Skip to content

Commit

Permalink
Optimize multiple constraints (#4775)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tom-Szendrey authored Sep 16, 2024
1 parent 53fcdfb commit f4ffa88
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -514,12 +514,15 @@ const showSpinner = computed<boolean>(
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 (
Expand Down Expand Up @@ -767,13 +770,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',
Expand All @@ -784,15 +793,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
}
Expand Down Expand Up @@ -909,23 +916,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
Expand Down
7 changes: 4 additions & 3 deletions packages/client/hmi-client/src/types/Types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -642,7 +641,7 @@ export interface OptimizeExtra {
maxiter?: number;
maxfeval?: number;
isMinimized?: boolean;
alpha?: number;
alpha?: number[];
solverMethod?: string;
solverStepSize?: number;
}
Expand All @@ -659,6 +658,8 @@ export interface OptimizeInterventions {
export interface OptimizeQoi {
contexts: string[];
method: string;
riskBound: number;
isMinimized: boolean;
}

export interface TimeSpan {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,7 @@ public class OptimizeRequestCiemss implements Serializable {
@TSOptional
private Double loggingStepSize;

private OptimizeQoi qoi;

@JsonAlias("risk_bound")
private Double riskBound;
private List<OptimizeQoi> qoi;

@JsonAlias("bounds_interventions")
private List<List<Double>> boundsInterventions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -31,7 +32,7 @@ public class OptimizeExtra implements Serializable {
private Boolean isMinimized;

@TSOptional
private Double alpha;
private List<Double> alpha;

@JsonAlias("solver_method")
@TSOptional
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -14,4 +15,10 @@ public class OptimizeQoi implements Serializable {

private List<String> contexts;
private String method;

@JsonAlias("risk_bound")
private Double riskBound;

@JsonAlias("is_minimized")
private Boolean isMinimized;
}

0 comments on commit f4ffa88

Please sign in to comment.