def __init__(self, sVar, **kwds): if not isinstance(sVar, Var): raise DAE_Error( "%s is not a variable. Can only take the derivative of a Var" "component." % sVar) if "wrt" in kwds and "withrespectto" in kwds: raise TypeError( "Cannot specify both 'wrt' and 'withrespectto keywords " "in a DerivativeVar") wrt = kwds.pop('wrt', None) wrt = kwds.pop('withrespectto', wrt) try: num_contset = len(sVar._contset) except AttributeError: # This dictionary keeps track of where the ContinuousSet appears # in the index. This implementation assumes that every element # in an indexing set has the same dimension. sVar._contset = ComponentMap() sVar._derivative = {} if sVar.dim() == 0: num_contset = 0 else: sidx_sets = list(sVar.index_set().subsets()) loc = 0 for i, s in enumerate(sidx_sets): if s.ctype is ContinuousSet: sVar._contset[s] = loc _dim = s.dimen if _dim is None: raise DAE_Error( "The variable %s is indexed by a Set (%s) with a " "non-fixed dimension. A DerivativeVar may only be " "indexed by Sets with constant dimension" % (sVar, s.name)) elif _dim is UnknownSetDimen: raise DAE_Error( "The variable %s is indexed by a Set (%s) with an " "unknown dimension. A DerivativeVar may only be " "indexed by Sets with known constant dimension" % (sVar, s.name)) loc += s.dimen num_contset = len(sVar._contset) if num_contset == 0: raise DAE_Error( "The variable %s is not indexed by any ContinuousSets. A " "derivative may only be taken with respect to a continuous " "domain" % sVar) if wrt is None: # Check to be sure Var is indexed by single ContinuousSet and take # first deriv wrt that set if num_contset != 1: raise DAE_Error( "The variable %s is indexed by multiple ContinuousSets. " "The desired ContinuousSet must be specified using the " "keyword argument 'wrt'" % sVar) wrt = [ next(iter(sVar._contset.keys())), ] elif type(wrt) is ContinuousSet: if wrt not in sVar._contset: raise DAE_Error( "Invalid derivative: The variable %s is not indexed by " "the ContinuousSet %s" % (sVar, wrt)) wrt = [ wrt, ] elif type(wrt) is tuple or type(wrt) is list: for i in wrt: if type(i) is not ContinuousSet: raise DAE_Error( "Cannot take the derivative with respect to %s. " "Expected a ContinuousSet or a tuple of " "ContinuousSets" % i) if i not in sVar._contset: raise DAE_Error( "Invalid derivative: The variable %s is not indexed " "by the ContinuousSet %s" % (sVar, i)) wrt = list(wrt) else: raise DAE_Error( "Cannot take the derivative with respect to %s. " "Expected a ContinuousSet or a tuple of ContinuousSets" % i) wrtkey = [str(i) for i in wrt] wrtkey.sort() wrtkey = tuple(wrtkey) if wrtkey in sVar._derivative: raise DAE_Error( "Cannot create a new derivative variable for variable " "%s: derivative already defined as %s" % (sVar.name, sVar._derivative[wrtkey]().name)) sVar._derivative[wrtkey] = weakref.ref(self) self._sVar = sVar self._wrt = wrt kwds.setdefault('ctype', DerivativeVar) Var.__init__(self, sVar.index_set(), **kwds)
def __init__(self, sVar, **kwds): if not isinstance(sVar, Var): raise DAE_Error( "%s is not a variable. Can only take the derivative of a Var" "component." % sVar) if "wrt" in kwds and "withrespectto" in kwds: raise TypeError( "Cannot specify both 'wrt' and 'withrespectto keywords " "in a DerivativeVar") wrt = kwds.pop('wrt', None) wrt = kwds.pop('withrespectto', wrt) try: num_contset = len(sVar._contset) except AttributeError: # This dictionary keeps track of where the ContinuousSet appears # in the index. This implementation assumes that every element # in an indexing set has the same dimension. sVar._contset = {} sVar._derivative = {} if sVar.dim() == 0: num_contset = 0 elif sVar.dim() == 1: sidx_sets = sVar._index if sidx_sets.type() is ContinuousSet: sVar._contset[sidx_sets] = 0 else: sidx_sets = sVar._implicit_subsets loc = 0 for i, s in enumerate(sidx_sets): if s.type() is ContinuousSet: sVar._contset[s] = loc loc += s.dimen num_contset = len(sVar._contset) if num_contset == 0: raise DAE_Error( "The variable %s is not indexed by any ContinuousSets. A " "derivative may only be taken with respect to a continuous " "domain" % sVar) if wrt is None: # Check to be sure Var is indexed by single ContinuousSet and take # first deriv wrt that set if num_contset != 1: raise DAE_Error( "The variable %s is indexed by multiple ContinuousSets. " "The desired ContinuousSet must be specified using the " "keyword argument 'wrt'" % sVar) wrt = [next(iterkeys(sVar._contset)), ] elif type(wrt) is ContinuousSet: if wrt not in sVar._contset: raise DAE_Error( "Invalid derivative: The variable %s is not indexed by " "the ContinuousSet %s" % (sVar, wrt)) wrt = [wrt, ] elif type(wrt) is tuple or type(wrt) is list: for i in wrt: if type(i) is not ContinuousSet: raise DAE_Error( "Cannot take the derivative with respect to %s. " "Expected a ContinuousSet or a tuple of " "ContinuousSets" % i) if i not in sVar._contset: raise DAE_Error( "Invalid derivative: The variable %s is not indexed " "by the ContinuousSet %s" % (sVar, i)) wrt = list(wrt) else: raise DAE_Error( "Cannot take the derivative with respect to %s. " "Expected a ContinuousSet or a tuple of ContinuousSets" % i) wrtkey = [str(i) for i in wrt] wrtkey.sort() wrtkey = tuple(wrtkey) if wrtkey in sVar._derivative: raise DAE_Error( "Cannot create a new derivative variable for variable " "%s: derivative already defined as %s" % (sVar.name, sVar._derivative[wrtkey]().name)) sVar._derivative[wrtkey] = weakref.ref(self) self._sVar = sVar self._wrt = wrt kwds.setdefault('ctype', DerivativeVar) if sVar._implicit_subsets is None: arg = (sVar.index_set(),) else: arg = tuple(sVar._implicit_subsets) Var.__init__(self,*arg,**kwds)
def __init__(self, sVar, **kwds): if not isinstance(sVar, Var): raise DAE_Error( "%s is not a variable. Can only take the derivative of a Var component." % (sVar)) if "wrt" in kwds and "withrespectto" in kwds: raise TypeError( "Cannot specify both 'wrt' and 'withrespectto keywords " "in a DerivativeVar") wrt = kwds.pop('wrt', None) wrt = kwds.pop('withrespectto', wrt) try: num_contset = len(sVar._contset) except: sVar._contset = {} sVar._derivative = {} if sVar.dim() == 0: num_contset = 0 elif sVar.dim() == 1: sidx_sets = sVar._index if sidx_sets.type() is ContinuousSet: sVar._contset[sidx_sets] = 0 else: sidx_sets = sVar._implicit_subsets for i, s in enumerate(sidx_sets): if s.type() is ContinuousSet: sVar._contset[s] = i num_contset = len(sVar._contset) if num_contset == 0: raise DAE_Error( "The variable %s is not indexed by any ContinuousSets. A derivative may " "only be taken with respect to a continuous domain" % (sVar)) if wrt == None: # Check to be sure Var is indexed by single ContinuousSet and take # first deriv wrt that set if num_contset != 1: raise DAE_Error( "The variable %s is indexed by multiple ContinuousSets. The desired " "ContinuousSet must be specified using the keyword argument 'wrt'" % (sVar)) wrt = [ next(iterkeys(sVar._contset)), ] elif type(wrt) is ContinuousSet: if wrt not in sVar._contset: raise DAE_Error( "Invalid derivative: The variable %s is not indexed by " "the ContinuousSet %s" % (sVar, wrt)) wrt = [ wrt, ] elif type(wrt) is tuple or type(wrt) is list: for i in wrt: if type(i) is not ContinuousSet: raise DAE_Error( "Cannot take the derivative with respect to %s. " "Expected a ContinuousSet or a tuple of ContinuousSets" % (i)) if i not in sVar._contset: raise DAE_Error( "Invalid derivative: The variable %s is not indexed by " "the ContinuousSet %s" % (sVar, i)) wrt = list(wrt) else: raise DAE_Error( "Cannot take the derivative with respect to %s. " "Expected a ContinuousSet or a tuple of ContinuousSets" % (i)) wrtkey = [str(i) for i in wrt] wrtkey.sort() wrtkey = tuple(wrtkey) if wrtkey in sVar._derivative: raise DAE_Error( "Cannot create a new derivative variable for variable " "%s: derivative already defined as %s" % (sVar.cname(True), sVar.get_derivative(*tuple(wrt)).cname(True))) sVar._derivative[wrtkey] = weakref.ref(self) self._sVar = sVar self._wrt = wrt kwds.setdefault('ctype', DerivativeVar) if sVar._implicit_subsets is None: arg = (sVar.index_set(), ) else: arg = tuple(sVar._implicit_subsets) Var.__init__(self, *arg, **kwds)
def __init__(self, sVar, **kwds): if not isinstance(sVar,Var): raise DAE_Error( "%s is not a variable. Can only take the derivative of a Var component." % (sVar)) if "wrt" in kwds and "withrespectto" in kwds: raise TypeError( "Cannot specify both 'wrt' and 'withrespectto keywords " "in a DerivativeVar") wrt = kwds.pop('wrt',None) wrt = kwds.pop('withrespectto',wrt) try: num_contset = len(sVar._contset) except: sVar._contset = {} sVar._derivative = {} if sVar.dim() == 0: num_contset = 0 elif sVar.dim() == 1: sidx_sets = sVar._index if sidx_sets.type() is ContinuousSet: sVar._contset[sidx_sets] = 0 else: sidx_sets = sVar._implicit_subsets for i,s in enumerate(sidx_sets): if s.type() is ContinuousSet: sVar._contset[s] = i num_contset = len(sVar._contset) if num_contset == 0: raise DAE_Error("The variable %s is not indexed by any ContinuousSets. A derivative may " "only be taken with respect to a continuous domain" % (sVar)) if wrt == None: # Check to be sure Var is indexed by single ContinuousSet and take # first deriv wrt that set if num_contset != 1: raise DAE_Error( "The variable %s is indexed by multiple ContinuousSets. The desired " "ContinuousSet must be specified using the keyword argument 'wrt'" % (sVar)) wrt = [next(iterkeys(sVar._contset)),] elif type(wrt) is ContinuousSet: if wrt not in sVar._contset: raise DAE_Error( "Invalid derivative: The variable %s is not indexed by " "the ContinuousSet %s" %(sVar,wrt)) wrt = [wrt,] elif type(wrt) is tuple or type(wrt) is list: for i in wrt: if type(i) is not ContinuousSet: raise DAE_Error( "Cannot take the derivative with respect to %s. " "Expected a ContinuousSet or a tuple of ContinuousSets"% (i)) if i not in sVar._contset: raise DAE_Error( "Invalid derivative: The variable %s is not indexed by " "the ContinuousSet %s" %(sVar,i)) wrt = list(wrt) else: raise DAE_Error( "Cannot take the derivative with respect to %s. " "Expected a ContinuousSet or a tuple of ContinuousSets"% (i)) wrtkey = [str(i) for i in wrt] wrtkey.sort() wrtkey = tuple(wrtkey) if wrtkey in sVar._derivative: raise DAE_Error( "Cannot create a new derivative variable for variable " "%s: derivative already defined as %s" % ( sVar.cname(True), sVar.get_derivative(*tuple(wrt)).cname(True) ) ) sVar._derivative[wrtkey] = weakref.ref(self) self._sVar = sVar self._wrt = wrt kwds.setdefault('ctype', DerivativeVar) if sVar._implicit_subsets is None: arg = (sVar.index_set(),) else: arg = tuple(sVar._implicit_subsets) Var.__init__(self,*arg,**kwds)