Changeset 728

Show
Ignore:
Timestamp:
08/25/10 20:52:52 (1 year ago)
Author:
dmitrey
Message:

some changes wrt FD func getOrder

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • PythonPackages/FuncDesigner/FuncDesigner/ooFun.py

    r726 r728  
    6969    _lastDiffVarsID = 0 
    7070    _lastFuncVarsID = 0 
     71    _lastOrderVarsID = 0 
    7172 
    7273    _usedIn = 0 
     
    8384    _d_val_prev = None 
    8485    #_c = 0.0 
    85  
     86    __array_priority__ = 15# set it greater than 1 to prevent invoking numpy array __mul__ etc 
     87     
    8688    pWarn = lambda self, msg: pWarn(msg) 
     89     
    8790    def disp(self, msg):  
    8891        print(msg) 
    8992     
    90     __array_priority__ = 15# set it greater than 1 to prevent invoking numpy array __mul__ etc 
    91  
    92      
    9393    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)) 
    9595         
    9696        # to prevent creating of several oofuns binded to same oofun.size 
     
    175175        if isinstance(other, oofun): 
    176176            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))) 
    177179        else: 
    178180            other = array(other, 'float') 
     
    189191            r._getFuncCalcEngine = lambda *args,  **kwargs: self._getFuncCalcEngine(*args,  **kwargs) + other 
    190192            r.discrete = self.discrete 
     193            r.getOrder = self.getOrder 
    191194            if (other.size == 1 or ('size' in self.__dict__ and self.size == other.size)):  
    192195                r._D = lambda *args,  **kwargs: self._D(*args,  **kwargs)  
     
    203206        r = oofun(lambda a: -a, self, d = lambda a: -Eye(Len(a)), is_linear = self.is_linear) 
    204207        r._getFuncCalcEngine = lambda *args,  **kwargs: -self._getFuncCalcEngine(*args,  **kwargs) 
     208        r.getOrder = self.getOrder 
    205209        r._D = lambda *args, **kwargs: dict([(key, -value) for key, value in self._D(*args, **kwargs).items()]) 
    206210        r.d = raise_except 
     
    208212         
    209213    # 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) 
    211215    __rsub__ = lambda self, other: other + (-self) 
    212216 
     
    233237                return r 
    234238            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 
    235243        else: 
    236244            other = array(other,'float') 
    237245            r = oofun(lambda a: a/other, self, discrete = self.discrete)# TODO: involve sparsity if possible! 
     246            r.getOrder = self.getOrder 
    238247            r._getFuncCalcEngine = lambda *args,  **kwargs: self._getFuncCalcEngine(*args,  **kwargs) / other 
    239248            r.d = lambda x: 1.0/other if (isscalar(x) or x.size == 1) else Diag(ones(x.size)/other) 
     
    254263        r.d = lambda x: Diag(- other / x**2) 
    255264        #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 
    256269        return r 
    257270 
     
    274287            r = oofun(lambda x, y: x*y, [self, other]) 
    275288            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) 
    276290        else: 
    277291            other = array(other, 'float') 
    278292            r = oofun(lambda x: x*other, self, discrete = self.discrete) 
     293            r.getOrder = self.getOrder 
    279294            r._getFuncCalcEngine = lambda *args,  **kwargs: other * self._getFuncCalcEngine(*args,  **kwargs) 
    280295            r.d = lambda x: aux_d(x, other) 
     
    355370                return r 
    356371                 
    357         r = oofun(f, self, d = d, size = 1
     372        r = oofun(f, self, d = d, size = 1, getOrder = self.getOrder
    358373        # TODO: check me! 
    359374        # what about a[a.size/2:]? 
    360375        if self.is_linear and not isinstance(ind,  oofun): 
    361376            r.is_linear = True 
    362              
    363377             
    364378        # TODO: edit me! 
     
    389403                r = hstack((m1, m2, m3)) 
    390404            return r 
    391         r = oofun(f, self, d = d
     405        r = oofun(f, self, d = d, getOrder = self.getOrder
    392406        if self.is_linear: 
    393407            r.is_linear = True 
     
    399413 
    400414    def sum(self): 
    401         r = oofun(sum, self
     415        r = oofun(sum, self, getOrder = self.getOrder
    402416        def d(x): 
    403417            if type(x) == ndarray and x.ndim > 1: raise FuncDesignerException('sum(x) is not implemented yet for arrays with ndim > 1') 
     
    409423        # TODO: consider using r.isCostly = True 
    410424        r = oofun(prod, self) 
     425        #r.getOrder = lambda *args, **kwargs: self.getOrder(*args, **kwargs)*self.size 
    411426        def d(x): 
    412427            x = asarray(x) # prod is used rarely, so optimizing it is not important 
     
    536551                        tmp = x.get(self, None) 
    537552                        if tmp is not None: 
    538                             return float(tmp) if isscalar(tmp) else array(tmp, 'float'
     553                            return float(tmp) if isscalar(tmp) else asfarray(tmp
    539554                        elif self.name in x: 
    540555                            return asfarray(x[self.name]) 
     
    726741                ac += 1 
    727742                tmp = derivativeSelf[ac] 
    728                 #assert tmp.ndim > 1  
    729743 
    730744                if inp in r: 
     
    752766                        else: 
    753767                            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) directly 
    756 #                            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 ndarrays 
    762 #                            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) 
    768768                         
    769769                        if not type(t1) == type(t2) ==  ndarray: 
     
    955955                 func_name=self.name, diffInt=self.diffInt, pointVal = val, args=self.args, \ 
    956956                 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 
    958983     
    959984    # TODO: should broadcast return non-void result? 
    960  
    961985    def _broadcast(self, func, *args, **kwargs): 
    962986        if self._broadcast_id == oofun._BroadCastID:  
     
    973997            c._broadcast(func, *args, **kwargs) 
    974998        func(self) 
    975          
     999     
     1000    
    9761001        """                                             End of class oofun                                             """ 
    9771002 
  • PythonPackages/FuncDesigner/FuncDesigner/overloads.py

    r714 r728  
    148148        _inp = set(INP) 
    149149        #!!!!!!!!!!!!!!!!!! TODO: check INP for complex cases (not list of oovars) 
     150         
    150151        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         
    151158        def _D(point, fixedVarsScheduleID, Vars=None, fixedVars = None, useSparse = 'auto'): 
    152159            # TODO: handle involvePrevData 
     
    205212    if len(args) != 0 or len(kwargs) != 0: 
    206213        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]) 
    207215    return inp.prod() 
    208216