package org.opensha2.calc;
import static com.google.common.util.concurrent.Futures.allAsList;
import static com.google.common.util.concurrent.Futures.immediateFuture;
import static com.google.common.util.concurrent.Futures.transform;
import org.opensha2.calc.Transforms.ClusterCurveConsolidator;
import org.opensha2.calc.Transforms.ClusterToCurves;
import org.opensha2.calc.Transforms.CurveConsolidator;
import org.opensha2.calc.Transforms.CurveSetConsolidator;
import org.opensha2.calc.Transforms.ParallelSystemToCurves;
import org.opensha2.calc.Transforms.SourceToCurves;
import org.opensha2.calc.Transforms.SystemToCurves;
import org.opensha2.eq.model.ClusterSource;
import org.opensha2.eq.model.ClusterSourceSet;
import org.opensha2.eq.model.HazardModel;
import org.opensha2.eq.model.Source;
import org.opensha2.eq.model.SourceSet;
import org.opensha2.eq.model.SystemSourceSet;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
/**
* Static utility methods for performing single-threaded and asynchronous hazard
* calculations via functions in {@link Transforms}.
*
* @author Peter Powers
* @see Transforms
* @see AsyncList
*/
final class CalcFactory {
private CalcFactory() {}
/* Compute hazard curves for a SourceSet. */
static HazardCurveSet sourcesToCurves(
SourceSet<? extends Source> sources,
CalcConfig config,
Site site) {
SourceToCurves sourceToCurves = new SourceToCurves(sources, config, site);
List<HazardCurves> curvesList = new ArrayList<>();
for (Source source : sources.iterableForLocation(site.location)) {
curvesList.add(sourceToCurves.apply(source));
}
CurveConsolidator consolidateFn = new CurveConsolidator(sources, config);
return consolidateFn.apply(curvesList);
}
/* Asynchronously compute hazard curves for a SourceSet. */
static ListenableFuture<HazardCurveSet> sourcesToCurves(
SourceSet<? extends Source> sources,
CalcConfig config,
Site site,
Executor ex) {
SourceToCurves sourceToCurves = new SourceToCurves(sources, config, site);
AsyncList<HazardCurves> curvesList = AsyncList.create();
for (Source source : sources.iterableForLocation(site.location)) {
ListenableFuture<HazardCurves> curves = transform(
immediateFuture(source),
sourceToCurves,
ex);
curvesList.add(curves);
}
return transform(
allAsList(curvesList),
new CurveConsolidator(sources, config),
ex);
}
/* Compute hazard curves for a SystemSourceSet. */
static HazardCurveSet systemToCurves(
SystemSourceSet sources,
CalcConfig config,
Site site) {
return new SystemToCurves(config, site).apply(sources);
}
/* Asynchronously compute hazard curves for a SystemSourceSet. */
static ListenableFuture<HazardCurveSet> systemToCurves(
SystemSourceSet sources,
CalcConfig config,
Site site,
final Executor ex) {
return transform(
immediateFuture(sources),
new ParallelSystemToCurves(site, config, ex),
ex);
}
/* Compute hazard curves for a ClusterSourceSet. */
static HazardCurveSet clustersToCurves(
ClusterSourceSet sources,
CalcConfig config,
Site site) {
ClusterToCurves clusterToCurves = new ClusterToCurves(sources, config, site);
List<ClusterCurves> curvesList = new ArrayList<>();
for (ClusterSource source : sources.iterableForLocation(site.location)) {
curvesList.add(clusterToCurves.apply(source));
}
ClusterCurveConsolidator consolidateFn = new ClusterCurveConsolidator(sources, config);
return consolidateFn.apply(curvesList);
}
/* Asynchronously compute hazard curves for a ClusterSourceSet. */
static ListenableFuture<HazardCurveSet> clustersToCurves(
ClusterSourceSet sources,
CalcConfig config,
Site site,
Executor ex) {
ClusterToCurves clusterToCurves = new ClusterToCurves(sources, config, site);
AsyncList<ClusterCurves> curvesList = AsyncList.create();
for (ClusterSource source : sources.iterableForLocation(site.location)) {
ListenableFuture<ClusterCurves> curves = transform(
immediateFuture(source),
clusterToCurves,
ex);
curvesList.add(curves);
}
return transform(
allAsList(curvesList),
new ClusterCurveConsolidator(sources, config),
ex);
}
/* Reduce hazard curves to a result. */
static Hazard toHazardResult(
HazardModel model,
CalcConfig config,
Site site,
List<HazardCurveSet> curveSets) {
return new CurveSetConsolidator(model, config, site).apply(curveSets);
}
/* Asynchronously reduce hazard curves to a result. */
static Hazard toHazardResult(
HazardModel model,
CalcConfig config,
Site site,
AsyncList<HazardCurveSet> curveSets,
Executor ex) throws InterruptedException, ExecutionException {
return transform(
allAsList(curveSets),
new CurveSetConsolidator(model, config, site), ex).get();
}
}