code: def test_fowlkes_mallows_score_properties():
      # handcrafted example
      labels_a = np.array([0, 0, 0, 1, 1, 2])
      labels_b = np.array([1, 1, 2, 2, 0, 0])
      expected = 1.0 / np.sqrt((1.0 + 3.0) * (1.0 + 2.0))
      # FMI = TP / sqrt((TP + FP) * (TP + FN))
  
      score_original = fowlkes_mallows_score(labels_a, labels_b)
      assert_almost_equal(score_original, expected)
  
      # symmetric property
      score_symmetric = fowlkes_mallows_score(labels_b, labels_a)
      assert_almost_equal(score_symmetric, expected)
  
      # permutation property
      score_permuted = fowlkes_mallows_score(
          (labels_a + 1) % 3, labels_b
      )
      assert_almost_equal(score_permuted, expected)
  
      # symmetric and permutation(both together)
      score_both = fowlkes_mallows_score(labels_b, (labels_a + 2) % 3)
      assert_almost_equal(score_both, expected)
  
imports: import warnings
  import numpy
  import pytest
  from numpy.testing import assert_allclose, assert_array_almost_equal, assert_array_equal
  from sklearn.metrics.cluster import adjusted_mutual_info_score, adjusted_rand_score, completeness_score, contingency_matrix, entropy, expected_mutual_information, fowlkes_mallows_score, homogeneity_completeness_v_measure, homogeneity_score, mutual_info_score, normalized_mutual_info_score, pair_confusion_matrix, rand_score, v_measure_score
  from sklearn.metrics.cluster._supervised import _generalized_average, check_clusterings
  from sklearn.utils import assert_all_finite
  from sklearn.utils._testing import assert_almost_equal
label_desc: Use image node_id 20 for calling a global function with example usage: test_fowlkes_mallows_score_properties() without return types