|
47 | 47 | os.chdir(constants.NETPYNE_WORKDIR_PATH) |
48 | 48 |
|
49 | 49 |
|
50 | | -class NepyneValidationError(Exception): |
| 50 | +class NetpyneValidationError(Exception): |
51 | 51 | ... |
52 | 52 |
|
53 | 53 |
|
| 54 | +def deepcopy_wout_empty(d, memo=None): |
| 55 | + def is_empty(x): |
| 56 | + return x == '' or x == [] or x == () or x == set() or x == {} or x is None |
| 57 | + |
| 58 | + # if is_empty(d): |
| 59 | + # return None |
| 60 | + memo = {} if memo is None else memo |
| 61 | + if id(d) in memo: |
| 62 | + return memo[id(d)] |
| 63 | + if isinstance(d, dict): |
| 64 | + cpy = {} |
| 65 | + for k, v in d.items(): |
| 66 | + v_cpy = deepcopy_wout_empty(v, memo=memo) |
| 67 | + if is_empty(v_cpy): |
| 68 | + continue |
| 69 | + cpy[k] = memo.setdefault(id(v), v_cpy) |
| 70 | + return cpy |
| 71 | + elif isinstance(d, (list, set, tuple)): |
| 72 | + return d.__class__(memo.setdefault(id(v), deepcopy_wout_empty(v, memo=memo)) for v in d if not is_empty(v)) |
| 73 | + elif hasattr(d, '__dict__'): |
| 74 | + cpy = d.__new__(d.__class__) # We skip the initializer, in case it needs some arguments |
| 75 | + for k, v in d.__dict__.items(): |
| 76 | + v_cpy = deepcopy_wout_empty(v, memo=memo) |
| 77 | + # if is_empty(v_cpy): # |
| 78 | + # continue |
| 79 | + cpy.__dict__[k] = memo.setdefault(id(v), v_cpy) |
| 80 | + return cpy |
| 81 | + return d |
| 82 | + |
| 83 | + |
54 | 84 | class NetPyNEGeppetto: |
55 | 85 |
|
56 | 86 | def __init__(self): |
@@ -189,6 +219,11 @@ def instantiateNetPyNEModelInGeppetto(self, args): |
189 | 219 | self.geppetto_model = self.model_interpreter.getGeppettoModel(netpyne_model) |
190 | 220 |
|
191 | 221 | return json.loads(GeppettoModelSerializer.serialize(self.geppetto_model)) |
| 222 | + except NetpyneValidationError as e: |
| 223 | + message = ("Error while validating the NetPyNE model before instantiation.\n" |
| 224 | + "One or more components in your model have issues, see details below:") |
| 225 | + logging.exception(message) |
| 226 | + return utils.getJSONError(message, '\n'.join(e.args)) |
192 | 227 | except Exception as e: |
193 | 228 | message = "Error while instantiating the NetPyNE model" |
194 | 229 | logging.exception(message) |
@@ -260,22 +295,24 @@ def simulate_single_model(self, experiment: model.Experiment = None, use_prev_in |
260 | 295 | response = json.loads(GeppettoModelSerializer.serialize(self.geppetto_model)) |
261 | 296 | return response |
262 | 297 |
|
| 298 | + |
263 | 299 | def validate_netParams(self): |
264 | | - _, failed = sim.validator.validateNetParams(self.netParams) |
| 300 | + cpy = deepcopy_wout_empty(self.netParams) |
| 301 | + _, failed = sim.validator.validateNetParams(cpy) |
265 | 302 | if failed: |
266 | | - message = "One or more components in your model have issues, see details below:\n" |
| 303 | + message = "" |
267 | 304 | components_error = {} |
268 | 305 | for entry in failed: |
269 | 306 | components_error.setdefault(entry.component, []).append((entry.keyPath, entry.summary)) |
270 | 307 | for component, details in components_error.items(): |
271 | | - message = message + f" * Error validating {component}\n" |
| 308 | + message = message + f"* Error validating {component}\n" |
272 | 309 | for (keyPath, summary) in details: |
273 | | - path = ' -> '.join(f"{key!r}" for key in keyPath) |
274 | | - message = message + f" Error in {path}\n" |
| 310 | + path = ' -> '.join(f"{key}" for key in keyPath) |
| 311 | + message = message + f" Error in {path}\n" |
275 | 312 | for line in summary: |
276 | | - message = message + f" {line}\n" |
| 313 | + message = message + f" {line}\n" |
277 | 314 | message = message + "\n" |
278 | | - raise NepyneValidationError(message) |
| 315 | + raise NetpyneValidationError(message) |
279 | 316 |
|
280 | 317 |
|
281 | 318 | def simulateNetPyNEModelInGeppetto(self, args): |
@@ -323,6 +360,11 @@ def simulateNetPyNEModelInGeppetto(self, args): |
323 | 360 |
|
324 | 361 | else: |
325 | 362 | return self.simulate_single_model(use_prev_inst=use_prev_inst) |
| 363 | + except NetpyneValidationError as e: |
| 364 | + message = (f"Error while validating the NetPyNE model before simualtion {sim_id}.\n" |
| 365 | + "One or more components in your model have issues, see details below:") |
| 366 | + logging.exception(message) |
| 367 | + return utils.getJSONError(message, '\n'.join(e.args)) |
326 | 368 |
|
327 | 369 | except Exception as e : |
328 | 370 | message = f"Error while simulating the NetPyNE model: {e}. SimulationId {sim_id}" |
@@ -763,6 +805,7 @@ def deleteModel(self, modelParams): |
763 | 805 | return utils.getJSONReply() |
764 | 806 |
|
765 | 807 | def instantiateNetPyNEModel(self): |
| 808 | + self.validate_netParams() |
766 | 809 | with redirect_stdout(sys.__stdout__): |
767 | 810 | saveData = sim.allSimData if hasattr(sim, 'allSimData') and 'spkt' in sim.allSimData.keys() and len( |
768 | 811 | sim.allSimData['spkt']) > 0 else False |
|
0 commit comments