Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 92 additions & 6 deletions pallets/subtensor/src/epoch/run_epoch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1327,9 +1327,21 @@ impl<T: Config> Pallet<T> {
.iter()
.any(|&c| c != I32F32::saturating_from_num(0))
{
// Liquid Alpha is enabled, compute the liquid alphas matrix.
let alphas: Vec<Vec<I32F32>> =
Self::compute_liquid_alpha_values(netuid, weights, bonds, consensus);
// Liquid Alpha is enabled, compute the appropriate consensus for liquid alpha based on mode
let consensus_for_liquid_alpha =
Self::compute_consensus_for_liquid_alpha(netuid, consensus);
log::trace!(
"consensus_for_liquid_alpha: {:?}",
&consensus_for_liquid_alpha
);

// Compute the liquid alphas matrix.
let alphas: Vec<Vec<I32F32>> = Self::compute_liquid_alpha_values(
netuid,
weights,
bonds,
&consensus_for_liquid_alpha,
);
log::trace!("alphas: {:?}", &alphas);

// Compute the Exponential Moving Average (EMA) of bonds using the provided clamped alpha values.
Expand Down Expand Up @@ -1369,9 +1381,21 @@ impl<T: Config> Pallet<T> {
.iter()
.any(|&c| c != I32F32::saturating_from_num(0))
{
// Liquid Alpha is enabled, compute the liquid alphas matrix.
let alphas: Vec<Vec<I32F32>> =
Self::compute_liquid_alpha_values_sparse(netuid, weights, bonds, consensus);
// Liquid Alpha is enabled, compute the appropriate consensus for liquid alpha based on mode
let consensus_for_liquid_alpha =
Self::compute_consensus_for_liquid_alpha(netuid, consensus);
log::trace!(
"consensus_for_liquid_alpha: {:?}",
&consensus_for_liquid_alpha
);

// Compute the liquid alphas matrix.
let alphas: Vec<Vec<I32F32>> = Self::compute_liquid_alpha_values_sparse(
netuid,
weights,
bonds,
&consensus_for_liquid_alpha,
);
log::trace!("alphas: {:?}", &alphas);

// Compute the Exponential Moving Average (EMA) of bonds using the provided clamped alpha values.
Expand All @@ -1385,6 +1409,55 @@ impl<T: Config> Pallet<T> {
}
}

/// Compute the consensus to use for liquid alpha calculation based on the configured mode
///
/// # Args:
/// * `netuid` - The network ID.
/// * `current_consensus` - The current in-memory consensus values.
///
/// # Returns:
/// A vector of consensus values to use for liquid alpha calculation
pub fn compute_consensus_for_liquid_alpha(
netuid: NetUid,
current_consensus: &[I32F32],
) -> Vec<I32F32> {
let mode = Self::get_liquid_alpha_consensus_mode(netuid);

match mode {
ConsensusMode::Current => {
// Use the in-memory consensus (current behavior)
current_consensus.to_vec()
}
ConsensusMode::Previous => {
// Use consensus from storage
let previous_consensus_u16 = Consensus::<T>::get(netuid);
previous_consensus_u16
.iter()
.map(|&c| {
I32F32::saturating_from_num(c)
.safe_div(I32F32::saturating_from_num(u16::MAX))
})
.collect()
}
ConsensusMode::Auto => {
// Auto mode: Previous if bond_penalty == 1, otherwise Current
let bonds_penalty = Self::get_float_bonds_penalty(netuid);
if bonds_penalty == I32F32::from_num(1) {
let previous_consensus_u16 = Consensus::<T>::get(netuid);
previous_consensus_u16
.iter()
.map(|&c| {
I32F32::saturating_from_num(c)
.safe_div(I32F32::saturating_from_num(u16::MAX))
})
.collect()
} else {
current_consensus.to_vec()
}
}
}
}

/// Compute liquid alphas matrix
/// There is a separate alpha param for each validator-miner binding
///
Expand Down Expand Up @@ -1592,6 +1665,19 @@ impl<T: Config> Pallet<T> {
Ok(())
}

pub fn do_set_liquid_alpha_consensus_mode(
origin: T::RuntimeOrigin,
netuid: NetUid,
mode: ConsensusMode,
) -> Result<(), DispatchError> {
Self::ensure_subnet_owner_or_root(origin, netuid)?;

Self::set_liquid_alpha_consensus_mode(netuid, mode.clone());

log::debug!("LiquidAlphaConsensusModeSet( netuid: {netuid:?}, mode: {mode:?} )",);
Ok(())
}

pub fn do_reset_bonds(
netuid_index: NetUidStorageIndex,
account_id: &T::AccountId,
Expand Down
24 changes: 23 additions & 1 deletion pallets/subtensor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,18 @@ pub mod pallet {
Manual,
}

/// Enum for consensus mode used in liquid alpha calculation
#[derive(Encode, Decode, Default, TypeInfo, Clone, PartialEq, Eq, Debug)]
pub enum ConsensusMode {
/// Use current in-memory consensus (current behavior)
Current,
/// Use previous consensus from storage
Previous,
/// Auto mode: Previous if bond_penalty == 1, otherwise Current
#[default]
Auto,
}

/// Default minimum root claim amount.
/// This is the minimum amount of root claim that can be made.
/// Any amount less than this will not be claimed.
Expand Down Expand Up @@ -949,6 +961,11 @@ pub mod pallet {
(45875, 58982)
}

/// Default consensus mode for liquid alpha calculation
#[pallet::type_value]
pub fn DefaultConsensusMode<T: Config>() -> ConsensusMode {
ConsensusMode::default()
}
/// Default value for coldkey swap schedule duration
#[pallet::type_value]
pub fn DefaultColdkeySwapScheduleDuration<T: Config>() -> BlockNumberFor<T> {
Expand Down Expand Up @@ -1860,7 +1877,12 @@ pub mod pallet {
#[pallet::storage]
pub type AlphaValues<T> =
StorageMap<_, Identity, NetUid, (u16, u16), ValueQuery, DefaultAlphaValues<T>>;


/// MAP ( netuid ) --> consensus mode for liquid alpha calculation
#[pallet::storage]
pub type LiquidAlphaConsensusMode<T> =
StorageMap<_, Identity, NetUid, ConsensusMode, ValueQuery, DefaultConsensusMode<T>>;

/// --- MAP ( netuid ) --> If subtoken trading enabled
#[pallet::storage]
pub type SubtokenEnabled<T> =
Expand Down
Loading