diff --git a/packages/client/hmi-client/src/components/workflow/ops/optimize-ciemss/tera-optimize-ciemss-drilldown.vue b/packages/client/hmi-client/src/components/workflow/ops/optimize-ciemss/tera-optimize-ciemss-drilldown.vue index c2f177c53a..225d9f0b34 100644 --- a/packages/client/hmi-client/src/components/workflow/ops/optimize-ciemss/tera-optimize-ciemss-drilldown.vue +++ b/packages/client/hmi-client/src/components/workflow/ops/optimize-ciemss/tera-optimize-ciemss-drilldown.vue @@ -535,12 +535,15 @@ const showSpinner = computed( const showModelModal = ref(false); const displayOptimizationResultMessage = ref(true); -const isRunDisabled = computed( - () => - !props.node.state.constraintGroups?.at(0)?.targetVariable || +const isRunDisabled = computed(() => { + const activeConstraintGroups = props.node.state.constraintGroups.filter((ele) => ele.isActive); + return ( + activeConstraintGroups.length === 0 || + !activeConstraintGroups.every((ele) => ele.targetVariable) || props.node.state.interventionPolicyGroups.length === 0 || activePolicyGroups.value.length <= 0 -); + ); +}); const presetType = computed(() => { if ( @@ -788,13 +791,19 @@ const runOptimize = async () => { // These are interventions to be considered but not optimized over. const fixedInterventions: Intervention[] = _.cloneDeep(inactivePolicyGroups.value.map((ele) => ele.intervention)); - // TODO: https://github.com/DARPA-ASKEM/terarium/issues/3909 - // The method should be a list but pyciemss + pyciemss service is not yet ready for this. - const qoi: OptimizeQoi = { - contexts: props.node.state.constraintGroups.map((ele) => ele.targetVariable), - method: props.node.state.constraintGroups[0].qoiMethod - }; + const qois: OptimizeQoi[] = []; + const activeConstraintGroups = props.node.state.constraintGroups.filter((ele) => ele.isActive); + activeConstraintGroups.forEach((constraintGroup) => + qois.push({ + contexts: [constraintGroup.targetVariable], + method: constraintGroup.qoiMethod, + riskBound: constraintGroup.threshold, + isMinimized: constraintGroup.isMinimized + }) + ); + // riskTolerance to get alpha and divide by 100 to turn into a percent for pyciemss-service. + const alphas: number[] = activeConstraintGroups.map((ele) => ele.riskTolerance / 100); const optimizePayload: OptimizeRequestCiemss = { userId: 'no_user_provided', engine: 'ciemss', @@ -805,15 +814,13 @@ const runOptimize = async () => { }, optimizeInterventions, fixedInterventions, - qoi, - riskBound: props.node.state.constraintGroups[0].threshold, // TODO: https://github.com/DARPA-ASKEM/terarium/issues/3909 + qoi: qois, boundsInterventions: listBoundsInterventions, extra: { - isMinimized: props.node.state.constraintGroups[0].isMinimized, numSamples: knobs.value.numSamples, maxiter: knobs.value.maxiter, maxfeval: knobs.value.maxfeval, - alpha: props.node.state.constraintGroups[0].riskTolerance / 100, // riskTolerance to get alpha and divide by 100 to turn into a percent for pyciemss-service. + alpha: alphas, solverMethod: knobs.value.solverMethod, solverStepSize: 1 } @@ -951,23 +958,25 @@ onMounted(async () => { const preparedSuccessCriteriaCharts = computed(() => { const postForecastRunId = props.node.state.postForecastRunId; - return props.node.state.constraintGroups.map((constraint) => - createSuccessCriteriaChart( - riskResults.value[postForecastRunId], - constraint.targetVariable, - constraint.threshold, - constraint.isMinimized, - constraint.riskTolerance, - { - title: constraint.name, - width: chartSize.value.width, - height: chartSize.value.height, - xAxisTitle: 'Number of samples', - yAxisTitle: `${constraint.isMinimized ? 'Max' : 'Min'} value of ${constraint.targetVariable} at all timepoints`, - legend: true - } - ) - ); + return props.node.state.constraintGroups + .filter((ele) => ele.isActive) + .map((constraint) => + createSuccessCriteriaChart( + riskResults.value[postForecastRunId], + constraint.targetVariable, + constraint.threshold, + constraint.isMinimized, + constraint.riskTolerance, + { + title: constraint.name, + width: chartSize.value.width, + height: chartSize.value.height, + xAxisTitle: 'Number of samples', + yAxisTitle: `${constraint.isMinimized ? 'Max' : 'Min'} value of ${constraint.targetVariable} at all timepoints`, + legend: true + } + ) + ); }); // Creates forecast charts for interventions and simulation charts, based on the selected variables diff --git a/packages/client/hmi-client/src/types/Types.ts b/packages/client/hmi-client/src/types/Types.ts index da93178580..f6b5986ab9 100644 --- a/packages/client/hmi-client/src/types/Types.ts +++ b/packages/client/hmi-client/src/types/Types.ts @@ -574,8 +574,7 @@ export interface OptimizeRequestCiemss { optimizeInterventions?: OptimizeInterventions; fixedInterventions?: Intervention[]; loggingStepSize?: number; - qoi: OptimizeQoi; - riskBound: number; + qoi: OptimizeQoi[]; boundsInterventions: number[][]; extra: OptimizeExtra; engine: string; @@ -642,7 +641,7 @@ export interface OptimizeExtra { maxiter?: number; maxfeval?: number; isMinimized?: boolean; - alpha?: number; + alpha?: number[]; solverMethod?: string; solverStepSize?: number; } @@ -659,6 +658,8 @@ export interface OptimizeInterventions { export interface OptimizeQoi { contexts: string[]; method: string; + riskBound: number; + isMinimized: boolean; } export interface TimeSpan { diff --git a/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/OptimizeRequestCiemss.java b/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/OptimizeRequestCiemss.java index 3c040a3f96..c17a2a40b5 100644 --- a/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/OptimizeRequestCiemss.java +++ b/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/OptimizeRequestCiemss.java @@ -37,10 +37,7 @@ public class OptimizeRequestCiemss implements Serializable { @TSOptional private Double loggingStepSize; - private OptimizeQoi qoi; - - @JsonAlias("risk_bound") - private Double riskBound; + private List qoi; @JsonAlias("bounds_interventions") private List> boundsInterventions; diff --git a/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/parts/OptimizeExtra.java b/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/parts/OptimizeExtra.java index 124e7cd0e3..e9b79e1ada 100644 --- a/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/parts/OptimizeExtra.java +++ b/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/parts/OptimizeExtra.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonAlias; import java.io.Serializable; +import java.util.List; import lombok.Data; import lombok.experimental.Accessors; import software.uncharted.terarium.hmiserver.annotations.TSModel; @@ -31,7 +32,7 @@ public class OptimizeExtra implements Serializable { private Boolean isMinimized; @TSOptional - private Double alpha; + private List alpha; @JsonAlias("solver_method") @TSOptional diff --git a/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/parts/OptimizeQoi.java b/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/parts/OptimizeQoi.java index 0f14372d0c..08c559b042 100644 --- a/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/parts/OptimizeQoi.java +++ b/packages/server/src/main/java/software/uncharted/terarium/hmiserver/models/simulationservice/parts/OptimizeQoi.java @@ -1,5 +1,6 @@ package software.uncharted.terarium.hmiserver.models.simulationservice.parts; +import com.fasterxml.jackson.annotation.JsonAlias; import java.io.Serializable; import java.util.List; import lombok.Data; @@ -14,4 +15,10 @@ public class OptimizeQoi implements Serializable { private List contexts; private String method; + + @JsonAlias("risk_bound") + private Double riskBound; + + @JsonAlias("is_minimized") + private Boolean isMinimized; }