code: def report_cross_access(self, model: AccessAnomalyModel):
      training_scores = materialized_cache(
          model.transform(data_set.training)
      )
      training_stats: StatsMap = create_stats(
          training_scores,
          AccessAnomalyConfig.default_tenant_col,
      )
  
      print("training_stats")
  
      for stats in training_stats.get_stats():
          assert abs(stats.mean) < epsilon
          assert abs(stats.std - 1.0) < epsilon
          print(stats)
  
      num_tenants = (
          data_set.training.select(
              AccessAnomalyConfig.default_tenant_col
          )
          .distinct()
          .count()
      )
      expected_num_components = num_tenants * (
          1 if single_component_data else 3
      )
  
      assert (
          model.user_res_feature_vector_mapping.user2component_mappings_df.select(
              "component",
          )
          .distinct()
          .count()
          == expected_num_components
      )
  
      assert (
          model.user_res_feature_vector_mapping.res2component_mappings_df.select(
              "component",
          )
          .distinct()
          .count()
          == expected_num_components
      )
  
      intra_test_scores = model.transform(data_set.intra_test)
      intra_test_stats = create_stats(
          intra_test_scores,
          AccessAnomalyConfig.default_tenant_col,
      )
  
      inter_test_scores = model.transform(data_set.inter_test)
      inter_test_stats = create_stats(
          inter_test_scores,
          AccessAnomalyConfig.default_tenant_col,
      )
  
      print("test_stats")
  
      for tid in inter_test_stats.get_tenants():
          intra_stats = intra_test_stats.get_stat(tid)
          inter_stats = inter_test_stats.get_stat(tid)
  
          assert inter_stats.mean > intra_stats.mean
          assert inter_stats.mean - intra_stats.mean >= 2.0
  
          print(tid)
          print(intra_stats)
          print(inter_stats)
  
imports: import os
  import tempfile
  import unittest
  from typing import Dict, Optional, Set, Type, Union
  from pandas.testing import assert_frame_equal
  from pyspark.sql import DataFrame, types, functions
  from synapse.ml.cyber.feature import indexers
  from synapse.ml.cyber import DataFactory
  from synapse.ml.cyber.anomaly.collaborative_filtering import AccessAnomaly, AccessAnomalyModel, AccessAnomalyConfig, ConnectedComponents, ModelNormalizeTransformer, _UserResourceFeatureVectorMapping
  from synapsemltest.cyber.explain_tester import ExplainTester
  from synapsemltest.spark import *
label_desc: Use image node_id 5 for calling the TestAccessAnomaly obj's underlying member method code with example usage: obj.report_cross_access(model) without return types