A storage ring drifts. Over a long user run the hardware and the tunnel around it change a little, often for reasons nobody can pin down. The setting we found on the last study shift slowly stops being the best one. A few knobs could usually win it back. But an optimizer tries bad settings on its way to good ones, and the beamline users would notice. So the tuning waits for the next study shift (or somebody gives up beam time for an extra one). I had watched it happen to our own MG-GPO settings on SPEAR3, good on the day and gone a few days later. RCDS-S was my attempt at a method that could tune during the run anyway, with every step checked against a line we set in advance. I led it, and Minghao Song, Xiaobiao Huang and I published it in Physical Review Accelerators and Beams in 2022.
The line search
Underneath is RCDS, Xiaobiao's algorithm (with Corbett, Safranek and Wu, NIM A, 2013). It goes through a set of conjugate directions one at a time, and along each one it takes enough points to bracket the minimum and fits a parabola through them. RCDS-S keeps all of that. What it replaces is how the next point gets chosen. Plain RCDS puts no limit on its steps, and the line plays no part in it.
Take a point you already measured. If the objective can't change faster than some slope (the Lipschitz constant), a point a distance away is at worst higher. Put the noise of both readings on top and you get the chance that the new point still comes in under the line.
is the line we set, the highest value the slope bound allows at that point, and and the noise on the readings.
Every measured point gives each candidate such a chance, and the candidate keeps the best one. The next trial goes to the far edge of the stretch where that chance is high enough (usually the side away from the points we have). That way each step covers as much new ground as it safely can. If the stretch can't reach past the points already taken, it lowers the bar a notch and looks again. Below a floor it gives up on the direction.
The Lipschitz idea isn't ours. SafeOpt (Sui and others, 2015) and Kirschner and others (2019) use it to mark out a safe region and run Gaussian-process optimization inside it. We use it to pick each trial point along a direction, and the parabola does the rest.
Old points go stale
Drift makes all of this shakier, since a point measured a while ago says less about now than the one you just took. We treat the drift as a random walk, so the uncertainty on an old reading grows with the square root of its age. It joins the noise under the same root.
is how long ago the point was measured, the drift rate and the same reading noise as above, so a stale point widens its own root and loses its say.
So the curve sags around the old points, and the safe stretch pulls back toward the fresh ones.

The model leans on two numbers, the slope L and the drift rate, and both come from scans before the run. Leave the knobs alone for a while and watch the objective wander, and that gives the drift rate. Scan each starting direction end to end, and the steepest slope you see gives L. Set L too small and it steps onto bad points more often. Too big, and it creeps.
The kicker bump on SPEAR3
We tried it in simulation first. The hardest case steered the beam from the booster into the ring with four knobs (the same line the single-shot policy later learned to correct in one step), against a drift that took injection to zero for half of each period when nobody tuned. RCDS-S kept injection near the top and mostly inside the line. Plain RCDS crossed it and now and then lost the drift altogether.
The drift on the ring was one we made ourselves. SPEAR3 has three injection kickers that should form a closed bump when they fire. They don't quite, and the stored beam keeps a small oscillation afterwards, which a turn-by-turn BPM picks up. That oscillation was the objective. We swung the first kicker, K1, on a slow sine (a period took just under half an hour), and RCDS-S chased it with K2 and K3. It started from the operating setting, the best one when nothing drifts.
Round one put the line at 60 µm. That went fine, so round two tightened it to 50 µm and ran plain RCDS on the same drift for comparison. Left alone, the oscillation swung far above the line. RCDS crossed it again and again. RCDS-S followed the drift and mostly stayed under.

Over the line
Both rounds still had a few small violations. Possibly the slope was off. We had taken L from simulation, and the ring's may not have matched it. A bigger L would cross less, but it creeps, and a slower search is more likely to lose the drift. In our tests the method also stopped working once the drift ran twice as fast, on the ring and in simulation alike.

So what we have is simulations and two machine-study rounds on the ring. It never ran during a real user run or on a drift the machine made by itself. It never went into routine operation. The paper says it tends to keep exploration safe and doesn't recommend it for high-risk applications. The runs that started all this are on the MG-GPO page.
Numbers and figures are from Zhang, Song and Huang, Phys. Rev. Accel. Beams 25, 122801 (2022, open access under CC BY 4.0). The round-one plot is from the arXiv version, arXiv:2205.06984.