Changeset 728
- Timestamp:
- 08/25/10 20:52:52 (1 year ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
PythonPackages/FuncDesigner/FuncDesigner/ooFun.py
r726 r728 69 69 _lastDiffVarsID = 0 70 70 _lastFuncVarsID = 0 71 _lastOrderVarsID = 0 71 72 72 73 _usedIn = 0 … … 83 84 _d_val_prev = None 84 85 #_c = 0.0 85 86 __array_priority__ = 15# set it greater than 1 to prevent invoking numpy array __mul__ etc 87 86 88 pWarn = lambda self, msg: pWarn(msg) 89 87 90 def disp(self, msg): 88 91 print(msg) 89 92 90 __array_priority__ = 15# set it greater than 1 to prevent invoking numpy array __mul__ etc91 92 93 93 def __getattr__(self, attr): 94 if attr != 'size': raise AttributeError 94 if attr != 'size': raise AttributeError('you are trying to obtain incorrect attribute "%s" for FuncDesigner oofun "%s"' %(attr, self.name)) 95 95 96 96 # to prevent creating of several oofuns binded to same oofun.size … … 175 175 if isinstance(other, oofun): 176 176 r = oofun(lambda x, y: x+y, [self, other], d = (lambda x, y: aux_d(x, y), lambda x, y: aux_d(y, x))) 177 r.discrete = self.discrete and other.discrete 178 r.getOrder = lambda *args, **kwargs: max((self.getOrder(*args, **kwargs), other.getOrder(*args, **kwargs))) 177 179 else: 178 180 other = array(other, 'float') … … 189 191 r._getFuncCalcEngine = lambda *args, **kwargs: self._getFuncCalcEngine(*args, **kwargs) + other 190 192 r.discrete = self.discrete 193 r.getOrder = self.getOrder 191 194 if (other.size == 1 or ('size' in self.__dict__ and self.size == other.size)): 192 195 r._D = lambda *args, **kwargs: self._D(*args, **kwargs) … … 203 206 r = oofun(lambda a: -a, self, d = lambda a: -Eye(Len(a)), is_linear = self.is_linear) 204 207 r._getFuncCalcEngine = lambda *args, **kwargs: -self._getFuncCalcEngine(*args, **kwargs) 208 r.getOrder = self.getOrder 205 209 r._D = lambda *args, **kwargs: dict([(key, -value) for key, value in self._D(*args, **kwargs).items()]) 206 210 r.d = raise_except … … 208 212 209 213 # overload "a-b" 210 __sub__ = lambda self, other: self + (-array(other, 'float')) if isinstance(other, list) and type(other[0]) in (int, float) else self + (-other)214 __sub__ = lambda self, other: self + (-array(other, 'float')) if type(other) in (list, tuple, ndarray) and type(other[0]) in (int, float) else self + (-other) 211 215 __rsub__ = lambda self, other: other + (-self) 212 216 … … 233 237 return r 234 238 r.d = (aux_dx, aux_dy) 239 def getOrder(*args, **kwargs): 240 order1, order2 = self.getOrder(*args, **kwargs), other.getOrder(*args, **kwargs) 241 return order1 if order2 == 0 else inf 242 r.getOrder = getOrder 235 243 else: 236 244 other = array(other,'float') 237 245 r = oofun(lambda a: a/other, self, discrete = self.discrete)# TODO: involve sparsity if possible! 246 r.getOrder = self.getOrder 238 247 r._getFuncCalcEngine = lambda *args, **kwargs: self._getFuncCalcEngine(*args, **kwargs) / other 239 248 r.d = lambda x: 1.0/other if (isscalar(x) or x.size == 1) else Diag(ones(x.size)/other) … … 254 263 r.d = lambda x: Diag(- other / x**2) 255 264 #r.isCostly = True 265 def getOrder(*args, **kwargs): 266 order = self.getOrder(*args, **kwargs) 267 return 0 if order == 0 else inf 268 r.getOrder = getOrder 256 269 return r 257 270 … … 274 287 r = oofun(lambda x, y: x*y, [self, other]) 275 288 r.d = (lambda x, y: aux_d(x, y), lambda x, y: aux_d(y, x)) 289 r.getOrder = lambda *args, **kwargs: self.getOrder(*args, **kwargs) + other.getOrder(*args, **kwargs) 276 290 else: 277 291 other = array(other, 'float') 278 292 r = oofun(lambda x: x*other, self, discrete = self.discrete) 293 r.getOrder = self.getOrder 279 294 r._getFuncCalcEngine = lambda *args, **kwargs: other * self._getFuncCalcEngine(*args, **kwargs) 280 295 r.d = lambda x: aux_d(x, other) … … 355 370 return r 356 371 357 r = oofun(f, self, d = d, size = 1 )372 r = oofun(f, self, d = d, size = 1, getOrder = self.getOrder) 358 373 # TODO: check me! 359 374 # what about a[a.size/2:]? 360 375 if self.is_linear and not isinstance(ind, oofun): 361 376 r.is_linear = True 362 363 377 364 378 # TODO: edit me! … … 389 403 r = hstack((m1, m2, m3)) 390 404 return r 391 r = oofun(f, self, d = d )405 r = oofun(f, self, d = d, getOrder = self.getOrder) 392 406 if self.is_linear: 393 407 r.is_linear = True … … 399 413 400 414 def sum(self): 401 r = oofun(sum, self )415 r = oofun(sum, self, getOrder = self.getOrder) 402 416 def d(x): 403 417 if type(x) == ndarray and x.ndim > 1: raise FuncDesignerException('sum(x) is not implemented yet for arrays with ndim > 1') … … 409 423 # TODO: consider using r.isCostly = True 410 424 r = oofun(prod, self) 425 #r.getOrder = lambda *args, **kwargs: self.getOrder(*args, **kwargs)*self.size 411 426 def d(x): 412 427 x = asarray(x) # prod is used rarely, so optimizing it is not important … … 536 551 tmp = x.get(self, None) 537 552 if tmp is not None: 538 return float(tmp) if isscalar(tmp) else a rray(tmp, 'float')553 return float(tmp) if isscalar(tmp) else asfarray(tmp) 539 554 elif self.name in x: 540 555 return asfarray(x[self.name]) … … 726 741 ac += 1 727 742 tmp = derivativeSelf[ac] 728 #assert tmp.ndim > 1729 743 730 744 if inp in r: … … 752 766 else: 753 767 t1, t2 = self._considerSparse(t1, val) 754 # if t1.ndim > 1 or t2.ndim > 1:755 # # warning! t1,t2 can be sparse matrices, so I don't use t = atleast_2d(t) directly756 # if t2.ndim < 2:757 # #assert t1.ndim > 1, 'error in FuncDesigner kernel, inform developers'758 # if t1.shape[1] != t2.shape[0]:759 # t2 = t2.reshape(1, -1)760 # else:761 # # hence these are ndarrays762 # if self._getFuncCalcEngine(x).size > 1:763 # t1 = t1.reshape(-1, 1)764 # t2 = t2.reshape(1, -1)765 # else:766 # t1 = t1.reshape(1, -1)767 # t2 = t2.reshape(-1, 1)768 768 769 769 if not type(t1) == type(t2) == ndarray: … … 955 955 func_name=self.name, diffInt=self.diffInt, pointVal = val, args=self.args, \ 956 956 stencil = max((3, self.stencil)), maxViolation=self.maxViolation, varForCheck = i) 957 957 958 def getOrder(self, Vars=None, fixedVars=None, fixedVarsScheduleID=-1): 959 # returns polinomial order of the oofun 960 if isinstance(Vars, oofun): Vars = set([Vars]) 961 elif Vars is not None and type(Vars) != set: Vars = set([Vars]) 962 963 if isinstance(fixedVars, oofun): fixedVars = set([fixedVars]) 964 elif fixedVars is not None and type(fixedVars) != set: fixedVars = set(fixedVars) 965 966 sameVarsScheduleID = fixedVarsScheduleID == self._lastOrderVarsID 967 rebuildFixedCheck = not sameVarsScheduleID 968 if fixedVarsScheduleID != -1: self._lastOrderVarsID = fixedVarsScheduleID 969 970 if rebuildFixedCheck: 971 # ajust new value of self._order wrt new free/fixed vars schedule 972 if self.discrete: self._order = 0 973 974 if self.is_oovar: 975 if (fixedVars is not None and self in fixedVars) or (Vars is not None and self not in Vars): 976 self._order = 0 977 else: 978 self._order = 1 979 else: 980 self._order = inf 981 982 return self._order 958 983 959 984 # TODO: should broadcast return non-void result? 960 961 985 def _broadcast(self, func, *args, **kwargs): 962 986 if self._broadcast_id == oofun._BroadCastID: … … 973 997 c._broadcast(func, *args, **kwargs) 974 998 func(self) 975 999 1000 976 1001 """ End of class oofun """ 977 1002 PythonPackages/FuncDesigner/FuncDesigner/overloads.py
r714 r728 148 148 _inp = set(INP) 149 149 #!!!!!!!!!!!!!!!!!! TODO: check INP for complex cases (not list of oovars) 150 150 151 r = oofun(f, INP, is_linear=is_linear) 152 153 def getOrder(*args, **kwargs): 154 orders = [0]+[inp.getOrder(*args, **kwargs) for inp in INP] 155 return max(orders) 156 r.getOrder = getOrder 157 151 158 def _D(point, fixedVarsScheduleID, Vars=None, fixedVars = None, useSparse = 'auto'): 152 159 # TODO: handle involvePrevData … … 205 212 if len(args) != 0 or len(kwargs) != 0: 206 213 raise FuncDesignerException('oofun for prod(x, *args,**kwargs) is not implemented yet') 214 #r.getOrder = lambda *args, **kwargs: prod([(1 if not isinstance(inp, oofun) else inp.getOrder(*args, **kwargs)) for inp in self.input]) 207 215 return inp.prod() 208 216
