From cf2e66ba5bc23618383f168b87fbacbe8868ec88 Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Tue, 14 Dec 2021 15:21:02 -0700
Subject: [PATCH] updated lib and other dependencies

---
 build.gradle                                  |  2 +-
 gradle.properties                             |  8 ++---
 gradle/wrapper/gradle-wrapper.properties      |  2 +-
 .../nshmp/www/gmm/GroundMotions.java          | 31 +++++++++++++++++--
 .../nshmp/www/gmm/ResponseSpectra.java        | 11 ++++---
 5 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/build.gradle b/build.gradle
index 6ee694c..2e50899 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,6 @@
 plugins {
   id "application"
-  id "com.diffplug.gradle.spotless" version "${spotlessVersion}"
+  id "com.diffplug.spotless" version "${spotlessVersion}"
   id "com.github.johnrengelman.shadow" version "${shadowVersion}"
   id "com.github.node-gradle.node" version "${nodeVersion}"
   id "com.github.spotbugs" version "${spotbugsVersion}"
diff --git a/gradle.properties b/gradle.properties
index f228ebc..35dc381 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,14 +1,14 @@
 githooksVersion = 1.2.0
 jacksonVersion = 2.9.0
-junitVersion = 5.5.2
+junitVersion = 5.8.2
 logbackVersion = 1.2.3
 micronautVersion = 2.4.1
 mnPluginVersion = 1.4.2
 nodeVersion = 3.0.1
 nshmFaultSectionsTag = v0.1
-nshmpLibVersion = 0.4.2
+nshmpLibVersion = 0.8.0
 nshmpWsUtilsVersion = 0.1.2
 shadowVersion = 6.1.0
-spotbugsVersion = 4.2.4
-spotlessVersion = 4.1.0
+spotbugsVersion = 4.7.0
+spotlessVersion = 6.0.4
 swaggerVersion = 2.1.7
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index be52383..84d1f85 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/gmm/GroundMotions.java b/src/main/java/gov/usgs/earthquake/nshmp/www/gmm/GroundMotions.java
index 5c98675..a2b1925 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/gmm/GroundMotions.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/gmm/GroundMotions.java
@@ -18,11 +18,14 @@ import java.util.stream.Collectors;
 import com.google.common.primitives.Doubles;
 
 import gov.usgs.earthquake.nshmp.Maths;
+import gov.usgs.earthquake.nshmp.data.DoubleData;
 import gov.usgs.earthquake.nshmp.gmm.Gmm;
 import gov.usgs.earthquake.nshmp.gmm.GmmInput;
+import gov.usgs.earthquake.nshmp.gmm.GroundMotion;
 import gov.usgs.earthquake.nshmp.gmm.GroundMotionModel;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
-import gov.usgs.earthquake.nshmp.gmm.ScalarGroundMotion;
+import gov.usgs.earthquake.nshmp.tree.Branch;
+import gov.usgs.earthquake.nshmp.tree.LogicTree;
 
 public class GroundMotions {
 
@@ -115,7 +118,7 @@ public class GroundMotions {
 
       GroundMotionModel model = gmm.instance(imt);
       for (GmmInput gmmInput : gmmInputs) {
-        ScalarGroundMotion gm = model.calc(gmmInput);
+        GroundMotion gm = combine(model.calc(gmmInput));
         means.add(gm.mean());
         sigmas.add(gm.sigma());
       }
@@ -131,6 +134,30 @@ public class GroundMotions {
         xsMap);
   }
 
+  @Deprecated
+  static GroundMotion combine(LogicTree<GroundMotion> tree) {
+    // once GroundMotions in lib is exposed remove this
+    if (tree.size() == 1) {
+      return tree.get(0).value();
+    }
+    double[] means = tree.stream()
+        .map(Branch::value)
+        .mapToDouble(GroundMotion::mean)
+        .toArray();
+    double[] sigmas = tree.stream()
+        .map(Branch::value)
+        .mapToDouble(GroundMotion::sigma)
+        .toArray();
+    double[] weights = tree.stream()
+        .mapToDouble(Branch::weight)
+        .toArray();
+    double mean = DoubleData.weightedSumLn(means, weights);
+    double sigma = DoubleData.weightedSum(sigmas, weights);
+    // TODO update NGA-East test results
+    // double sigma = Maths.srssWeighted(sigmas, weights);
+    return GroundMotion.create(mean, sigma);
+  }
+
   /*
    * Compute distance metrics for a fault.
    */
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/gmm/ResponseSpectra.java b/src/main/java/gov/usgs/earthquake/nshmp/www/gmm/ResponseSpectra.java
index e268119..e1efc86 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/gmm/ResponseSpectra.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/gmm/ResponseSpectra.java
@@ -12,9 +12,9 @@ import com.google.common.collect.Maps;
 
 import gov.usgs.earthquake.nshmp.gmm.Gmm;
 import gov.usgs.earthquake.nshmp.gmm.GmmInput;
+import gov.usgs.earthquake.nshmp.gmm.GroundMotion;
 import gov.usgs.earthquake.nshmp.gmm.GroundMotionModel;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
-import gov.usgs.earthquake.nshmp.gmm.ScalarGroundMotion;
 
 /**
  * Entry point for computing deterministic response spectra.
@@ -46,8 +46,9 @@ public class ResponseSpectra {
    * @return a two-element double[] containing the natural log of the median
    *         ground motion and its standard deviation
    */
+  @Deprecated
   public static double[] groundMotion(Gmm model, Imt imt, GmmInput source) {
-    ScalarGroundMotion sgm = model.instance(imt).calc(source);
+    GroundMotion sgm = GroundMotions.combine(model.instance(imt).calc(source));
     return new double[] { sgm.mean(), sgm.sigma() };
   }
 
@@ -71,7 +72,7 @@ public class ResponseSpectra {
     Result spectrum = new Result(imts.size());
     int i = 0;
     for (Imt imt : imts) {
-      ScalarGroundMotion sgm = model.instance(imt).calc(input);
+      GroundMotion sgm = GroundMotions.combine(model.instance(imt).calc(input));
       spectrum.periods[i] = imt.period();
       spectrum.means[i] = sgm.mean();
       spectrum.sigmas[i] = sgm.sigma();
@@ -145,12 +146,12 @@ public class ResponseSpectra {
       ImmutableList.Builder<Double> means = ImmutableList.builder();
       ImmutableList.Builder<Double> sigmas = ImmutableList.builder();
 
-      ScalarGroundMotion pgaGm = gmm.instance(Imt.PGA).calc(input);
+      GroundMotion pgaGm = GroundMotions.combine(gmm.instance(Imt.PGA).calc(input));
       means.add(pgaGm.mean());
       sigmas.add(pgaGm.sigma());
 
       for (Imt imt : saImts) {
-        ScalarGroundMotion sgm = gmm.instance(imt).calc(input);
+        GroundMotion sgm = GroundMotions.combine(gmm.instance(imt).calc(input));
         means.add(sgm.mean());
         sigmas.add(sgm.sigma());
       }
-- 
GitLab