From fcf8b93765010c84997c69d7ad6d7b06f2f4efef Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Tue, 12 Nov 2024 11:38:04 -0700
Subject: [PATCH] keep modelData in ruptureSet builders

---
 .../nshmp/model/ClusterRuptureSet.java        |  6 ----
 .../nshmp/model/FaultRuptureSet.java          | 31 ++++++++--------
 .../nshmp/model/InterfaceRuptureSet.java      | 29 ++++++++-------
 .../nshmp/model/ZoneRuptureSet.java           | 36 ++++++++++---------
 4 files changed, 53 insertions(+), 49 deletions(-)

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/ClusterRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/ClusterRuptureSet.java
index 85c9e9ec..cb68cd9f 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/ClusterRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/ClusterRuptureSet.java
@@ -60,14 +60,11 @@ public class ClusterRuptureSet extends AbstractRuptureSet<ClusterSource> {
    *
    */
 
-  @Deprecated
-  final ModelData data; // holds cluster rate tree
   private final List<ClusterSource> source;
   private final LogicTree<Mfd> mfdTree;
 
   private ClusterRuptureSet(Builder builder) {
     super(builder);
-    this.data = builder.data;
     this.source = List.of(builder.source);
     this.mfdTree = builder.mfdTree;
   }
@@ -177,7 +174,6 @@ public class ClusterRuptureSet extends AbstractRuptureSet<ClusterSource> {
   /* Single use builder */
   static class Builder extends AbstractRuptureSet.Builder {
 
-    private ModelData data; // holds cluster rate-tree
     private ClusterSource source;
     private LogicTree<Mfd> mfdTree;
 
@@ -199,7 +195,6 @@ public class ClusterRuptureSet extends AbstractRuptureSet<ClusterSource> {
 
     /* Set MFD helper data. */
     Builder modelData(ModelData data) {
-      this.data = checkNotNull(data);
       super.setting(data.tectonicSetting());
       super.gmms(data.gmms());
       return this;
@@ -213,7 +208,6 @@ public class ClusterRuptureSet extends AbstractRuptureSet<ClusterSource> {
 
     void validateAndInit(String label) {
       validateState(label);
-      checkNotNull(data, "%s model data", label);
       checkNotNull(source, "%s cluster source", label);
     }
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/FaultRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/FaultRuptureSet.java
index 255d9390..7dca98ac 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/FaultRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/FaultRuptureSet.java
@@ -70,7 +70,6 @@ public class FaultRuptureSet extends AbstractRuptureSet<FaultSource> {
    *
    */
   final SourceFeature.NshmFault feature;
-  final ModelData data; // is this needed beyond the builder?
 
   final LogicTree<Mfd> mfdTree;
   final List<Boolean> mfdFloats; // 1:1 with mfdTree branches
@@ -79,28 +78,21 @@ public class FaultRuptureSet extends AbstractRuptureSet<FaultSource> {
   final List<Integer> sectionIds; // reference: actually needed?
   private final List<FaultSource> source; // single source list
 
+  private final boolean useDistanceFilterUpdate;
+
   FaultRuptureSet(Builder builder) {
     super(builder);
     this.feature = builder.feature;
-    this.data = builder.data;
 
     this.mfdTree = builder.mfdTree;
     this.mfdTotal = builder.mfdTotal;
 
     this.sectionIds = builder.sectionIds;
 
-    FaultSource source = createSource();
-    this.mfdFloats = List.copyOf(source.floats);
-    this.source = List.of(source);
-  }
+    this.mfdFloats = List.copyOf(builder.source.floats);
+    this.source = List.of(builder.source);
 
-  private FaultSource createSource() {
-    return new FaultSource.Builder()
-        .feature(feature)
-        .config(data.sourceConfig().asFault())
-        .mfdTree(mfdTree)
-        .mfdTotal(mfdTotal)
-        .build();
+    this.useDistanceFilterUpdate = builder.data.useDistanceFilterUpdate();
   }
 
   @Override
@@ -130,7 +122,7 @@ public class FaultRuptureSet extends AbstractRuptureSet<FaultSource> {
 
   @Override
   public Predicate<FaultSource> distanceFilter(Location loc, double distance) {
-    return data.useDistanceFilterUpdate()
+    return useDistanceFilterUpdate
         ? new DistanceFilterUpdate(loc, distance)
         : new DistanceFilter(loc, distance);
   }
@@ -199,6 +191,7 @@ public class FaultRuptureSet extends AbstractRuptureSet<FaultSource> {
   static class Builder extends AbstractRuptureSet.Builder {
 
     private SourceFeature.NshmFault feature;
+    private FaultSource source;
     private ModelData data;
 
     private LogicTree<Mfd.Properties> mfdPropsTree;
@@ -289,6 +282,7 @@ public class FaultRuptureSet extends AbstractRuptureSet<FaultSource> {
 
       mfdTree = createMfdTree(mfdPropsTree, moRateTree, mfdConfig);
       mfdTotal = ModelTrees.reduceMfdTree(mfdTree);
+      source = createSource();
     }
 
     private SourceFeature.NshmFault createFeature() {
@@ -354,6 +348,15 @@ public class FaultRuptureSet extends AbstractRuptureSet<FaultSource> {
       return new SourceFeature.NshmFault(feature);
     }
 
+    private FaultSource createSource() {
+      return new FaultSource.Builder()
+          .feature(feature)
+          .config(data.sourceConfig().asFault())
+          .mfdTree(mfdTree)
+          .mfdTotal(mfdTotal)
+          .build();
+    }
+
     /* For single feature rupture sets. */
     private void updateState(Properties.Builder props, List<String> states) {
       String state = (String) ruptureProps.orElseThrow().get(Key.STATE);
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/InterfaceRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/InterfaceRuptureSet.java
index 1351e523..8a2ec1b5 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/InterfaceRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/InterfaceRuptureSet.java
@@ -33,31 +33,24 @@ public class InterfaceRuptureSet extends AbstractRuptureSet<InterfaceSource> {
 
   /* May be original interface section or stitched. */
   final SourceFeature.Interface feature;
-  final ModelData data;
 
   final LogicTree<Mfd> mfdTree;
   final Mfd mfdTotal;
 
   private final List<InterfaceSource> source;
 
+  private final boolean useDistanceFilterUpdate;
+
   InterfaceRuptureSet(Builder builder) {
     super(builder);
     this.feature = builder.feature;
-    this.data = builder.data;
 
     this.mfdTree = builder.mfdTree;
     this.mfdTotal = builder.mfdTotal;
 
-    this.source = List.of(createSource());
-  }
+    this.source = List.of(builder.source);
 
-  private InterfaceSource createSource() {
-    return new InterfaceSource.Builder()
-        .feature(feature)
-        .config(data.sourceConfig().asInterface())
-        .mfdTree(mfdTree)
-        .mfdTotal(mfdTotal)
-        .build();
+    this.useDistanceFilterUpdate = builder.data.useDistanceFilterUpdate();
   }
 
   @Override
@@ -87,7 +80,7 @@ public class InterfaceRuptureSet extends AbstractRuptureSet<InterfaceSource> {
 
   @Override
   public Predicate<InterfaceSource> distanceFilter(Location loc, double distance) {
-    return data.useDistanceFilterUpdate()
+    return useDistanceFilterUpdate
         ? new DistanceFilterUpdate(loc, distance)
         : new DistanceFilter(loc, distance);
   }
@@ -179,6 +172,7 @@ public class InterfaceRuptureSet extends AbstractRuptureSet<InterfaceSource> {
   static class Builder extends AbstractRuptureSet.Builder {
 
     private SourceFeature.Interface feature;
+    private InterfaceSource source;
     private ModelData data;
     private List<Integer> sectionIds;
 
@@ -247,6 +241,7 @@ public class InterfaceRuptureSet extends AbstractRuptureSet<InterfaceSource> {
       mfdTotal = ModelTrees.reduceMfdTree(mfdTree);
 
       feature = createFeature();
+      source = createSource();
     }
 
     private SourceFeature.Interface createFeature() {
@@ -305,6 +300,16 @@ public class InterfaceRuptureSet extends AbstractRuptureSet<InterfaceSource> {
               toList(),
               LocationList::copyOf));
     }
+
+    private InterfaceSource createSource() {
+      return new InterfaceSource.Builder()
+          .feature(feature)
+          .config(data.sourceConfig().asInterface())
+          .mfdTree(mfdTree)
+          .mfdTotal(mfdTotal)
+          .build();
+    }
+
   }
 
   private static LogicTree<Mfd> buildMfdTree(
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/ZoneRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/ZoneRuptureSet.java
index 9b6697eb..258a1f90 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/ZoneRuptureSet.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/ZoneRuptureSet.java
@@ -35,7 +35,6 @@ import gov.usgs.earthquake.nshmp.tree.Trees;
 class ZoneRuptureSet extends AbstractRuptureSet<PointSource> {
 
   private final SourceFeature.Zone feature;
-  private final ModelData data;
 
   private final List<Location> locations;
   private final List<Mfd> mfds;
@@ -59,27 +58,12 @@ class ZoneRuptureSet extends AbstractRuptureSet<PointSource> {
   ZoneRuptureSet(Builder builder) {
     super(builder);
     this.feature = builder.feature;
-    this.data = builder.data;
     this.locations = builder.locations;
     this.mfdsTree = builder.mfdsTree;
     this.mfdTree = builder.mfdTree;
     this.mfds = builder.mfds;
     // TODO handle SS weight
-    this.delegate = createRuptureSet();
-  }
-
-  private GridRuptureSet createRuptureSet() {
-    GridRuptureSet grid = GridLoader.createGrid(
-        feature.name,
-        feature.id,
-        data,
-        SourceType.ZONE,
-        feature,
-        locations,
-        mfds,
-        mfdsTree,
-        Optional.empty());
-    return grid;
+    this.delegate = builder.gridRuptureSet;
   }
 
   @Override
@@ -139,6 +123,8 @@ class ZoneRuptureSet extends AbstractRuptureSet<PointSource> {
 
     private LogicTree<double[]> ratesTree;
 
+    private GridRuptureSet gridRuptureSet;
+
     private Builder() {
       super(SourceType.ZONE);
     }
@@ -204,6 +190,7 @@ class ZoneRuptureSet extends AbstractRuptureSet<PointSource> {
       mfds = createTotalMfds();
       mfdsTree = createMfdsTree();
       mfdTree = Trees.transform(mfdsTree, Mfds::combine, Optional.empty());
+      gridRuptureSet = createRuptureSet();
     }
 
     private void initLocationAndRateLists() {
@@ -299,5 +286,20 @@ class ZoneRuptureSet extends AbstractRuptureSet<PointSource> {
       }
       return mfdsTree.build();
     }
+
+    private GridRuptureSet createRuptureSet() {
+      GridRuptureSet grid = GridLoader.createGrid(
+          feature.name,
+          feature.id,
+          data,
+          SourceType.ZONE,
+          feature,
+          locations,
+          mfds,
+          mfdsTree,
+          Optional.empty());
+      return grid;
+    }
+
   }
 }
-- 
GitLab