1+ /* eslint-disable no-nested-ternary */
12/* eslint-disable lines-between-class-members */
3+ /* eslint-disable consistent-return */
24import {
35 CLONE_EXPERIMENT ,
46 GET_EXPERIMENTS ,
@@ -8,6 +10,7 @@ import {
810} from 'root/redux/actions/experiments' ;
911import { NETPYNE_COMMANDS } from 'root/constants' ;
1012import * as GeppettoActions from '@metacell/geppetto-meta-client/common/actions' ;
13+ import * as ExperimentsApi from 'root/api/experiments' ;
1114import {
1215 UPDATE_CARDS ,
1316 CREATE_NETWORK ,
@@ -21,16 +24,15 @@ import {
2124 RESET_MODEL ,
2225 showNetwork ,
2326 MODEL_LOADED ,
24- changeInstanceColor ,
2527 addInstancesToCanvas ,
26- removeInstancesFromCanvas ,
2728} from '../actions/general' ;
2829import { openBackendErrorDialog } from '../actions/errors' ;
2930import { closeDrawerDialogBox } from '../actions/drawer' ;
3031import Utils from '../../Utils' ;
3132import { downloadJsonResponse , downloadPythonResponse } from './utils' ;
3233import * as Constants from '../../constants' ;
3334
35+ const SUPPORTED_TYPES = [ Constants . REAL_TYPE . INT , Constants . REAL_TYPE . FLOAT , Constants . REAL_TYPE . STR , Constants . REAL_TYPE . BOOL ] ;
3436let previousLayout = {
3537 edit : undefined ,
3638 network : undefined ,
@@ -119,7 +121,7 @@ const simulateNetwork = (payload) => createSimulateBackendCall(
119121class PythonMessageFilter {
120122 errorIds = new Set ( ) ;
121123 shouldLaunch ( e ) {
122- const errorId = e . additionalInfo ?. sim_id ;
124+ const errorId = e . additionalInfo ?. sim_id ;
123125 if ( ! errorId ) {
124126 return true ;
125127 }
@@ -214,26 +216,107 @@ export default (store) => (next) => (action) => {
214216 break ;
215217 }
216218 case CREATE_NETWORK : {
217- instantiateNetwork ( { } )
218- . then ( toNetworkCallback ( false ) , pythonErrorCallback ) ;
219+ let allParams = true ;
220+ ExperimentsApi . getParameters ( )
221+ . then ( ( params ) => {
222+ const flattened = Utils . flatten ( params ) ;
223+ const paramKeys = Object . keys ( flattened ) ;
224+
225+ const filteredKeys = paramKeys . filter ( ( key ) => {
226+ // TODO: avoid to fetch field twice!
227+ const field = Utils . getMetadataField ( `netParams.${ key } ` ) ;
228+ if ( field && SUPPORTED_TYPES . includes ( field . type ) ) {
229+ return true ;
230+ }
231+ return false ;
232+ } ) ;
233+ const expData = store . getState ( ) . experiments ;
234+ expData ?. inDesign ?. params ?. forEach ( ( param ) => {
235+ if ( ! filteredKeys . includes ( param . mapsTo ) ) {
236+ pythonErrorCallback (
237+ {
238+ errorDetails : 'Missing Parameters' ,
239+ errorMessage : 'Error' ,
240+ } ,
241+ ) ;
242+ allParams = false ;
243+ }
244+ } ) ;
245+ if ( allParams ) {
246+ instantiateNetwork ( { } )
247+ . then ( toNetworkCallback ( false ) , pythonErrorCallback ) ;
248+ }
249+ } , pythonErrorCallback ) ;
219250 break ;
220251 }
221252 case CREATE_SIMULATE_NETWORK : {
222- const payload = { allTrials : false , simId : new Date ( ) . getTime ( ) } ;
223- simulateNetwork ( payload )
224- . then ( toNetworkCallback ( false ) , pythonErrorCallback ) ;
253+ let allParams = true ;
254+ ExperimentsApi . getParameters ( )
255+ . then ( ( params ) => {
256+ const flattened = Utils . flatten ( params ) ;
257+ const paramKeys = Object . keys ( flattened ) ;
258+
259+ const filteredKeys = paramKeys . filter ( ( key ) => {
260+ // TODO: avoid to fetch field twice!
261+ const field = Utils . getMetadataField ( `netParams.${ key } ` ) ;
262+ if ( field && SUPPORTED_TYPES . includes ( field . type ) ) {
263+ return true ;
264+ }
265+ return false ;
266+ } ) ;
267+ const expData = store . getState ( ) . experiments ;
268+ expData ?. inDesign ?. params ?. forEach ( ( param ) => {
269+ if ( ! filteredKeys . includes ( param . mapsTo ) ) {
270+ pythonErrorCallback (
271+ {
272+ errorDetails : 'Missing Parameters' ,
273+ errorMessage : 'Error' ,
274+ } ,
275+ ) ;
276+ allParams = false ;
277+ }
278+ } ) ;
279+ if ( allParams ) {
280+ simulateNetwork ( { allTrials : false } )
281+ . then ( toNetworkCallback ( false ) , pythonErrorCallback ) ;
282+ }
283+ } , pythonErrorCallback ) ;
225284 break ;
226285 }
227- case SIMULATE_NETWORK :
228- // eslint-disable-next-line no-case-declarations
229- const payload = {
230- allTrials : action . payload ,
231- simId : new Date ( ) . getTime ( ) ,
232- usePrevInst : false ,
233- } ;
234- simulateNetwork ( payload )
235- . then ( toNetworkCallback ( false ) , pythonErrorCallback ) ;
286+ case SIMULATE_NETWORK : {
287+ let allParams = true ;
288+ ExperimentsApi . getParameters ( )
289+ . then ( ( params ) => {
290+ const flattened = Utils . flatten ( params ) ;
291+ const paramKeys = Object . keys ( flattened ) ;
292+
293+ const filteredKeys = paramKeys . filter ( ( key ) => {
294+ // TODO: avoid to fetch field twice!
295+ const field = Utils . getMetadataField ( `netParams.${ key } ` ) ;
296+ if ( field && SUPPORTED_TYPES . includes ( field . type ) ) {
297+ return true ;
298+ }
299+ return false ;
300+ } ) ;
301+ const expData = store . getState ( ) . experiments ;
302+ expData ?. inDesign ?. params ?. forEach ( ( param ) => {
303+ if ( ! filteredKeys . includes ( param . mapsTo ) ) {
304+ pythonErrorCallback (
305+ {
306+ errorDetails : 'Missing Parameters' ,
307+ errorMessage : 'Error' ,
308+ } ,
309+ ) ;
310+ allParams = false ;
311+ }
312+ } ) ;
313+ if ( allParams ) {
314+ simulateNetwork ( { allTrials : action . payload , usePrevInst : false } )
315+ . then ( toNetworkCallback ( false ) , pythonErrorCallback ) ;
316+ }
317+ } , pythonErrorCallback ) ;
236318 break ;
319+ }
237320 case PYTHON_CALL : {
238321 const callback = ( response ) => {
239322 switch ( action . cmd ) {
0 commit comments