# Documentation

Filter Content By
Version
Languages

### Source code for the experiment of optimizing over a circle

from gurobipy import *
from math import *
import random
import time
import sys

# Work on a circle defined on a million constraints
t0      = time.time()
n       = 1024 * 1024
m       = Model('Circle Optimization')
Wb      = 0
Wc      = 0
Wd      = 0
maxdiff = 0
niter   = 0
margin  = 1.01

for i in range(n))
print('Added 2 Vars and %d constraints in %.2f seconds' %
(n, time.time()-t0))
m.Params.OutputFlag = 0
m.Params.Presolve   = 0

# Now select random objectives and optimize. Resulting optimal
# solution must be in the circle
for i in range(4096):
theta=2*pi*random.random()
a = cos(theta)
b = sin(theta)
m.setObjective(X[0] * a + X[1] * b)
m.optimize()
niter  += m.IterCount

# See how far is the solution from the boundary of a circle of
# radius one, if we minimize (a,b) the optimal solution should be (-a,-b)
error  = (X[0].X+a)*(X[0].X+a) + (X[1].X+b)*(X[1].X+b)

# Display most inacurate solution
if (error > margin * maxdiff  or
m.BoundVio > margin * Wb  or
m.ConstrVio > margin * Wc or
m.DualVio > margin * Wd     ):
maxdiff = max(maxdiff, error)
Wb      = max(Wb, m.BoundVio)
Wc      = max(Wb, m.ConstrVio)
Wd      = max(Wd, m.DualVio)
print('Errors: %g %g %g %g Iter %d %d Kappa %g' %
(maxdiff, Wb, Wc, Wd, i, niter, m.KappaExact))
sys.stdout.flush()