code: def _column_reduction(self):
          
          #assign each column to its lowest cost row, ensuring that only row
          #or column is assigned once
          i1, j = np.unique(np.argmin(self.c, axis=0), return_index=True)
          self._x[i1] = j
  
          #if problem is solved, return
          if len(i1) == self.n:
              return False
  
          self._y[j] = i1
  
          #reduction_transfer
          #tempc is array with previously assigned matchings masked
          self._v = np.min(self.c, axis=0)
          tempc = self.c.copy()
          tempc[i1, j] = np.inf
          mu = np.min(tempc[i1, :] - self._v[None, :], axis=1)
          self._v[j] -= mu
          return True
docs: Column reduction and reduction transfer steps from LAPJV algorithm