code: def unit_change_linear_input_only(
      mechanism: LinearPredictionModel,
      background_df: pd.DataFrame,
      foreground_df: pd.DataFrame,
      input_column_names: List[str],
  ) -> pd.DataFrame:
      """
      Calculates the contributions of each input to the change in the output values of a linear deterministic mechanism.
  
      :param mechanism: The linear mechanism.
      :param background_df: The background data.
      :param foreground_df: The foreground data.
      :param input_column_names: The names of the input (features) columns in both dataframes.
      :return: A pandas dataframe with attributions to each cause for the change in each output row of provided dataframes.
      """
      _check_if_input_columns_exist(
          background_df, foreground_df, input_column_names
      )
  
      input_diff = (
          foreground_df[input_column_names].to_numpy()
          - background_df[input_column_names].to_numpy()
      )  # n x p
      contribution_input = np.einsum(
          "ij,ki->ki", mechanism.coefficients.reshape(-1, 1), input_diff
      )
      return pd.DataFrame(
          contribution_input, columns=input_column_names
      )
  
imports: from abc import abstractmethod
  from typing import List, Optional
  import numpy
  import pandas
  from sklearn.linear_model._base import LinearModel
  from sklearn.utils.validation import check_is_fitted
  from dowhy.gcm.ml.prediction_model import PredictionModel
  from dowhy.gcm.ml.regression import SklearnRegressionModel
  from dowhy.gcm.shapley import ShapleyConfig, estimate_shapley_values
label_desc: Use image node_id 5 for calling a global function with example usage: unit_change_linear_input_only(mechanism, background_df, foreground_df, input_column_names) and returns: pd