What happens
add_cp_eccentricity and add_thrust_eccentricity accept None to mean an input is not randomized, and their docstrings document x and y as optional. Passing None after a distribution was configured does not remove the earlier one, so the next reseed brings it back.
stochastic = StochasticRocket(rocket=calisto, radius=0.0127 / 2)
stochastic.add_cp_eccentricity(x=0.001)
stochastic.add_cp_eccentricity(x=None)
stochastic._set_stochastic(7)
On develop at 7822ab1d:
after the None call, still declared: True
after the reseed, the attribute: (0, 0.001, Generator.normal)
in the generated dict: True
The caller asked for the uncertainty to go away and it is still being drawn.
Why
StochasticModel._declare_stochastic_input returns early on None rather than removing the entry:
if input_value is None:
return
self.__stochastic_dict[input_name] = input_value
dict_generator walks __stochastic_dict, so the stale declaration reaches the draw. The early return is right for the case it was written for, which is add_cp_eccentricity(x=0.001) with no y, where None means "was never given" rather than "take it away". The two meanings are not distinguished.
Fix
Removing the entry instead of returning early covers the second meaning, and leaves the first alone as long as removal only happens for a name that is being configured. #1169 adds _reconfigure_stochastic_input, which already owns the replacement half of this, so the removal fits there in about a line.
Worth a test for each meaning: add_cp_eccentricity(x=0.001) with no y must not declare y, and add_cp_eccentricity(x=None) after x=0.001 must remove x.
Where it came from
The behaviour arrived with #1167, which declared these inputs so a fixed seed could reproduce them. Reconfiguration was not part of that change. Raised separately rather than folded into #1169, which fixes the other half of the same lifecycle and is under review.
What happens
add_cp_eccentricityandadd_thrust_eccentricityacceptNoneto mean an input is not randomized, and their docstrings documentxandyas optional. PassingNoneafter a distribution was configured does not remove the earlier one, so the next reseed brings it back.On
developat7822ab1d:The caller asked for the uncertainty to go away and it is still being drawn.
Why
StochasticModel._declare_stochastic_inputreturns early onNonerather than removing the entry:dict_generatorwalks__stochastic_dict, so the stale declaration reaches the draw. The early return is right for the case it was written for, which isadd_cp_eccentricity(x=0.001)with noy, whereNonemeans "was never given" rather than "take it away". The two meanings are not distinguished.Fix
Removing the entry instead of returning early covers the second meaning, and leaves the first alone as long as removal only happens for a name that is being configured. #1169 adds
_reconfigure_stochastic_input, which already owns the replacement half of this, so the removal fits there in about a line.Worth a test for each meaning:
add_cp_eccentricity(x=0.001)with noymust not declarey, andadd_cp_eccentricity(x=None)afterx=0.001must removex.Where it came from
The behaviour arrived with #1167, which declared these inputs so a fixed seed could reproduce them. Reconfiguration was not part of that change. Raised separately rather than folded into #1169, which fixes the other half of the same lifecycle and is under review.