docs: def _update_cell_values(self, cell_ids, interior_edge_ids):
          """Updates all sorts of cell information for the given cell IDs.
          """
          # update idx_hierarchy
          nds = self.cells["nodes"][cell_ids].T
          self.idx_hierarchy[..., cell_ids] = nds[self.local_idx]
  
          # update self.half_edge_coords
          self.half_edge_coords[:, cell_ids, :] = numpy.moveaxis(
              self.node_coords[self.idx_hierarchy[1, ..., cell_ids]]
              - self.node_coords[self.idx_hierarchy[0, ..., cell_ids]],
              0,
              1,
          )
  
          # update self.ei_dot_ej
          self.ei_dot_ej[:, cell_ids] = numpy.einsum(
              "ijk, ijk->ij",
              self.half_edge_coords[[1, 2, 0]][:, cell_ids],
              self.half_edge_coords[[2, 0, 1]][:, cell_ids],
          )
  
          # update self.ei_dot_ei
          e = self.half_edge_coords[:, cell_ids]
          self.ei_dot_ei[:, cell_ids] = numpy.einsum("ijk, ijk->ij", e, e)
  
          # update cell_volumes, ce_ratios_per_half_edge
          cv = compute_tri_areas(self.ei_dot_ej[:, cell_ids])
          ce = compute_ce_ratios(self.ei_dot_ej[:, cell_ids], cv)
          self.cell_volumes[cell_ids] = cv
          self.ce_ratios[:, cell_ids] = ce
  
          if self._interior_ce_ratios is not None:
              self._interior_ce_ratios[interior_edge_ids] = 0.0
              edge_gids = self._edge_to_edge_gid[2][interior_edge_ids]
              adj_cells = self._edges_cells[2][interior_edge_ids]
  
              is0 = self.cells["edges"][adj_cells[:, 0]][:, 0] == edge_gids
              is1 = self.cells["edges"][adj_cells[:, 0]][:, 1] == edge_gids
              is2 = self.cells["edges"][adj_cells[:, 0]][:, 2] == edge_gids
              assert numpy.all(
                  numpy.sum(numpy.column_stack([is0, is1, is2]), axis=1) == 1
              )
              #
              self._interior_ce_ratios[interior_edge_ids[is0]] += self.ce_ratios[
                  0, adj_cells[is0, 0]
              ]
              self._interior_ce_ratios[interior_edge_ids[is1]] += self.ce_ratios[
                  1, adj_cells[is1, 0]
              ]
              self._interior_ce_ratios[interior_edge_ids[is2]] += self.ce_ratios[
                  2, adj_cells[is2, 0]
              ]
  
              is0 = self.cells["edges"][adj_cells[:, 1]][:, 0] == edge_gids
              is1 = self.cells["edges"][adj_cells[:, 1]][:, 1] == edge_gids
              is2 = self.cells["edges"][adj_cells[:, 1]][:, 2] == edge_gids
              assert numpy.all(
                  numpy.sum(numpy.column_stack([is0, is1, is2]), axis=1) == 1
              )
              #
              self._interior_ce_ratios[interior_edge_ids[is0]] += self.ce_ratios[
                  0, adj_cells[is0, 1]
              ]
              self._interior_ce_ratios[interior_edge_ids[is1]] += self.ce_ratios[
                  1, adj_cells[is1, 1]
              ]
              self._interior_ce_ratios[interior_edge_ids[is2]] += self.ce_ratios[
                  2, adj_cells[is2, 1]
              ]
  
          if self._signed_cell_areas is not None:
              # One could make p contiguous by adding a copy(), but that's not
              # really worth it here.
              p = self.node_coords[self.cells["nodes"][cell_ids]].T
              # <https://stackoverflow.com/q/50411583/353337>
              self._signed_cell_areas[cell_ids] = (
                  +p[0][2] * (p[1][0] - p[1][1])
                  + p[0][0] * (p[1][1] - p[1][2])
                  + p[0][1] * (p[1][2] - p[1][0])
              ) / 2
  
          # TODO update those values
          self._cell_centroids = None
          self._edge_lengths = None
          self._cell_circumcenters = None
          self._control_volumes = None
          self._cell_partitions = None
          self._cv_centroids = None
          self._surface_areas = None
          self.subdomains = {}
          return