oxwhirl / smac

SMAC: The StarCraft Multi-Agent Challenge
MIT License
1.04k stars 227 forks source link

Environment Cloning #69

Closed dimikout3 closed 3 years ago

dimikout3 commented 3 years ago

Is there a way of create a copy of a running environment, in order to perform some kind of breadth-first search or apply Monte Carlo techniques. I have already tried using python's copy library but the threading gives me some hard time and deepcopy() works. I get the following error

env2 = copy.deepcopy(env)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 270, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 146, in deepcopy
    y = copier(x, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 230, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 270, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 146, in deepcopy
    y = copier(x, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 230, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 270, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 146, in deepcopy
    y = copier(x, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 230, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 270, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 146, in deepcopy
    y = copier(x, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 230, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/dkoutras/.conda/envs/GEP/lib/python3.8/copy.py", line 161, in deepcopy
    rv = reductor(4)
TypeError: cannot pickle '_thread.lock' object

env is the original smac environment and env2 the expected copy.

samvelyan commented 3 years ago

Unfortunately, I don't think this is possible given the PySC2 interface that SMAC uses.