def create_ramp_plan(err, ramp):
if ramp == <NUM_LIT:1>:  <EOL><INDENT>yield int(err)<EOL>while True:<EOL><INDENT>yield <NUM_LIT:0><EOL><DEDENT><DEDENT>n = np.abs(np.roots([<NUM_LIT>, -<NUM_LIT>, <NUM_LIT:0>]).max())<EOL>niter = int(ramp // (<NUM_LIT:2> * n))  <EOL>MV = n<EOL>log.info('<STR_LIT>', extra=dict(<EOL>ramp_size=ramp, err=err, niter=niter))<EOL>for x in range(int(n)):<EOL><INDENT>budget = MV<EOL>for x in range(niter):<EOL><INDENT>budget -= MV // niter<EOL>yield int(np.sign(err) * (MV // niter))<EOL><DEDENT>yield int(budget * np.sign(err))<EOL>MV -= <NUM_LIT:1><EOL><DEDENT>while True:<EOL><INDENT>yield <NUM_LIT:0><EOL><DEDENT>
Formulate and execute on a plan to slowly add heat or cooling to the system

`err` initial error (PV - SP)
`ramp` the size of the ramp

A ramp plan might yield MVs in this order at every timestep:
    [5, 0, 4, 0, 3, 0, 2, 0, 1]
    where err == 5 + 4 + 3 + 2 + 1