docstr: Private method to simulate trajectories of the Cramer-von Mises statistic for the desired reference set
  size and window sizes under the null distribution, where both the reference set and deployment stream
  follow the same distribution. It then uses these simulated trajectories to estimate thresholds.
  
  As the test statistics are rank based and independent of the underlying distribution, we may use any
  continuous distribution -- we use Gaussian.
  
  The thresholds should stop changing after t=(2*max-window-size - 1) and therefore we need only simulate
  trajectories and estimate thresholds up to this point.
docstr_tok: ["Private","method","to","simulate","trajectories","of","the","Cramer-von","Mises","statistic","for","the","desired","reference","set","size","and","window","sizes","under","the","null","distribution",",","where","both","the","reference","set","and","deployment","stream","follow","the","same","distribution",".","It","then","uses","these","simulated","trajectories","to","estimate","thresholds",".","As","the","test","statistics","are","rank","based","and","independent","of","the","underlying","distribution",",","we","may","use","any","continuous","distribution","--","we","use","Gaussian",".","The","thresholds","should","stop","changing","after","t=","(","2","*","max-window-size","-","1",")","and","therefore","we","need","only","simulate","trajectories","and","estimate","thresholds","up","to","this","point","."]
code: def _configure_thresholds(self) -> None:
      """
      Private method to simulate trajectories of the Cramer-von Mises statistic for the desired reference set
      size and window sizes under the null distribution, where both the reference set and deployment stream
      follow the same distribution. It then uses these simulated trajectories to estimate thresholds.
  
      As the test statistics are rank based and independent of the underlying distribution, we may use any
      continuous distribution -- we use Gaussian.
  
      The thresholds should stop changing after t=(2*max-window-size - 1) and therefore we need only simulate
      trajectories and estimate thresholds up to this point.
      """
      if self.verbose:
          print(
              "Using %d bootstrap simulations to configure thresholds..."
              % self.n_bootstraps
          )
  
      # Assuming independent features, calibrate to beta = 1 - (1-FPR)^(1/n_features)
      beta = 1 - (1 - self.fpr) ** (1 / self.n_features)
  
      # Compute test statistic at each t_max number of t's, for each of the n_bootstrap number of streams
      # Only need to simulate streams for a single feature here.
      t_max = 2 * self.max_ws - 1
      stats = self._simulate_streams(t_max)
      # At each t for each stream, find max stats. over window sizes
      with warnings.catch_warnings():
          warnings.filterwarnings(
              action="ignore", message="All-NaN slice encountered"
          )
          max_stats = np.nanmax(stats, -1)
      # Now loop through each t and find threshold (at each t) that satisfies eqn. (2) in Ross et al.
      thresholds = np.full((t_max, 1), np.nan)
      for t in range(np.min(self.window_sizes) - 1, t_max):
          # Compute (1-beta) quantile of max_stats at a given t, over all streams
          threshold = quantile(max_stats[:, t], 1 - beta)
          # Remove streams for which a change point has already been detected
          max_stats = max_stats[max_stats[:, t] <= threshold]
          thresholds[t, 0] = threshold
  
      self.thresholds = thresholds
  
imports: import numpy
  from typing import Any, Callable, List, Optional, Union
  from alibi_detect.base import DriftConfigMixin
  from alibi_detect.cd.base_online import BaseUniDriftOnline
  from alibi_detect.utils.misc import quantile
  import numba
  from tqdm import tqdm
  import warnings
label_desc: Use image node_id 3 for calling the CVMDriftOnline obj's underlying member method code with example usage: obj._configure_thresholds() without return types