1.4. Optimization Modopt (Work in progress)

"""Optimization Modopt (Work in progress)"""
import csdl_alpha as csdl

# This example demonstrates how to define and solve an simple optimization problem using modopt
# minimize x^4 + y^4 subject to x>=0, x+y=1, x-y>=1.

rec = csdl.Recorder()
rec.start()

# initialize design variables
x = csdl.Variable(name = 'x', value=1.)
y = csdl.Variable(name = 'y', value=1.)
x.set_as_design_variable(lower = 0.0, scaler=100.0)
y.set_as_design_variable(scaler=0.2)

z = x**4 + y**4

# compute objective
z.add_name('z')
z.set_as_objective(scaler=3.)

# compute constraints
constraint_1 = x + y
constraint_2 = x - y
constraint_1.add_name('constraint_1')
constraint_2.add_name('constraint_2')
constraint_1.set_as_constraint(lower=1., upper=1., scaler=20)
constraint_2.set_as_constraint(lower=1., scaler=12.)

rec.stop()

# Create a Simulator object from the Recorder object
sim = csdl.experimental.PySimulator(rec)
# sim = csdl.experimental.JaxSimulator(rec)

# Import modopt
import modopt as mo

# Instantiate your problem using the csdl Simulator object and name your problem
prob = mo.CSDLAlphaProblem(problem_name='quartic',simulator=sim)


# Setup your preferred optimizer (here, SLSQP) with the Problem object 
# Pass in the options for your chosen optimizer
optimizer = mo.SLSQP(prob, solver_options={'ftol':1e-6, 'maxiter':20})

# Check first derivatives at the initial guess, if needed
# optimizer.check_first_derivatives(prob.x0)

# Solve your optimization problem
optimizer.solve()

# Print results of optimization
optimizer.print_results()