Python Example:
from mplpy import *
class MplCirclePack(object):
def __init__(self):
self._resultString = ""
self._solRadius = 0.0
self._solXVal = []
self._solYVal = []
@property
def ResultString(self):
return self._resultString
@property
def SolRadius(self):
return self._solRadius
@property
def SolXVal(self):
return self._solXVal
@property
def SolYVal(self):
return self._solYVal
def _loadModel(self, mod, circleCount):
mod.UseExceptions = True
try:
mod.IndexSets.AddNumRange("i", 1, circleCount)
mod.IndexSets.AddAlias("j", "i")
varRadius = mod.PlainVariables.Add("Radius")
varX = mod.VariableVectors.Add("x[i]", VariableType.Free)
varY = mod.VariableVectors.Add("y[i]", VariableType.Free)
varRadius.UpperBound = 1.0
varX.LowerBound = -1.0
varX.UpperBound = 1.0
varY.LowerBound = -1.0
varY.UpperBound = 1.0
mod.Objectives.Add("Radius", ObjectSense.Maximize)
mod.ConstraintVectors.Add("NoOverlap[i,j]",
"2 * Radius <= ((x[i] - x[i:=j])^2 + (y[i] - y[i:=j])^2)^0.5", "WHERE(i < j)")
mod.ConstraintVectors.Add("InBoundsA[i]", "x + Radius <= 1")
mod.ConstraintVectors.Add("InBoundsB[i]", "x - Radius >= -1")
mod.ConstraintVectors.Add("InBoundsC[i]", "y + Radius <= 1")
mod.ConstraintVectors.Add("InBoundsD[i]", "y - Radius >= -1")
except Exception as ex:
print(str(ex))
return mod.LastResult
def _getSolutionXValues(self, model):
solXVal = []
xVar = model.VariableVectors["x"]
for var in xVar:
solXVal.append(var.Activity)
return solXVal
def _getSolutionYValues(self, model):
solYVal = []
yVar = model.VariableVectors["y"]
for var in yVar:
solYVal.append(var.Activity)
return solYVal
def SolveModel(self, solverName, circleCount):
model = mpl.Models.Add("CirclePacking")
solver = mpl.Solvers.Add(solverName)
if solver == None:
self._resultString = "Solver " + solverName + " + was not found."
return False
mpl.Options["ModelType"].ValueStr = "Nonlinear"
mpl.Options["ParserType"].ValueStr = "Extended"
result = self._loadModel(model, circleCount)
if not result == ResultType.Success:
if result == ResultType.AddFailed:
self._resultString = model.ResultString
else:
self._resultString = str(model.Error)
model.ClearModel()
return False
model.UseExceptions = False
result = model.Solve(solver)
if not result == ResultType.Success:
self._resultString = "Solver " + solver.Name + ": " + model.ResultString + "\n" + model.Solution.ResultString
model.ClearModel()
return False
self._resultString = model.Solution.ResultString
self._solRadius = model.Solution.ObjectValue
self._solXVal = self._getSolutionXValues(model)
self._solYVal = self._getSolutionYValues(model)
model.ClearModel()
return True