#! /usr/bin/env python
#
# A python script that reads an XML input file, computes a simple function,
# and writes out an XML file.
#
# function_value: a quadratic function of real, integer and binary vars, plus
#       a term like the Rosenbrock function
#
# gradient: compute the derivative w.r.t. real vars
#
# nonlinear_constraint_values: two constraints, which are respectively
#       quadratic functions of the real and integer vars
#

import sys
from coopr.colin import *

class Problem(OptProblem):

    def __init__(self):
        self.response_types = [response_enum.FunctionValue, \
                                response_enum.Gradient, \
                                response_enum.NonlinearConstraintValues]

    def function_value(self, point):
       val=0.0
       for i in range(0,len(point.reals)-1):
         val = val + (point.reals[i] - 1.0)*(point.reals[i] - 1.0)
       for i in range(0,len(point.reals)-1):
         tmp = (point.reals[i+1]-point.reals[i]*point.reals[i])
         val = val + 100.0*tmp*tmp
       for i in range(0,len(point.ints)):
         val = val + (point.ints[i] - 2)*(point.ints[i] - 2)
       for i in range(0,len(point.bits)):
         val = val + (point.bits[i] - 1)*(point.bits[i] - 1)
       return val

    def gradient(self, point):
       val=[]
       for i in range(0,len(point.reals)-1):
         tmp = 2.0*(point.reals[i]-1.0) -400*(point.reals[i+1]-point.reals[i]*point.reals[i])*point.reals[i]
         if i>0:
            tmp = tmp + 200*(point.reals[i]-point.reals[i-1]*point.reals[i-1])
         val.append( tmp )
       i = len(point.reals)
       val.append(200*(point.reals[i-1]-point.reals[i-2]*point.reals[i-2]))
       return val

    def nonlinear_constraint_values(self, point):
       val=[]
       tmp=0
       for i in range(0,len(point.reals)):
         tmp = tmp + (point.reals[i] - 10.0)*(point.reals[i] - 10.0)
       val.append(tmp)
       tmp=0
       for i in range(0,len(point.ints)):
         tmp = tmp + (point.ints[i] - 10)*(point.ints[i] - 10)
       val.append(tmp)
       return val


instance = Problem()
instance.main(sys.argv)
