13.9.3. Macro “reoptimizeHollowBarCodevizir.py”
13.9.3.1. Objective
The objective of the macro is to optimize the section and distortion of the hollow bar defined in
Sizing of a hollow bar example problem using the evolutionary solvers. This can be done with
different solvers, the one chosen here being the TVizirGenetic one.
13.9.3.2. Macro Uranie
"""
Example of hollow bar optimisation with Vizir
"""
from URANIE import DataServer, Relauncher, Reoptimizer
import ROOT
# variables
x = DataServer.TAttribute("x", 0.0, 1.0)
y = DataServer.TAttribute("y", 0.0, 1.0)
thick = DataServer.TAttribute("thick") # thickness
sect = DataServer.TAttribute("sect") # section of the pipe
dist = DataServer.TAttribute("dist") # distortion
# Creating TCodeEval, dumping output in an output
python_exec = "python3"
if ROOT.gSystem.GetBuildArch() == "win64":
python_exec = python_exec[:-1]
code = Relauncher.TCodeEval(python_exec + " bar.py > bartoto.dat")
# Pass the python script as a input. Inputs are modified in bar.py
inputfile = Relauncher.TKeyScript("bar.py")
inputfile.addInput(x, "x")
inputfile.addInput(y, "y")
code.addInputFile(inputfile)
# precise the output file in which to read the three outputs
outputfile = Relauncher.TFlatResult("bartoto.dat")
outputfile.addOutput(thick)
outputfile.addOutput(sect)
outputfile.addOutput(dist)
code.addOutputFile(outputfile)
# Create a runner
runner = Relauncher.TSequentialRun(code)
runner.startSlave() # Usual Relauncher construction
if runner.onMaster():
# Create the TDS
tds = DataServer.TDataServer("vizirDemo", "Param de l'opt vizir")
tds.addAttribute(x)
tds.addAttribute(y)
# create the vizir genetic solver
solv = Reoptimizer.TVizirGenetic()
# Size of the population and maximum number of evaluation
solv.setSize(200, 15000)
# Create the multi-objective constrained optimizer
opt = Reoptimizer.TVizir2(tds, runner, solv)
# add the objective
opt.addObjective(sect) # minimizing the section
opt.addObjective(dist) # minimizing the distortion
# and the constrains
positiv = Reoptimizer.TGreaterFit(0.4)
opt.addConstraint(thick, positiv) # on thickness (thick > 0.4)
opt.solverLoop() # running the optimization
# Stop the slave processes
runner.stopSlave()
fig1 = ROOT.TCanvas("fig1", "Pareto Zone", 5, 64, 1270, 667)
phi = 12
theta = 30
pad1 = ROOT.TPad("pad1", "", 0, 0.03, 1, 1)
pad2 = ROOT.TPad("pad2", "", 0, 0.03, 1, 1)
pad2.SetFillStyle(4000) # will be transparent
pad1.Draw()
pad1.Divide(2, 1)
pad1.cd(1)
ROOT.gPad.SetPhi(phi)
ROOT.gPad.SetTheta(theta)
ROOT.gStyle.SetLabelSize(0.03)
ROOT.gStyle.SetLabelSize(0.03, "Y")
ROOT.gStyle.SetLabelSize(0.03, "Z")
tds.getTuple().Draw("sect:y:x")
# Get the TH3 to change Z axis color
htemp = ROOT.gPad.GetPrimitive("htemp")
htemp.SetTitle("")
htemp.GetZaxis().SetLabelColor(2)
htemp.GetZaxis().SetAxisColor(2)
htemp.GetZaxis().SetTitleColor(2)
fig1.cd()
pad2.Draw()
pad2.Divide(2, 1)
pad2.cd(1)
ROOT.gPad.SetFillStyle(4000)
ROOT.gPad.SetPhi(phi)
ROOT.gPad.SetTheta(theta)
tds.getTuple().SetMarkerColor(4)
tds.getTuple().Draw("dist:y:x")
htemp = ROOT.gPad.GetPrimitive("htemp")
htemp.SetTitle("")
htemp.GetZaxis().SetLabelColor(4)
htemp.GetZaxis().SetAxisColor(4)
htemp.GetZaxis().SetTitleColor(4)
htemp.GetZaxis().SetTickSize(-1*htemp.GetZaxis().GetTickLength())
htemp.GetZaxis().SetLabelOffset(-15*htemp.GetZaxis().GetLabelOffset())
htemp.GetZaxis().LabelsOption("d")
htemp.GetZaxis().SetTitleOffset(-1.5*htemp.GetZaxis().GetTitleOffset())
htemp.GetZaxis().RotateTitle()
pad2.cd(2)
tds.getTuple().SetMarkerColor(2)
tds.draw("dist:sect")
The variables are defined as follow:
# variables
x = DataServer.TAttribute("x", 0.0, 1.0)
y = DataServer.TAttribute("y", 0.0, 1.0)
thick = DataServer.TAttribute("thick") # thickness
sect = DataServer.TAttribute("sect") # section of the pipe
dist = DataServer.TAttribute("dist") # distortion
where the first two are the input ones while the last ones are computed using the provided code (as explained in Sizing of a hollow bar example problem). This code is configured through these lines
# Creating TCodeEval, dumping output in an output
code = Relauncher.TCodeEval(python_exec + " bar.py > bartoto.dat")
# Pass the python script as a input. Inputs are modified in bar.py
inputfile = Relauncher.TKeyScript("bar.py")
inputfile.addInput(x, "x")
inputfile.addInput(y, "y")
code.addInputFile(inputfile)
# precise the output file in which to read the three outputs
outputfile = Relauncher.TFlatResult("bartoto.dat")
outputfile.addOutput(thick)
outputfile.addOutput(sect)
outputfile.addOutput(dist)
code.addOutputFile(outputfile)
The usual Relauncher construction is followed, using a TSequentialRun runner and the solver is
chosen in these lines
# create the vizir genetic solver
solv = Reoptimizer.TVizirGenetic()
# Size of the population and maximum number of evaluation
solv.setSize(200, 15000)
Combining the runner, solver and dataserver, the master object is created and the objective and constraint are defined. This is done in:
# Create the multi-objective constrained optimizer
opt = Reoptimizer.TVizir2(tds, runner, solv)
# add the objective
opt.addObjective(sect) # minimizing the section
opt.addObjective(dist) # minimizing the distortion
# and the constrains
positiv = Reoptimizer.TGreaterFit(0.4)
opt.addConstraint(thick, positiv) # on thickness (thick > 0.4)
Finally the optimisation is launched and the rest of code is providing the graphical result shown in next section.
13.9.3.3. Graph
Figure 13.55 Graph of the macro “reoptimizeHollowBarCodeVizir.py”