in robogym/randomization/sim.py [0:0]
def _randomize_sim(self, random_state: RandomState):
values = self._randomizer_param_values
assert isinstance(values, np.ndarray)
dmax_mean, dmax_std, delta_mean, delta_std, width_mean, width_std = values
assert dmax_std >= 0.0
assert delta_std >= 0.0
assert width_std >= 0.0
# We randomize (1-dmax) since dmax typically very close to 1 and we'd like to cover the
# range [0, 1] well. We then sample delta that is subtracted from dmax to produce dmin,
# thus ensuring that dmin <= dmax holds.
dmax = 1.0 - (1.0 - self._initial_value[:, 1]) * np.exp(
random_state.normal(
dmax_mean, scale=dmax_std, size=self._initial_value.shape[0]
)
)
dmax = np.clip(dmax, *self._drange)
delta = (self._initial_value[:, 1] - self._initial_value[:, 0]) * np.exp(
random_state.normal(
delta_mean, scale=delta_std, size=self._initial_value.shape[0]
)
)
dmin = np.clip(dmax - delta, *self._drange)
# Sample width.
width = self._initial_value[:, 2] * np.exp(
random_state.normal(
width_mean, scale=width_std, size=self._initial_value.shape[0]
)
)
# Validate constraints. Mujoco internally already ensures that dmin and dmax are clipped,
# if necessary (http://mujoco.org/book/modeling.html#CSolver), but we enforce slightly
# stronger constraints for additional stability.
assert dmin.shape == dmax.shape == width.shape
assert (dmin <= dmax).all()
assert (self._drange[0] <= dmin).all()
assert (dmin <= self._drange[1]).all()
assert (self._drange[0] <= dmax).all()
assert (dmax <= self._drange[1]).all()
self.sim.model.geom_solimp[:, 0] = dmin
self.sim.model.geom_solimp[:, 1] = dmax
self.sim.model.geom_solimp[:, 2] = width