Skip to content

Commit 423d400

Browse files
authored
Overrides copy and deep copy for the metagraph (#2523)
1 parent 534342c commit 423d400

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

bittensor/core/metagraph.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import os
23
import pickle
34
import typing
@@ -911,6 +912,30 @@ def load_from_path(self, dir_path: str) -> "Metagraph":
911912
state files within it are accurate and consistent with the expected metagraph structure.
912913
"""
913914

915+
def __deepcopy__(self, memo):
916+
cls = self.__class__
917+
new_instance = cls.__new__(cls)
918+
memo[id(self)] = new_instance
919+
920+
for key, value in self.__dict__.items():
921+
if key == "subtensor":
922+
setattr(new_instance, key, None)
923+
else:
924+
setattr(new_instance, key, copy.deepcopy(value, memo))
925+
926+
return new_instance
927+
928+
def __copy__(self):
929+
cls = self.__class__
930+
new_instance = cls.__new__(cls)
931+
932+
for key, value in self.__dict__.items():
933+
if key == "subtensor":
934+
setattr(new_instance, key, None)
935+
else:
936+
setattr(new_instance, key, value)
937+
return new_instance
938+
914939

915940
BaseClass: Union["torch.nn.Module", object] = torch.nn.Module if use_torch() else object
916941
"""

tests/unit_tests/test_metagraph.py

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import numpy as np
2222
import pytest
23+
import copy
2324

2425
from bittensor.core import settings
2526
from bittensor.core.metagraph import Metagraph
@@ -174,3 +175,97 @@ def test_sync_warning_cases(block, test_id, metagraph_instance, mock_subtensor,
174175
assert (
175176
expected_message in caplog.text
176177
), f"Test ID: {test_id} - Expected warning message not found in Loguru sink."
178+
179+
180+
def test_deepcopy(mock_environment):
181+
subtensor, neurons = mock_environment
182+
metagraph = Metagraph(1, sync=False)
183+
metagraph.neurons = neurons
184+
metagraph.subtensor = subtensor
185+
186+
# Do a deep copy
187+
copied_metagraph = copy.deepcopy(metagraph)
188+
189+
# Check that the subtensor attribute is None
190+
assert copied_metagraph.subtensor is None
191+
192+
# Check that other attributes are copied correctly
193+
assert copied_metagraph.n == metagraph.n
194+
assert copied_metagraph.block == metagraph.block
195+
assert np.array_equal(copied_metagraph.uids, metagraph.uids)
196+
assert np.array_equal(copied_metagraph.stake, metagraph.stake)
197+
assert np.array_equal(copied_metagraph.total_stake, metagraph.total_stake)
198+
assert np.array_equal(copied_metagraph.ranks, metagraph.ranks)
199+
assert np.array_equal(copied_metagraph.trust, metagraph.trust)
200+
assert np.array_equal(copied_metagraph.consensus, metagraph.consensus)
201+
assert np.array_equal(copied_metagraph.validator_trust, metagraph.validator_trust)
202+
assert np.array_equal(copied_metagraph.incentive, metagraph.incentive)
203+
assert np.array_equal(copied_metagraph.emission, metagraph.emission)
204+
assert np.array_equal(copied_metagraph.dividends, metagraph.dividends)
205+
assert np.array_equal(copied_metagraph.active, metagraph.active)
206+
assert np.array_equal(copied_metagraph.last_update, metagraph.last_update)
207+
assert np.array_equal(copied_metagraph.validator_permit, metagraph.validator_permit)
208+
assert np.array_equal(copied_metagraph.weights, metagraph.weights)
209+
assert np.array_equal(copied_metagraph.bonds, metagraph.bonds)
210+
211+
# Check that the neurons are different objects in the original and copied metagraphs
212+
for original_neuron, copied_neuron in zip(
213+
metagraph.neurons, copied_metagraph.neurons
214+
):
215+
assert original_neuron is not copied_neuron
216+
assert original_neuron.uid == copied_neuron.uid
217+
assert original_neuron.trust == copied_neuron.trust
218+
assert original_neuron.consensus == copied_neuron.consensus
219+
assert original_neuron.incentive == copied_neuron.incentive
220+
assert original_neuron.dividends == copied_neuron.dividends
221+
assert original_neuron.rank == copied_neuron.rank
222+
assert original_neuron.emission == copied_neuron.emission
223+
assert original_neuron.active == copied_neuron.active
224+
assert original_neuron.last_update == copied_neuron.last_update
225+
assert original_neuron.validator_permit == copied_neuron.validator_permit
226+
assert original_neuron.validator_trust == copied_neuron.validator_trust
227+
assert original_neuron.total_stake.tao == copied_neuron.total_stake.tao
228+
assert original_neuron.stake == copied_neuron.stake
229+
assert original_neuron.axon_info == copied_neuron.axon_info
230+
assert original_neuron.weights == copied_neuron.weights
231+
assert original_neuron.bonds == copied_neuron.bonds
232+
233+
234+
def test_copy(mock_environment):
235+
subtensor, neurons = mock_environment
236+
metagraph = Metagraph(1, sync=False)
237+
metagraph.neurons = neurons
238+
metagraph.subtensor = subtensor
239+
240+
# Do a shallow copy
241+
copied_metagraph = copy.copy(metagraph)
242+
243+
# Check that the subtensor attribute is None in the copied object
244+
assert copied_metagraph.subtensor is None
245+
246+
# Check that other attributes are copied correctly
247+
assert copied_metagraph.n == metagraph.n
248+
assert copied_metagraph.block == metagraph.block
249+
assert np.array_equal(copied_metagraph.uids, metagraph.uids)
250+
assert np.array_equal(copied_metagraph.stake, metagraph.stake)
251+
assert np.array_equal(copied_metagraph.total_stake, metagraph.total_stake)
252+
assert np.array_equal(copied_metagraph.ranks, metagraph.ranks)
253+
assert np.array_equal(copied_metagraph.trust, metagraph.trust)
254+
assert np.array_equal(copied_metagraph.consensus, metagraph.consensus)
255+
assert np.array_equal(copied_metagraph.validator_trust, metagraph.validator_trust)
256+
assert np.array_equal(copied_metagraph.incentive, metagraph.incentive)
257+
assert np.array_equal(copied_metagraph.emission, metagraph.emission)
258+
assert np.array_equal(copied_metagraph.dividends, metagraph.dividends)
259+
assert np.array_equal(copied_metagraph.active, metagraph.active)
260+
assert np.array_equal(copied_metagraph.last_update, metagraph.last_update)
261+
assert np.array_equal(copied_metagraph.validator_permit, metagraph.validator_permit)
262+
assert copied_metagraph.axons == metagraph.axons
263+
assert copied_metagraph.neurons == metagraph.neurons
264+
assert np.array_equal(copied_metagraph.weights, metagraph.weights)
265+
assert np.array_equal(copied_metagraph.bonds, metagraph.bonds)
266+
267+
# Check that the neurons are the same objects in the original and copied metagraphs
268+
for original_neuron, copied_neuron in zip(
269+
metagraph.neurons, copied_metagraph.neurons
270+
):
271+
assert original_neuron is copied_neuron

0 commit comments

Comments
 (0)