def fit(self, name, free_pars, parest=None): """Fit an individual candidate model in its context, peforming parameter optimization on the given free parameters. """ model = self.manager[name] assert remain(free_pars, model.pars) == [], "Invalid free variables" model.set(verboselevel=self.verboselevel) # get initial results of context at default parameters # if success then done already if self.context.evaluate(model): return filteredDict(model.pars, free_pars) # determine parameter sensitivity of the free parameters # dict of par -> sensitivity #sens = param_sensitivity(model, self.context, free_pars) print("Get pre-defined tols from features somehow") print("Establish parameter estimation class and run it")
def newCurve(self, initargs): """Create new curve with arguments specified in the dictionary initargs.""" curvetype = initargs['type'].upper() if curvetype not in self.curve_list: raise PyDSTool_TypeError(str(curvetype) + ' not an allowable curve type') # Check name cname = initargs['name'] if 'force' in initargs: if initargs['force'] and cname in self.curves: del self.curves[cname] if cname in self.curves: raise ValueError('Ambiguous name field: ' + cname \ + ' already exists (use force=True to override)') # Check parameters if (curvetype != 'UD-C' and self.model.pars == {}) or \ (curvetype == 'UD-C' and 'userpars' not in initargs): raise ValueError('No parameters defined for this system!') # Process initial point initargs = initargs.copy() # ensures no side-effects outside if 'initpoint' not in initargs or initargs['initpoint'] is None: # Default to initial conditions for model if self.model.icdict == {}: raise ValueError('No initial point defined for this system!') elif 'uservars' in initargs: if remain(initargs['uservars'], self.model.icdict.keys()) == []: # uservars just used to select a subset of system's regular state vars initargs['initpoint'] = filteredDict(self.model.icdict, initargs['uservars']) else: raise ValueError('No initial point defined for this system!') else: initargs['initpoint'] = self.model.icdict.copy() #for p in initargs['freepars']: # initargs['initpoint'][p] = self.model.pars[p] else: if isinstance(initargs['initpoint'], dict): initargs['initpoint'] = initargs['initpoint'].copy() #for p in initargs['freepars']: # if p not in initargs['initpoint'].keys(): # initargs['initpoint'][p] = self.model.pars[p] elif isinstance(initargs['initpoint'], str): curvename, pointname = initargs['initpoint'].split(':') pointtype = pointname.strip('0123456789') if curvename not in self.curves: raise KeyError('No curve of name ' + curvename + ' exists.') else: point = self.curves[curvename].getSpecialPoint(pointtype, pointname) if point is None: raise KeyError('No point of name ' + pointname + ' exists.') else: initargs['initpoint'] = point # Separate from if-else above since 'str' clause returns type Point if isinstance(initargs['initpoint'], Point): # Check to see if point contains a cycle. If it does, assume # we are starting at a cycle and save it in initcycle for v in initargs['initpoint'].labels.values(): if 'cycle' in v: initargs['initcycle'] = v # Dictionary w/ cycle, name, and tangent information # Save initial point information initPoint = {} if 'curvename' in locals() and curvename in self.curves: initPoint = self.curves[curvename].parsdict.copy() initPoint.update(initargs['initpoint'].copy().todict()) initargs['initpoint'] = initPoint # initargs['initpoint'] = initargs['initpoint'].copy().todict() #for p in initargs['freepars']: # if p not in initargs['initpoint'].keys(): # initargs['initpoint'][p] = self.model.pars[p] # Process cycle if 'initcycle' in initargs: if isinstance(initargs['initcycle'], ndarray): c0 = {} c0['data'] = args(V = {'udotps': None, 'rldot': None}) c0['cycle'] = Pointset({'coordnames': self.gensys.funcspec.vars, 'coordarray': initargs['initcycle'][1:,:].copy(), 'indepvarname': 't', 'indepvararray': initargs['initcycle'][0,:].copy() }) initargs['initcycle'] = c0 elif isinstance(initargs['initcycle'], Pointset): c0 = {} c0['data'] = args(V = {'udotps': None, 'rldot': None}) c0['cycle'] = initargs['initcycle'] initargs['initcycle'] = c0 # Load auto module if required automod = None if curvetype in auto_list: if self._autoMod is None: self.loadAutoMod() automod = self._autoMod self.curves[cname] = self.curve_list[curvetype](self.model, self.gensys, automod, self.plot, initargs)
def newCurve(self, initargs): """Create new curve with arguments specified in the dictionary initargs.""" curvetype = initargs['type'].upper() if curvetype not in self.curve_list: raise PyDSTool_TypeError( str(curvetype) + ' not an allowable curve type') # Check name cname = initargs['name'] if 'force' in initargs: if initargs['force'] and cname in self.curves: del self.curves[cname] if cname in self.curves: raise ValueError('Ambiguous name field: ' + cname \ + ' already exists (use force=True to override)') # Check parameters if (curvetype != 'UD-C' and self.model.pars == {}) or \ (curvetype == 'UD-C' and 'userpars' not in initargs): raise ValueError('No parameters defined for this system!') # Process initial point initargs = initargs.copy() # ensures no side-effects outside if 'initpoint' not in initargs or initargs['initpoint'] is None: # Default to initial conditions for model if self.model.icdict == {}: raise ValueError('No initial point defined for this system!') elif 'uservars' in initargs: if remain(initargs['uservars'], self.model.icdict.keys()) == []: # uservars just used to select a subset of system's regular state vars initargs['initpoint'] = filteredDict( self.model.icdict, initargs['uservars']) else: raise ValueError( 'No initial point defined for this system!') else: initargs['initpoint'] = self.model.icdict.copy() #for p in initargs['freepars']: # initargs['initpoint'][p] = self.model.pars[p] else: if isinstance(initargs['initpoint'], dict): initargs['initpoint'] = initargs['initpoint'].copy() #for p in initargs['freepars']: # if p not in initargs['initpoint'].keys(): # initargs['initpoint'][p] = self.model.pars[p] elif isinstance(initargs['initpoint'], str): curvename, pointname = initargs['initpoint'].split(':') pointtype = pointname.strip('0123456789') if curvename not in self.curves: raise KeyError('No curve of name ' + curvename + ' exists.') else: point = self.curves[curvename].getSpecialPoint( pointtype, pointname) if point is None: raise KeyError('No point of name ' + pointname + ' exists.') else: initargs['initpoint'] = point # Separate from if-else above since 'str' clause returns type Point if isinstance(initargs['initpoint'], Point): # Check to see if point contains a cycle. If it does, assume # we are starting at a cycle and save it in initcycle for v in initargs['initpoint'].labels.values(): if 'cycle' in v: initargs[ 'initcycle'] = v # Dictionary w/ cycle, name, and tangent information # Save initial point information initPoint = {} if 'curvename' in locals() and curvename in self.curves: initPoint = self.curves[curvename].parsdict.copy() initPoint.update(initargs['initpoint'].copy().todict()) initargs['initpoint'] = initPoint # initargs['initpoint'] = initargs['initpoint'].copy().todict() #for p in initargs['freepars']: # if p not in initargs['initpoint'].keys(): # initargs['initpoint'][p] = self.model.pars[p] # Process cycle if 'initcycle' in initargs: if isinstance(initargs['initcycle'], ndarray): c0 = {} c0['data'] = args(V={'udotps': None, 'rldot': None}) c0['cycle'] = Pointset({ 'coordnames': self.gensys.funcspec.vars, 'coordarray': initargs['initcycle'][1:, :].copy(), 'indepvarname': 't', 'indepvararray': initargs['initcycle'][0, :].copy() }) initargs['initcycle'] = c0 elif isinstance(initargs['initcycle'], Pointset): c0 = {} c0['data'] = args(V={'udotps': None, 'rldot': None}) c0['cycle'] = initargs['initcycle'] initargs['initcycle'] = c0 # Load auto module if required automod = None if curvetype in auto_list: if self._autoMod is None: self.loadAutoMod() automod = self._autoMod self.curves[cname] = self.curve_list[curvetype](self.model, self.gensys, automod, self.plot, initargs)