idaholab / raven

RAVEN is a flexible and multi-purpose probabilistic risk analysis, validation and uncertainty quantification, parameter optimization, model reduction and data knowledge-discovering framework.
https://raven.inl.gov/
Apache License 2.0
212 stars 131 forks source link

[DEFECT] SimulatedAnnealing Opt fails with for 1 variable optimization #2295

Closed alfoa closed 2 months ago

alfoa commented 3 months ago

Thank you for the defect report

Defect Description

If simulated annealing optimization is used with a single variable, the code crashes in the method _nextNeighbour.

Traceback (most recent call last):
  File "./raven/raven_framework.py", line 25, in <module>
    sys.exit(main(True))
  File "./raven/ravenframework/Driver.py", line 207, in main
    raven()
  File "./raven/ravenframework/Driver.py", line 160, in raven
    simulation.run()
  File "./raven/ravenframework/Simulation.py", line 901, in run
    self.executeStep(stepInputDict, stepInstance)
  File "./raven/ravenframework/Simulation.py", line 834, in executeStep
    stepInstance.takeAstep(stepInputDict)
  File "./raven/ravenframework/Steps/Step.py", line 317, in takeAstep
    self._localTakeAstepRun(inDictionary)
  File "./raven/ravenframework/Steps/MultiRun.py", line 229, in _localTakeAstepRun
    sampler.finalizeActualSampling(finishedJob,model,inputs)
  File "./raven/ravenframework/Samplers/Sampler.py", line 1081, in finalizeActualSampling
    self.localFinalizeActualSampling(jobObject, model, myInput)
  File "./raven/ravenframework/Optimizers/RavenSampled.py", line 308, in localFinalizeActualSampling
    self._useRealization(info, rlz)
  File "./raven/ravenframework/Optimizers/SimulatedAnnealing.py", line 317, in _useRealization
    newPoint = self._nextNeighbour(rlz, fraction)
  File "./raven/ravenframework/Optimizers/SimulatedAnnealing.py", line 717, in _nextNeighbour
    nextNeighbour[var] = rlz[var] + delta[i]
IndexError: invalid index to scalar variable.

The reason Is that the delta variable is cast as float in case of a 1-variable optimization. The fix is as follows:

diff --git a/ravenframework/Optimizers/SimulatedAnnealing.py b/ravenframework/Optimizers/SimulatedAnnealing.py
index 03f1ba144..05ff7d1df 100644
--- a/ravenframework/Optimizers/SimulatedAnnealing.py
+++ b/ravenframework/Optimizers/SimulatedAnnealing.py
@@ -708,6 +708,7 @@ class SimulatedAnnealing(RavenSampled):
     elif self._coolingMethod == 'cauchy':
       amp = (np.pi - (-np.pi))*randomUtils.random(dim=D, samples=1)-np.pi
       delta = alpha*self.T*np.tan(amp)
+    delta = np.atleast_1d(delta)
     for i,var in enumerate(self.toBeSampled.keys()):
       nextNeighbour[var] = rlz[var] + delta[i]
       self.info['amp_'+var] = amp

Steps to Reproduce

Single variable optimization using SimulatedAnnealing

Expected Behavior

Successful optimization process

Screenshots and Input Files

No response

OS

MacOS

OS Version

No response

Dependency Manager

CONDA

For Change Control Board: Issue Review

For Change Control Board: Issue Closure

wangcj05 commented 2 months ago

Issue closure checklist is good.