docs: def _update(self):
          """Calculate remaining values for each row, column, box and finally cell."""
          # Update possible values in each row, column and box.
          for i, (row, col, box) in enumerate(zip(self.row_iter(), self.col_iter(), self.box_iter())):
              self._poss_rows[i] = set(self._values).difference(set(row))
              self._poss_cols[i] = set(self._values).difference(set(col))
              self._poss_box[i] = set(self._values).difference(set(box))
  
          # Iterate over the entire Sudoku and combine information about possible values
          # from rows, columns and boxes to get a set of possible values for each cell.
          for i in utils.range_(self.side):
              self._possibles[i] = {}
              for j in utils.range_(self.side):
                  self._possibles[i][j] = set()
                  if self[i][j] > 0:
                      continue
                  this_box_index = ((i // self.order) * self.order) + (j // self.order)
                  self._possibles[i][j] = self._poss_rows[i].intersection(
                      self._poss_cols[j]).intersection(self._poss_box[this_box_index])