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: Adds a reduction block of given type after `every` few blocks.
docstr_tok: ["Adds","a","reduction","block","of","given","type","after","`","every","`","few","blocks","."]
code: def _add_reduction_blocks(self, architecture, every, reduction_type):
      """Adds a reduction block of given type after `every` few blocks."""
      result = []
      for i, block in enumerate(architecture):
          result.append(block)
          if (i + 1) % every == 0:
              result.append(
                  block_builder.BlockType[reduction_type].value
              )
      return np.array(result)
  
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 4 for calling the ConstrainedDescent obj's underlying member method code with example usage: obj._add_reduction_blocks(architecture, every, reduction_type) and returns: np