55import jsonschema
66import numpy as np
77import logging
8+
9+ logger = logging .getLogger (__name__ )
810from django .db import models
911from django .core .validators import MaxValueValidator , MinValueValidator
1012
1113from django .utils .translation import gettext_lazy as _
14+ from datetime import datetime
1215
13- from projects .constants import USER_RATING
16+ from projects .constants import USER_RATING , DONE , PENDING , ERROR
1417from projects .helpers import (
1518 sensitivity_analysis_payload ,
1619 SA_OUPUT_NAMES_SCHEMA ,
1720 sa_output_values_schema_generator ,
18- SA_MVS_TOKEN_SCHEMA ,
21+ SA_RESPONSE_SCHEMA ,
1922 format_scenario_for_mvs ,
2023)
2124
@@ -65,12 +68,6 @@ def set_reference_scenario(self, scenario):
6568 self .scenario = scenario
6669 self .save ()
6770
68- def collect_simulations_tokens (self , server_response ):
69- try :
70- jsonschema .validate (server_response , SA_MVS_TOKEN_SCHEMA )
71- except jsonschema .exceptions .ValidationError :
72- answer = {}
73-
7471 @property
7572 def variable_range (self ):
7673 return np .arange (
@@ -93,17 +90,59 @@ def output_names(self):
9390 @property
9491 def output_values (self ):
9592 try :
96- answer = json .loads (self .output_parameters_values )
97- try :
98- jsonschema .validate (
99- answer , sa_output_values_schema_generator (self .output_names )
100- )
101- except jsonschema .exceptions .ValidationError :
102- answer = {}
93+ out_values = json .loads (self .output_parameters_values )
94+ answer = {}
95+ for in_value , sa_step in zip (self .variable_range , out_values ):
96+ try :
97+ jsonschema .validate (
98+ sa_step , sa_output_values_schema_generator (self .output_names )
99+ )
100+ answer [in_value ] = sa_step
101+ except jsonschema .exceptions .ValidationError :
102+ answer [in_value ] = None
103103 except json .decoder .JSONDecodeError :
104104 answer = {}
105105 return answer
106106
107+ def parse_server_response (self , sa_results ):
108+ try :
109+ # make sure the response is formatted as expected
110+ jsonschema .validate (sa_results , SA_RESPONSE_SCHEMA )
111+ self .status = sa_results ["status" ]
112+ self .errors = (
113+ json .dumps (sa_results ["results" ][ERROR ])
114+ if self .status == ERROR
115+ else None
116+ )
117+ if self .status == DONE :
118+ sa_steps = sa_results ["results" ]["sensitivity_analysis_steps" ]
119+ sa_steps_processed = []
120+ # make sure that each step is formatted as expected
121+ for step_idx , sa_step in enumerate (sa_steps ):
122+ try :
123+ jsonschema .validate (
124+ sa_step ,
125+ sa_output_values_schema_generator (self .output_names ),
126+ )
127+ sa_steps_processed .append (sa_step )
128+ except jsonschema .exceptions .ValidationError as e :
129+ logger .error (
130+ f"Could not parse the results of the sensitivity analysis { self .id } for step { step_idx } "
131+ )
132+ sa_steps_processed .append (None )
133+ self .output_parameters_values = json .dumps (sa_steps_processed )
134+
135+ except jsonschema .exceptions .ValidationError as e :
136+ self .status = ERROR
137+ self .output_parameters_values = ""
138+ self .errors = str (e )
139+
140+ self .elapsed_seconds = (datetime .now () - self .start_date ).seconds
141+ self .end_date = (
142+ datetime .now () if sa_results ["status" ] in [ERROR , DONE ] else None
143+ )
144+ self .save ()
145+
107146 @property
108147 def payload (self ):
109148 return sensitivity_analysis_payload (
0 commit comments