docstr: This function is a wrapper to allow having the same calls for shared or unshared memories.
  It should be used instead of calling the memory directly in order to allow different algorithms to work
  both with a shared and a local memory.
  
  :param func: the name of the memory function to call
  :param args: the arguments to supply to the function
  :return: the return value of the function
docstr_tok: ["This","function","is","a","wrapper","to","allow","having","the","same","calls","for","shared","or","unshared","memories",".","It","should","be","used","instead","of","calling","the","memory","directly","in","order","to","allow","different","algorithms","to","work","both","with","a","shared","and","a","local","memory",".",":","param","func",":","the","name","of","the","memory","function","to","call",":","param","args",":","the","arguments","to","supply","to","the","function",":","return",":","the","return","value","of","the","function"]
code: def call_memory(self, func, args=()):
      """
      This function is a wrapper to allow having the same calls for shared or unshared memories.
      It should be used instead of calling the memory directly in order to allow different algorithms to work
      both with a shared and a local memory.
  
      :param func: the name of the memory function to call
      :param args: the arguments to supply to the function
      :return: the return value of the function
      """
      if self.shared_memory:
          result = self.shared_memory_scratchpad.internal_call(
              self.memory_lookup_name, func, args
          )
      else:
          if type(args) != tuple:
              args = (args,)
          result = getattr(self.memory, func)(*args)
      return result
  
imports: import copy
  import random
  from collections import OrderedDict
  from typing import Dict, List, Union, Tuple
  import numpy
  from six.moves import range
  from rl_coach.agents.agent_interface import AgentInterface
  from rl_coach.architectures.network_wrapper import NetworkWrapper
  from rl_coach.base_parameters import AgentParameters, Device, DeviceType, DistributedTaskParameters, Frameworks
  from rl_coach.core_types import RunPhase, PredictionType, EnvironmentEpisodes, ActionType, Batch, Episode, StateType
  from rl_coach.core_types import Transition, ActionInfo, TrainingSteps, EnvironmentSteps, EnvResponse
  from rl_coach.logger import screen, Logger, EpisodeLogger
  from rl_coach.memories.episodic.episodic_experience_replay import EpisodicExperienceReplay
  from rl_coach.saver import SaverCollection
  from rl_coach.spaces import SpacesDefinition, VectorObservationSpace, GoalsSpace, AttentionActionSpace
  from rl_coach.utils import Signal, force_list
  from rl_coach.utils import dynamic_import_and_instantiate_module_from_params
  from rl_coach.memories.backend.memory_impl import get_memory_backend
  from rl_coach.core_types import TimeTypes
  from rl_coach.off_policy_evaluators.ope_manager import OpeManager
  from rl_coach.core_types import PickledReplayBuffer, CsvDataset
label_desc: Use image node_id 15 for calling the Agent obj's underlying member method code with example usage: obj.call_memory(func, args) and returns: result