code: def test_save_load(self):
      self.run_init()
      print("-" * 80)
      logger.info("test_save_load\n" + "-" * 80 + "\n")
      scores = self.model.get_anomaly_score(self.vals_test)
      scores = scores.to_pd().values.flatten()
  
      self.model.save(dirname=join(rootdir, "tmp", "rcf"))
      loaded_model = RandomCutForest.load(
          dirname=join(rootdir, "tmp", "rcf")
      )
      loaded_model_scores = loaded_model.get_anomaly_score(
          self.vals_test
      )
      loaded_model_scores = loaded_model_scores.to_pd().values.flatten()
  
      self.assertEqual(len(scores), len(loaded_model_scores))
      max_diff = float(np.max(np.abs(scores - loaded_model_scores)))
      self.assertAlmostEqual(max_diff, 0.0, delta=1)
  
file_path: merlion/tests/anomaly/test_random_cut_forest.py
imports: import logging
  import math
  from os.path import abspath, dirname, join
  import sys
  import unittest
  import numpy
  from merlion.models.anomaly.random_cut_forest import RandomCutForest, RandomCutForestConfig
  from merlion.post_process.threshold import AggregateAlarms
  from merlion.transform.moving_average import DifferenceTransform
  from merlion.transform.normalize import MeanVarNormalize
  from merlion.transform.resample import Shingle, TemporalResample
  from merlion.transform.sequence import TransformSequence
  from merlion.utils.data_io import csv_to_time_series
label_desc: Use image node_id 4 for calling the TestRandomCutForest obj's underlying member method code with example usage: obj.test_save_load() without return types