code: def make_transform(degree, weights_a, weights_b, weights_c):
      
      num_nodes = ((degree + 1) * (degree + 2)) // 2
      id_mat = np.eye(num_nodes, order="F")
      # Pre-compute the matrices that do the reduction so we don't
      # have to **actually** perform the de Casteljau algorithm
      # every time.
      transform = {
          0: de_casteljau_one_round(id_mat, degree, *weights_a),
          1: de_casteljau_one_round(id_mat, degree, *weights_b),
          2: de_casteljau_one_round(id_mat, degree, *weights_c),
      }
      return transform
docs: Compute matrices corresponding to the de Casteljau algorithm.
  
      .. note::
  
         This is a helper used only by :func:`_specialize_surface`.
  
      Applies the de Casteljau to the identity matrix, thus
      effectively caching the algorithm in a transformation matrix.
  
      .. note::
  
         This is premature optimization. It's unclear if the time
         saved from "caching" one round of de Casteljau is cancelled
         out by the extra storage required for the 3 matrices.
  
      Args:
          degree (int): The degree of a candidate surface.
          weights_a (numpy.ndarray): Triple (1D array) of barycentric weights
              for a point in the reference triangle
          weights_b (numpy.ndarray): Triple (1D array) of barycentric weights
              for a point in the reference triangle
          weights_c (numpy.ndarray): Triple (1D array) of barycentric weights
              for a point in the reference triangle
  
      Returns:
          Mapping[int, numpy.ndarray]: Mapping from keys to the de Casteljau
          transformation mappings. The keys are ``0`` corresponding to
          ``weights_a``, ``1`` to ``weights_b`` and ``2`` to ``weights_c``.