class_docstr: Responsible for generating samples of the leaf node predictions
  Essentially just draws from a normal distribution with prior specified by model parameters
  
  Uses a cache of draws from a normal(0, 1) distribution to improve sampling performance
code: def sample(self, model: Model, node: LeafNode) -> float:
      prior_var = model.sigma_m**2
      n = node.data.X.n_obsv
      likelihood_var = (model.sigma.current_value() ** 2) / n
      likelihood_mean = node.data.y.summed_y() / n
      node.set_mean_response(likelihood_mean)
      posterior_variance = 1.0 / (
          1.0 / prior_var + 1.0 / likelihood_var
      )
      posterior_mean = (
          likelihood_mean * 1
      )  # (prior_var / (likelihood_var + prior_var))
      val = posterior_mean  # + (self._scalar_sampler.sample() * np.power(posterior_variance / model.n_trees, 0.5))
      return val
  
file_path: imodels/imodels/experimental/bartpy/samplers/leafnode.py
imports: import numpy
  from ..model import Model
  from ..node import LeafNode
  from ..samplers.sampler import Sampler
  from ..samplers.scalar import NormalScalarSampler
label_desc: Use image node_id 3 for calling the LeafNodeSampler obj's underlying member method code with example usage: obj.sample(model, node) and returns: val