Skip to content

Commit ceed34a

Browse files
authored
Merge pull request #1443 from opentensor/feat/reset-bonds-on-dereg
Feat/reset bonds on dereg
2 parents dfe3161 + cbca1c3 commit ceed34a

File tree

6 files changed

+406
-26
lines changed

6 files changed

+406
-26
lines changed

pallets/subtensor/src/epoch/math.rs

+38
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,24 @@ pub fn inplace_mask_rows(mask: &[bool], matrix: &mut [Vec<I32F32>]) {
549549
});
550550
}
551551

552+
// Apply column mask to matrix, mask=true will mask out, i.e. set to 0.
553+
// Assumes each column has the same length.
554+
#[allow(dead_code)]
555+
pub fn inplace_mask_cols(mask: &[bool], matrix: &mut [Vec<I32F32>]) {
556+
let Some(first_row) = matrix.first() else {
557+
return;
558+
};
559+
assert_eq!(mask.len(), first_row.len());
560+
let zero: I32F32 = I32F32::saturating_from_num(0);
561+
matrix.iter_mut().for_each(|row_elem| {
562+
row_elem.iter_mut().zip(mask).for_each(|(elem, mask_col)| {
563+
if *mask_col {
564+
*elem = zero;
565+
}
566+
});
567+
});
568+
}
569+
552570
// Mask out the diagonal of the input matrix in-place.
553571
#[allow(dead_code)]
554572
pub fn inplace_mask_diag(matrix: &mut [Vec<I32F32>]) {
@@ -569,6 +587,26 @@ pub fn inplace_mask_diag(matrix: &mut [Vec<I32F32>]) {
569587
});
570588
}
571589

590+
// Remove cells from sparse matrix where the mask function of a scalar and a vector is true.
591+
#[allow(dead_code, clippy::indexing_slicing)]
592+
pub fn scalar_vec_mask_sparse_matrix(
593+
sparse_matrix: &[Vec<(u16, I32F32)>],
594+
scalar: u64,
595+
vector: &[u64],
596+
mask_fn: &dyn Fn(u64, u64) -> bool,
597+
) -> Vec<Vec<(u16, I32F32)>> {
598+
let n: usize = sparse_matrix.len();
599+
let mut result: Vec<Vec<(u16, I32F32)>> = vec![vec![]; n];
600+
for (i, sparse_row) in sparse_matrix.iter().enumerate() {
601+
for (j, value) in sparse_row {
602+
if !mask_fn(scalar, vector[*j as usize]) {
603+
result[i].push((*j, *value));
604+
}
605+
}
606+
}
607+
result
608+
}
609+
572610
// Mask out the diagonal of the input matrix in-place, except for the diagonal entry at except_index.
573611
#[allow(dead_code)]
574612
pub fn inplace_mask_diag_except_index(matrix: &mut [Vec<I32F32>], except_index: u16) {

pallets/subtensor/src/epoch/run_epoch.rs

+28-6
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ impl<T: Config> Pallet<T> {
2222
let current_block: u64 = Self::get_current_block_as_u64();
2323
log::trace!("current_block:\n{:?}\n", current_block);
2424

25+
// Get tempo.
26+
let tempo: u64 = Self::get_tempo(netuid).into();
27+
log::trace!("tempo: {:?}", tempo);
28+
2529
// Get activity cutoff.
2630
let activity_cutoff: u64 = Self::get_activity_cutoff(netuid) as u64;
2731
log::trace!("activity_cutoff:\n{:?}\n", activity_cutoff);
@@ -44,7 +48,7 @@ impl<T: Config> Pallet<T> {
4448
let block_at_registration: Vec<u64> = Self::get_block_at_registration(netuid);
4549
log::trace!("Block at registration:\n{:?}\n", &block_at_registration);
4650

47-
// Outdated matrix, updated_ij=True if i has last updated (weights) after j has last registered.
51+
// Outdated matrix, outdated_ij=True if i has last updated (weights) after j has last registered.
4852
let outdated: Vec<Vec<bool>> = last_update
4953
.iter()
5054
.map(|updated| {
@@ -56,6 +60,16 @@ impl<T: Config> Pallet<T> {
5660
.collect();
5761
log::trace!("Outdated:\n{:?}\n", &outdated);
5862

63+
// Recently registered matrix, recently_ij=True if last_tempo was *before* j was last registered.
64+
// Mask if: the last tempo block happened *before* the registration block
65+
// ==> last_tempo <= registered
66+
let last_tempo: u64 = current_block.saturating_sub(tempo);
67+
let recently_registered: Vec<bool> = block_at_registration
68+
.iter()
69+
.map(|registered| last_tempo <= *registered)
70+
.collect();
71+
log::trace!("Recently registered:\n{:?}\n", &recently_registered);
72+
5973
// ===========
6074
// == Stake ==
6175
// ===========
@@ -185,7 +199,8 @@ impl<T: Config> Pallet<T> {
185199

186200
// Access network bonds.
187201
let mut bonds: Vec<Vec<I32F32>> = Self::get_bonds(netuid);
188-
inplace_mask_matrix(&outdated, &mut bonds); // mask outdated bonds
202+
// Remove bonds referring to neurons that have registered since last tempo.
203+
inplace_mask_cols(&recently_registered, &mut bonds); // mask recently registered bonds
189204
inplace_col_normalize(&mut bonds); // sum_i b_ij = 1
190205
log::trace!("B:\n{:?}\n", &bonds);
191206

@@ -386,6 +401,10 @@ impl<T: Config> Pallet<T> {
386401
let current_block: u64 = Self::get_current_block_as_u64();
387402
log::trace!("current_block: {:?}", current_block);
388403

404+
// Get tempo.
405+
let tempo: u64 = Self::get_tempo(netuid).into();
406+
log::trace!("tempo:\n{:?}\n", tempo);
407+
389408
// Get activity cutoff.
390409
let activity_cutoff: u64 = Self::get_activity_cutoff(netuid) as u64;
391410
log::trace!("activity_cutoff: {:?}", activity_cutoff);
@@ -548,12 +567,15 @@ impl<T: Config> Pallet<T> {
548567
let mut bonds: Vec<Vec<(u16, I32F32)>> = Self::get_bonds_sparse(netuid);
549568
log::trace!("B: {:?}", &bonds);
550569

551-
// Remove bonds referring to deregistered neurons.
552-
bonds = vec_mask_sparse_matrix(
570+
// Remove bonds referring to neurons that have registered since last tempo.
571+
// Mask if: the last tempo block happened *before* the registration block
572+
// ==> last_tempo <= registered
573+
let last_tempo: u64 = current_block.saturating_sub(tempo);
574+
bonds = scalar_vec_mask_sparse_matrix(
553575
&bonds,
554-
&last_update,
576+
last_tempo,
555577
&block_at_registration,
556-
&|updated, registered| updated <= registered,
578+
&|last_tempo, registered| last_tempo <= registered,
557579
);
558580
log::trace!("B (outdatedmask): {:?}", &bonds);
559581

pallets/subtensor/src/subnets/uids.rs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ impl<T: Config> Pallet<T> {
2323
Consensus::<T>::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0));
2424
Incentive::<T>::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0));
2525
Dividends::<T>::mutate(netuid, |v| Self::set_element_at(v, neuron_index, 0));
26+
Bonds::<T>::remove(netuid, neuron_uid); // Remove bonds for Validator.
2627
}
2728

2829
/// Replace the neuron under this uid.

0 commit comments

Comments
 (0)