Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize multiple constraints #4775

Merged
merged 10 commits into from
Sep 16, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -535,12 +535,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 @@ -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',
Expand All @@ -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
}
Expand Down Expand Up @@ -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
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;
}
Loading