def _randomize_sim()

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