diff --git a/crates/brk_client/src/lib.rs b/crates/brk_client/src/lib.rs index 1e63e7658..3ba01d13a 100644 --- a/crates/brk_client/src/lib.rs +++ b/crates/brk_client/src/lib.rs @@ -2062,8 +2062,8 @@ pub struct AverageBlockCumulativeInSumPattern { pub average: _1m1w1y24hPattern3, pub block: BtcCentsSatsUsdPattern3, pub cumulative: BtcCentsSatsUsdPattern, - pub in_loss: AverageBlockCumulativeSumPattern3, - pub in_profit: AverageBlockCumulativeSumPattern3, + pub in_loss: AverageBlockCumulativeSumPattern2, + pub in_profit: AverageBlockCumulativeSumPattern2, pub sum: _1m1w1y24hPattern4, } @@ -2074,8 +2074,8 @@ impl AverageBlockCumulativeInSumPattern { average: _1m1w1y24hPattern3::new(client.clone(), _m(&acc, "average")), block: BtcCentsSatsUsdPattern3::new(client.clone(), acc.clone()), cumulative: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "cumulative")), - in_loss: AverageBlockCumulativeSumPattern3::new(client.clone(), _m(&acc, "in_loss")), - in_profit: AverageBlockCumulativeSumPattern3::new(client.clone(), _m(&acc, "in_profit")), + in_loss: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "in_loss")), + in_profit: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "in_profit")), sum: _1m1w1y24hPattern4::new(client.clone(), _m(&acc, "sum")), } } @@ -2641,33 +2641,13 @@ impl _1m1w1y24hPattern8 { /// Pattern struct for repeated tree structure. pub struct AverageBlockCumulativeSumPattern2 { - pub average: _1m1w1y24hPattern, - pub block: SeriesPattern18, - pub cumulative: SeriesPattern1, - pub sum: _1m1w1y24hPattern, -} - -impl AverageBlockCumulativeSumPattern2 { - /// Create a new pattern node with accumulated series name. - pub fn new(client: Arc, acc: String) -> Self { - Self { - average: _1m1w1y24hPattern::new(client.clone(), _m(&acc, "average")), - block: SeriesPattern18::new(client.clone(), acc.clone()), - cumulative: SeriesPattern1::new(client.clone(), _m(&acc, "cumulative")), - sum: _1m1w1y24hPattern::new(client.clone(), _m(&acc, "sum")), - } - } -} - -/// Pattern struct for repeated tree structure. -pub struct AverageBlockCumulativeSumPattern3 { pub average: _1m1w1y24hPattern3, pub block: BtcCentsSatsUsdPattern3, pub cumulative: BtcCentsSatsUsdPattern, pub sum: _1m1w1y24hPattern4, } -impl AverageBlockCumulativeSumPattern3 { +impl AverageBlockCumulativeSumPattern2 { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { @@ -2977,18 +2957,18 @@ impl BlockCumulativeSumPattern { /// Pattern struct for repeated tree structure. pub struct BlocksDominanceRewardsPattern { - pub blocks_mined: AverageBlockCumulativeSumPattern2, + pub blocks_mined: AverageBlockCumulativeSumPattern, pub dominance: _1m1w1y24hPercentPpmRatioPattern, - pub rewards: AverageBlockCumulativeSumPattern3, + pub rewards: AverageBlockCumulativeSumPattern2, } impl BlocksDominanceRewardsPattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { - blocks_mined: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "blocks_mined")), + blocks_mined: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "blocks_mined")), dominance: _1m1w1y24hPercentPpmRatioPattern::new(client.clone(), _m(&acc, "dominance")), - rewards: AverageBlockCumulativeSumPattern3::new(client.clone(), _m(&acc, "rewards")), + rewards: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "rewards")), } } } @@ -3272,7 +3252,7 @@ impl RsiStochPattern { /// Pattern struct for repeated tree structure. pub struct SpentUnspentUtxoPattern { - pub spent_count: AverageBlockCumulativeSumPattern2, + pub spent_count: AverageBlockCumulativeSumPattern, pub unspent_count: BaseDeltaPattern, pub utxo_turnover_1y: SeriesPattern1, } @@ -3281,7 +3261,7 @@ impl SpentUnspentUtxoPattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { - spent_count: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "spent_utxo_count")), + spent_count: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "spent_utxo_count")), unspent_count: BaseDeltaPattern::new(client.clone(), _m(&acc, "utxo_count")), utxo_turnover_1y: SeriesPattern1::new(client.clone(), _m(&acc, "utxo_turnover_1y")), } @@ -3468,7 +3448,7 @@ impl BlockCumulativePattern { /// Pattern struct for repeated tree structure. pub struct BlocksDominancePattern { - pub blocks_mined: AverageBlockCumulativeSumPattern2, + pub blocks_mined: AverageBlockCumulativeSumPattern, pub dominance: PercentPpmRatioPattern2, } @@ -3476,7 +3456,7 @@ impl BlocksDominancePattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { - blocks_mined: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "blocks_mined")), + blocks_mined: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "blocks_mined")), dominance: PercentPpmRatioPattern2::new(client.clone(), _m(&acc, "dominance")), } } @@ -3860,14 +3840,14 @@ impl SupplyPattern { /// Pattern struct for repeated tree structure. pub struct TransferPattern { - pub transfer_volume: AverageBlockCumulativeSumPattern3, + pub transfer_volume: AverageBlockCumulativeSumPattern2, } impl TransferPattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { - transfer_volume: AverageBlockCumulativeSumPattern3::new(client.clone(), acc.clone()), + transfer_volume: AverageBlockCumulativeSumPattern2::new(client.clone(), acc.clone()), } } } @@ -4038,14 +4018,14 @@ impl SeriesTree_Blocks_Size { /// Series tree node. pub struct SeriesTree_Blocks_Count { pub target: _1m1w1y24hPattern, - pub total: AverageBlockCumulativeSumPattern2, + pub total: AverageBlockCumulativeSumPattern, } impl SeriesTree_Blocks_Count { pub fn new(client: Arc, base_path: String) -> Self { Self { target: _1m1w1y24hPattern::new(client.clone(), "block_count_target".to_string()), - total: AverageBlockCumulativeSumPattern2::new(client.clone(), "block_count".to_string()), + total: AverageBlockCumulativeSumPattern::new(client.clone(), "block_count".to_string()), } } } @@ -4558,14 +4538,14 @@ impl SeriesTree_Transactions_Versions { /// Series tree node. pub struct SeriesTree_Transactions_Volume { - pub transfer_volume: AverageBlockCumulativeSumPattern3, + pub transfer_volume: AverageBlockCumulativeSumPattern2, pub tx_per_sec: _1m1w1y24hPattern, } impl SeriesTree_Transactions_Volume { pub fn new(client: Arc, base_path: String) -> Self { Self { - transfer_volume: AverageBlockCumulativeSumPattern3::new(client.clone(), "transfer_volume_bis".to_string()), + transfer_volume: AverageBlockCumulativeSumPattern2::new(client.clone(), "transfer_volume_bis".to_string()), tx_per_sec: _1m1w1y24hPattern::new(client.clone(), "tx_per_sec".to_string()), } } @@ -5704,7 +5684,7 @@ impl SeriesTree_Mining { /// Series tree node. pub struct SeriesTree_Mining_Rewards { - pub coinbase: AverageBlockCumulativeSumPattern3, + pub coinbase: AverageBlockCumulativeSumPattern2, pub subsidy: SeriesTree_Mining_Rewards_Subsidy, pub fees: SeriesTree_Mining_Rewards_Fees, pub output_volume: SeriesPattern18, @@ -5714,7 +5694,7 @@ pub struct SeriesTree_Mining_Rewards { impl SeriesTree_Mining_Rewards { pub fn new(client: Arc, base_path: String) -> Self { Self { - coinbase: AverageBlockCumulativeSumPattern3::new(client.clone(), "coinbase".to_string()), + coinbase: AverageBlockCumulativeSumPattern2::new(client.clone(), "coinbase".to_string()), subsidy: SeriesTree_Mining_Rewards_Subsidy::new(client.clone(), format!("{base_path}_subsidy")), fees: SeriesTree_Mining_Rewards_Fees::new(client.clone(), format!("{base_path}_fees")), output_volume: SeriesPattern18::new(client.clone(), "output_volume".to_string()), @@ -8248,7 +8228,7 @@ impl SeriesTree_Cohorts_Utxo_All { /// Series tree node. pub struct SeriesTree_Cohorts_Utxo_All_Outputs { pub unspent_count: BaseDeltaPattern, - pub spent_count: AverageBlockCumulativeSumPattern2, + pub spent_count: AverageBlockCumulativeSumPattern, pub utxo_turnover_1y: SeriesPattern1, } @@ -8256,7 +8236,7 @@ impl SeriesTree_Cohorts_Utxo_All_Outputs { pub fn new(client: Arc, base_path: String) -> Self { Self { unspent_count: BaseDeltaPattern::new(client.clone(), "utxo_count".to_string()), - spent_count: AverageBlockCumulativeSumPattern2::new(client.clone(), "spent_utxo_count".to_string()), + spent_count: AverageBlockCumulativeSumPattern::new(client.clone(), "spent_utxo_count".to_string()), utxo_turnover_1y: SeriesPattern1::new(client.clone(), "utxo_turnover_1y".to_string()), } } @@ -9029,53 +9009,53 @@ impl SeriesTree_Cohorts_Utxo_Profitability_Loss { /// Series tree node. pub struct SeriesTree_Cohorts_Utxo_Matured { - pub under_1h: AverageBlockCumulativeSumPattern3, - pub _1h_to_1d: AverageBlockCumulativeSumPattern3, - pub _1d_to_1w: AverageBlockCumulativeSumPattern3, - pub _1w_to_1m: AverageBlockCumulativeSumPattern3, - pub _1m_to_2m: AverageBlockCumulativeSumPattern3, - pub _2m_to_3m: AverageBlockCumulativeSumPattern3, - pub _3m_to_4m: AverageBlockCumulativeSumPattern3, - pub _4m_to_5m: AverageBlockCumulativeSumPattern3, - pub _5m_to_6m: AverageBlockCumulativeSumPattern3, - pub _6m_to_1y: AverageBlockCumulativeSumPattern3, - pub _1y_to_2y: AverageBlockCumulativeSumPattern3, - pub _2y_to_3y: AverageBlockCumulativeSumPattern3, - pub _3y_to_4y: AverageBlockCumulativeSumPattern3, - pub _4y_to_5y: AverageBlockCumulativeSumPattern3, - pub _5y_to_6y: AverageBlockCumulativeSumPattern3, - pub _6y_to_7y: AverageBlockCumulativeSumPattern3, - pub _7y_to_8y: AverageBlockCumulativeSumPattern3, - pub _8y_to_10y: AverageBlockCumulativeSumPattern3, - pub _10y_to_12y: AverageBlockCumulativeSumPattern3, - pub _12y_to_15y: AverageBlockCumulativeSumPattern3, - pub over_15y: AverageBlockCumulativeSumPattern3, + pub under_1h: AverageBlockCumulativeSumPattern2, + pub _1h_to_1d: AverageBlockCumulativeSumPattern2, + pub _1d_to_1w: AverageBlockCumulativeSumPattern2, + pub _1w_to_1m: AverageBlockCumulativeSumPattern2, + pub _1m_to_2m: AverageBlockCumulativeSumPattern2, + pub _2m_to_3m: AverageBlockCumulativeSumPattern2, + pub _3m_to_4m: AverageBlockCumulativeSumPattern2, + pub _4m_to_5m: AverageBlockCumulativeSumPattern2, + pub _5m_to_6m: AverageBlockCumulativeSumPattern2, + pub _6m_to_1y: AverageBlockCumulativeSumPattern2, + pub _1y_to_2y: AverageBlockCumulativeSumPattern2, + pub _2y_to_3y: AverageBlockCumulativeSumPattern2, + pub _3y_to_4y: AverageBlockCumulativeSumPattern2, + pub _4y_to_5y: AverageBlockCumulativeSumPattern2, + pub _5y_to_6y: AverageBlockCumulativeSumPattern2, + pub _6y_to_7y: AverageBlockCumulativeSumPattern2, + pub _7y_to_8y: AverageBlockCumulativeSumPattern2, + pub _8y_to_10y: AverageBlockCumulativeSumPattern2, + pub _10y_to_12y: AverageBlockCumulativeSumPattern2, + pub _12y_to_15y: AverageBlockCumulativeSumPattern2, + pub over_15y: AverageBlockCumulativeSumPattern2, } impl SeriesTree_Cohorts_Utxo_Matured { pub fn new(client: Arc, base_path: String) -> Self { Self { - under_1h: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_under_1h_old_matured_supply".to_string()), - _1h_to_1d: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1h_to_1d_old_matured_supply".to_string()), - _1d_to_1w: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1d_to_1w_old_matured_supply".to_string()), - _1w_to_1m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1w_to_1m_old_matured_supply".to_string()), - _1m_to_2m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1m_to_2m_old_matured_supply".to_string()), - _2m_to_3m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_2m_to_3m_old_matured_supply".to_string()), - _3m_to_4m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_3m_to_4m_old_matured_supply".to_string()), - _4m_to_5m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_4m_to_5m_old_matured_supply".to_string()), - _5m_to_6m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_5m_to_6m_old_matured_supply".to_string()), - _6m_to_1y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_6m_to_1y_old_matured_supply".to_string()), - _1y_to_2y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1y_to_2y_old_matured_supply".to_string()), - _2y_to_3y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_2y_to_3y_old_matured_supply".to_string()), - _3y_to_4y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_3y_to_4y_old_matured_supply".to_string()), - _4y_to_5y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_4y_to_5y_old_matured_supply".to_string()), - _5y_to_6y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_5y_to_6y_old_matured_supply".to_string()), - _6y_to_7y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_6y_to_7y_old_matured_supply".to_string()), - _7y_to_8y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_7y_to_8y_old_matured_supply".to_string()), - _8y_to_10y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_8y_to_10y_old_matured_supply".to_string()), - _10y_to_12y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_10y_to_12y_old_matured_supply".to_string()), - _12y_to_15y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_12y_to_15y_old_matured_supply".to_string()), - over_15y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_over_15y_old_matured_supply".to_string()), + under_1h: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_under_1h_old_matured_supply".to_string()), + _1h_to_1d: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_1h_to_1d_old_matured_supply".to_string()), + _1d_to_1w: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_1d_to_1w_old_matured_supply".to_string()), + _1w_to_1m: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_1w_to_1m_old_matured_supply".to_string()), + _1m_to_2m: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_1m_to_2m_old_matured_supply".to_string()), + _2m_to_3m: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_2m_to_3m_old_matured_supply".to_string()), + _3m_to_4m: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_3m_to_4m_old_matured_supply".to_string()), + _4m_to_5m: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_4m_to_5m_old_matured_supply".to_string()), + _5m_to_6m: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_5m_to_6m_old_matured_supply".to_string()), + _6m_to_1y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_6m_to_1y_old_matured_supply".to_string()), + _1y_to_2y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_1y_to_2y_old_matured_supply".to_string()), + _2y_to_3y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_2y_to_3y_old_matured_supply".to_string()), + _3y_to_4y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_3y_to_4y_old_matured_supply".to_string()), + _4y_to_5y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_4y_to_5y_old_matured_supply".to_string()), + _5y_to_6y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_5y_to_6y_old_matured_supply".to_string()), + _6y_to_7y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_6y_to_7y_old_matured_supply".to_string()), + _7y_to_8y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_7y_to_8y_old_matured_supply".to_string()), + _8y_to_10y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_8y_to_10y_old_matured_supply".to_string()), + _10y_to_12y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_10y_to_12y_old_matured_supply".to_string()), + _12y_to_15y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_12y_to_15y_old_matured_supply".to_string()), + over_15y: AverageBlockCumulativeSumPattern2::new(client.clone(), "utxos_over_15y_old_matured_supply".to_string()), } } } diff --git a/crates/brk_computer/src/blocks/count/compute.rs b/crates/brk_computer/src/blocks/count/compute.rs index 38ec22ef1..b13542128 100644 --- a/crates/brk_computer/src/blocks/count/compute.rs +++ b/crates/brk_computer/src/blocks/count/compute.rs @@ -1,6 +1,5 @@ use brk_error::Result; use brk_indexer::Indexer; -use brk_types::StoredU32; use vecdb::Exit; use super::Vecs; @@ -8,13 +7,12 @@ use super::Vecs; impl Vecs { pub(crate) fn compute(&mut self, indexer: &Indexer, exit: &Exit) -> Result<()> { let starting_height = indexer.safe_lengths().height; - self.total.block.compute_range( + self.total.cumulative.height.compute_cumulative_count( starting_height, &indexer.vecs.blocks.weight, - |h| (h, StoredU32::from(1_u32)), + |_| true, exit, )?; - self.total.compute_rest(starting_height, exit)?; Ok(()) } diff --git a/crates/brk_computer/src/blocks/count/vecs.rs b/crates/brk_computer/src/blocks/count/vecs.rs index be7d5c20f..deeaaaa84 100644 --- a/crates/brk_computer/src/blocks/count/vecs.rs +++ b/crates/brk_computer/src/blocks/count/vecs.rs @@ -1,5 +1,5 @@ use brk_traversable::Traversable; -use brk_types::{StoredU32, StoredU64}; +use brk_types::StoredU64; use vecdb::{Rw, StorageMode}; use crate::internal::{ConstantVecs, PerBlockCumulativeRolling, Windows}; @@ -7,5 +7,5 @@ use crate::internal::{ConstantVecs, PerBlockCumulativeRolling, Windows}; #[derive(Traversable)] pub struct Vecs { pub target: Windows>, - pub total: PerBlockCumulativeRolling, + pub total: PerBlockCumulativeRolling, } diff --git a/crates/brk_computer/src/distribution/addr/new_addr_count.rs b/crates/brk_computer/src/distribution/addr/new_addr_count.rs index 5481a31e5..84d848360 100644 --- a/crates/brk_computer/src/distribution/addr/new_addr_count.rs +++ b/crates/brk_computer/src/distribution/addr/new_addr_count.rs @@ -14,7 +14,7 @@ use super::TotalAddrCountVecs; /// New address count per block (global + per-type). #[derive(Deref, DerefMut, Traversable)] pub struct NewAddrCountVecs( - #[traversable(flatten)] pub WithAddrTypes>, + #[traversable(flatten)] pub WithAddrTypes>, ); impl NewAddrCountVecs { @@ -24,15 +24,15 @@ impl NewAddrCountVecs { indexes: &indexes::Vecs, cached_starts: &Windows<&WindowStartVec>, ) -> Result { - Ok(Self(WithAddrTypes::< - PerBlockCumulativeRolling, - >::forced_import( - db, - "new_addr_count", - version, - indexes, - cached_starts, - )?)) + Ok(Self( + WithAddrTypes::>::forced_import( + db, + "new_addr_count", + version, + indexes, + cached_starts, + )?, + )) } pub(crate) fn compute( @@ -41,9 +41,12 @@ impl NewAddrCountVecs { total_addr_count: &TotalAddrCountVecs, exit: &Exit, ) -> Result<()> { - self.0.all.compute(max_from, exit, |height_vec| { - Ok(height_vec.compute_change(max_from, &total_addr_count.all.height, 1, exit)?) - })?; + self.0.all.cumulative.height.compute_transform( + max_from, + &total_addr_count.all.height, + |(height, total, ..)| (height, StoredU64::from(total)), + exit, + )?; for ((_, new), (_, total)) in self .0 @@ -51,9 +54,12 @@ impl NewAddrCountVecs { .iter_mut() .zip(total_addr_count.by_addr_type.iter()) { - new.compute(max_from, exit, |height_vec| { - Ok(height_vec.compute_change(max_from, &total.height, 1, exit)?) - })?; + new.cumulative.height.compute_transform( + max_from, + &total.height, + |(height, total, ..)| (height, StoredU64::from(total)), + exit, + )?; } Ok(()) diff --git a/crates/brk_computer/src/distribution/addr/reused/events/vecs.rs b/crates/brk_computer/src/distribution/addr/reused/events/vecs.rs index dbd1c7421..7134e5caf 100644 --- a/crates/brk_computer/src/distribution/addr/reused/events/vecs.rs +++ b/crates/brk_computer/src/distribution/addr/reused/events/vecs.rs @@ -65,12 +65,10 @@ use super::state::AddrTypeToAddrEventCount; /// address can appear in multiple blocks. #[derive(Traversable)] pub struct AddrEventsVecs { - pub output_to_reused_addr_count: - WithAddrTypes>, + pub output_to_reused_addr_count: WithAddrTypes>, pub output_to_reused_addr_share: WithAddrTypes>, pub spendable_output_to_reused_addr_share: PercentCumulativeRolling, - pub input_from_reused_addr_count: - WithAddrTypes>, + pub input_from_reused_addr_count: WithAddrTypes>, pub input_from_reused_addr_share: WithAddrTypes>, pub active_reused_addr_count: PerBlockRollingAverage, pub active_reused_addr_share: PerBlockRollingAverage, @@ -85,7 +83,7 @@ impl AddrEventsVecs { cached_starts: &Windows<&WindowStartVec>, ) -> Result { let import_count = |name: &str| { - WithAddrTypes::>::forced_import( + WithAddrTypes::>::forced_import( db, name, version, @@ -211,10 +209,6 @@ impl AddrEventsVecs { inputs_by_type: &inputs::ByTypeVecs, exit: &Exit, ) -> Result<()> { - self.output_to_reused_addr_count - .compute_rest(starting_lengths.height, exit)?; - self.input_from_reused_addr_count - .compute_rest(starting_lengths.height, exit)?; self.active_reused_addr_count .compute_rest(starting_lengths.height, exit)?; self.active_reused_addr_share diff --git a/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs b/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs index a458b372c..5ede5f635 100644 --- a/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs +++ b/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs @@ -613,7 +613,8 @@ impl UTXOCohorts { .realized .sopr .value_destroyed - .block + .cumulative + .height .read_only_clone(); // "all" cohort computed first (no all_supply_sats needed). diff --git a/crates/brk_computer/src/distribution/compute/block_loop.rs b/crates/brk_computer/src/distribution/compute/block_loop.rs index 4d4b9a751..70234eb23 100644 --- a/crates/brk_computer/src/distribution/compute/block_loop.rs +++ b/crates/brk_computer/src/distribution/compute/block_loop.rs @@ -7,7 +7,7 @@ use brk_types::{ use rayon::prelude::*; use rustc_hash::FxHashSet; use tracing::{debug, info}; -use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, VecIndex, WritableVec, unlikely}; +use vecdb::{AnyVec, Exit, ReadableVec, VecIndex, unlikely}; use crate::{ distribution::{ @@ -213,9 +213,7 @@ pub(crate) fn process_blocks( .par_iter_vecs_mut() .chain(vecs.addr_cohorts.par_iter_vecs_mut()) .chain(vecs.addrs.par_iter_height_mut()) - .chain(rayon::iter::once( - &mut vecs.coinblocks_destroyed.block as &mut dyn AnyStoredVec, - )) + .chain(rayon::iter::once(vecs.coinblocks_destroyed.stored_mut())) .try_for_each(|v| v.any_truncate_if_needed_at(start))?; } @@ -394,7 +392,7 @@ pub(crate) fn process_blocks( blocks_old as u128 * u64::from(sent.spendable_supply.value) as u128 }) .sum(); - vecs.coinblocks_destroyed.block.push(StoredF64::from( + vecs.coinblocks_destroyed.push_block(StoredF64::from( total_satblocks as f64 / Sats::ONE_BTC_U128 as f64, )); } diff --git a/crates/brk_computer/src/distribution/compute/write.rs b/crates/brk_computer/src/distribution/compute/write.rs index 39d76072a..07fc1f756 100644 --- a/crates/brk_computer/src/distribution/compute/write.rs +++ b/crates/brk_computer/src/distribution/compute/write.rs @@ -80,7 +80,7 @@ pub(crate) fn write( .chain( [ &mut vecs.supply_state as &mut dyn AnyStoredVec, - &mut vecs.coinblocks_destroyed.block, + vecs.coinblocks_destroyed.stored_mut(), ] .into_par_iter(), ) diff --git a/crates/brk_computer/src/distribution/metrics/activity/core.rs b/crates/brk_computer/src/distribution/metrics/activity/core.rs index 90137884e..d8c58aaa9 100644 --- a/crates/brk_computer/src/distribution/metrics/activity/core.rs +++ b/crates/brk_computer/src/distribution/metrics/activity/core.rs @@ -23,7 +23,7 @@ pub struct ActivityCore { #[traversable(flatten)] pub minimal: ActivityMinimal, - pub coindays_destroyed: PerBlockCumulativeRolling, + pub coindays_destroyed: PerBlockCumulativeRolling, #[traversable(wrap = "transfer_volume", rename = "in_profit")] pub transfer_volume_in_profit: ValuePerBlockCumulativeRolling, #[traversable(wrap = "transfer_volume", rename = "in_loss")] @@ -53,8 +53,7 @@ impl ActivityCore { pub(crate) fn push_state(&mut self, state: &CohortState) { self.minimal.push_state(state); self.coindays_destroyed - .block - .push(StoredF64::from(Bitcoin::from(state.satdays_destroyed))); + .push_block(StoredF64::from(Bitcoin::from(state.satdays_destroyed))); self.transfer_volume_in_profit .block .sats @@ -67,7 +66,7 @@ impl ActivityCore { pub(crate) fn collect_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> { let mut vecs = self.minimal.collect_vecs_mut(); - vecs.push(&mut self.coindays_destroyed.block); + vecs.push(self.coindays_destroyed.stored_mut()); vecs.push(&mut self.transfer_volume_in_profit.inner.block.sats); vecs.push(&mut self.transfer_volume_in_profit.inner.block.cents); vecs.push(&mut self.transfer_volume_in_loss.inner.block.sats); @@ -89,7 +88,7 @@ impl ActivityCore { self.minimal .compute_from_stateful(starting_lengths, &minimal_refs, exit)?; - sum_others!(self, starting_lengths, others, exit; coindays_destroyed.block); + sum_others!(self, starting_lengths, others, exit; coindays_destroyed.cumulative.height); sum_others!(self, starting_lengths, others, exit; transfer_volume_in_profit.block.sats); sum_others!(self, starting_lengths, others, exit; transfer_volume_in_loss.block.sats); @@ -104,8 +103,6 @@ impl ActivityCore { ) -> Result<()> { self.minimal .compute_rest_part1(prices, starting_lengths, exit)?; - self.coindays_destroyed - .compute_rest(starting_lengths.height, exit)?; self.transfer_volume_in_profit .compute_rest(starting_lengths.height, prices, exit)?; self.transfer_volume_in_loss diff --git a/crates/brk_computer/src/distribution/metrics/cohort/all.rs b/crates/brk_computer/src/distribution/metrics/cohort/all.rs index dceabb076..e8245a94c 100644 --- a/crates/brk_computer/src/distribution/metrics/cohort/all.rs +++ b/crates/brk_computer/src/distribution/metrics/cohort/all.rs @@ -123,8 +123,8 @@ impl AllCohortMetrics { self.asopr.compute_rest_part2( starting_lengths, - &self.activity.transfer_volume.block.cents, - &self.realized.core.sopr.value_destroyed.block, + &self.activity.transfer_volume.inner.cumulative.cents.height, + &self.realized.core.sopr.value_destroyed.cumulative.height, under_1h_value_created, under_1h_value_destroyed, exit, diff --git a/crates/brk_computer/src/distribution/metrics/cohort/extended_adjusted.rs b/crates/brk_computer/src/distribution/metrics/cohort/extended_adjusted.rs index 685380b9b..1f00068d8 100644 --- a/crates/brk_computer/src/distribution/metrics/cohort/extended_adjusted.rs +++ b/crates/brk_computer/src/distribution/metrics/cohort/extended_adjusted.rs @@ -80,8 +80,22 @@ impl ExtendedAdjustedCohortMetrics { self.asopr.compute_rest_part2( starting_lengths, - &self.inner.activity.transfer_volume.block.cents, - &self.inner.realized.core.sopr.value_destroyed.block, + &self + .inner + .activity + .transfer_volume + .inner + .cumulative + .cents + .height, + &self + .inner + .realized + .core + .sopr + .value_destroyed + .cumulative + .height, under_1h_value_created, under_1h_value_destroyed, exit, diff --git a/crates/brk_computer/src/distribution/metrics/config.rs b/crates/brk_computer/src/distribution/metrics/config.rs index 52f73b1ff..805576815 100644 --- a/crates/brk_computer/src/distribution/metrics/config.rs +++ b/crates/brk_computer/src/distribution/metrics/config.rs @@ -54,10 +54,9 @@ impl ConfigImport for PerBlock { Self::forced_import(cfg.db, &cfg.name(suffix), cfg.version + offset, cfg.indexes) } } -impl ConfigImport for PerBlockCumulativeRolling +impl ConfigImport for PerBlockCumulativeRolling where - T: NumericValue + JsonSchema + Into, - C: NumericValue + JsonSchema, + T: NumericValue + JsonSchema, { fn config_import(cfg: &ImportConfig, suffix: &str, offset: Version) -> Result { Self::forced_import( diff --git a/crates/brk_computer/src/distribution/metrics/outputs/base.rs b/crates/brk_computer/src/distribution/metrics/outputs/base.rs index f98a0f4e6..f495fd324 100644 --- a/crates/brk_computer/src/distribution/metrics/outputs/base.rs +++ b/crates/brk_computer/src/distribution/metrics/outputs/base.rs @@ -1,9 +1,7 @@ use brk_error::Result; use brk_indexer::Lengths; use brk_traversable::Traversable; -use brk_types::{ - Height, PartsPerMillionSigned64, StoredF32, StoredI64, StoredU32, StoredU64, Version, -}; +use brk_types::{Height, PartsPerMillionSigned64, StoredF32, StoredI64, StoredU64, Version}; use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, Rw, StorageMode, WritableVec}; use crate::{ @@ -18,7 +16,7 @@ use crate::{ #[derive(Traversable)] pub struct OutputsBase { pub unspent_count: PerBlockWithDeltas, - pub spent_count: PerBlockCumulativeRolling, + pub spent_count: PerBlockCumulativeRolling, pub utxo_turnover_1y: PerBlock, } @@ -52,19 +50,18 @@ impl OutputsBase { .height .push(StoredU64::from(state.supply.utxo_count)); self.spent_count - .block - .push(StoredU32::from(state.spent_utxo_count)); + .push_block(StoredU64::from(state.spent_utxo_count)); } pub(crate) fn collect_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> { vec![ &mut self.unspent_count.height as &mut dyn AnyStoredVec, - &mut self.spent_count.block, + self.spent_count.stored_mut(), ] } - pub(crate) fn compute_rest(&mut self, max_from: Height, exit: &Exit) -> Result<()> { - self.spent_count.compute_rest(max_from, exit) + pub(crate) fn compute_rest(&mut self, _max_from: Height, _exit: &Exit) -> Result<()> { + Ok(()) } pub(crate) fn compute_part2( @@ -96,7 +93,7 @@ impl OutputsBase { .collect::>(), exit, )?; - sum_others!(self, starting_lengths, others, exit; spent_count.block); + sum_others!(self, starting_lengths, others, exit; spent_count.cumulative.height); Ok(()) } } diff --git a/crates/brk_computer/src/distribution/metrics/realized/adjusted.rs b/crates/brk_computer/src/distribution/metrics/realized/adjusted.rs index 4b33de087..9ba5deb2d 100644 --- a/crates/brk_computer/src/distribution/metrics/realized/adjusted.rs +++ b/crates/brk_computer/src/distribution/metrics/realized/adjusted.rs @@ -12,8 +12,8 @@ use crate::{ #[derive(Traversable)] pub struct AdjustedSopr { pub ratio: RollingWindows, - pub transfer_volume: PerBlockCumulativeRolling, - pub value_destroyed: PerBlockCumulativeRolling, + pub transfer_volume: PerBlockCumulativeRolling, + pub value_destroyed: PerBlockCumulativeRolling, } impl AdjustedSopr { @@ -35,24 +35,19 @@ impl AdjustedSopr { under_1h_value_destroyed: &impl ReadableVec, exit: &Exit, ) -> Result<()> { - self.transfer_volume.block.compute_subtract( + self.transfer_volume.cumulative.height.compute_subtract( starting_lengths.height, base_transfer_volume, under_1h_transfer_volume, exit, )?; - self.value_destroyed.block.compute_subtract( + self.value_destroyed.cumulative.height.compute_subtract( starting_lengths.height, base_value_destroyed, under_1h_value_destroyed, exit, )?; - self.transfer_volume - .compute_rest(starting_lengths.height, exit)?; - self.value_destroyed - .compute_rest(starting_lengths.height, exit)?; - for ((sopr, tv), vd) in self .ratio .as_mut_array() diff --git a/crates/brk_computer/src/distribution/metrics/realized/core.rs b/crates/brk_computer/src/distribution/metrics/realized/core.rs index f7c6e1099..fdfb6a4fc 100644 --- a/crates/brk_computer/src/distribution/metrics/realized/core.rs +++ b/crates/brk_computer/src/distribution/metrics/realized/core.rs @@ -5,10 +5,7 @@ use brk_types::{ Bitcoin, Cents, CentsSigned, Dollars, Height, PartsPerMillionSigned64, StoredF64, Version, }; use derive_more::{Deref, DerefMut}; -use vecdb::{ - AnyStoredVec, Exit, LazyVecFrom1, ReadableCloneableVec, ReadableVec, Rw, StorageMode, - WritableVec, -}; +use vecdb::{AnyStoredVec, Exit, LazyVecFrom1, ReadableCloneableVec, ReadableVec, Rw, StorageMode}; use crate::{ distribution::state::{CohortState, CostBasisOps, RealizedOps}, @@ -32,7 +29,7 @@ pub struct NegRealizedLoss { #[derive(Traversable)] pub struct RealizedSoprCore { - pub value_destroyed: PerBlockCumulativeRolling, + pub value_destroyed: PerBlockCumulativeRolling, pub ratio: RollingWindow24hPerBlock, } @@ -117,13 +114,12 @@ impl RealizedCore { self.minimal.push_state(state); self.sopr .value_destroyed - .block - .push(state.realized.value_destroyed()); + .push_block(state.realized.value_destroyed()); } pub(crate) fn collect_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> { let mut vecs = self.minimal.collect_vecs_mut(); - vecs.push(&mut self.sopr.value_destroyed.block); + vecs.push(self.sopr.value_destroyed.stored_mut()); vecs } @@ -137,7 +133,7 @@ impl RealizedCore { self.minimal .compute_from_stateful(starting_lengths, &minimal_refs, exit)?; - sum_others!(self, starting_lengths, others, exit; sopr.value_destroyed.block); + sum_others!(self, starting_lengths, others, exit; sopr.value_destroyed.cumulative.height); Ok(()) } @@ -148,10 +144,6 @@ impl RealizedCore { ) -> Result<()> { self.minimal.compute_rest_part1(starting_lengths, exit)?; - self.sopr - .value_destroyed - .compute_rest(starting_lengths.height, exit)?; - self.net_pnl.block.cents.compute_transform2( starting_lengths.height, &self.minimal.profit.block.cents, diff --git a/crates/brk_computer/src/distribution/vecs.rs b/crates/brk_computer/src/distribution/vecs.rs index 8e23b9e0f..3d2152ff5 100644 --- a/crates/brk_computer/src/distribution/vecs.rs +++ b/crates/brk_computer/src/distribution/vecs.rs @@ -144,7 +144,7 @@ pub struct Vecs { #[traversable(wrap = "cohorts", rename = "addr")] pub addr_cohorts: AddrCohorts, #[traversable(wrap = "cointime/activity")] - pub coinblocks_destroyed: PerBlockCumulativeRolling, + pub coinblocks_destroyed: PerBlockCumulativeRolling, pub addrs: AddrMetricsVecs, /// In-memory state that does NOT survive rollback. @@ -552,10 +552,6 @@ impl Vecs { r2?; } - // 5b. Compute coinblocks_destroyed cumulative from raw - self.coinblocks_destroyed - .compute_rest(starting_lengths.height, exit)?; - // 6. Compute rest part1 (day1 mappings) info!("Computing rest part 1..."); { diff --git a/crates/brk_computer/src/frameworks/cointime/activity/compute.rs b/crates/brk_computer/src/frameworks/cointime/activity/compute.rs index 33490698f..2021be238 100644 --- a/crates/brk_computer/src/frameworks/cointime/activity/compute.rs +++ b/crates/brk_computer/src/frameworks/cointime/activity/compute.rs @@ -8,16 +8,18 @@ use crate::{distribution, internal::PerBlockCumulativeRolling}; pub(crate) fn compute_rest( starting_height: brk_types::Height, - created: &PerBlockCumulativeRolling, - consumed: &PerBlockCumulativeRolling, - stored: &mut PerBlockCumulativeRolling, + created: &PerBlockCumulativeRolling, + consumed: &PerBlockCumulativeRolling, + stored: &mut PerBlockCumulativeRolling, derived: &mut DerivedVecs, exit: &Exit, ) -> Result<()> { - stored.compute(starting_height, exit, |vec| { - vec.compute_subtract(starting_height, &created.block, &consumed.block, exit)?; - Ok(()) - })?; + stored.cumulative.height.compute_subtract( + starting_height, + &created.cumulative.height, + &consumed.cumulative.height, + exit, + )?; derived.liveliness.height.compute_divide( starting_height, @@ -47,16 +49,12 @@ impl Vecs { let all_metrics = &distribution.utxo_cohorts.all.metrics; let circulating_supply = &all_metrics.supply.total.sats.height; - self.coinblocks_created - .compute(starting_height, exit, |vec| { - vec.compute_transform( - starting_height, - circulating_supply, - |(i, v, ..)| (i, StoredF64::from(Bitcoin::from(v))), - exit, - )?; - Ok(()) - })?; + self.coinblocks_created.compute_cumulative_transformed( + starting_height, + circulating_supply, + |value| StoredF64::from(Bitcoin::from(value)), + exit, + )?; compute_rest( starting_height, diff --git a/crates/brk_computer/src/frameworks/cointime/activity/vecs.rs b/crates/brk_computer/src/frameworks/cointime/activity/vecs.rs index aec5b5705..d477709fc 100644 --- a/crates/brk_computer/src/frameworks/cointime/activity/vecs.rs +++ b/crates/brk_computer/src/frameworks/cointime/activity/vecs.rs @@ -14,8 +14,8 @@ pub struct DerivedVecs { #[derive(Deref, DerefMut, Traversable)] pub struct Vecs { - pub coinblocks_created: PerBlockCumulativeRolling, - pub coinblocks_stored: PerBlockCumulativeRolling, + pub coinblocks_created: PerBlockCumulativeRolling, + pub coinblocks_stored: PerBlockCumulativeRolling, #[deref] #[deref_mut] #[traversable(flatten)] diff --git a/crates/brk_computer/src/frameworks/cointime/age_range/compute.rs b/crates/brk_computer/src/frameworks/cointime/age_range/compute.rs index 74fdef0da..6cd2e73d3 100644 --- a/crates/brk_computer/src/frameworks/cointime/age_range/compute.rs +++ b/crates/brk_computer/src/frameworks/cointime/age_range/compute.rs @@ -2,7 +2,7 @@ use brk_cohort::AGE_RANGE_BOUNDS; use brk_error::Result; use brk_indexer::Indexer; use brk_types::{Bitcoin, Height, ONE_DAY_IN_SEC_F64, Sats, StoredF64, Timestamp, Version}; -use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, WritableVec}; +use vecdb::{AnyVec, Exit, ReadableVec}; use super::super::activity; use super::{CohortVecs, Vecs}; @@ -72,19 +72,18 @@ impl Vecs { for cohort in cohorts.iter_mut() { cohort .coindays_created - .block .validate_computed_version_or_reset(created_version)?; } let start = cohorts .iter() - .map(|cohort| cohort.coindays_created.block.len()) + .map(|cohort| cohort.coindays_created.cumulative.height.len()) .min() .unwrap_or_default() .min(usize::from(starting_height)); for cohort in cohorts.iter_mut() { - cohort.coindays_created.block.truncate_if_needed_at(start)?; + cohort.coindays_created.truncate_if_needed_at(start)?; } let source_end = supplies @@ -109,7 +108,7 @@ impl Vecs { monotonic_interval_seconds(×tamp_batch, chunk_start, offset); for (index, cohort) in cohorts.iter_mut().enumerate() { - cohort.coindays_created.block.push(coindays_created( + cohort.coindays_created.push_block(coindays_created( supply_batches[index][offset], interval_seconds, )); @@ -119,18 +118,12 @@ impl Vecs { { let _lock = exit.lock(); for cohort in cohorts.iter_mut() { - cohort.coindays_created.block.write()?; + cohort.coindays_created.write()?; } } chunk_start = chunk_end; } - for cohort in cohorts { - cohort - .coindays_created - .compute_rest(starting_height, exit)?; - } - Ok(()) } @@ -158,22 +151,18 @@ impl Vecs { for cohort in cohorts.iter_mut() { cohort .coindays_consumed - .block .validate_computed_version_or_reset(destroyed_version)?; } let start = cohorts .iter() - .map(|cohort| cohort.coindays_consumed.block.len()) + .map(|cohort| cohort.coindays_consumed.cumulative.height.len()) .min() .unwrap_or_default() .min(usize::from(starting_height)); for cohort in cohorts.iter_mut() { - cohort - .coindays_consumed - .block - .truncate_if_needed_at(start)?; + cohort.coindays_consumed.truncate_if_needed_at(start)?; } let source_end = transfer_volumes @@ -207,26 +196,19 @@ impl Vecs { for (index, cohort) in cohorts.iter_mut().enumerate() { cohort .coindays_consumed - .block - .push(StoredF64::from(consumed[index])); + .push_block(StoredF64::from(consumed[index])); } } { let _lock = exit.lock(); for cohort in cohorts.iter_mut() { - cohort.coindays_consumed.block.write()?; + cohort.coindays_consumed.write()?; } } chunk_start = chunk_end; } - for cohort in cohorts { - cohort - .coindays_consumed - .compute_rest(starting_height, exit)?; - } - Ok(()) } diff --git a/crates/brk_computer/src/frameworks/cointime/age_range/vecs.rs b/crates/brk_computer/src/frameworks/cointime/age_range/vecs.rs index a9787b72d..f595035f2 100644 --- a/crates/brk_computer/src/frameworks/cointime/age_range/vecs.rs +++ b/crates/brk_computer/src/frameworks/cointime/age_range/vecs.rs @@ -10,9 +10,9 @@ use super::super::{SupplyBaseVecs, activity::DerivedVecs as ActivityDerivedVecs} #[derive(Deref, DerefMut, Traversable)] pub struct CohortVecs { - pub coindays_created: PerBlockCumulativeRolling, - pub coindays_consumed: PerBlockCumulativeRolling, - pub coindays_stored: PerBlockCumulativeRolling, + pub coindays_created: PerBlockCumulativeRolling, + pub coindays_consumed: PerBlockCumulativeRolling, + pub coindays_stored: PerBlockCumulativeRolling, #[deref] #[deref_mut] #[traversable(flatten)] diff --git a/crates/brk_computer/src/frameworks/cointime/value/compute.rs b/crates/brk_computer/src/frameworks/cointime/value/compute.rs index 918b576f3..9aeda8555 100644 --- a/crates/brk_computer/src/frameworks/cointime/value/compute.rs +++ b/crates/brk_computer/src/frameworks/cointime/value/compute.rs @@ -1,7 +1,7 @@ use brk_error::Result; use brk_indexer::Indexer; use brk_types::{Bitcoin, Dollars, StoredF64}; -use vecdb::Exit; +use vecdb::{Exit, ReadableVec}; use super::super::activity; use super::Vecs; @@ -22,59 +22,66 @@ impl Vecs { let coindays_destroyed = &all_metrics.activity.coindays_destroyed; let circulating_supply = &all_metrics.supply.total.btc.height; - self.destroyed.compute(starting_height, exit, |vec| { - vec.compute_multiply( + self.destroyed + .cumulative + .height + .compute_cumulative_transformed_binary( starting_height, &prices.spot.usd.height, &coinblocks_destroyed.block, + |price, value| StoredF64::from(f64::from(price) * f64::from(value)), exit, )?; - Ok(()) - })?; - self.created.compute(starting_height, exit, |vec| { - vec.compute_multiply( + self.created + .cumulative + .height + .compute_cumulative_transformed_binary( starting_height, &prices.spot.usd.height, &activity.coinblocks_created.block, + |price, value| StoredF64::from(f64::from(price) * f64::from(value)), exit, )?; - Ok(()) - })?; - self.stored.compute(starting_height, exit, |vec| { - vec.compute_multiply( + self.stored + .cumulative + .height + .compute_cumulative_transformed_binary( starting_height, &prices.spot.usd.height, &activity.coinblocks_stored.block, + |price, value| StoredF64::from(f64::from(price) * f64::from(value)), exit, )?; - Ok(()) - })?; // VOCDD: Value of Coin Days Destroyed = price × (CDD / circulating_supply) // Supply-adjusted to account for growing supply over time // This is a key input for Reserve Risk / HODL Bank calculation - self.vocdd.compute(starting_height, exit, |vec| { - vec.compute_transform3( - starting_height, - &prices.spot.usd.height, - &coindays_destroyed.block, - circulating_supply, - |(i, price, cdd, supply, _): (_, Dollars, StoredF64, Bitcoin, _)| { - let supply_f64 = f64::from(supply); - if supply_f64 == 0.0 { - (i, StoredF64::from(0.0)) - } else { - // VOCDD = price × (CDD / supply) - let vocdd = f64::from(price) * f64::from(cdd) / supply_f64; - (i, StoredF64::from(vocdd)) - } - }, - exit, - )?; - Ok(()) - })?; + let mut cumulative = None; + self.vocdd.cumulative.height.compute_transform3( + starting_height, + &prices.spot.usd.height, + &coindays_destroyed.block, + circulating_supply, + |(i, price, cdd, supply, this): (_, Dollars, StoredF64, Bitcoin, _)| { + let cumulative = cumulative.get_or_insert_with(|| { + i.decremented() + .and_then(|height| this.collect_one(height)) + .unwrap_or_default() + }); + let supply_f64 = f64::from(supply); + let value = if supply_f64 == 0.0 { + StoredF64::from(0.0) + } else { + // VOCDD = price × (CDD / supply) + StoredF64::from(f64::from(price) * f64::from(cdd) / supply_f64) + }; + *cumulative += value; + (i, *cumulative) + }, + exit, + )?; Ok(()) } diff --git a/crates/brk_computer/src/frameworks/cointime/value/vecs.rs b/crates/brk_computer/src/frameworks/cointime/value/vecs.rs index b9d2cbaa5..1c5dfcdbd 100644 --- a/crates/brk_computer/src/frameworks/cointime/value/vecs.rs +++ b/crates/brk_computer/src/frameworks/cointime/value/vecs.rs @@ -6,8 +6,8 @@ use crate::internal::PerBlockCumulativeRolling; #[derive(Traversable)] pub struct Vecs { - pub destroyed: PerBlockCumulativeRolling, - pub created: PerBlockCumulativeRolling, - pub stored: PerBlockCumulativeRolling, - pub vocdd: PerBlockCumulativeRolling, + pub destroyed: PerBlockCumulativeRolling, + pub created: PerBlockCumulativeRolling, + pub stored: PerBlockCumulativeRolling, + pub vocdd: PerBlockCumulativeRolling, } diff --git a/crates/brk_computer/src/inputs/by_type/compute.rs b/crates/brk_computer/src/inputs/by_type/compute.rs index c4dd68795..d4874efb4 100644 --- a/crates/brk_computer/src/inputs/by_type/compute.rs +++ b/crates/brk_computer/src/inputs/by_type/compute.rs @@ -1,7 +1,7 @@ use brk_error::{OptionData, Result}; use brk_indexer::Indexer; use brk_types::StoredU64; -use vecdb::{AnyVec, Exit, ReadableVec, VecIndex, WritableVec}; +use vecdb::{AnyVec, Exit, ReadableVec, VecIndex}; use super::{Vecs, WithInputTypes}; use crate::internal::{CoinbasePolicy, PerBlockCumulativeRolling, walk_blocks}; @@ -85,10 +85,6 @@ impl Vecs { } } - self.input_count - .compute_rest(starting_lengths.height, exit)?; - self.tx_count.compute_rest(starting_lengths.height, exit)?; - for (otype, source) in self.input_count.by_type.iter_typed() { self.input_share.get_mut(otype).compute_count_ratio( source, @@ -112,12 +108,12 @@ impl Vecs { #[inline] fn push_block( - metric: &mut WithInputTypes>, + metric: &mut WithInputTypes>, total: u64, per_type: &[u64; 12], ) { - metric.all.block.push(StoredU64::from(total)); + metric.all.push_block(StoredU64::from(total)); for (otype, vec) in metric.by_type.iter_typed_mut() { - vec.block.push(StoredU64::from(per_type[otype as usize])); + vec.push_block(StoredU64::from(per_type[otype as usize])); } } diff --git a/crates/brk_computer/src/inputs/by_type/import.rs b/crates/brk_computer/src/inputs/by_type/import.rs index 408ca2b57..b396e98d5 100644 --- a/crates/brk_computer/src/inputs/by_type/import.rs +++ b/crates/brk_computer/src/inputs/by_type/import.rs @@ -17,7 +17,7 @@ impl Vecs { cached_starts: &Windows<&WindowStartVec>, ) -> Result { let input_count = - WithInputTypes::>::forced_import_with( + WithInputTypes::>::forced_import_with( db, "input_count_bis", |t| format!("{t}_prevout_count"), @@ -25,15 +25,14 @@ impl Vecs { indexes, cached_starts, )?; - let tx_count = - WithInputTypes::>::forced_import_with( - db, - "non_coinbase_tx_count", - |t| format!("tx_count_with_{t}_prevout"), - version, - indexes, - cached_starts, - )?; + let tx_count = WithInputTypes::>::forced_import_with( + db, + "non_coinbase_tx_count", + |t| format!("tx_count_with_{t}_prevout"), + version, + indexes, + cached_starts, + )?; let input_share = SpendableType::try_new(|_, name| { PercentCumulativeRolling::forced_import( diff --git a/crates/brk_computer/src/inputs/by_type/vecs.rs b/crates/brk_computer/src/inputs/by_type/vecs.rs index b3462581d..dbf0bf524 100644 --- a/crates/brk_computer/src/inputs/by_type/vecs.rs +++ b/crates/brk_computer/src/inputs/by_type/vecs.rs @@ -8,8 +8,8 @@ use crate::internal::{PerBlockCumulativeRolling, PercentCumulativeRolling}; #[derive(Traversable)] pub struct Vecs { - pub input_count: WithInputTypes>, + pub input_count: WithInputTypes>, pub input_share: SpendableType>, - pub tx_count: WithInputTypes>, + pub tx_count: WithInputTypes>, pub tx_share: SpendableType>, } diff --git a/crates/brk_computer/src/inputs/by_type/with_input_types.rs b/crates/brk_computer/src/inputs/by_type/with_input_types.rs index 1f3bfaf54..f0478773d 100644 --- a/crates/brk_computer/src/inputs/by_type/with_input_types.rs +++ b/crates/brk_computer/src/inputs/by_type/with_input_types.rs @@ -7,7 +7,7 @@ use brk_error::Result; use brk_traversable::Traversable; use brk_types::{Height, Version}; use schemars::JsonSchema; -use vecdb::{AnyStoredVec, AnyVec, Database, Exit, WritableVec}; +use vecdb::{AnyStoredVec, AnyVec, Database, WritableVec}; use crate::{ indexes, @@ -24,10 +24,9 @@ pub struct WithInputTypes { pub by_type: SpendableType, } -impl WithInputTypes> +impl WithInputTypes> where - T: NumericValue + JsonSchema + Into, - C: NumericValue + JsonSchema, + T: NumericValue + JsonSchema, { pub(crate) fn forced_import_with( db: &Database, @@ -49,16 +48,16 @@ where pub(crate) fn min_stateful_len(&self) -> usize { self.by_type .iter() - .map(|v| v.block.len()) + .map(|v| v.cumulative.height.len()) .min() .unwrap() - .min(self.all.block.len()) + .min(self.all.cumulative.height.len()) } pub(crate) fn write(&mut self) -> Result<()> { - self.all.block.write()?; + self.all.cumulative.height.write()?; for v in self.by_type.iter_mut() { - v.block.write()?; + v.cumulative.height.write()?; } Ok(()) } @@ -69,26 +68,21 @@ where at_height: Height, ) -> Result<()> { self.all - .block + .cumulative + .height .validate_and_truncate(dep_version, at_height)?; for v in self.by_type.iter_mut() { - v.block.validate_and_truncate(dep_version, at_height)?; + v.cumulative + .height + .validate_and_truncate(dep_version, at_height)?; } Ok(()) } pub(crate) fn truncate_if_needed_at(&mut self, len: usize) -> Result<()> { - self.all.block.truncate_if_needed_at(len)?; + self.all.cumulative.height.truncate_if_needed_at(len)?; for v in self.by_type.iter_mut() { - v.block.truncate_if_needed_at(len)?; - } - Ok(()) - } - - pub(crate) fn compute_rest(&mut self, max_from: Height, exit: &Exit) -> Result<()> { - self.all.compute_rest(max_from, exit)?; - for v in self.by_type.iter_mut() { - v.compute_rest(max_from, exit)?; + v.cumulative.height.truncate_if_needed_at(len)?; } Ok(()) } diff --git a/crates/brk_computer/src/internal/per_block/computed/cumulative_rolling.rs b/crates/brk_computer/src/internal/per_block/computed/cumulative_rolling.rs index 7a45a6bf1..a1206c682 100644 --- a/crates/brk_computer/src/internal/per_block/computed/cumulative_rolling.rs +++ b/crates/brk_computer/src/internal/per_block/computed/cumulative_rolling.rs @@ -1,44 +1,41 @@ -//! PerBlockCumulativeRolling - base EagerVec + cumulative PerBlock + lazy rolling sums. +//! PerBlockCumulativeRolling - stored cumulative + lazy block and rolling views. //! -//! Rolling sums are derived lazily from the cumulative vec via LazyDeltaVec. -//! No rolling sum vecs are stored on disk. -//! -//! Type parameters: -//! - `T`: per-block value type (e.g., `StoredU32` for tx counts) -//! - `M`: storage mode (`Rw` or `Ro`) -//! - `C`: cumulative type, defaults to `T`. Use a wider type (e.g., `StoredU64`) -//! when the prefix sum of `T` values could overflow `T`. +//! The cumulative vector is the sole stored source of truth. Per-block values +//! and rolling sums/averages are all derived lazily from it. use brk_error::Result; use brk_traversable::Traversable; use brk_types::{Height, Version}; use schemars::JsonSchema; -use vecdb::{Database, EagerVec, Exit, ImportableVec, PcoVec, Rw, StorageMode}; +use vecdb::{ + AnyStoredVec, AnyVec, Database, Exit, ReadableCloneableVec, ReadableVec, Rw, StorageMode, + VecValue, WritableVec, +}; use crate::{ indexes, internal::{ - LazyRollingAvgsFromHeight, LazyRollingSumsFromHeight, NumericValue, PerBlock, - WindowStartVec, Windows, + LazyPreviousDeltaVec, LazyRollingAvgsFromHeight, LazyRollingSumsFromHeight, NumericValue, + PerBlock, WindowStartVec, Windows, }, }; #[derive(Traversable)] -pub struct PerBlockCumulativeRolling +pub struct PerBlockCumulativeRolling where T: NumericValue + JsonSchema, - C: NumericValue + JsonSchema, { - pub block: M::Stored>>, - pub cumulative: PerBlock, - pub sum: LazyRollingSumsFromHeight, - pub average: LazyRollingAvgsFromHeight, + pub block: LazyPreviousDeltaVec, + pub cumulative: PerBlock, + pub sum: LazyRollingSumsFromHeight, + pub average: LazyRollingAvgsFromHeight, + #[traversable(skip)] + last_cumulative: Option<(usize, T)>, } -impl PerBlockCumulativeRolling +impl PerBlockCumulativeRolling where - T: NumericValue + JsonSchema + Into, - C: NumericValue + JsonSchema, + T: NumericValue + JsonSchema, { pub(crate) fn forced_import( db: &Database, @@ -47,9 +44,14 @@ where indexes: &indexes::Vecs, cached_starts: &Windows<&WindowStartVec>, ) -> Result { - let block = EagerVec::forced_import(db, name, version)?; let cumulative = PerBlock::forced_import(db, &format!("{name}_cumulative"), version, indexes)?; + let last_cumulative = cumulative + .height + .collect_last() + .map(|value| (cumulative.height.len(), value)); + let cumulative_source = cumulative.height.read_only_boxed_clone(); + let block = LazyPreviousDeltaVec::new(name, version, cumulative_source); let sum = LazyRollingSumsFromHeight::new( &format!("{name}_sum"), version, @@ -70,31 +72,141 @@ where cumulative, sum, average, + last_cumulative, }) } - /// Compute base data via closure, then cumulative. Rolling sums are lazy. - pub(crate) fn compute( - &mut self, - max_from: Height, - exit: &Exit, - compute_base: impl FnOnce(&mut EagerVec>) -> Result<()>, - ) -> Result<()> + #[inline(always)] + pub(crate) fn push_block(&mut self, value: T) where - C: Default, + T: Copy, { - compute_base(&mut self.block)?; - self.compute_rest(max_from, exit) + let len = self.cumulative.height.len(); + let mut cumulative = match self.last_cumulative { + Some((cached_len, value)) if cached_len == len => value, + _ => self.cumulative.height.collect_last().unwrap_or_default(), + }; + cumulative += value; + self.cumulative.height.push(cumulative); + self.last_cumulative = Some((len + 1, cumulative)); } - /// Compute cumulative from already-populated base data. Rolling sums are lazy. - pub(crate) fn compute_rest(&mut self, max_from: Height, exit: &Exit) -> Result<()> + pub(crate) fn compute_cumulative( + &mut self, + max_from: Height, + source: &impl ReadableVec, + exit: &Exit, + ) -> Result<()> where - C: Default, + S: VecValue + Into, + T: Copy, { + Ok(self + .cumulative + .height + .compute_cumulative(max_from, source, exit)?) + } + + pub(crate) fn compute_cumulative_transformed( + &mut self, + max_from: Height, + source: &impl ReadableVec, + mut transform: impl FnMut(S) -> T, + exit: &Exit, + ) -> Result<()> + where + S: VecValue, + T: Copy, + { + let mut cumulative = None; + Ok(self.cumulative.height.compute_transform( + max_from, + source, + |(height, value, this)| { + let cumulative = cumulative.get_or_insert_with(|| { + height + .decremented() + .and_then(|height| this.collect_one(height)) + .unwrap_or_default() + }); + *cumulative += transform(value); + (height, *cumulative) + }, + exit, + )?) + } + + pub(crate) fn validate_computed_version_or_reset(&mut self, version: Version) -> Result<()> { self.cumulative .height - .compute_cumulative(max_from, &self.block, exit)?; + .validate_computed_version_or_reset(version)?; Ok(()) } + + pub(crate) fn validate_and_truncate(&mut self, version: Version, height: Height) -> Result<()> { + Ok(self + .cumulative + .height + .validate_and_truncate(version, height)?) + } + + pub(crate) fn truncate_if_needed_at(&mut self, len: usize) -> Result<()> { + Ok(self.cumulative.height.truncate_if_needed_at(len)?) + } + + pub(crate) fn write(&mut self) -> Result<()> { + self.cumulative.height.write()?; + Ok(()) + } + + pub(crate) fn stored_mut(&mut self) -> &mut dyn AnyStoredVec { + &mut self.cumulative.height + } +} + +#[cfg(test)] +mod tests { + use brk_types::{Height, StoredU64, Version}; + use vecdb::{ + AnyStoredVec, Database, EagerVec, ImportableVec, PcoVec, ReadableCloneableVec, ReadableVec, + WritableVec, + }; + + use crate::internal::LazyPreviousDeltaVec; + + #[test] + fn lazy_block_is_the_delta_of_cumulative() { + let suffix = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos(); + let path = std::env::temp_dir().join(format!( + "brk-lazy-block-cumulative-{}-{suffix}", + std::process::id() + )); + let db = Database::open(&path).unwrap(); + let mut cumulative: EagerVec> = + EagerVec::forced_import(&db, "cumulative", Version::ONE).unwrap(); + + for value in [1_u64, 3, 6] { + cumulative.push(StoredU64::from(value)); + } + cumulative.write().unwrap(); + + let block = LazyPreviousDeltaVec::::new( + "block", + Version::ONE, + cumulative.read_only_boxed_clone(), + ); + + assert_eq!( + block.collect_range_at(0, 3), + [1_u64, 2, 3].map(StoredU64::from) + ); + + drop(block); + drop(cumulative); + drop(db); + std::fs::remove_dir_all(path).unwrap(); + } } diff --git a/crates/brk_computer/src/internal/per_block/lazy/mod.rs b/crates/brk_computer/src/internal/per_block/lazy/mod.rs index c91b78bb4..48587df11 100644 --- a/crates/brk_computer/src/internal/per_block/lazy/mod.rs +++ b/crates/brk_computer/src/internal/per_block/lazy/mod.rs @@ -1,9 +1,11 @@ mod base; mod derived_resolutions; mod map_option; +mod previous_delta; mod transform_last; pub use base::*; pub use derived_resolutions::*; pub use map_option::*; +pub use previous_delta::*; pub use transform_last::*; diff --git a/crates/brk_computer/src/internal/per_block/lazy/previous_delta.rs b/crates/brk_computer/src/internal/per_block/lazy/previous_delta.rs new file mode 100644 index 000000000..a1eddcb1e --- /dev/null +++ b/crates/brk_computer/src/internal/per_block/lazy/previous_delta.rs @@ -0,0 +1,185 @@ +use std::sync::Arc; + +use brk_traversable::{Traversable, TreeNode, make_leaf}; +use schemars::JsonSchema; +use serde::Serialize; +use vecdb::{ + AnyExportableVec, AnyVec, CheckedSub, Formattable, ReadableBoxedVec, ReadableVec, TypedVec, + VecIndex, VecValue, Version, short_type_name, +}; + +/// Lazy `source[index] - source[index - 1]`, with zero before the first value. +/// +/// This is a single-source view: it follows source growth automatically and +/// stores nothing on disk. +pub struct LazyPreviousDeltaVec +where + I: VecIndex, + T: VecValue, +{ + name: Arc, + base_version: Version, + source: ReadableBoxedVec, +} + +impl LazyPreviousDeltaVec +where + I: VecIndex, + T: VecValue, +{ + pub fn new(name: &str, version: Version, source: ReadableBoxedVec) -> Self { + Self { + name: Arc::from(name), + base_version: version, + source, + } + } +} + +impl Clone for LazyPreviousDeltaVec +where + I: VecIndex, + T: VecValue, +{ + fn clone(&self) -> Self { + Self { + name: Arc::clone(&self.name), + base_version: self.base_version, + source: self.source.clone(), + } + } +} + +impl AnyVec for LazyPreviousDeltaVec +where + I: VecIndex, + T: VecValue, +{ + fn version(&self) -> Version { + self.base_version + self.source.version() + } + + fn name(&self) -> &str { + &self.name + } + + fn len(&self) -> usize { + self.source.len() + } + + fn index_type_to_string(&self) -> &'static str { + I::to_string() + } + + fn region_names(&self) -> Vec { + Vec::new() + } + + fn value_type_to_size_of(&self) -> usize { + size_of::() + } + + fn value_type_to_string(&self) -> &'static str { + short_type_name::() + } +} + +impl TypedVec for LazyPreviousDeltaVec +where + I: VecIndex, + T: VecValue, +{ + type I = I; + type T = T; +} + +impl LazyPreviousDeltaVec +where + I: VecIndex, + T: VecValue + CheckedSub + Default, +{ + fn for_each_delta(&self, from: usize, to: usize, mut each: impl FnMut(T)) { + let to = to.min(self.len()); + if from >= to { + return; + } + + let read_from = from.saturating_sub(1); + let values = self.source.collect_range_dyn(read_from, to); + let mut values = values.into_iter(); + let mut previous = if from == 0 { + T::default() + } else { + values.next().unwrap() + }; + + for current in values { + each(current.clone().checked_sub(previous).unwrap_or_default()); + previous = current; + } + } +} + +impl ReadableVec for LazyPreviousDeltaVec +where + I: VecIndex, + T: VecValue + CheckedSub + Default, +{ + fn read_into_at(&self, from: usize, to: usize, buf: &mut Vec) { + buf.reserve(to.saturating_sub(from)); + self.for_each_delta(from, to, |value| buf.push(value)); + } + + fn for_each_range_dyn_at(&self, from: usize, to: usize, f: &mut dyn FnMut(T)) { + self.for_each_delta(from, to, f); + } + + fn fold_range_at B>(&self, from: usize, to: usize, init: B, f: F) -> B { + let mut values = Vec::with_capacity(to.saturating_sub(from)); + self.read_into_at(from, to, &mut values); + values.into_iter().fold(init, f) + } + + fn try_fold_range_at Result>( + &self, + from: usize, + to: usize, + init: B, + f: F, + ) -> Result { + let mut values = Vec::with_capacity(to.saturating_sub(from)); + self.read_into_at(from, to, &mut values); + values.into_iter().try_fold(init, f) + } + + fn collect_one_at(&self, index: usize) -> Option { + let current = self.source.collect_one_at(index)?; + let previous = index + .checked_sub(1) + .and_then(|index| self.source.collect_one_at(index)) + .unwrap_or_default(); + Some(current.checked_sub(previous).unwrap_or_default()) + } + + fn read_sorted_into_at(&self, indices: &[usize], out: &mut Vec) { + out.reserve(indices.len()); + indices + .iter() + .filter_map(|&index| self.collect_one_at(index)) + .for_each(|value| out.push(value)); + } +} + +impl Traversable for LazyPreviousDeltaVec +where + I: VecIndex, + T: VecValue + CheckedSub + Default + Formattable + Serialize + JsonSchema, +{ + fn iter_any_exportable(&self) -> impl Iterator { + std::iter::once(self as &dyn AnyExportableVec) + } + + fn to_tree_node(&self) -> TreeNode { + make_leaf::(self) + } +} diff --git a/crates/brk_computer/src/internal/per_block/percent/cumulative_rolling.rs b/crates/brk_computer/src/internal/per_block/percent/cumulative_rolling.rs index 0ea678419..b99d75498 100644 --- a/crates/brk_computer/src/internal/per_block/percent/cumulative_rolling.rs +++ b/crates/brk_computer/src/internal/per_block/percent/cumulative_rolling.rs @@ -80,8 +80,8 @@ impl PercentCumulativeRolling { #[inline] pub(crate) fn compute_count_ratio( &mut self, - numerator: &PerBlockCumulativeRolling, - denominator: &PerBlockCumulativeRolling, + numerator: &PerBlockCumulativeRolling, + denominator: &PerBlockCumulativeRolling, starting_height: Height, exit: &Exit, ) -> Result<()> { diff --git a/crates/brk_computer/src/internal/transform/arithmetic.rs b/crates/brk_computer/src/internal/transform/arithmetic.rs index 4eb02d182..f0921797f 100644 --- a/crates/brk_computer/src/internal/transform/arithmetic.rs +++ b/crates/brk_computer/src/internal/transform/arithmetic.rs @@ -64,6 +64,17 @@ impl BinaryTransform for MaskSats { } } +impl BinaryTransform for MaskSats { + #[inline] + fn apply(mask: StoredU64, value: Sats) -> Sats { + if u64::from(mask) != 0 { + value + } else { + Sats::ZERO + } + } +} + pub struct ReturnF32Tenths; impl UnaryTransform for ReturnF32Tenths { diff --git a/crates/brk_computer/src/internal/with_addr_types.rs b/crates/brk_computer/src/internal/with_addr_types.rs index 776d8db6c..d270f360d 100644 --- a/crates/brk_computer/src/internal/with_addr_types.rs +++ b/crates/brk_computer/src/internal/with_addr_types.rs @@ -94,10 +94,9 @@ where } } -impl WithAddrTypes> +impl WithAddrTypes> where - T: NumericValue + JsonSchema + Into, - C: NumericValue + JsonSchema, + T: NumericValue + JsonSchema, { pub(crate) fn forced_import( db: &Database, @@ -123,26 +122,26 @@ where pub(crate) fn min_stateful_len(&self) -> usize { self.by_addr_type .values() - .map(|v| v.block.len()) + .map(|v| v.cumulative.height.len()) .min() .unwrap() - .min(self.all.block.len()) + .min(self.all.cumulative.height.len()) } pub(crate) fn par_iter_height_mut( &mut self, ) -> impl ParallelIterator { - rayon::iter::once(&mut self.all.block as &mut dyn AnyStoredVec).chain( + rayon::iter::once(&mut self.all.cumulative.height as &mut dyn AnyStoredVec).chain( self.by_addr_type .par_values_mut() - .map(|v| &mut v.block as &mut dyn AnyStoredVec), + .map(|v| &mut v.cumulative.height as &mut dyn AnyStoredVec), ) } pub(crate) fn reset_height(&mut self) -> Result<()> { - self.all.block.reset()?; + self.all.cumulative.height.reset()?; for v in self.by_addr_type.values_mut() { - v.block.reset()?; + v.cumulative.height.reset()?; } Ok(()) } @@ -152,20 +151,11 @@ where where U: Into, { - self.all.block.push(total.into()); + self.all.push_block(total.into()); for (v, value) in self.by_addr_type.values_mut().zip(per_type) { - v.block.push(value.into()); + v.push_block(value.into()); } } - - /// Finalize `cumulative` / `sum` / `average` for `all` and every per-type vec. - pub(crate) fn compute_rest(&mut self, max_from: Height, exit: &Exit) -> Result<()> { - self.all.compute_rest(max_from, exit)?; - for v in self.by_addr_type.values_mut() { - v.compute_rest(max_from, exit)?; - } - Ok(()) - } } impl WithAddrTypes { diff --git a/crates/brk_computer/src/op_return/compute.rs b/crates/brk_computer/src/op_return/compute.rs index bef109999..8d9579fa6 100644 --- a/crates/brk_computer/src/op_return/compute.rs +++ b/crates/brk_computer/src/op_return/compute.rs @@ -150,7 +150,6 @@ impl Vecs { self.write()?; } - self.compute_cumulative(starting_lengths.height, exit)?; let block_size = &blocks.size.size.cumulative.height; compute_data_share( starting_lengths.height, @@ -226,7 +225,7 @@ impl Vecs { fn compute_fee_share( max_from: Height, target: &mut PercentCumulativeRolling, - numerator: &PerBlockCumulativeRolling, + numerator: &PerBlockCumulativeRolling, denominator: &ValuePerBlockCumulativeRolling, exit: &Exit, ) -> Result<()> { diff --git a/crates/brk_computer/src/op_return/vecs.rs b/crates/brk_computer/src/op_return/vecs.rs index e7ea0571f..b953b43e1 100644 --- a/crates/brk_computer/src/op_return/vecs.rs +++ b/crates/brk_computer/src/op_return/vecs.rs @@ -2,7 +2,7 @@ use brk_error::Result; use brk_traversable::Traversable; use brk_types::{Height, PartsPerMillion32, Sats, StoredU64, VSize, Version}; use derive_more::{Deref, DerefMut}; -use vecdb::{AnyStoredVec, AnyVec, Database, Exit, Rw, StorageMode, WritableVec}; +use vecdb::{AnyVec, Database, Rw, StorageMode}; use super::ByKind; use crate::{ @@ -13,7 +13,7 @@ use crate::{ }, }; -pub type Series = PerBlockCumulativeRolling; +pub type Series = PerBlockCumulativeRolling; #[derive(Clone, Copy, Default)] pub(super) struct Totals { @@ -84,43 +84,33 @@ impl TotalMetrics { } pub(super) fn push(&mut self, block: Totals) { - self.data_bytes.block.push(block.data_bytes.into()); - self.tx_count.block.push(block.tx_count.into()); - self.tx_vsize.block.push(block.tx_vsize); - self.fees.block.push(block.fees); + self.data_bytes.push_block(block.data_bytes.into()); + self.tx_count.push_block(block.tx_count.into()); + self.tx_vsize.push_block(block.tx_vsize); + self.fees.push_block(block.fees); } fn validate_and_truncate(&mut self, version: Version, height: Height) -> Result<()> { - self.data_bytes - .block - .validate_and_truncate(version, height)?; - self.tx_count.block.validate_and_truncate(version, height)?; - self.tx_vsize.block.validate_and_truncate(version, height)?; - self.fees.block.validate_and_truncate(version, height)?; + self.data_bytes.validate_and_truncate(version, height)?; + self.tx_count.validate_and_truncate(version, height)?; + self.tx_vsize.validate_and_truncate(version, height)?; + self.fees.validate_and_truncate(version, height)?; Ok(()) } fn truncate_if_needed_at(&mut self, len: usize) -> Result<()> { - self.data_bytes.block.truncate_if_needed_at(len)?; - self.tx_count.block.truncate_if_needed_at(len)?; - self.tx_vsize.block.truncate_if_needed_at(len)?; - self.fees.block.truncate_if_needed_at(len)?; + self.data_bytes.truncate_if_needed_at(len)?; + self.tx_count.truncate_if_needed_at(len)?; + self.tx_vsize.truncate_if_needed_at(len)?; + self.fees.truncate_if_needed_at(len)?; Ok(()) } fn write(&mut self) -> Result<()> { - self.data_bytes.block.write()?; - self.tx_count.block.write()?; - self.tx_vsize.block.write()?; - self.fees.block.write()?; - Ok(()) - } - - fn compute_cumulative(&mut self, max_from: Height, exit: &Exit) -> Result<()> { - self.data_bytes.compute_rest(max_from, exit)?; - self.tx_count.compute_rest(max_from, exit)?; - self.tx_vsize.compute_rest(max_from, exit)?; - self.fees.compute_rest(max_from, exit)?; + self.data_bytes.write()?; + self.tx_count.write()?; + self.tx_vsize.write()?; + self.fees.write()?; Ok(()) } } @@ -194,35 +184,27 @@ impl Metrics { } pub(super) fn push(&mut self, block: Totals) { - self.output_count.block.push(block.output_count.into()); + self.output_count.push_block(block.output_count.into()); self.total.push(block); } fn validate_and_truncate(&mut self, version: Version, height: Height) -> Result<()> { - self.output_count - .block - .validate_and_truncate(version, height)?; + self.output_count.validate_and_truncate(version, height)?; self.total.validate_and_truncate(version, height)?; Ok(()) } fn truncate_if_needed_at(&mut self, len: usize) -> Result<()> { - self.output_count.block.truncate_if_needed_at(len)?; + self.output_count.truncate_if_needed_at(len)?; self.total.truncate_if_needed_at(len)?; Ok(()) } fn write(&mut self) -> Result<()> { - self.output_count.block.write()?; + self.output_count.write()?; self.total.write()?; Ok(()) } - - fn compute_cumulative(&mut self, max_from: Height, exit: &Exit) -> Result<()> { - self.output_count.compute_rest(max_from, exit)?; - self.total.compute_cumulative(max_from, exit)?; - Ok(()) - } } #[derive(Deref, DerefMut, Traversable)] @@ -377,15 +359,4 @@ impl Vecs { } Ok(()) } - - pub(crate) fn compute_cumulative(&mut self, max_from: Height, exit: &Exit) -> Result<()> { - self.total.compute_cumulative(max_from, exit)?; - for metrics in self.by_kind.iter_mut() { - metrics.compute_cumulative(max_from, exit)?; - } - for metrics in self.policy.iter_mut() { - metrics.compute_cumulative(max_from, exit)?; - } - Ok(()) - } } diff --git a/crates/brk_computer/src/outputs/by_type/compute.rs b/crates/brk_computer/src/outputs/by_type/compute.rs index 722073763..332b284a5 100644 --- a/crates/brk_computer/src/outputs/by_type/compute.rs +++ b/crates/brk_computer/src/outputs/by_type/compute.rs @@ -1,7 +1,7 @@ use brk_error::{OptionData, Result}; use brk_indexer::Indexer; use brk_types::{OutputType, StoredU64}; -use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, VecIndex, WritableVec}; +use vecdb::{AnyVec, Exit, ReadableVec, VecIndex}; use super::{Vecs, WithOutputTypes}; use crate::internal::{CoinbasePolicy, PerBlockCumulativeRolling, walk_blocks}; @@ -20,7 +20,6 @@ impl Vecs { self.output_count .validate_and_truncate(dep_version, starting_lengths.height)?; self.spendable_output_count - .block .validate_and_truncate(dep_version, starting_lengths.height)?; self.tx_count .validate_and_truncate(dep_version, starting_lengths.height)?; @@ -35,9 +34,7 @@ impl Vecs { let end = first_tx_index.len(); if skip < end { self.output_count.truncate_if_needed_at(skip)?; - self.spendable_output_count - .block - .truncate_if_needed_at(skip)?; + self.spendable_output_count.truncate_if_needed_at(skip)?; self.tx_count.truncate_if_needed_at(skip)?; let fi_batch = first_tx_index.collect_range_at(skip, end); @@ -77,14 +74,13 @@ impl Vecs { let spendable_total = agg.entries_all - agg.entries_per_type[OutputType::OpReturn as usize]; self.spendable_output_count - .block - .push(StoredU64::from(spendable_total)); + .push_block(StoredU64::from(spendable_total)); height += 1; if height.is_multiple_of(WRITE_INTERVAL) { let _lock = exit.lock(); self.output_count.write()?; - self.spendable_output_count.block.write()?; + self.spendable_output_count.write()?; self.tx_count.write()?; } Ok(()) @@ -94,17 +90,11 @@ impl Vecs { { let _lock = exit.lock(); self.output_count.write()?; - self.spendable_output_count.block.write()?; + self.spendable_output_count.write()?; self.tx_count.write()?; } } - self.output_count - .compute_rest(starting_lengths.height, exit)?; - self.spendable_output_count - .compute_rest(starting_lengths.height, exit)?; - self.tx_count.compute_rest(starting_lengths.height, exit)?; - for (otype, source) in self.output_count.by_type.iter_typed() { self.output_share.get_mut(otype).compute_count_ratio( source, @@ -128,12 +118,12 @@ impl Vecs { #[inline] fn push_block( - metric: &mut WithOutputTypes>, + metric: &mut WithOutputTypes>, total: u64, per_type: &[u64; 12], ) { - metric.all.block.push(StoredU64::from(total)); + metric.all.push_block(StoredU64::from(total)); for (otype, vec) in metric.by_type.iter_typed_mut() { - vec.block.push(StoredU64::from(per_type[otype as usize])); + vec.push_block(StoredU64::from(per_type[otype as usize])); } } diff --git a/crates/brk_computer/src/outputs/by_type/import.rs b/crates/brk_computer/src/outputs/by_type/import.rs index 56647c778..53cee8ea1 100644 --- a/crates/brk_computer/src/outputs/by_type/import.rs +++ b/crates/brk_computer/src/outputs/by_type/import.rs @@ -17,7 +17,7 @@ impl Vecs { cached_starts: &Windows<&WindowStartVec>, ) -> Result { let output_count = - WithOutputTypes::>::forced_import_with( + WithOutputTypes::>::forced_import_with( db, "output_count_bis", |t| format!("{t}_output_count"), @@ -25,15 +25,14 @@ impl Vecs { indexes, cached_starts, )?; - let tx_count = - WithOutputTypes::>::forced_import_with( - db, - "tx_count_bis", - |t| format!("tx_count_with_{t}_output"), - version, - indexes, - cached_starts, - )?; + let tx_count = WithOutputTypes::>::forced_import_with( + db, + "tx_count_bis", + |t| format!("tx_count_with_{t}_output"), + version, + indexes, + cached_starts, + )?; let spendable_output_count = PerBlockCumulativeRolling::forced_import( db, diff --git a/crates/brk_computer/src/outputs/by_type/vecs.rs b/crates/brk_computer/src/outputs/by_type/vecs.rs index 2e3ae0e70..acf52640c 100644 --- a/crates/brk_computer/src/outputs/by_type/vecs.rs +++ b/crates/brk_computer/src/outputs/by_type/vecs.rs @@ -8,9 +8,9 @@ use crate::internal::{PerBlockCumulativeRolling, PercentCumulativeRolling}; #[derive(Traversable)] pub struct Vecs { - pub output_count: WithOutputTypes>, - pub spendable_output_count: PerBlockCumulativeRolling, + pub output_count: WithOutputTypes>, + pub spendable_output_count: PerBlockCumulativeRolling, pub output_share: ByType>, - pub tx_count: WithOutputTypes>, + pub tx_count: WithOutputTypes>, pub tx_share: ByType>, } diff --git a/crates/brk_computer/src/outputs/by_type/with_output_types.rs b/crates/brk_computer/src/outputs/by_type/with_output_types.rs index 544cd865f..d843e573c 100644 --- a/crates/brk_computer/src/outputs/by_type/with_output_types.rs +++ b/crates/brk_computer/src/outputs/by_type/with_output_types.rs @@ -7,7 +7,7 @@ use brk_error::Result; use brk_traversable::Traversable; use brk_types::{Height, Version}; use schemars::JsonSchema; -use vecdb::{AnyStoredVec, AnyVec, Database, Exit, WritableVec}; +use vecdb::{AnyStoredVec, AnyVec, Database, WritableVec}; use crate::{ indexes, @@ -23,10 +23,9 @@ pub struct WithOutputTypes { pub by_type: ByType, } -impl WithOutputTypes> +impl WithOutputTypes> where - T: NumericValue + JsonSchema + Into, - C: NumericValue + JsonSchema, + T: NumericValue + JsonSchema, { pub(crate) fn forced_import_with( db: &Database, @@ -48,16 +47,16 @@ where pub(crate) fn min_stateful_len(&self) -> usize { self.by_type .iter() - .map(|v| v.block.len()) + .map(|v| v.cumulative.height.len()) .min() .unwrap() - .min(self.all.block.len()) + .min(self.all.cumulative.height.len()) } pub(crate) fn write(&mut self) -> Result<()> { - self.all.block.write()?; + self.all.cumulative.height.write()?; for v in self.by_type.iter_mut() { - v.block.write()?; + v.cumulative.height.write()?; } Ok(()) } @@ -68,26 +67,21 @@ where at_height: Height, ) -> Result<()> { self.all - .block + .cumulative + .height .validate_and_truncate(dep_version, at_height)?; for v in self.by_type.iter_mut() { - v.block.validate_and_truncate(dep_version, at_height)?; + v.cumulative + .height + .validate_and_truncate(dep_version, at_height)?; } Ok(()) } pub(crate) fn truncate_if_needed_at(&mut self, len: usize) -> Result<()> { - self.all.block.truncate_if_needed_at(len)?; + self.all.cumulative.height.truncate_if_needed_at(len)?; for v in self.by_type.iter_mut() { - v.block.truncate_if_needed_at(len)?; - } - Ok(()) - } - - pub(crate) fn compute_rest(&mut self, max_from: Height, exit: &Exit) -> Result<()> { - self.all.compute_rest(max_from, exit)?; - for v in self.by_type.iter_mut() { - v.compute_rest(max_from, exit)?; + v.cumulative.height.truncate_if_needed_at(len)?; } Ok(()) } diff --git a/crates/brk_computer/src/outputs/unspent/compute.rs b/crates/brk_computer/src/outputs/unspent/compute.rs index c28b46f68..cf8f6a4b9 100644 --- a/crates/brk_computer/src/outputs/unspent/compute.rs +++ b/crates/brk_computer/src/outputs/unspent/compute.rs @@ -19,7 +19,7 @@ impl Vecs { starting_lengths: &Lengths, exit: &Exit, ) -> Result<()> { - let op_return: &PerBlockCumulativeRolling = + let op_return: &PerBlockCumulativeRolling = &by_type.output_count.by_type.unspendable.op_return; self.count.height.compute_transform3( diff --git a/crates/brk_computer/src/pools/minor.rs b/crates/brk_computer/src/pools/minor.rs index a3252982e..dedc80802 100644 --- a/crates/brk_computer/src/pools/minor.rs +++ b/crates/brk_computer/src/pools/minor.rs @@ -1,7 +1,7 @@ use brk_error::Result; use brk_indexer::Indexer; use brk_traversable::Traversable; -use brk_types::{Height, PartsPerMillion32, PoolSlug, StoredU32, StoredU64}; +use brk_types::{Height, PartsPerMillion32, PoolSlug, StoredU64}; use vecdb::{Database, Exit, ReadableVec, Rw, StorageMode, Version}; use crate::{ @@ -14,7 +14,7 @@ pub struct Vecs { #[traversable(skip)] slug: PoolSlug, - pub blocks_mined: PerBlockCumulativeRolling, + pub blocks_mined: PerBlockCumulativeRolling, pub dominance: PercentPerBlock, } @@ -54,24 +54,10 @@ impl Vecs { ) -> Result<()> { let starting_height = indexer.safe_lengths().height; - self.blocks_mined.compute(starting_height, exit, |vec| { - vec.compute_transform( - starting_height, - pool, - |(h, id, ..)| { - ( - h, - if id == self.slug { - StoredU32::ONE - } else { - StoredU32::ZERO - }, - ) - }, - exit, - )?; - Ok(()) - })?; + self.blocks_mined + .cumulative + .height + .compute_cumulative_count(starting_height, pool, |id| *id == self.slug, exit)?; self.dominance .compute_binary::>( diff --git a/crates/brk_computer/src/transactions/versions/compute.rs b/crates/brk_computer/src/transactions/versions/compute.rs index 5d47a258c..7ce065082 100644 --- a/crates/brk_computer/src/transactions/versions/compute.rs +++ b/crates/brk_computer/src/transactions/versions/compute.rs @@ -16,14 +16,7 @@ impl Vecs { (&mut self.v3, &counts.v3), (&mut self.other, &counts.other_version), ] { - metrics.compute(starting_height, exit, |block| { - Ok(block.compute_transform( - starting_height, - source, - |(height, count, ..)| (height, count), - exit, - )?) - })?; + metrics.compute_cumulative(starting_height, source, exit)?; } Ok(()) diff --git a/crates/brk_computer/src/transactions/versions/vecs.rs b/crates/brk_computer/src/transactions/versions/vecs.rs index c80b00f01..f2c5adc5b 100644 --- a/crates/brk_computer/src/transactions/versions/vecs.rs +++ b/crates/brk_computer/src/transactions/versions/vecs.rs @@ -6,8 +6,8 @@ use crate::internal::PerBlockCumulativeRolling; #[derive(Traversable)] pub struct Vecs { - pub v1: PerBlockCumulativeRolling, - pub v2: PerBlockCumulativeRolling, - pub v3: PerBlockCumulativeRolling, - pub other: PerBlockCumulativeRolling, + pub v1: PerBlockCumulativeRolling, + pub v2: PerBlockCumulativeRolling, + pub v3: PerBlockCumulativeRolling, + pub other: PerBlockCumulativeRolling, } diff --git a/crates/brk_traversable/src/lib.rs b/crates/brk_traversable/src/lib.rs index 2ddd41501..6c4349310 100644 --- a/crates/brk_traversable/src/lib.rs +++ b/crates/brk_traversable/src/lib.rs @@ -24,8 +24,8 @@ pub trait Traversable { } } -/// Helper to create a SeriesLeafWithSchema from a vec -fn make_leaf(vec: &V) -> TreeNode { +/// Creates a series leaf, including its value schema, from a vector. +pub fn make_leaf(vec: &V) -> TreeNode { let index_str = I::to_string(); let index = Index::try_from(index_str).ok(); let indexes = index.into_iter().collect(); diff --git a/modules/brk-client/index.js b/modules/brk-client/index.js index 42676fee9..3bd8c3f12 100644 --- a/modules/brk-client/index.js +++ b/modules/brk-client/index.js @@ -3561,8 +3561,8 @@ function createActivityAddrOutputsRealizedSupplyUnrealizedPattern(client, acc) { * @property {_1m1w1y24hPattern3} average * @property {BtcCentsSatsUsdPattern3} block * @property {BtcCentsSatsUsdPattern} cumulative - * @property {AverageBlockCumulativeSumPattern3} inLoss - * @property {AverageBlockCumulativeSumPattern3} inProfit + * @property {AverageBlockCumulativeSumPattern2} inLoss + * @property {AverageBlockCumulativeSumPattern2} inProfit * @property {_1m1w1y24hPattern4} sum */ @@ -3577,8 +3577,8 @@ function createAverageBlockCumulativeInSumPattern(client, acc) { average: create_1m1w1y24hPattern3(client, _m(acc, 'average')), block: createBtcCentsSatsUsdPattern3(client, acc), cumulative: createBtcCentsSatsUsdPattern(client, _m(acc, 'cumulative')), - inLoss: createAverageBlockCumulativeSumPattern3(client, _m(acc, 'in_loss')), - inProfit: createAverageBlockCumulativeSumPattern3(client, _m(acc, 'in_profit')), + inLoss: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'in_loss')), + inProfit: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'in_profit')), sum: create_1m1w1y24hPattern4(client, _m(acc, 'sum')), }; } @@ -4220,10 +4220,10 @@ function create_1m1w1y24hPattern8(client, acc) { /** * @typedef {Object} AverageBlockCumulativeSumPattern2 - * @property {_1m1w1y24hPattern} average - * @property {SeriesPattern18} block - * @property {SeriesPattern1} cumulative - * @property {_1m1w1y24hPattern} sum + * @property {_1m1w1y24hPattern3} average + * @property {BtcCentsSatsUsdPattern3} block + * @property {BtcCentsSatsUsdPattern} cumulative + * @property {_1m1w1y24hPattern4} sum */ /** @@ -4233,29 +4233,6 @@ function create_1m1w1y24hPattern8(client, acc) { * @returns {AverageBlockCumulativeSumPattern2} */ function createAverageBlockCumulativeSumPattern2(client, acc) { - return { - average: create_1m1w1y24hPattern(client, _m(acc, 'average')), - block: createSeriesPattern18(client, acc), - cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), - sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), - }; -} - -/** - * @typedef {Object} AverageBlockCumulativeSumPattern3 - * @property {_1m1w1y24hPattern3} average - * @property {BtcCentsSatsUsdPattern3} block - * @property {BtcCentsSatsUsdPattern} cumulative - * @property {_1m1w1y24hPattern4} sum - */ - -/** - * Create a AverageBlockCumulativeSumPattern3 pattern node - * @param {BrkClient} client - * @param {string} acc - Accumulated series name - * @returns {AverageBlockCumulativeSumPattern3} - */ -function createAverageBlockCumulativeSumPattern3(client, acc) { return { average: create_1m1w1y24hPattern3(client, _m(acc, 'average')), block: createBtcCentsSatsUsdPattern3(client, acc), @@ -4611,9 +4588,9 @@ function createBlockCumulativeSumPattern(client, acc) { /** * @typedef {Object} BlocksDominanceRewardsPattern - * @property {AverageBlockCumulativeSumPattern2} blocksMined + * @property {AverageBlockCumulativeSumPattern} blocksMined * @property {_1m1w1y24hPercentPpmRatioPattern} dominance - * @property {AverageBlockCumulativeSumPattern3} rewards + * @property {AverageBlockCumulativeSumPattern2} rewards */ /** @@ -4624,9 +4601,9 @@ function createBlockCumulativeSumPattern(client, acc) { */ function createBlocksDominanceRewardsPattern(client, acc) { return { - blocksMined: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'blocks_mined')), + blocksMined: createAverageBlockCumulativeSumPattern(client, _m(acc, 'blocks_mined')), dominance: create_1m1w1y24hPercentPpmRatioPattern(client, _m(acc, 'dominance')), - rewards: createAverageBlockCumulativeSumPattern3(client, _m(acc, 'rewards')), + rewards: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'rewards')), }; } @@ -4956,7 +4933,7 @@ function createRsiStochPattern(client, acc, disc) { /** * @typedef {Object} SpentUnspentUtxoPattern - * @property {AverageBlockCumulativeSumPattern2} spentCount + * @property {AverageBlockCumulativeSumPattern} spentCount * @property {BaseDeltaPattern} unspentCount * @property {SeriesPattern1} utxoTurnover1y */ @@ -4969,7 +4946,7 @@ function createRsiStochPattern(client, acc, disc) { */ function createSpentUnspentUtxoPattern(client, acc) { return { - spentCount: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'spent_utxo_count')), + spentCount: createAverageBlockCumulativeSumPattern(client, _m(acc, 'spent_utxo_count')), unspentCount: createBaseDeltaPattern(client, _m(acc, 'utxo_count')), utxoTurnover1y: createSeriesPattern1(client, _m(acc, 'utxo_turnover_1y')), }; @@ -5191,7 +5168,7 @@ function createBlockCumulativePattern(client, acc) { /** * @typedef {Object} BlocksDominancePattern - * @property {AverageBlockCumulativeSumPattern2} blocksMined + * @property {AverageBlockCumulativeSumPattern} blocksMined * @property {PercentPpmRatioPattern2} dominance */ @@ -5203,7 +5180,7 @@ function createBlockCumulativePattern(client, acc) { */ function createBlocksDominancePattern(client, acc) { return { - blocksMined: createAverageBlockCumulativeSumPattern2(client, _m(acc, 'blocks_mined')), + blocksMined: createAverageBlockCumulativeSumPattern(client, _m(acc, 'blocks_mined')), dominance: createPercentPpmRatioPattern2(client, _m(acc, 'dominance')), }; } @@ -5658,7 +5635,7 @@ function createSupplyPattern(client, acc) { /** * @typedef {Object} TransferPattern - * @property {AverageBlockCumulativeSumPattern3} transferVolume + * @property {AverageBlockCumulativeSumPattern2} transferVolume */ /** @@ -5669,7 +5646,7 @@ function createSupplyPattern(client, acc) { */ function createTransferPattern(client, acc) { return { - transferVolume: createAverageBlockCumulativeSumPattern3(client, acc), + transferVolume: createAverageBlockCumulativeSumPattern2(client, acc), }; } @@ -5751,7 +5728,7 @@ function createTransferPattern(client, acc) { /** * @typedef {Object} SeriesTree_Blocks_Count * @property {_1m1w1y24hPattern} target - * @property {AverageBlockCumulativeSumPattern2} total + * @property {AverageBlockCumulativeSumPattern} total */ /** @@ -5982,7 +5959,7 @@ function createTransferPattern(client, acc) { /** * @typedef {Object} SeriesTree_Transactions_Volume - * @property {AverageBlockCumulativeSumPattern3} transferVolume + * @property {AverageBlockCumulativeSumPattern2} transferVolume * @property {_1m1w1y24hPattern} txPerSec */ @@ -6477,7 +6454,7 @@ function createTransferPattern(client, acc) { /** * @typedef {Object} SeriesTree_Mining_Rewards - * @property {AverageBlockCumulativeSumPattern3} coinbase + * @property {AverageBlockCumulativeSumPattern2} coinbase * @property {SeriesTree_Mining_Rewards_Subsidy} subsidy * @property {SeriesTree_Mining_Rewards_Fees} fees * @property {SeriesPattern18} outputVolume @@ -7595,7 +7572,7 @@ function createTransferPattern(client, acc) { /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Outputs * @property {BaseDeltaPattern} unspentCount - * @property {AverageBlockCumulativeSumPattern2} spentCount + * @property {AverageBlockCumulativeSumPattern} spentCount * @property {SeriesPattern1} utxoTurnover1y */ @@ -7946,27 +7923,27 @@ function createTransferPattern(client, acc) { /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Matured - * @property {AverageBlockCumulativeSumPattern3} under1h - * @property {AverageBlockCumulativeSumPattern3} _1hTo1d - * @property {AverageBlockCumulativeSumPattern3} _1dTo1w - * @property {AverageBlockCumulativeSumPattern3} _1wTo1m - * @property {AverageBlockCumulativeSumPattern3} _1mTo2m - * @property {AverageBlockCumulativeSumPattern3} _2mTo3m - * @property {AverageBlockCumulativeSumPattern3} _3mTo4m - * @property {AverageBlockCumulativeSumPattern3} _4mTo5m - * @property {AverageBlockCumulativeSumPattern3} _5mTo6m - * @property {AverageBlockCumulativeSumPattern3} _6mTo1y - * @property {AverageBlockCumulativeSumPattern3} _1yTo2y - * @property {AverageBlockCumulativeSumPattern3} _2yTo3y - * @property {AverageBlockCumulativeSumPattern3} _3yTo4y - * @property {AverageBlockCumulativeSumPattern3} _4yTo5y - * @property {AverageBlockCumulativeSumPattern3} _5yTo6y - * @property {AverageBlockCumulativeSumPattern3} _6yTo7y - * @property {AverageBlockCumulativeSumPattern3} _7yTo8y - * @property {AverageBlockCumulativeSumPattern3} _8yTo10y - * @property {AverageBlockCumulativeSumPattern3} _10yTo12y - * @property {AverageBlockCumulativeSumPattern3} _12yTo15y - * @property {AverageBlockCumulativeSumPattern3} over15y + * @property {AverageBlockCumulativeSumPattern2} under1h + * @property {AverageBlockCumulativeSumPattern2} _1hTo1d + * @property {AverageBlockCumulativeSumPattern2} _1dTo1w + * @property {AverageBlockCumulativeSumPattern2} _1wTo1m + * @property {AverageBlockCumulativeSumPattern2} _1mTo2m + * @property {AverageBlockCumulativeSumPattern2} _2mTo3m + * @property {AverageBlockCumulativeSumPattern2} _3mTo4m + * @property {AverageBlockCumulativeSumPattern2} _4mTo5m + * @property {AverageBlockCumulativeSumPattern2} _5mTo6m + * @property {AverageBlockCumulativeSumPattern2} _6mTo1y + * @property {AverageBlockCumulativeSumPattern2} _1yTo2y + * @property {AverageBlockCumulativeSumPattern2} _2yTo3y + * @property {AverageBlockCumulativeSumPattern2} _3yTo4y + * @property {AverageBlockCumulativeSumPattern2} _4yTo5y + * @property {AverageBlockCumulativeSumPattern2} _5yTo6y + * @property {AverageBlockCumulativeSumPattern2} _6yTo7y + * @property {AverageBlockCumulativeSumPattern2} _7yTo8y + * @property {AverageBlockCumulativeSumPattern2} _8yTo10y + * @property {AverageBlockCumulativeSumPattern2} _10yTo12y + * @property {AverageBlockCumulativeSumPattern2} _12yTo15y + * @property {AverageBlockCumulativeSumPattern2} over15y */ /** @@ -9296,7 +9273,7 @@ class BrkClient extends BrkClientBase { segwitWeight: createSeriesPattern18(this, 'segwit_weight'), count: { target: create_1m1w1y24hPattern(this, 'block_count_target'), - total: createAverageBlockCumulativeSumPattern2(this, 'block_count'), + total: createAverageBlockCumulativeSumPattern(this, 'block_count'), }, lookback: { _1h: createSeriesPattern18(this, 'height_1h_ago'), @@ -9476,7 +9453,7 @@ class BrkClient extends BrkClientBase { other: createAverageBlockCumulativeSumPattern(this, 'tx_other_version'), }, volume: { - transferVolume: createAverageBlockCumulativeSumPattern3(this, 'transfer_volume_bis'), + transferVolume: createAverageBlockCumulativeSumPattern2(this, 'transfer_volume_bis'), txPerSec: create_1m1w1y24hPattern(this, 'tx_per_sec'), }, }, @@ -9820,7 +9797,7 @@ class BrkClient extends BrkClientBase { }, mining: { rewards: { - coinbase: createAverageBlockCumulativeSumPattern3(this, 'coinbase'), + coinbase: createAverageBlockCumulativeSumPattern2(this, 'coinbase'), subsidy: { block: createBtcCentsSatsUsdPattern3(this, 'subsidy'), cumulative: createBtcCentsSatsUsdPattern(this, 'subsidy_cumulative'), @@ -10620,7 +10597,7 @@ class BrkClient extends BrkClientBase { supply: createDeltaDominanceHalfInTotalPattern2(this, 'supply'), outputs: { unspentCount: createBaseDeltaPattern(this, 'utxo_count'), - spentCount: createAverageBlockCumulativeSumPattern2(this, 'spent_utxo_count'), + spentCount: createAverageBlockCumulativeSumPattern(this, 'spent_utxo_count'), utxoTurnover1y: createSeriesPattern1(this, 'utxo_turnover_1y'), }, activity: { @@ -10913,27 +10890,27 @@ class BrkClient extends BrkClientBase { }, }, matured: { - under1h: createAverageBlockCumulativeSumPattern3(this, 'utxos_under_1h_old_matured_supply'), - _1hTo1d: createAverageBlockCumulativeSumPattern3(this, 'utxos_1h_to_1d_old_matured_supply'), - _1dTo1w: createAverageBlockCumulativeSumPattern3(this, 'utxos_1d_to_1w_old_matured_supply'), - _1wTo1m: createAverageBlockCumulativeSumPattern3(this, 'utxos_1w_to_1m_old_matured_supply'), - _1mTo2m: createAverageBlockCumulativeSumPattern3(this, 'utxos_1m_to_2m_old_matured_supply'), - _2mTo3m: createAverageBlockCumulativeSumPattern3(this, 'utxos_2m_to_3m_old_matured_supply'), - _3mTo4m: createAverageBlockCumulativeSumPattern3(this, 'utxos_3m_to_4m_old_matured_supply'), - _4mTo5m: createAverageBlockCumulativeSumPattern3(this, 'utxos_4m_to_5m_old_matured_supply'), - _5mTo6m: createAverageBlockCumulativeSumPattern3(this, 'utxos_5m_to_6m_old_matured_supply'), - _6mTo1y: createAverageBlockCumulativeSumPattern3(this, 'utxos_6m_to_1y_old_matured_supply'), - _1yTo2y: createAverageBlockCumulativeSumPattern3(this, 'utxos_1y_to_2y_old_matured_supply'), - _2yTo3y: createAverageBlockCumulativeSumPattern3(this, 'utxos_2y_to_3y_old_matured_supply'), - _3yTo4y: createAverageBlockCumulativeSumPattern3(this, 'utxos_3y_to_4y_old_matured_supply'), - _4yTo5y: createAverageBlockCumulativeSumPattern3(this, 'utxos_4y_to_5y_old_matured_supply'), - _5yTo6y: createAverageBlockCumulativeSumPattern3(this, 'utxos_5y_to_6y_old_matured_supply'), - _6yTo7y: createAverageBlockCumulativeSumPattern3(this, 'utxos_6y_to_7y_old_matured_supply'), - _7yTo8y: createAverageBlockCumulativeSumPattern3(this, 'utxos_7y_to_8y_old_matured_supply'), - _8yTo10y: createAverageBlockCumulativeSumPattern3(this, 'utxos_8y_to_10y_old_matured_supply'), - _10yTo12y: createAverageBlockCumulativeSumPattern3(this, 'utxos_10y_to_12y_old_matured_supply'), - _12yTo15y: createAverageBlockCumulativeSumPattern3(this, 'utxos_12y_to_15y_old_matured_supply'), - over15y: createAverageBlockCumulativeSumPattern3(this, 'utxos_over_15y_old_matured_supply'), + under1h: createAverageBlockCumulativeSumPattern2(this, 'utxos_under_1h_old_matured_supply'), + _1hTo1d: createAverageBlockCumulativeSumPattern2(this, 'utxos_1h_to_1d_old_matured_supply'), + _1dTo1w: createAverageBlockCumulativeSumPattern2(this, 'utxos_1d_to_1w_old_matured_supply'), + _1wTo1m: createAverageBlockCumulativeSumPattern2(this, 'utxos_1w_to_1m_old_matured_supply'), + _1mTo2m: createAverageBlockCumulativeSumPattern2(this, 'utxos_1m_to_2m_old_matured_supply'), + _2mTo3m: createAverageBlockCumulativeSumPattern2(this, 'utxos_2m_to_3m_old_matured_supply'), + _3mTo4m: createAverageBlockCumulativeSumPattern2(this, 'utxos_3m_to_4m_old_matured_supply'), + _4mTo5m: createAverageBlockCumulativeSumPattern2(this, 'utxos_4m_to_5m_old_matured_supply'), + _5mTo6m: createAverageBlockCumulativeSumPattern2(this, 'utxos_5m_to_6m_old_matured_supply'), + _6mTo1y: createAverageBlockCumulativeSumPattern2(this, 'utxos_6m_to_1y_old_matured_supply'), + _1yTo2y: createAverageBlockCumulativeSumPattern2(this, 'utxos_1y_to_2y_old_matured_supply'), + _2yTo3y: createAverageBlockCumulativeSumPattern2(this, 'utxos_2y_to_3y_old_matured_supply'), + _3yTo4y: createAverageBlockCumulativeSumPattern2(this, 'utxos_3y_to_4y_old_matured_supply'), + _4yTo5y: createAverageBlockCumulativeSumPattern2(this, 'utxos_4y_to_5y_old_matured_supply'), + _5yTo6y: createAverageBlockCumulativeSumPattern2(this, 'utxos_5y_to_6y_old_matured_supply'), + _6yTo7y: createAverageBlockCumulativeSumPattern2(this, 'utxos_6y_to_7y_old_matured_supply'), + _7yTo8y: createAverageBlockCumulativeSumPattern2(this, 'utxos_7y_to_8y_old_matured_supply'), + _8yTo10y: createAverageBlockCumulativeSumPattern2(this, 'utxos_8y_to_10y_old_matured_supply'), + _10yTo12y: createAverageBlockCumulativeSumPattern2(this, 'utxos_10y_to_12y_old_matured_supply'), + _12yTo15y: createAverageBlockCumulativeSumPattern2(this, 'utxos_12y_to_15y_old_matured_supply'), + over15y: createAverageBlockCumulativeSumPattern2(this, 'utxos_over_15y_old_matured_supply'), }, }, addr: { diff --git a/packages/brk_client/brk_client/__init__.py b/packages/brk_client/brk_client/__init__.py index b5b8d0b6e..9be9de60a 100644 --- a/packages/brk_client/brk_client/__init__.py +++ b/packages/brk_client/brk_client/__init__.py @@ -3491,8 +3491,8 @@ class AverageBlockCumulativeInSumPattern: self.average: _1m1w1y24hPattern3 = _1m1w1y24hPattern3(client, _m(acc, 'average')) self.block: BtcCentsSatsUsdPattern3 = BtcCentsSatsUsdPattern3(client, acc) self.cumulative: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, _m(acc, 'cumulative')) - self.in_loss: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, _m(acc, 'in_loss')) - self.in_profit: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, _m(acc, 'in_profit')) + self.in_loss: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, _m(acc, 'in_loss')) + self.in_profit: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, _m(acc, 'in_profit')) self.sum: _1m1w1y24hPattern4 = _1m1w1y24hPattern4(client, _m(acc, 'sum')) class CentsNegativeToUsdPattern2: @@ -3776,16 +3776,6 @@ class _1m1w1y24hPattern8: class AverageBlockCumulativeSumPattern2: """Pattern struct for repeated tree structure.""" - def __init__(self, client: BrkClient, acc: str): - """Create pattern node with accumulated series name.""" - self.average: _1m1w1y24hPattern[StoredF32] = _1m1w1y24hPattern(client, _m(acc, 'average')) - self.block: SeriesPattern18[StoredU32] = SeriesPattern18(client, acc) - self.cumulative: SeriesPattern1[StoredU64] = SeriesPattern1(client, _m(acc, 'cumulative')) - self.sum: _1m1w1y24hPattern[StoredU64] = _1m1w1y24hPattern(client, _m(acc, 'sum')) - -class AverageBlockCumulativeSumPattern3: - """Pattern struct for repeated tree structure.""" - def __init__(self, client: BrkClient, acc: str): """Create pattern node with accumulated series name.""" self.average: _1m1w1y24hPattern3 = _1m1w1y24hPattern3(client, _m(acc, 'average')) @@ -3946,9 +3936,9 @@ class BlocksDominanceRewardsPattern: def __init__(self, client: BrkClient, acc: str): """Create pattern node with accumulated series name.""" - self.blocks_mined: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, _m(acc, 'blocks_mined')) + self.blocks_mined: AverageBlockCumulativeSumPattern[StoredU64] = AverageBlockCumulativeSumPattern(client, _m(acc, 'blocks_mined')) self.dominance: _1m1w1y24hPercentPpmRatioPattern = _1m1w1y24hPercentPpmRatioPattern(client, _m(acc, 'dominance')) - self.rewards: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, _m(acc, 'rewards')) + self.rewards: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, _m(acc, 'rewards')) class CentsSatsUsdPattern3: """Pattern struct for repeated tree structure.""" @@ -4094,7 +4084,7 @@ class SpentUnspentUtxoPattern: def __init__(self, client: BrkClient, acc: str): """Create pattern node with accumulated series name.""" - self.spent_count: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, _m(acc, 'spent_utxo_count')) + self.spent_count: AverageBlockCumulativeSumPattern[StoredU64] = AverageBlockCumulativeSumPattern(client, _m(acc, 'spent_utxo_count')) self.unspent_count: BaseDeltaPattern = BaseDeltaPattern(client, _m(acc, 'utxo_count')) self.utxo_turnover_1y: SeriesPattern1[StoredF32] = SeriesPattern1(client, _m(acc, 'utxo_turnover_1y')) @@ -4192,7 +4182,7 @@ class BlocksDominancePattern: def __init__(self, client: BrkClient, acc: str): """Create pattern node with accumulated series name.""" - self.blocks_mined: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, _m(acc, 'blocks_mined')) + self.blocks_mined: AverageBlockCumulativeSumPattern[StoredU64] = AverageBlockCumulativeSumPattern(client, _m(acc, 'blocks_mined')) self.dominance: PercentPpmRatioPattern2 = PercentPpmRatioPattern2(client, _m(acc, 'dominance')) class BtcSatsPattern: @@ -4389,7 +4379,7 @@ class TransferPattern: def __init__(self, client: BrkClient, acc: str): """Create pattern node with accumulated series name.""" - self.transfer_volume: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, acc) + self.transfer_volume: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, acc) # Series tree classes @@ -4431,7 +4421,7 @@ class SeriesTree_Blocks_Count: def __init__(self, client: BrkClient, base_path: str = ''): self.target: _1m1w1y24hPattern[StoredU64] = _1m1w1y24hPattern(client, 'block_count_target') - self.total: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'block_count') + self.total: AverageBlockCumulativeSumPattern[StoredU64] = AverageBlockCumulativeSumPattern(client, 'block_count') class SeriesTree_Blocks_Lookback: """Series tree node.""" @@ -4687,7 +4677,7 @@ class SeriesTree_Transactions_Volume: """Series tree node.""" def __init__(self, client: BrkClient, base_path: str = ''): - self.transfer_volume: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'transfer_volume_bis') + self.transfer_volume: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'transfer_volume_bis') self.tx_per_sec: _1m1w1y24hPattern[StoredF32] = _1m1w1y24hPattern(client, 'tx_per_sec') class SeriesTree_Transactions: @@ -5278,7 +5268,7 @@ class SeriesTree_Mining_Rewards: """Series tree node.""" def __init__(self, client: BrkClient, base_path: str = ''): - self.coinbase: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'coinbase') + self.coinbase: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'coinbase') self.subsidy: SeriesTree_Mining_Rewards_Subsidy = SeriesTree_Mining_Rewards_Subsidy(client) self.fees: SeriesTree_Mining_Rewards_Fees = SeriesTree_Mining_Rewards_Fees(client) self.output_volume: SeriesPattern18[Sats] = SeriesPattern18(client, 'output_volume') @@ -6430,7 +6420,7 @@ class SeriesTree_Cohorts_Utxo_All_Outputs: def __init__(self, client: BrkClient, base_path: str = ''): self.unspent_count: BaseDeltaPattern = BaseDeltaPattern(client, 'utxo_count') - self.spent_count: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'spent_utxo_count') + self.spent_count: AverageBlockCumulativeSumPattern[StoredU64] = AverageBlockCumulativeSumPattern(client, 'spent_utxo_count') self.utxo_turnover_1y: SeriesPattern1[StoredF32] = SeriesPattern1(client, 'utxo_turnover_1y') class SeriesTree_Cohorts_Utxo_All_Activity: @@ -6819,27 +6809,27 @@ class SeriesTree_Cohorts_Utxo_Matured: """Series tree node.""" def __init__(self, client: BrkClient, base_path: str = ''): - self.under_1h: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_under_1h_old_matured_supply') - self._1h_to_1d: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_1h_to_1d_old_matured_supply') - self._1d_to_1w: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_1d_to_1w_old_matured_supply') - self._1w_to_1m: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_1w_to_1m_old_matured_supply') - self._1m_to_2m: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_1m_to_2m_old_matured_supply') - self._2m_to_3m: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_2m_to_3m_old_matured_supply') - self._3m_to_4m: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_3m_to_4m_old_matured_supply') - self._4m_to_5m: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_4m_to_5m_old_matured_supply') - self._5m_to_6m: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_5m_to_6m_old_matured_supply') - self._6m_to_1y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_6m_to_1y_old_matured_supply') - self._1y_to_2y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_1y_to_2y_old_matured_supply') - self._2y_to_3y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_2y_to_3y_old_matured_supply') - self._3y_to_4y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_3y_to_4y_old_matured_supply') - self._4y_to_5y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_4y_to_5y_old_matured_supply') - self._5y_to_6y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_5y_to_6y_old_matured_supply') - self._6y_to_7y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_6y_to_7y_old_matured_supply') - self._7y_to_8y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_7y_to_8y_old_matured_supply') - self._8y_to_10y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_8y_to_10y_old_matured_supply') - self._10y_to_12y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_10y_to_12y_old_matured_supply') - self._12y_to_15y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_12y_to_15y_old_matured_supply') - self.over_15y: AverageBlockCumulativeSumPattern3 = AverageBlockCumulativeSumPattern3(client, 'utxos_over_15y_old_matured_supply') + self.under_1h: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_under_1h_old_matured_supply') + self._1h_to_1d: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_1h_to_1d_old_matured_supply') + self._1d_to_1w: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_1d_to_1w_old_matured_supply') + self._1w_to_1m: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_1w_to_1m_old_matured_supply') + self._1m_to_2m: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_1m_to_2m_old_matured_supply') + self._2m_to_3m: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_2m_to_3m_old_matured_supply') + self._3m_to_4m: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_3m_to_4m_old_matured_supply') + self._4m_to_5m: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_4m_to_5m_old_matured_supply') + self._5m_to_6m: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_5m_to_6m_old_matured_supply') + self._6m_to_1y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_6m_to_1y_old_matured_supply') + self._1y_to_2y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_1y_to_2y_old_matured_supply') + self._2y_to_3y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_2y_to_3y_old_matured_supply') + self._3y_to_4y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_3y_to_4y_old_matured_supply') + self._4y_to_5y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_4y_to_5y_old_matured_supply') + self._5y_to_6y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_5y_to_6y_old_matured_supply') + self._6y_to_7y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_6y_to_7y_old_matured_supply') + self._7y_to_8y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_7y_to_8y_old_matured_supply') + self._8y_to_10y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_8y_to_10y_old_matured_supply') + self._10y_to_12y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_10y_to_12y_old_matured_supply') + self._12y_to_15y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_12y_to_15y_old_matured_supply') + self.over_15y: AverageBlockCumulativeSumPattern2 = AverageBlockCumulativeSumPattern2(client, 'utxos_over_15y_old_matured_supply') class SeriesTree_Cohorts_Utxo: """Series tree node."""