Skip to content

Commit 68087f6

Browse files
committed
Merge branch 'development' of https://github.com/MetaCell/netpyne-ui into feature/417
2 parents 643a482 + bc5e0eb commit 68087f6

File tree

3 files changed

+102
-19
lines changed

3 files changed

+102
-19
lines changed

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ ipython-genutils==0.2.0
2020
ipywidgets==7.5.1
2121
jedi==0.17.0
2222
Jinja2==2.11.2
23+
jsonpickle==2.1.0
2324
jsonschema==3.2.0
2425
jupyter==1.0.0
2526
jupyter-client==6.1.3

webapp/components/experiments/ExperimentEdit.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import ParameterMenu from './ParameterMenu';
2626
import useStyles from './ExperimentEditStyle';
2727
import * as ExperimentHelper from './ExperimentHelper';
2828
import DialogBox from '../general/DialogBox';
29-
3029
const RANGE_VALUE = 0;
3130
const SUPPORTED_TYPES = [REAL_TYPE.INT, REAL_TYPE.FLOAT, REAL_TYPE.STR, REAL_TYPE.BOOL];
3231
const MAX_TRIALS = 100;
@@ -198,7 +197,7 @@ const ExperimentEdit = (props) => {
198197
const experiments = useSelector((state) => state.experiments.experiments);
199198

200199
let numberOfTrials = 1;
201-
200+
// const dispatch = useDispatch();
202201
const validateParameter = (param) => {
203202
let updatedParam = param;
204203
if (param.type === LIST) {

webapp/redux/middleware/middleware.js

Lines changed: 100 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
/* eslint-disable no-nested-ternary */
12
/* eslint-disable lines-between-class-members */
3+
/* eslint-disable consistent-return */
24
import {
35
CLONE_EXPERIMENT,
46
GET_EXPERIMENTS,
@@ -8,6 +10,7 @@ import {
810
} from 'root/redux/actions/experiments';
911
import { NETPYNE_COMMANDS } from 'root/constants';
1012
import * as GeppettoActions from '@metacell/geppetto-meta-client/common/actions';
13+
import * as ExperimentsApi from 'root/api/experiments';
1114
import {
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';
2829
import { openBackendErrorDialog } from '../actions/errors';
2930
import { closeDrawerDialogBox } from '../actions/drawer';
3031
import Utils from '../../Utils';
3132
import { downloadJsonResponse, downloadPythonResponse } from './utils';
3233
import * 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];
3436
let previousLayout = {
3537
edit: undefined,
3638
network: undefined,
@@ -119,7 +121,7 @@ const simulateNetwork = (payload) => createSimulateBackendCall(
119121
class 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

Comments
 (0)