package org.opensha2.gmm; import static org.junit.Assert.assertEquals; import org.opensha2.internal.Parsing; import org.opensha2.internal.Parsing.Delimiter; import org.junit.Ignore; import org.junit.Test; import com.google.common.base.Function; import com.google.common.base.StandardSystemProperty; import com.google.common.collect.FluentIterable; import com.google.common.collect.Lists; import com.google.common.io.Files; import com.google.common.io.Resources; import com.google.common.primitives.Doubles; import java.io.File; import java.io.IOException; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Iterator; import java.util.List; import java.util.Set; @SuppressWarnings("javadoc") @Ignore("Parameterized Use Only") public class GmmTest { private static final String DATA_DIR = "data/"; private static final double TOL = 1e-6; static List<GmmInput> inputsList; private int index; private Gmm gmm; private Imt imt; private double exMedian; private double exSigma; public GmmTest(int index, Gmm gmm, Imt imt, double exMedian, double exSigma) { this.index = index; this.gmm = gmm; this.imt = imt; this.exMedian = exMedian; this.exSigma = exSigma; } @Test public void test() { ScalarGroundMotion sgm = gmm.instance(imt).calc(inputsList.get(index)); assertEquals(exMedian, Math.exp(sgm.mean()), TOL); assertEquals(exSigma, sgm.sigma(), TOL); } /* Use to generate Gmm result file */ static void generateResults(Set<Gmm> gmms, Set<Imt> imts, String inputsFileName, String resultsFileName) throws IOException { List<GmmInput> inputs = loadInputs(inputsFileName); File out = new File("tmp/Gmm-tests/" + resultsFileName); Files.write("", out, StandardCharsets.UTF_8); for (Gmm gmm : gmms) { for (Imt imt : imts) { GroundMotionModel gmModel = gmm.instance(imt); int modelIndex = 0; String id = gmm.name() + "-" + imt.name(); for (GmmInput input : inputs) { ScalarGroundMotion sgm = gmModel.calc(input); String result = Parsing.join( Lists.newArrayList(modelIndex++ + "-" + id, String.format("%.6f", Math.exp(sgm.mean())), String.format("%.6f", sgm.sigma())), Delimiter.COMMA) + StandardSystemProperty.LINE_SEPARATOR.value(); Files.append(result, out, StandardCharsets.UTF_8); } } } } static List<Object[]> loadResults(String resource) throws IOException { URL url = Resources.getResource(GmmTest.class, DATA_DIR + resource); return FluentIterable .from(Resources.readLines(url, StandardCharsets.UTF_8)) .transform(ResultsToObjectsFunction.INSTANCE) .toList(); } private enum ResultsToObjectsFunction implements Function<String, Object[]> { INSTANCE; @Override public Object[] apply(String line) { Iterator<String> lineIt = Parsing.split(line, Delimiter.COMMA).iterator(); Iterator<String> idIt = Parsing.split(lineIt.next(), Delimiter.DASH).iterator(); return new Object[] { Integer.valueOf(idIt.next()), // inputs index Gmm.valueOf(idIt.next()), // Gmm Imt.valueOf(idIt.next()), // Imt Double.valueOf(lineIt.next()), // median Double.valueOf(lineIt.next()) // sigma }; } } static List<GmmInput> loadInputs(String resource) throws IOException { URL url = Resources.getResource(GmmTest.class, DATA_DIR + resource); return FluentIterable .from(Resources.readLines(url, StandardCharsets.UTF_8)) .skip(1) .transform(ArgsToInputFunction.INSTANCE) .toList(); } private enum ArgsToInputFunction implements Function<String, GmmInput> { INSTANCE; @Override public GmmInput apply(String line) { Iterator<Double> it = FluentIterable .from(Parsing.split(line, Delimiter.COMMA)) .transform(Doubles.stringConverter()) .iterator(); return GmmInput.builder() .mag(it.next()) .distances(it.next(), it.next(), it.next()) .dip(it.next()) .width(it.next()) .zTop(it.next()) .zHyp(it.next()) .rake(it.next()) .vs30(it.next(), it.next() > 0.0) .z1p0(it.next()) .z2p5(it.next()) .build(); } } }