Changeset 950

Show
Ignore:
Timestamp:
04/29/08 10:47:33 (7 months ago)
Author:
dmitrey.kroshko
Message:

some changes, some updates in docstrings + add glpk MILP solver

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openopt/README.txt

    r919 r950  
     1openopt livense: BSD 
     2 
    13openopt usage: 
    24 
  • trunk/openopt/scikits/openopt/COPYING.txt

    r660 r950  
    11(New BSD license) 
    22----------------------------------- 
    3 Copyright (c) 2007, Dmitrey Kroshko, Matthieu Brucher 
     3Copyright (c) 2007, Dmitrey Kroshko, www.icyb.kiev.ua optimization department 
    44 
    5 All rights reserved. 
     5OpenOpt Kernal license is BSD (see text below) 
     6 
     7GenericOpt rights (that currently is spread with OpenOpt, in terms of BSD license) belong to Matthieu Brucher 
     8 
     9All connected solvers have their own licenses. 
    610 
    711THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
  • trunk/openopt/scikits/openopt/Kernel/BaseProblem.py

    r948 r950  
    109109        self.x0 = nan 
    110110        self.intVars = [] # for problems like MILP 
     111        self.binVars = [] # for problems like MILP 
    111112         
    112113        self.noise = ProbDefaults['noise'] 
  • trunk/openopt/scikits/openopt/Kernel/runProbSolver.py

    r948 r950  
    4545    'galileo' : "scikits.openopt.solvers.Standalone.galileo_oo", 
    4646    'toms587' : "scikits.openopt.solvers.Standalone.toms587_oo", 
     47    'glpk' : "scikits.openopt.solvers.CVXOPT.glpk_oo", 
    4748} 
    4849 
  • trunk/openopt/scikits/openopt/Kernel/setDefaultIterFuncs.py

    r874 r950  
    88FVAL_IS_ENOUGH = 10 
    99SOLVED_WITH_UNIMPLEMENTED_OR_UNKNOWN_REASON = 1000 
     10 
     11UNDEFINED = 0 
    1012 
    1113IS_NAN_IN_X = -4 
  • trunk/openopt/scikits/openopt/examples/milp_1.py

    r595 r950  
    55 
    66f = [1, 2, 3, 4, 5, 4, 2, 1] 
    7 intVars = [5, 8] 
    8 lb = 1.5 * ones([8,1]) 
     7 
     8# indexing starts from ZERO! 
     9# while in native lpsolve-python wrapper from 1 
     10# so if you used [5,8] for native lp_solve python binding 
     11# you should use [4,7] instead 
     12intVars = [4, 7] 
     13 
     14lb = -1.5 * ones([8,1]) 
     15ub = 15 * ones([8,1]) 
    916A = zeros((5, 8)) 
    1017b = zeros(5) 
     
    1421    b[i] = -150 + 80*sin(80*i) 
    1522 
    16 p = MILP(f=f, intVars=intVars, lb=lb, A=A, b=b
     23p = MILP(f=f, lb=lb, ub=ub, A=A, b=b, intVars=intVars
    1724r = p.solve('lpSolve') 
     25print 'f_opt:', r.ff # 25.801450769161505 
     26print 'x_opt:', r.xf # [ 15. 10.15072538 -1.5 -1.5 -1.  -1.5 -1.5 15.] 
    1827 
    19 print 'f_opt:', r.ff # 55.05 
    20 print 'x_opt:' 
    21 print r.xf # [1.54923517 1.5 1.5 1.5 2. 1.5 1.5 21.] 
     28""" 
     29if you have installed glpk+cvxopt 1.0 or later  
     30(with BUILD_GLPK=1 in setup.py file)  
     31you can handle MILP problems with binary constraints  
     32(coords x from p.binVars should be in {0, 1}): 
     33 
     34p = MILP(f=f, lb=lb, ub=ub, A=A, b=b, intVars=intVars, binVars=[1]) 
     35#intVars, binVars indexing from ZERO! 
     36r = p.solve('glpk')  
     37 
     38print 'f_opt:', r.ff # 26.566058805272387 
     39print 'x_opt:', r.xf # [15.  1.  -1.5 -1.5 -1. -1.5 8.0330294 15.] 
     40""" 
  • trunk/openopt/scikits/openopt/solvers/CVXOPT/CVXOPT_LP_Solver.py

    r934 r950  
    1 from numpy import asarray,  ones, all, isfinite, copy, nan, concatenate 
     1from numpy import asarray,  ones, all, isfinite, copy, nan, concatenate, array 
    22from scikits.openopt.Kernel.ooMisc import WholeRepr2LinConst, xBounds2Matrix 
    33from cvxopt_misc import * 
    44import cvxopt.solvers as cvxopt_solvers 
     5from cvxopt.base import matrix 
     6from scikits.openopt.Kernel.setDefaultIterFuncs import SOLVED_WITH_UNIMPLEMENTED_OR_UNKNOWN_REASON,  IS_MAX_ITER_REACHED, IS_MAX_TIME_REACHED, FAILED_WITH_UNIMPLEMENTED_OR_UNKNOWN_REASON, UNDEFINED 
    57 
    68def CVXOPT_LP_Solver(p, solverName): 
     
    2022    #    sol= cvxopt_solvers.solvers.lp(Matrix(p.f), Matrix(p.A), Matrix(p.b), Matrix(p.Aeq), Matrix(p.beq), solverName) 
    2123    #else: 
    22     try: 
     24     
     25    if len(p.intVars)>0 and solverName == 'glpk': 
     26        from cvxopt.glpk import ilp 
     27        c = Matrix(p.f) 
     28        A, b = Matrix(p.Aeq),  Matrix(p.beq) 
     29        G, h = Matrix(p.A),  Matrix(p.b) 
     30        if A is None:  
     31            A = matrix(0.0,  (0, p.n)) 
     32            b = matrix(0.0,(0,1)) 
     33        if G is None:  
     34            G = matrix(0.0,  (0, p.n)) 
     35            h = matrix(0.0,(0,1)) 
     36         
     37        (status, x) = ilp(c, G, h, A, b, set(p.intVars), B=set(p.binVars)) 
     38        if status == 'optimal': p.istop = SOLVED_WITH_UNIMPLEMENTED_OR_UNKNOWN_REASON 
     39        elif status == 'maxiters exceeded': p.istop = IS_MAX_ITER_REACHED 
     40        elif status == 'time limit exceeded': p.istop = IS_MAX_TIME_REACHED 
     41        elif status == 'unknown': p.istop = UNDEFINED 
     42        else: p.istop = FAILED_WITH_UNIMPLEMENTED_OR_UNKNOWN_REASON 
     43        if x is None:  
     44            p.xf = nan*ones(p.n) 
     45        else: 
     46            p.xf = array(x).flatten()#w/o flatten it yields incorrect result in ff! 
     47        p.ff = sum(p.dotmult(p.f, p.xf)) 
     48        p.msg = status 
     49    else: 
    2350        sol = cvxopt_solvers.lp(Matrix(p.f), Matrix(p.A), Matrix(p.b), Matrix(p.Aeq), Matrix(p.beq), solverName) 
    24     except: 
    25         msg_err = 'Error: YOU SHOULD INSTALL '  
    26         if solverName is not None: msg_err += solverName + ' and ' 
    27         msg_err += 'CVXOPT'     
    28         print  msg_err 
    29         p.istop, p.msg = -1, 'unknown' 
    30         return 
    31      
    32     p.msg = sol['status'] 
    33     if p.msg == 'optimal' :  p.istop = 1000 
    34     else: p.istop = -100 
    35      
    36      
    37     if sol['x'] is not None: 
    38         p.xf = asarray(sol['x']).flatten() 
    39         p.ff = sum(p.dotmult(p.f, p.xf)) 
    40         p.duals = concatenate((asarray(sol['y']).flatten(), asarray(sol['z']).flatten())) 
    41     else: 
    42         p.ff = nan 
    43         p.xf = nan*ones([p.n,1]) 
     51        p.msg = sol['status'] 
     52        if p.msg == 'optimal' :  p.istop = SOLVED_WITH_UNIMPLEMENTED_OR_UNKNOWN_REASON 
     53        else: p.istop = -100 
     54        if sol['x'] is not None: 
     55            p.xf = asarray(sol['x']).flatten() 
     56            p.ff = sum(p.dotmult(p.f, p.xf)) 
     57            p.duals = concatenate((asarray(sol['y']).flatten(), asarray(sol['z']).flatten())) 
     58        else: 
     59            p.ff = nan 
     60            p.xf = nan*ones([p.n,1]) 
  • trunk/openopt/scikits/openopt/solvers/lp_solve/lpSolve_oo.py

    r935 r950  
    2525            else: return x.tolist() 
    2626        [obj, x_opt, duals] = lps(List(f.flatten()), List(p.Awhole), List(p.bwhole.flatten()), List(p.dwhole.flatten()), \ 
    27         List(p.lb.flatten()), List(p.ub.flatten()), asarray(p.intVars).tolist()) 
     27        List(p.lb.flatten()), List(p.ub.flatten()), (1+asarray(p.intVars)).tolist()) 
    2828        if obj != []: 
    2929            p.ff = - obj # sign '-' because lp_solve by default searches for maximum, not minimum         
  • trunk/openopt/setup.py

    r933 r950  
    1414DESCRIPTION         = 'A python module for numerical optimization' 
    1515LONG_DESCRIPTION    = descr 
    16 MAINTAINER          = 'Dmitrey Kroshko, Matthieu Brucher', 
     16MAINTAINER          = 'mainteiner of OpenOpt is Dmitrey Kroshko, mainteiner of GenericOpt is Matthieu Brucher', 
    1717MAINTAINER_EMAIL    = 'dmitrey.kroshko@scipy.org', 
    1818URL                 = 'http://openopt.blogspot.com', 
     
    2929##from scikits import openopt 
    3030##from openopt.info import __version__ as openopt_version 
    31 openopt_version = 0.15 
     31openopt_version = 0.17 
    3232from shutil import copytree, rmtree 
    3333