# Copyright (C) 2005, Paulo Jose da Silva e Silva

from numarray import *
from coin import *

si = OsiSolver()
si.readMps('p0033.mps')

si.setObjSense(-1.0)
si.initialSolve()
si.setObjSense(1.0)
si.enableSimplexInterface(True)
numberIterations = 0
numberColumns = si.getNumCols()
numberRows = si.getNumRows()
fakeCost = si.getObjCoefficients()
duals = zeros(numberRows, Float)
djs = zeros(numberColumns, Float)
solution = si.getColSolution()

while True:
    if numberIterations & 1 == 0:
        dj = si.getReducedCost()
        dual = si.getRowPrice()
    else:
        dj = djs
        dual = duals
        si.getReducedGradient(djs, duals, fakeCost)

    colIn = 9999
    direction = 1
    best = 1.0e-6
    bigDual = dual.argmax()
    if dual[bigDual] > best:
        best = dual[bigDual]
        direction = -1
        colIn = -bigDual - 1
    for i in range(numberColumns):
        value = dj[i]
        if value < -best and solution[i] < 1.0e-6:
            direction = 1
            best = -value
            colIn = i
        elif value > best and solution[i] > 1.0 - 1.0e-6:
            direction = -1
            best = value
            colIn = i
    if colIn == 9999: break
    out, outStatus = copy_intp(0), copy_intp(0)
    stepSize = copy_doublep(0.0)
    si.primalPivotResult(colIn, direction, out, outStatus,
                         stepSize, 'NULL')
    print 'out %d, direction %d theta %g' % (intp_value(out),
                                             intp_value(outStatus),
                                             doublep_value(stepSize))
    solution = si.getColSolution()
    numberIterations += 1
si.disableSimplexInterface()
si.resolve()
assert(not si.getIterationCount())
si.setObjSense(-1.0)
si.initialSolve()


syntax highlighted by Code2HTML, v. 0.9.1