Changeset 1519

Show
Ignore:
Timestamp:
10/02/08 03:17:16 (2 months ago)
Author:
dmitrey.kroshko
Message:

init code for oovar

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openopt/scikits/openopt/Kernel/BaseProblem.py

    r1509 r1519  
    1111from ooIterPrint import ooTextOutput 
    1212from ooMisc import setNonLinFincsNumber 
     13from ooVar import oovar 
     14from Function import oofun 
    1315 
    1416ProbDefaults = {'diffInt': 1e-7,  'xtol': 1e-6,  'noise': 0} 
     
    334336            if self.iprint >= -1: self.warn('some non-linear constraints are equal to NaN') 
    335337 
     338    def __construct_x_from_ooVars__(self): 
     339        self.oovars = set([]) 
     340        for FuncType in ['f', 'c', 'h']: 
     341            Funcs = getattr(self, FuncType) 
     342            if Funcs is None: continue 
     343            if isinstance(Funcs, oofun): 
     344                Funcs.__connect_ooVars__(self) 
     345            else: 
     346                if type(Funcs) not in [tuple, list]: 
     347                    self.err('when x0 is absent, oofuns (with oovars) are expected') 
     348                for fun in Funcs: 
     349                    if type(Funcs) not in [tuple, list]: 
     350                        self.err('when x0 is absent, oofuns (with oovars) are expected') 
     351                    fun.__connect_ooVars__(self) 
     352        assert len(self.oovars) > 0 
     353        n = 0 
     354        for fn in ['x0', 'lb', 'ub']: 
     355            if not hasattr(self, fn): continue 
     356            val = getattr(self, fn) 
     357            if val is not None and any(isfinite(val)): 
     358                self.err('while using oovars providing x0, lb, ub for whole prob is forbidden, use for each oovar instead') 
     359 
     360        x0, lb, ub = [], [], [] 
     361 
     362        for var in self.oovars: 
     363            var.__initialize__(self) 
     364            var.dep = range(n, n+var.size) 
     365            n += var.size 
     366            x0.append(var.v0) 
     367            lb.append(var.lb) 
     368            ub.append(var.ub) 
     369        self.n = n 
     370        self.x0 = x0 
     371        self.lb = lb 
     372        self.ub = ub 
     373 
    336374    def __prepare__(self): 
     375        # TODO: remove GLP, make other workaround 
     376        if (not hasattr(self, 'x0') or self.x0 is nan) and self.probType != 'GLP': 
     377            # hence oovar(s) are used 
     378            self.__construct_x_from_ooVars__() 
     379 
    337380        self.x0 = ravel(self.x0) 
    338381        self.__makeCorrectArgs__() 
  • trunk/openopt/scikits/openopt/Kernel/Function.py

    r1482 r1519  
    22# created by Dmitrey 
    33#from numpy import copy, isnan, array, argmax, abs, zeros 
    4 from numpy import inf, asfarray, copy, all, any, empty, atleast_2d, zeros, dot, asarray, atleast_1d, empty, ones, ndarray, where, isfinite 
     4from numpy import inf, asfarray, copy, all, any, empty, atleast_2d, zeros, dot, asarray, atleast_1d, empty, ones, ndarray, where, isfinite, array 
    55from oologfcn import OpenOptException 
    66from copy import deepcopy 
     7from ooVar import oovar 
    78 
    89class oofun: 
     
    3839        self.inputTotalLength = 0 
    3940        for item in self.input: 
    40             if not callable(item): r.append(item) 
    41             elif item.__module__ == 'scikits.openopt.Kernel.Function': 
     41            if isinstance(item, oofun): 
    4242                item.x = self.x 
    4343                r.append(item()) 
     44            elif isinstance(item, oovar): 
     45                r.append(self.x[item.dep]) 
     46            elif not callable(item): r.append(item) 
    4447            else:  r.append(item()) 
    4548            self.inputTotalLength += r[-1].size 
     
    4952    def __getDep__(self): 
    5053        if hasattr(self, 'dep'): 
    51             pass 
     54            return self.dep 
    5255        elif self.input is None: 
    5356            self.dep = None 
    5457        else: 
    55             r = empty(self.x.size, bool
    56             r.fill(False) 
     58            r = set([]
     59            #r.fill(False) 
    5760            if not type(self.input) in (list, tuple): 
    5861                self.input = [self.input] 
    5962            for oofunInstance in self.input: 
    60                 if not hasattr(oofunInstance, 'x'): 
    61                     oofunInstance.x = self.x 
     63#                if not hasattr(oofunInstance, 'x'): 
     64#                    oofunInstance.x = self.x 
    6265                tmp = oofunInstance.__getDep__() 
    6366                if tmp is None: 
     
    6568                    break 
    6669                else: 
    67                     r[tmp] = True 
     70                    if type(tmp) in (ndarray, list, tuple): 
     71                        tmp = set(tmp) 
     72                    elif type(tmp) == int: 
     73                        tmp = set([tmp]) 
     74                    elif type(tmp) != set: 
     75                        raise OpenOptException('unknown type of oofun or oovar dependence') 
     76                    r.update(tmp) 
    6877            if r is not None: 
    69                 self.dep = where(r)[0] 
     78                self.dep = array(list(r)) 
    7079        return self.dep 
    7180 
     
    204213        return r 
    205214 
     215    def __connect_ooVars__(self, p): 
     216        if self.input is None: p.err('got oofun w/o connection to oovar (empty input instead). Use x0 or connect oovars.') 
     217        if not type(self.input) in (list, tuple): 
     218            self.input = [self.input] 
     219        # p.oovars is set 
     220 
     221        for inp in self.input: 
     222            if isinstance(inp, oovar): 
     223                p.oovars.add(inp) 
     224            elif isinstance(inp, oofun): 
     225                inp.__connect_ooVars__(p) # recursive 
     226            else: p.err('incorrect input for oofun instance') 
     227 
     228 
     229 
  • trunk/openopt/scikits/openopt/Kernel/NLP.py

    r1128 r1519  
    2424def nlp_init(prob, kwargs): 
    2525 
     26    prob.goal = 'minimum' 
    2627    f = kwargs['f'] 
    27     x0 = array(kwargs['x0']) 
    28  
    29  
    30  
    31     prob.goal = 'minimum' 
    32     prob.x0 = asarray(x0, float).reshape((-1,1)) 
    33  
    34     prob.n = x0.size 
    35     prob.lb = -inf * ones([prob.n,1]) 
    36     prob.ub =  inf * ones([prob.n,1]) 
     28    if kwargs.has_key('x0'): 
     29        x0 = array(kwargs['x0']) 
     30        prob.x0 = asarray(x0, float).reshape((-1,1)) 
     31        prob.n = x0.size 
     32        prob.lb = -inf * ones([prob.n,1]) 
     33        prob.ub =  inf * ones([prob.n,1]) 
    3734 
    3835