# 10.4.8. Plotting the circuit’s response during optimization¶

This demo shows how to plot the circuit’s response during optimization. Read chapter Optimizing a circuit to learn more about circuit optimization.

The problem definition in the main file runme.py in folder demo/evaluation/06-iteration-plotter/ is identical to the one in chapter Optimizing a circuit. Only the differences are given in this document.

First we import the the things we need.

```from pyopus.evaluator.performance import PerformanceEvaluator, updateAnalysisCount
from pyopus.evaluator.aggregate import *
from pyopus.evaluator.auxfunc import listParamDesc
from pyopus.optimizer import optimizerClass
from pyopus.plotter.evalplotter import EvalPlotter
from pyopus.plotter.optplugin import IterationPlotter
import pyopus.plotter as plt
```

In the main program we insert an iteration plotter plugin in the optimizer.

```	# Performance and cost evaluators
pe=PerformanceEvaluator(heads, analyses, measures, corners, variables=variables, debug=0)

# Input parameter order in vector x is defined by inOrder.
ce=Aggregator(pe, costDefinition, inOrder, debug=0)

# Vectors of initial, low, and high values of input parameters.
xlow=listParamDesc(costInput, inOrder, "lo")
xhi=listParamDesc(costInput, inOrder, "hi")
xinit=listParamDesc(costInput, inOrder, "init")

# Optimizer (Hooke-Jeeves). xlo and xhi must be numpy arrays.
opt=optimizerClass("HookeJeeves")(ce, xlo=xlow, xhi=xhi, maxiter=1+1*1000)

# Set initial point. Must be a numpy array; xinit is a Python list.
opt.reset(xinit)

# Install reporter plugin.
# Print cost. Print performance every time cost is decreased.
opt.installPlugin(ce.getReporter())

# Install stopper plugin.
# Stop when all requirements are satisfied (all cost contributions are 0).
opt.installPlugin(ce.getStopWhenAllSatisfied())

# Plotter
plotter=EvalPlotter(visualisation, pe)

# Create and install iteration plotter plugin
opt.installPlugin(IterationPlotter(plotter))

# Run
opt.run()

# Optimization result
xresult=opt.x
iterresult=opt.bestIter

# Final evaluation at xresult.
cf=ce(xresult)
plotter("Final result")

# Print results.
print("\n\nFinal cost: "+str(cf)+", found in iter "+str(iterresult)+", total "+str(opt.niter)+" iteration(s)")
print(ce.formatParameters())
print(ce.formatResults(nMeasureName=10, nCornerName=15))
print("Performance in corners")
print(pe.formatResults(outOrder, nMeasureName=10, nCornerName=15))

# Every call to pe results in the same analysis count.
# Therefore we can multiply the analysis count of a single pe call
# with the number of calls to get the actual analysis count.
acnt={}
updateAnalysisCount(acnt, pe.analysisCount, opt.niter+1)
print("Analysis count: "+str(acnt))

# Cleanup intemediate files
pe.finalize()

# Wait for plot windows to close
plt.join()

```