def _set_kernel_matrix()

in orbit/template/ktrlite.py [0:0]


    def _set_kernel_matrix(self, df, training_meta):
        """set all kernel related metrics
        1. knot index (knot_idx)
        2. knot time point (knot_tp)
        3. kernel matrix (kernel)
        4. knot dates (knot_dates) based on frequency implied from df
        5. do the same on regression (seasonality regression) if regressors are available

        Parameters
        ----------
        df : pd.DataFrame
        training_meta : dict
        """
        num_of_observations = training_meta[TrainingMetaKeys.NUM_OF_OBS.value]
        date_array = training_meta[TrainingMetaKeys.DATE_ARRAY.value]

        self._level_knots_idx = get_knot_idx(
            num_of_obs=num_of_observations,
            knot_distance=self.level_knot_distance,
            num_of_segments=self.level_segments,
            date_array=date_array,
            knot_dates=self.level_knot_dates,
        )
        # kernel of coefficients calculations
        # set some default
        self.kernel_coefficients = np.zeros((num_of_observations, 0), dtype=np.double)
        self.num_knots_coefficients = 0

        if self.num_of_regressors > 0:
            self._seas_knots_idx = get_knot_idx(
                date_array=None,
                num_of_obs=num_of_observations,
                knot_dates=None,
                knot_distance=None,
                num_of_segments=self.seasonality_segments,
            )

        tp = np.arange(1, num_of_observations + 1) / num_of_observations
        self.knots_tp_level = (1 + self._level_knots_idx) / num_of_observations
        self.kernel_level = sandwich_kernel(tp, self.knots_tp_level)
        self.num_knots_level = len(self.knots_tp_level)
        if self.date_freq is None:
            self.date_freq = pd.infer_freq(date_array)
            # self.time_delta = date_array.diff().min()
        self._level_knot_dates = get_knot_dates(
            date_array[0], self._level_knots_idx, self.date_freq
        )

        # update rest of the seasonality related fields
        if self.num_of_regressors > 0:
            self.knots_tp_coefficients = (
                1 + self._seas_knots_idx
            ) / num_of_observations
            self.kernel_coefficients = sandwich_kernel(tp, self.knots_tp_coefficients)
            self.num_knots_coefficients = len(self.knots_tp_coefficients)
            self._coef_knot_dates = get_knot_dates(
                date_array[0], self._seas_knots_idx, self.date_freq
            )