#!/usr/bin/env python
'''
Solves Constrained Toy Problem Using Variable Groups.

    min 	x1^2 + x2^2
    s.t.:	3 - x1 <= 0
            2 - x2 <= 0
            -10 <= x1 <= 10
            -10 <= x2 <= 10 
'''

# =============================================================================
# Standard Python modules
# =============================================================================

# =============================================================================
# Extension modules
# =============================================================================
from pyOpt import Optimization
from pyOpt import SLSQP


# =============================================================================
# 
# =============================================================================
def objfunc(xn):
    x0 = xn['x']
    x1 = xn['z']

    f = x0 ** 2 + x1 ** 2
    g = [0.0] * 2
    g[0] = 3 - x0
    g[1] = 2 - x1

    fail = 0

    return f, g, fail


# =============================================================================
# 
# ============================================================================= 

# Instantiate Optimization Problem
opt_prob = Optimization('TOY Constrained Problem', objfunc, use_groups=True)
opt_prob.addVarGroup('a', 2, 'c', value=1.0, lower=0.0, upper=10)
opt_prob.delVarGroup('a')
opt_prob.addVar('x', 'c', value=1.0, lower=0.0, upper=10)
opt_prob.addVarGroup('y', 2, 'c', value=1.0, lower=0.0, upper=10)
opt_prob.delVarGroup('y')
opt_prob.addVarGroup('z', 1, 'c', value=1.0, lower=0.0, upper=10)
opt_prob.addVarGroup('b', 5, 'c', value=3.0, lower=0.0, upper=10)
opt_prob.delVarGroup('b')
opt_prob.addObj('f')
opt_prob.addCon('g1', 'i')
opt_prob.addCon('g2', 'i')
print opt_prob

# Instantiate Optimizer (SLSQP) & Solve Problem
slsqp = SLSQP()
slsqp(opt_prob)
print opt_prob.solution(0)
