package org.opensha2.eq.model.peer; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.lang.Math.abs; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertTrue; import static org.opensha2.internal.Parsing.Delimiter.COMMA; import org.opensha2.HazardCalc; import org.opensha2.calc.CalcConfig; import org.opensha2.calc.Hazard; import org.opensha2.calc.Site; import org.opensha2.calc.Sites; import org.opensha2.eq.model.HazardModel; import org.opensha2.gmm.Imt; import org.opensha2.internal.Parsing; import org.opensha2.mfd.Mfds; import org.junit.Ignore; import org.junit.Test; import com.google.common.base.Optional; import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; import com.google.common.primitives.Doubles; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; @SuppressWarnings("javadoc") @Ignore("Parameterized Use Only") public class PeerTest { public static final String S1_C1 = "Set1-Case1"; public static final String S1_C2 = "Set1-Case2"; public static final String S1_C2_F = "Set1-Case2-fast"; public static final String S1_C3 = "Set1-Case3"; public static final String S1_C3_F = "Set1-Case3-fast"; public static final String S1_C4 = "Set1-Case4"; public static final String S1_C4_F = "Set1-Case4-fast"; public static final String S1_C5 = "Set1-Case5"; public static final String S1_C5_F = "Set1-Case5-fast"; public static final String S1_C6 = "Set1-Case6"; public static final String S1_C6_F = "Set1-Case6-fast"; public static final String S1_C7 = "Set1-Case7"; public static final String S1_C7_F = "Set1-Case7-fast"; public static final String S1_C8A = "Set1-Case8a"; public static final String S1_C8B = "Set1-Case8b"; public static final String S1_C8B_F = "Set1-Case8b-fast"; public static final String S1_C8C = "Set1-Case8c"; public static final String S1_C10 = "Set1-Case10"; public static final String S1_C10_F = "Set1-Case10-fast"; public static final String S1_C11 = "Set1-Case11"; public static final String S1_C11_F = "Set1-Case11-fast"; public static final String S2_C1 = "Set2-Case1"; public static final String S2_C2A = "Set2-Case2a"; public static final String S2_C2A_F = "Set2-Case2a-fast"; public static final String S2_C2B = "Set2-Case2b"; public static final String S2_C2B_F = "Set2-Case2b-fast"; public static final String S2_C2C = "Set2-Case2c"; public static final String S2_C2C_F = "Set2-Case2c-fast"; public static final String S2_C2D = "Set2-Case2d"; public static final String S2_C2D_F = "Set2-Case2d-fast"; public static final String S2_C3A = "Set2-Case3a"; public static final String S2_C3A_F = "Set2-Case3a-fast"; public static final String S2_C3B = "Set2-Case3b"; public static final String S2_C3B_F = "Set2-Case3b-fast"; public static final String S2_C3C = "Set2-Case3c"; public static final String S2_C3C_F = "Set2-Case3c-fast"; public static final String S2_C3D = "Set2-Case3d"; public static final String S2_C3D_F = "Set2-Case3d-fast"; public static final String S2_C4A = "Set2-Case4a"; public static final String S2_C4A_F = "Set2-Case4a-fast"; public static final String S2_C4B = "Set2-Case4b"; public static final String S2_C4B_F = "Set2-Case4b-fast"; public static final String S2_C5A = "Set2-Case5a"; public static final String S2_C5B = "Set2-Case5b"; public static final String S3_C1A = "Set3-Case1a"; public static final String S3_C1B = "Set3-Case1a"; public static final String S3_C2 = "Set3-Case2"; public static final String S3_C3 = "Set3-Case3"; public static final String S3_C4 = "Set3-Case4"; private static final Path PEER_DIR = Paths.get("etc", "peer"); // private static final Path PEER_DIR = Paths.get("..", "nshmp-model-dev", // "models", "PEER"); private static final Path MODEL_DIR = PEER_DIR.resolve("models"); private static final Path RESULT_DIR = PEER_DIR.resolve("results"); private String modelName; // just used to improve test name when running private HazardModel model; private Site site; private double[] expected; private double tolerance; public PeerTest( String modelName, HazardModel model, Site site, double[] expected, double tolerance) { this.modelName = modelName; this.model = model; this.site = site; this.expected = expected; this.tolerance = tolerance; } @Test public void test() { System.out.println(site.name); Hazard result = HazardCalc.calc(model, model.config(), site, Optional.<Executor> absent()); // compute y-values converting to Poiss prob double[] actual = Doubles.toArray( FluentIterable.from(result.curves().get(Imt.PGA).yValues()) .transform(Mfds.annualRateToProbabilityConverter()) .toList()); checkArgument(actual.length == expected.length); assertArrayEquals(expected, actual, tolerance); for (int i = 0; i < expected.length; i++) { String message = String.format("arrays differ at [%s] expected:<[%s]> but was:<[%s]>", i, expected[i], actual[i]); assertTrue(message, compare(expected[i], actual[i], tolerance)); } } private static boolean compare(double expected, double actual, double tolerance) { return abs(actual - expected) / expected < tolerance || Double.valueOf(expected).equals(Double.valueOf(actual)); } static List<Object[]> load(String modelId, double tolerance) throws IOException { Map<String, double[]> expectedsMap = loadExpecteds(modelId); HazardModel model = HazardModel.load(MODEL_DIR.resolve(modelId)); CalcConfig config = model.config(); Iterable<Site> sites = Sites.fromCsv(MODEL_DIR.resolve(modelId).resolve("sites.csv"), config); // ensure that only PGA is being used checkState(config.hazard.imts.size() == 1); checkState(config.hazard.imts.iterator().next() == Imt.PGA); List<Object[]> argsList = new ArrayList<>(); for (Site site : sites) { checkState(expectedsMap.containsKey(site.name())); Object[] args = new Object[] { model.name(), model, site, expectedsMap.get(site.name()), tolerance }; argsList.add(args); } return argsList; } private static Map<String, double[]> loadExpecteds(String modelId) throws IOException { Path results = RESULT_DIR.resolve(modelId + ".csv"); List<String> lines = Files.readAllLines(results, UTF_8); Map<String, double[]> siteValuesMap = new HashMap<>(); for (String line : Iterables.skip(lines, 1)) { String[] splitLine = line.split(",", 4); String siteName = splitLine[0]; List<Double> values = Parsing.splitToDoubleList(splitLine[3], COMMA); siteValuesMap.put(siteName, Doubles.toArray(values)); } return siteValuesMap; } public static void main(String[] args) { String model = MODEL_DIR.resolve(S1_C11_F).toString(); HazardCalc.main(new String[] { model }); } }