class_docstr: Test hungarian matcher.
docstr: Test case from bencaine@ for repro.
docstr_tok: ["Test","case","from","bencaine","@","for","repro","."]
code: def test_manual_cost_matrix(self, matcher_fn):
      """Test case from bencaine@ for repro."""
      cost_matrix = jnp.asarray(
          [
              # We expect (0, 0) and (1, 1) to be matched.
              [[-100, 100], [100, -100], [100, 100]],
              # We expect (0, 0) and (2, 1) to be matched.
              [[-100, 100], [100, 100], [100, -100]],
          ],
          dtype=jnp.float32,
      )
  
      sp_ind = np.array(
          list(
              map(
                  lambda x: tuple(sciopt.linear_sum_assignment(x)),
                  cost_matrix,
              )
          )
      )
      ind = matcher_fn(cost_matrix)
      for i, ((sp_row, sp_col), (row, col)) in enumerate(
          zip(sp_ind, ind)
      ):
          sp_cost = cost_matrix[i, sp_row, sp_col].sum()
          cost = cost_matrix[i, row, col].sum()
          self.assertAlmostEqual(sp_cost, cost, places=4)
  
imports: from typing import Optional
  from absl.testing import absltest
  from absl.testing import parameterized
  import jax
  import jax.numpy
  import numpy
  from scenic.model_lib import matchers
  from scenic.model_lib.base_models import box_utils
  import scipy.optimize
label_desc: Use image node_id 10 for calling the MatchingTest obj's underlying member method code with example usage: obj.test_manual_cost_matrix(matcher_fn) without return types