class_docstr: `AlgorithmBase` is the base class of the `parl.Algorithm` in different
  frameworks.
  
  This base class mainly do the following things:
      1. Implements APIs to set or get weights of all `ModelBase` in self.__dict__;
      2. Defines common APIs that `parl.Algorithm` should implement in different frameworks.
docstr: Set weights of all `ModelBase` in self.__dict__.
  
  Note:
      `ModelBase` in list, tuple and dict will be included. But `ModelBase` in
      nested list, tuple and dict won't be included.
  
  Args:
      weights (Dict): Dict of weights ({attribute name: numpy array/List/Dict})
code: def set_weights(self, weights):
      """Set weights of all `ModelBase` in self.__dict__.
  
      Note:
          `ModelBase` in list, tuple and dict will be included. But `ModelBase` in
          nested list, tuple and dict won't be included.
  
      Args:
          weights (Dict): Dict of weights ({attribute name: numpy array/List/Dict})
  
      """
      for key in self.__dict__.keys():
          value = getattr(self, key)
          if isinstance(value, ModelBase):
              assert (
                  key in weights
              ), "weights is inconsistent with current algorithm."
              value.set_weights(weights[key])
          elif isinstance(value, list) or isinstance(value, tuple):
              model_list = []
              for x in value:
                  if isinstance(x, ModelBase):
                      model_list.append(x)
              if model_list:
                  assert key in weights and len(model_list) == len(
                      weights[key]
                  ), "weights is inconsistent with current algorithm."
                  for i, model in enumerate(model_list):
                      model.set_weights(weights[key][i])
          elif isinstance(value, dict):
              model_dict = {}
              for sub_k, sub_v in value.items():
                  if isinstance(sub_v, ModelBase):
                      model_dict[sub_k] = sub_v
              if model_dict:
                  assert key in weights and set(
                      model_dict.keys()
                  ) == set(
                      weights[key].keys()
                  ), "weights is inconsistent with current algorithm."
                  for sub_k, model in model_dict.items():
                      model.set_weights(weights[key][sub_k])
  
file_path: PARL/parl/core/algorithm_base.py
imports: from parl.core.model_base import ModelBase
label_desc: Use image node_id 3 for calling the AlgorithmBase obj's underlying member method code with example usage: obj.set_weights(weights) without return types