code: def _cumulative_hazard(self, params, T, Xs):
      # a negative sign makes the interpretation the same as other AFT models
      Xbeta = -np.dot(Xs["beta_"], params["beta_"])
      logT = np.log(T)
  
      H = safe_exp(
          params["gamma0_"] + params["gamma1_"] * (logT + Xbeta)
      )
  
      for i in range(2, self.n_baseline_knots):
          H *= safe_exp(
              params["gamma%d_" % i]
              * self.basis(
                  logT + Xbeta,
                  self.knots[i - 1],
                  min_knot=self.knots[0],
                  max_knot=self.knots[-1],
              )
          )
      return H
  
file_path: lifelines/examples/crowther_royston_clements_splines.py
imports: import pandas
  from autograd import numpy
  from lifelines.fitters import ParametricRegressionFitter
  from lifelines import WeibullAFTFitter
  from lifelines.fitters.mixins import SplineFitterMixin
  from lifelines.utils.safe_exp import safe_exp
label_desc: Use image node_id 5 for calling the CRCSplineFitter obj's underlying member method code with example usage: obj._cumulative_hazard(params, T, Xs) and returns: H