class_docstr: Doppelganger Simulator for time series generation.
  The codes and algorithm are adapted from https://github.com/fjxmlzn/DoppelGANger.
class_docstr_tok: ["Doppelganger","Simulator","for","time","series","generation",".","The","codes","and","algorithm","are","adapted","from","https",":","\/\/github.com\/fjxmlzn\/DoppelGANger","."]
docstr: Save the simulator.
  
  :param path_dir: saving path
docstr_tok: ["Save","the","simulator",".",":","param","path_dir",":","saving","path"]
code: def save(self, path_dir):
      """
      Save the simulator.
  
      :param path_dir: saving path
      """
      path_dir_model = os.path.join(path_dir, "model")
      self.trainer.save_checkpoint(
          os.path.join(path_dir_model, MODEL_PATH)
      )
      with open(os.path.join(path_dir, FEATURE_OUTPUT), "wb") as f:
          pickle.dump(self.data_module.data_feature_outputs, f)
      with open(os.path.join(path_dir, ATTRIBUTE_OUTPUT), "wb") as f:
          pickle.dump(self.data_module.data_attribute_outputs, f)
  
file_path: analytics-zoo/pyzoo/zoo/chronos/simulator/doppelganger_simulator.py
imports: import pickle
  import os
  import numpy
  from zoo.chronos.simulator.doppelganger.util import gen_attribute_input_noise, gen_feature_input_noise, gen_feature_input_data_free, renormalize_per_sample
  from zoo.chronos.simulator.doppelganger.output import OutputType
  import torch
  import torch.nn.functional
label_desc: Use image node_id 4 for calling the DPGANSimulator obj's underlying member method code with example usage: obj.save(path_dir) without return types