docs: def update_variogram_model(self, variogram_model, variogram_parameters=None,
                                 variogram_function=None, nlags=6, weight=False,
                                 anisotropy_scaling_y=1., anisotropy_scaling_z=1.,
                                 anisotropy_angle_x=0., anisotropy_angle_y=0.,
                                 anisotropy_angle_z=0.):
          """Changes the variogram model and variogram parameters
          for the kriging system.
  
          Parameters
          ----------
          variogram_model : str
              May be any of the variogram models listed above.
              May also be 'custom', in which case variogram_parameters and
              variogram_function must be specified.
          variogram_parameters : list or dict, optional
              List or dict of variogram model parameters, as explained above.
              If not provided, a best fit model will be calculated as
              described above.
          variogram_function : callable, optional
              A callable function that must be provided if variogram_model is
              specified as 'custom'. See above for more information.
          nlags : int, optional)
              Number of averaging bins for the semivariogram. Default is 6.
          weight : boolean, optional
              Flag that specifies if semivariance at smaller lags should be
              weighted more heavily when automatically calculating variogram
              model. See above for more information. True indicates that
              weights will be applied. Default is False.
          anisotropy_scaling_y : float, optional
              Scalar stretching value to take into account anisotropy
              in y-direction. Default is 1 (effectively no stretching).
              See above for more information.
          anisotropy_scaling_z : float, optional
              Scalar stretching value to take into account anisotropy
              in z-direction. Default is 1 (effectively no stretching).
              See above for more information.
          anisotropy_angle_x : float, optional
              Angle (in degrees) by which to rotate coordinate system about
              the x axis in order to take into account anisotropy.
              Default is 0 (no rotation). See above for more information.
          anisotropy_angle_y : float, optional
              Angle (in degrees) by which to rotate coordinate system about
              the y axis in order to take into account anisotropy.
              Default is 0 (no rotation). See above for more information.
          anisotropy_angle_z : float, optional
              Angle (in degrees) by which to rotate coordinate system about
              the z axis in order to take into account anisotropy.
              Default is 0 (no rotation).
              See above for more information.
          """
  
          if anisotropy_scaling_y != self.anisotropy_scaling_y or \
             anisotropy_scaling_z != self.anisotropy_scaling_z or \
             anisotropy_angle_x != self.anisotropy_angle_x or \
             anisotropy_angle_y != self.anisotropy_angle_y or \
             anisotropy_angle_z != self.anisotropy_angle_z:
              if self.verbose:
                  print("Adjusting data for anisotropy...")
              self.anisotropy_scaling_y = anisotropy_scaling_y
              self.anisotropy_scaling_z = anisotropy_scaling_z
              self.anisotropy_angle_x = anisotropy_angle_x
              self.anisotropy_angle_y = anisotropy_angle_y
              self.anisotropy_angle_z = anisotropy_angle_z
              self.X_ADJUSTED, self.Y_ADJUSTED, self.Z_ADJUSTED = \
                  _adjust_for_anisotropy(np.vstack((self.X_ORIG, self.Y_ORIG, self.Z_ORIG)).T,
                                         [self.XCENTER, self.YCENTER, self.ZCENTER],
                                         [self.anisotropy_scaling_y, self.anisotropy_scaling_z],
                                         [self.anisotropy_angle_x, self.anisotropy_angle_y, self.anisotropy_angle_z]).T
  
          self.variogram_model = variogram_model
          if self.variogram_model not in self.variogram_dict.keys() and self.variogram_model != 'custom':
              raise ValueError("Specified variogram model '%s' "
                               "is not supported." % variogram_model)
          elif self.variogram_model == 'custom':
              if variogram_function is None or not callable(variogram_function):
                  raise ValueError("Must specify callable function for "
                                   "custom variogram model.")
              else:
                  self.variogram_function = variogram_function
          else:
              self.variogram_function = self.variogram_dict[self.variogram_model]
          if self.verbose:
              print("Updating variogram mode...")
  
          vp_temp = _make_variogram_parameter_list(self.variogram_model,
                                                   variogram_parameters)
          self.lags, self.semivariance, self.variogram_model_parameters = \
              _initialize_variogram_model(np.vstack((self.X_ADJUSTED,
                                                     self.Y_ADJUSTED,
                                                     self.Z_ADJUSTED)).T,
                                          self.VALUES, self.variogram_model,
                                          vp_temp, self.variogram_function,
                                          nlags, weight, 'euclidean')
  
          if self.verbose:
              if self.variogram_model == 'linear':
                  print("Using '%s' Variogram Model" % 'linear')
                  print("Slope:", self.variogram_model_parameters[0])
                  print("Nugget:", self.variogram_model_parameters[1], '\n')
              elif self.variogram_model == 'power':
                  print("Using '%s' Variogram Model" % 'power')
                  print("Scale:", self.variogram_model_parameters[0])
                  print("Exponent:", self.variogram_model_parameters[1])
                  print("Nugget:", self.variogram_model_parameters[2], '\n')
              elif self.variogram_model == 'custom':
                  print("Using Custom Variogram Model")
              else:
                  print("Using '%s' Variogram Model" % self.variogram_model)
                  print("Partial Sill:", self.variogram_model_parameters[0])
                  print("Full Sill:", self.variogram_model_parameters[0] +
                        self.variogram_model_parameters[2])
                  print("Range:", self.variogram_model_parameters[1])
                  print("Nugget:", self.variogram_model_parameters[2], '\n')
          if self.enable_plotting:
              self.display_variogram_model()
  
          if self.verbose:
              print("Calculating statistics on variogram model fit...")
          self.delta, self.sigma, self.epsilon = \
              _find_statistics(np.vstack((self.X_ADJUSTED,
                                          self.Y_ADJUSTED,
                                          self.Z_ADJUSTED)).T,
                               self.VALUES, self.variogram_function,
                               self.variogram_model_parameters, 'euclidean')
          self.Q1 = core.calcQ1(self.epsilon)
          self.Q2 = core.calcQ2(self.epsilon)
          self.cR = core.calc_cR(self.Q2, self.sigma)
          if self.verbose:
              print("Q1 =", self.Q1)
              print("Q2 =", self.Q2)
              print("cR =", self.cR, '\n')