def METHOD_NAME(
    self,
    f_constraint: OptimiserCallable,
    tolerance: np.ndarray,
    df_constraint: Optional[OptimiserCallable] = None,
) -> None:
    r"""
    Add an inequality constrain to the optimiser.
    The constraint is a vector-valued, non-linear, inequality
    constraint of the form :math:`f_{c}(x) \le 0`.
    The constraint function should have the form
    :math:`f(x) \rightarrow y`, where:
        * :math:`x` is a numpy array of the optimisation parameters.
        * :math:`y` is a numpy array containing the values of the
          constraint at :math:`x`, with size :math:`m`, where
          :math:`m` is the dimensionality of the constraint.
    Parameters
    ----------
    f_constraint:
        The constraint function, with form as described above.
    tolerance:
        The tolerances for each optimisation parameter.
    df_constraint:
        The gradient of the constraint function. This should have
        the same form as the constraint function, however its output
        array should have dimensions :math:`m \times n` where
        :math`m` is the dimensionality of the constraint, and
        :math:`n` is the number of optimisation parameters.
    Notes
    -----
    Inequality constraints are only supported by algorithms:
        * SLSQP
        * COBYLA
        * ISRES
    """