def relog(_logf, _logt, _dt): # Get first occurence of error ifirstf, kfirstf = find_error_position(_logf) ifirstt, kfirstt = find_error_position(_logt) if kfirstf is None and kfirstt is None: raise myokit.FindNanError('Error condition not found in logs.') elif kfirstf is None: ifirst = ifirstt elif kfirstt is None: ifirst = ifirstf elif ifirstf == 0 or ifirstt == 0: raise myokit.FindNanError( 'Unable to work with simulation logs where the error' ' condition is met in the very first data point.') else: ifirst = min(ifirstf, ifirstt) # Position to start deep search at istart = ifirst - 1 # Get last logged states before error statef = [] statet = [] for dims in myokit._dimco(*self._ncellsf): pre = '.'.join([str(x) for x in dims]) + '.' for s in self._modelf.states(): statef.append(_logf[pre + s.qname()][istart]) for dims in myokit._dimco(*self._ncellst): pre = '.'.join([str(x) for x in dims]) + '.' for s in self._modelt.states(): statet.append(_logt[pre + s.qname()][istart]) # Get last time before error time = _logf[time_varf][istart] # Save current state & time old_statef = self._statef old_statet = self._statet old_time = self._time self._statef = statef self._statet = statet self._time = time # Run until next time point, log every step duration = _logf[time_varf][ifirst] - time log = myokit.LOG_BOUND + myokit.LOG_STATE _logf, _logt = self.run(duration, logf=log, logt=log, log_interval=_dt, report_nan=False) # Reset simulation to original state self._statef = old_statef self._statet = old_statet self._time = old_time # Return new logs return _logf, _logt
def relog(_log, _dt): # Get first occurence of error ifirst, kfirst = find_error_position(_log) if kfirst is None: raise myokit.FindNanError('Error condition not found in log.') if ifirst == 0: raise myokit.FindNanError( 'Unable to work with simulation logs where the error' ' condition is met in the very first data point.') # Position to start deep search at istart = ifirst - 1 # Get last logged state before error state = [] for dims in myokit._dimco(*self._dims): pre = '.'.join([str(x) for x in dims]) + '.' for s in self._model.states(): state.append(_log[pre + s.qname()][istart]) # Get last time before error time = _log[time_var][istart] # Save current state & time old_state = self._state old_time = self._time self._state = state self._time = time # Run until next time point, log every step duration = _log[time_var][ifirst] - time _log = self.run(duration, log=myokit.LOG_BOUND + myokit.LOG_STATE, log_interval=_dt, report_nan=False) # Reset simulation to original state self._state = old_state self._time = old_time # Return new log return _log
def find_error_position(_log): # Find first occurence of out-of-bounds error ifirst = None kfirst = None post = '.' + watch_var.qname() lower, upper = safe_range for dims in myokit._dimco(*self._dims): key = '.'.join([str(x) for x in dims]) + post ar = np.array(_log[key], copy=False) i = np.where((ar < lower) | (ar > upper) | np.isnan(ar) | np.isinf(ar))[0] if len(i) > 0: i = i[0] if ifirst is None: kfirst = key ifirst = i elif i < ifirst: kfirst = key ifirst = i if i == 0: break return ifirst, kfirst