class_docstr: Performs constrained coordinate descent on the architecture.
  
  This algorithm searches convolutions then inserts reduction blocks after
  every phoenix_spec.num_blocks_in_cell blocks. If phoenix_spec.replicate_cell
  is True, then only the first phoenix_spec.num_blocks_in_cell will be search
  via mutation and the whole architecture will be replicated with reduction
  blocks between each cell.
docstr: Returns the allowed depth not including reductions and flatten blocks.
docstr_tok: ["Returns","the","allowed","depth","not","including","reductions","and","flatten","blocks","."]
code: def _get_allowed_depth(self, num_completed_trials):
      """Returns the allowed depth not including reductions and flatten blocks."""
      if self._phoenix_spec.replicate_cell:
          allowed_depth = self._phoenix_spec.maximum_depth
      else:
          allowed_depth = common.get_allowed_depth(
              num_completed_trials,
              depth_thresholds=self._phoenix_spec.increase_complexity_minimum_trials,
              max_depth=self._phoenix_spec.maximum_depth,
          )
      # We must take into account the number of reduction blocks to be added and
      # the final flatten block.
      allowed_depth -= (
          allowed_depth // self._phoenix_spec.num_blocks_in_cell
      )
      return allowed_depth
  
file_path: model_search/model_search/search/constrained_descent.py
imports: from absl import logging
  from model_search import block_builder
  from model_search.architecture import architecture_utils
  from model_search.search import common
  from model_search.search import search_algorithm
  import numpy
label_desc: Use image node_id 5 for calling the ConstrainedDescent obj's underlying member method code with example usage: obj._get_allowed_depth(num_completed_trials) and returns: allowed_depth