global: adding support for safe lengths

This commit is contained in:
nym21
2026-05-06 15:33:07 +02:00
parent da7671744f
commit 086bfd9938
177 changed files with 2445 additions and 2049 deletions
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Indexes, Version};
use brk_types::Version;
use rayon::prelude::*;
use vecdb::{AnyStoredVec, Database, Exit, Rw, StorageMode};
@@ -70,9 +71,9 @@ impl AddrCountFundedTotalVecs {
self.total.push_counts(total);
}
pub(crate) fn compute_rest(&mut self, starting_indexes: &Indexes, exit: &Exit) -> Result<()> {
self.funded.compute_rest(starting_indexes, exit)?;
self.total.compute_rest(starting_indexes, exit)?;
pub(crate) fn compute_rest(&mut self, starting_lengths: &Lengths, exit: &Exit) -> Result<()> {
self.funded.compute_rest(starting_lengths, exit)?;
self.total.compute_rest(starting_lengths, exit)?;
Ok(())
}
}
@@ -35,8 +35,9 @@
use brk_cohort::ByAddrType;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Sats, Version};
use brk_types::{Height, Sats, Version};
use rayon::prelude::*;
use vecdb::{AnyStoredVec, Database, Exit, ReadableVec, Rw, StorageMode};
@@ -102,17 +103,17 @@ impl ExposedAddrVecs {
pub(crate) fn compute_rest(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
prices: &prices::Vecs,
all_supply_sats: &impl ReadableVec<Height, Sats>,
type_supply_sats: &ByAddrType<&impl ReadableVec<Height, Sats>>,
exit: &Exit,
) -> Result<()> {
self.count.compute_rest(starting_indexes, exit)?;
self.count.compute_rest(starting_lengths, exit)?;
self.supply
.compute_rest(starting_indexes.height, prices, exit)?;
.compute_rest(starting_lengths.height, prices, exit)?;
self.supply_share.compute_rest(
starting_indexes.height,
starting_lengths.height,
&self.supply,
all_supply_sats,
type_supply_sats,
@@ -1,7 +1,8 @@
use brk_cohort::ByAddrType;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{BasisPoints16, Indexes, OutputType, StoredF32, StoredU32, StoredU64, Version};
use brk_types::{BasisPoints16, OutputType, StoredF32, StoredU32, StoredU64, Version};
use rayon::prelude::*;
use vecdb::{AnyStoredVec, AnyVec, Database, Exit, Rw, StorageMode, WritableVec};
@@ -205,37 +206,37 @@ impl AddrEventsVecs {
pub(crate) fn compute_rest(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
outputs_by_type: &outputs::ByTypeVecs,
inputs_by_type: &inputs::ByTypeVecs,
exit: &Exit,
) -> Result<()> {
self.output_to_reused_addr_count
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.input_from_reused_addr_count
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.active_reused_addr_count
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.active_reused_addr_share
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.output_to_reused_addr_share.all.compute_count_ratio(
&self.output_to_reused_addr_count.all,
&outputs_by_type.output_count.all,
starting_indexes.height,
starting_lengths.height,
exit,
)?;
self.spendable_output_to_reused_addr_share
.compute_count_ratio(
&self.output_to_reused_addr_count.all,
&outputs_by_type.spendable_output_count,
starting_indexes.height,
starting_lengths.height,
exit,
)?;
self.input_from_reused_addr_share.all.compute_count_ratio(
&self.input_from_reused_addr_count.all,
&inputs_by_type.input_count.all,
starting_indexes.height,
starting_lengths.height,
exit,
)?;
for otype in OutputType::ADDR_TYPES {
@@ -247,7 +248,7 @@ impl AddrEventsVecs {
.by_addr_type
.get_unwrap(otype),
outputs_by_type.output_count.by_type.get(otype),
starting_indexes.height,
starting_lengths.height,
exit,
)?;
self.input_from_reused_addr_share
@@ -258,7 +259,7 @@ impl AddrEventsVecs {
.by_addr_type
.get_unwrap(otype),
inputs_by_type.input_count.by_type.get(otype),
starting_indexes.height,
starting_lengths.height,
exit,
)?;
}
@@ -22,8 +22,9 @@ pub use events::{AddrEventsVecs, AddrTypeToAddrEventCount};
use brk_cohort::ByAddrType;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Sats, Version};
use brk_types::{Height, Sats, Version};
use rayon::prelude::*;
use vecdb::{AnyStoredVec, Database, Exit, ReadableVec, Rw, StorageMode};
@@ -108,7 +109,7 @@ impl ReusedAddrVecs {
#[allow(clippy::too_many_arguments)]
pub(crate) fn compute_rest(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
outputs_by_type: &outputs::ByTypeVecs,
inputs_by_type: &inputs::ByTypeVecs,
prices: &prices::Vecs,
@@ -116,13 +117,13 @@ impl ReusedAddrVecs {
type_supply_sats: &ByAddrType<&impl ReadableVec<Height, Sats>>,
exit: &Exit,
) -> Result<()> {
self.count.compute_rest(starting_indexes, exit)?;
self.count.compute_rest(starting_lengths, exit)?;
self.events
.compute_rest(starting_indexes, outputs_by_type, inputs_by_type, exit)?;
.compute_rest(starting_lengths, outputs_by_type, inputs_by_type, exit)?;
self.supply
.compute_rest(starting_indexes.height, prices, exit)?;
.compute_rest(starting_lengths.height, prices, exit)?;
self.supply_share.compute_rest(
starting_indexes.height,
starting_lengths.height,
&self.supply,
all_supply_sats,
type_supply_sats,
@@ -2,8 +2,9 @@ use std::path::Path;
use brk_cohort::{AddrGroups, AmountRange, Filter, Filtered, OverAmount, UnderAmount};
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Sats, StoredU64, Version};
use brk_types::{Height, Sats, StoredU64, Version};
use derive_more::{Deref, DerefMut};
use rayon::prelude::*;
use vecdb::{AnyStoredVec, Database, Exit, ReadableVec, Rw, StorageMode};
@@ -83,11 +84,11 @@ impl AddrCohorts {
/// Compute overlapping cohorts from component amount_range cohorts.
pub(crate) fn compute_overlapping_vecs(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.for_each_aggregate(|vecs, sources| {
vecs.compute_from_stateful(starting_indexes, &sources, exit)
vecs.compute_from_stateful(starting_lengths, &sources, exit)
})
}
@@ -95,11 +96,11 @@ impl AddrCohorts {
pub(crate) fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.par_iter_mut()
.try_for_each(|v| v.compute_rest_part1(prices, starting_indexes, exit))?;
.try_for_each(|v| v.compute_rest_part1(prices, starting_lengths, exit))?;
Ok(())
}
@@ -108,7 +109,7 @@ impl AddrCohorts {
pub(crate) fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
all_supply_sats: &impl ReadableVec<Height, Sats>,
all_utxo_count: &impl ReadableVec<Height, StoredU64>,
exit: &Exit,
@@ -116,7 +117,7 @@ impl AddrCohorts {
self.0.par_iter_mut().try_for_each(|v| {
v.compute_rest_part2(
prices,
starting_indexes,
starting_lengths,
all_supply_sats,
all_utxo_count,
exit,
@@ -2,8 +2,9 @@ use std::path::Path;
use brk_cohort::{CohortContext, Filter, Filtered};
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{BasisPointsSigned32, Cents, Height, Indexes, Sats, StoredI64, StoredU64, Version};
use brk_types::{BasisPointsSigned32, Cents, Height, Sats, StoredI64, StoredU64, Version};
use rayon::prelude::*;
use vecdb::{AnyStoredVec, AnyVec, Database, Exit, ReadableVec, Rw, StorageMode, WritableVec};
@@ -174,11 +175,11 @@ impl DynCohortVecs for AddrCohortVecs {
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.metrics
.compute_rest_part1(prices, starting_indexes, exit)
.compute_rest_part1(prices, starting_lengths, exit)
}
fn write_state(&mut self, height: Height, cleanup: bool) -> Result<()> {
@@ -205,12 +206,12 @@ impl DynCohortVecs for AddrCohortVecs {
impl CohortVecs for AddrCohortVecs {
fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
self.addr_count.height.compute_sum_of_others(
starting_indexes.height,
starting_lengths.height,
others
.iter()
.map(|v| &v.addr_count.height)
@@ -219,7 +220,7 @@ impl CohortVecs for AddrCohortVecs {
exit,
)?;
self.metrics.compute_from_sources(
starting_indexes,
starting_lengths,
&others.iter().map(|v| &v.metrics).collect::<Vec<_>>(),
exit,
)?;
@@ -229,14 +230,14 @@ impl CohortVecs for AddrCohortVecs {
fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
all_supply_sats: &impl ReadableVec<Height, Sats>,
all_utxo_count: &impl ReadableVec<Height, StoredU64>,
exit: &Exit,
) -> Result<()> {
self.metrics.compute_rest_part2(
prices,
starting_indexes,
starting_lengths,
all_supply_sats,
all_utxo_count,
exit,
@@ -1,5 +1,6 @@
use brk_error::Result;
use brk_types::{Cents, Height, Indexes, Sats, StoredU64, Version};
use brk_indexer::Lengths;
use brk_types::{Cents, Height, Sats, StoredU64, Version};
use vecdb::{Exit, ReadableVec};
use crate::prices;
@@ -31,7 +32,7 @@ pub trait DynCohortVecs: Send + Sync {
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()>;
@@ -52,7 +53,7 @@ pub trait CohortVecs: DynCohortVecs {
/// Compute aggregate cohort from component cohorts.
fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()>;
@@ -61,7 +62,7 @@ pub trait CohortVecs: DynCohortVecs {
fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
all_supply_sats: &impl ReadableVec<Height, Sats>,
all_utxo_count: &impl ReadableVec<Height, StoredU64>,
exit: &Exit,
@@ -5,8 +5,9 @@ use brk_cohort::{
SpendableType, Term, UnderAge, UnderAmount,
};
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Cents, CentsSquaredSats, Dollars, Height, Indexes, Sats, Version};
use brk_types::{Cents, CentsSquaredSats, Dollars, Height, Sats, Version};
use rayon::prelude::*;
use vecdb::{
AnyStoredVec, AnyVec, Database, Exit, ReadOnlyClone, ReadableVec, Rw, StorageMode, WritableVec,
@@ -414,7 +415,7 @@ impl UTXOCohorts<Rw> {
pub(crate) fn compute_overlapping_vecs(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
let Self {
@@ -432,7 +433,7 @@ impl UTXOCohorts<Rw> {
let ar = &*age_range;
let amr = &*amount_range;
let si = starting_indexes;
let si = starting_lengths;
let tasks: Vec<Box<dyn FnOnce() -> Result<()> + Send + '_>> = vec![
Box::new(|| {
@@ -483,7 +484,7 @@ impl UTXOCohorts<Rw> {
pub(crate) fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
// 1. Compute all metrics except net_sentiment (all cohorts via DynCohortVecs)
@@ -527,16 +528,16 @@ impl UTXOCohorts<Rw> {
);
all.extend(self.type_.iter_mut().map(|x| x as &mut dyn DynCohortVecs));
all.into_par_iter()
.try_for_each(|v| v.compute_rest_part1(prices, starting_indexes, exit))?;
.try_for_each(|v| v.compute_rest_part1(prices, starting_lengths, exit))?;
}
// Compute matured cumulative + cents from sats × price
self.matured
.par_iter_mut()
.try_for_each(|v| v.compute_rest(starting_indexes.height, prices, exit))?;
.try_for_each(|v| v.compute_rest(starting_lengths.height, prices, exit))?;
// Compute profitability supply cents and realized price
self.profitability.compute(prices, starting_indexes, exit)?;
self.profitability.compute(prices, starting_lengths, exit)?;
Ok(())
}
@@ -546,7 +547,7 @@ impl UTXOCohorts<Rw> {
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
height_to_market_cap: &impl ReadableVec<Height, Dollars>,
exit: &Exit,
) -> Result<()> {
@@ -574,7 +575,7 @@ impl UTXOCohorts<Rw> {
self.all.metrics.compute_rest_part2(
blocks,
prices,
starting_indexes,
starting_lengths,
height_to_market_cap,
&under_1h_value_created,
&under_1h_value_destroyed,
@@ -619,7 +620,7 @@ impl UTXOCohorts<Rw> {
sth.metrics.compute_rest_part2(
blocks,
prices,
starting_indexes,
starting_lengths,
height_to_market_cap,
vc,
vd,
@@ -632,7 +633,7 @@ impl UTXOCohorts<Rw> {
lth.metrics.compute_rest_part2(
blocks,
prices,
starting_indexes,
starting_lengths,
height_to_market_cap,
ss,
au,
@@ -642,55 +643,55 @@ impl UTXOCohorts<Rw> {
Box::new(|| {
age_range.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
Box::new(|| {
under_age.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
Box::new(|| {
over_age.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
Box::new(|| {
over_amount.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
Box::new(|| {
epoch.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
Box::new(|| {
class.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
Box::new(|| {
amount_range.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
Box::new(|| {
under_amount.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
Box::new(|| {
type_.par_iter_mut().try_for_each(|v| {
v.metrics
.compute_rest_part2(prices, starting_indexes, ss, au, exit)
.compute_rest_part2(prices, starting_lengths, ss, au, exit)
})
}),
];
@@ -1,6 +1,7 @@
use brk_cohort::{Filter, Filtered};
use brk_error::Result;
use brk_types::{Cents, Height, Indexes, Version};
use brk_indexer::Lengths;
use brk_types::{Cents, Height, Version};
use vecdb::{Exit, ReadableVec};
use crate::{
@@ -56,11 +57,11 @@ impl DynCohortVecs for UTXOCohortVecs<CoreCohortMetrics> {
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.metrics
.compute_rest_part1(prices, starting_indexes, exit)
.compute_rest_part1(prices, starting_lengths, exit)
}
fn write_state(&mut self, height: Height, cleanup: bool) -> Result<()> {
@@ -1,6 +1,7 @@
use brk_cohort::{Filter, Filtered};
use brk_error::Result;
use brk_types::{Cents, Height, Indexes, Version};
use brk_indexer::Lengths;
use brk_types::{Cents, Height, Version};
use vecdb::{Exit, ReadableVec};
use crate::{
@@ -49,11 +50,11 @@ impl DynCohortVecs for UTXOCohortVecs<MinimalCohortMetrics> {
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.metrics
.compute_rest_part1(prices, starting_indexes, exit)
.compute_rest_part1(prices, starting_lengths, exit)
}
fn write_state(&mut self, height: Height, cleanup: bool) -> Result<()> {
@@ -44,8 +44,9 @@ mod r#type;
use brk_cohort::{Filter, Filtered};
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Cents, Height, Indexes, Version};
use brk_types::{Cents, Height, Version};
use vecdb::{Exit, ReadableVec};
use crate::{
@@ -186,11 +187,11 @@ impl<M: CohortMetricsBase + Traversable> DynCohortVecs for UTXOCohortVecs<M> {
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.metrics
.compute_rest_part1(prices, starting_indexes, exit)?;
.compute_rest_part1(prices, starting_lengths, exit)?;
Ok(())
}
@@ -1,6 +1,7 @@
use brk_cohort::{Filter, Filtered};
use brk_error::Result;
use brk_types::{Cents, Height, Indexes, Version};
use brk_indexer::Lengths;
use brk_types::{Cents, Height, Version};
use vecdb::{Exit, ReadableVec};
use crate::{
@@ -55,11 +56,11 @@ impl DynCohortVecs for UTXOCohortVecs<TypeCohortMetrics> {
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.metrics
.compute_rest_part1(prices, starting_indexes, exit)
.compute_rest_part1(prices, starting_lengths, exit)
}
fn write_state(&mut self, height: Height, cleanup: bool) -> Result<()> {
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Bitcoin, Indexes, StoredF64, Version};
use brk_types::{Bitcoin, StoredF64, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, AnyVec, Exit, Rw, StorageMode, WritableVec};
@@ -80,17 +81,17 @@ impl ActivityCore {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
let minimal_refs: Vec<&ActivityMinimal> = others.iter().map(|o| &o.minimal).collect();
self.minimal
.compute_from_stateful(starting_indexes, &minimal_refs, exit)?;
.compute_from_stateful(starting_lengths, &minimal_refs, exit)?;
sum_others!(self, starting_indexes, others, exit; coindays_destroyed.block);
sum_others!(self, starting_indexes, others, exit; transfer_volume_in_profit.block.sats);
sum_others!(self, starting_indexes, others, exit; transfer_volume_in_loss.block.sats);
sum_others!(self, starting_lengths, others, exit; coindays_destroyed.block);
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);
Ok(())
}
@@ -98,17 +99,17 @@ impl ActivityCore {
pub(crate) fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.minimal
.compute_rest_part1(prices, starting_indexes, exit)?;
.compute_rest_part1(prices, starting_lengths, exit)?;
self.coindays_destroyed
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.transfer_volume_in_profit
.compute_rest(starting_indexes.height, prices, exit)?;
.compute_rest(starting_lengths.height, prices, exit)?;
self.transfer_volume_in_loss
.compute_rest(starting_indexes.height, prices, exit)?;
.compute_rest(starting_lengths.height, prices, exit)?;
Ok(())
}
}
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Indexes, StoredF32, StoredF64, Version};
use brk_types::{StoredF32, StoredF64, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, Exit, Rw, StorageMode};
@@ -78,22 +79,22 @@ impl ActivityFull {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&ActivityCore],
exit: &Exit,
) -> Result<()> {
self.inner
.compute_from_stateful(starting_indexes, others, exit)
.compute_from_stateful(starting_lengths, others, exit)
}
pub(crate) fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.inner
.compute_rest_part1(prices, starting_indexes, exit)?;
.compute_rest_part1(prices, starting_lengths, exit)?;
for ((dormancy, cdd_sum), tv_sum) in self
.dormancy
@@ -103,7 +104,7 @@ impl ActivityFull {
.zip(self.inner.minimal.transfer_volume.sum.0.as_array())
{
dormancy.height.compute_transform2(
starting_indexes.height,
starting_lengths.height,
&cdd_sum.height,
&tv_sum.btc.height,
|(i, rolling_cdd, rolling_btc, ..)| {
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Indexes, Version};
use brk_types::Version;
use vecdb::{AnyStoredVec, AnyVec, Exit, Rw, StorageMode, WritableVec};
use crate::{
@@ -44,12 +45,12 @@ impl ActivityMinimal {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
self.transfer_volume.block.sats.compute_sum_of_others(
starting_indexes.height,
starting_lengths.height,
&others
.iter()
.map(|v| &v.transfer_volume.block.sats)
@@ -63,11 +64,11 @@ impl ActivityMinimal {
pub(crate) fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.transfer_volume
.compute_rest(starting_indexes.height, prices, exit)?;
.compute_rest(starting_lengths.height, prices, exit)?;
Ok(())
}
}
@@ -7,7 +7,8 @@ pub use full::ActivityFull;
pub use minimal::ActivityMinimal;
use brk_error::Result;
use brk_types::{Indexes, Version};
use brk_indexer::Lengths;
use brk_types::Version;
use vecdb::Exit;
use crate::{
@@ -23,14 +24,14 @@ pub trait ActivityLike: Send + Sync {
fn validate_computed_versions(&mut self, base_version: Version) -> Result<()>;
fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&ActivityCore],
exit: &Exit,
) -> Result<()>;
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()>;
}
@@ -53,19 +54,19 @@ impl ActivityLike for ActivityCore {
}
fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&ActivityCore],
exit: &Exit,
) -> Result<()> {
self.compute_from_stateful(starting_indexes, others, exit)
self.compute_from_stateful(starting_lengths, others, exit)
}
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.compute_rest_part1(prices, starting_indexes, exit)
self.compute_rest_part1(prices, starting_lengths, exit)
}
}
@@ -87,18 +88,18 @@ impl ActivityLike for ActivityFull {
}
fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&ActivityCore],
exit: &Exit,
) -> Result<()> {
self.compute_from_stateful(starting_indexes, others, exit)
self.compute_from_stateful(starting_lengths, others, exit)
}
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.compute_rest_part1(prices, starting_indexes, exit)
self.compute_rest_part1(prices, starting_lengths, exit)
}
}
@@ -1,7 +1,8 @@
use brk_cohort::Filter;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Cents, Dollars, Height, Indexes, Version};
use brk_types::{Cents, Dollars, Height, Version};
use vecdb::{AnyStoredVec, Exit, ReadOnlyClone, ReadableVec, Rw, StorageMode};
use crate::{
@@ -100,7 +101,7 @@ impl AllCohortMetrics {
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
height_to_market_cap: &impl ReadableVec<Height, Dollars>,
under_1h_value_created: &impl ReadableVec<Height, Cents>,
under_1h_value_destroyed: &impl ReadableVec<Height, Cents>,
@@ -109,7 +110,7 @@ impl AllCohortMetrics {
self.realized.compute_rest_part2(
blocks,
prices,
starting_indexes,
starting_lengths,
&self.supply.total.btc.height,
height_to_market_cap,
&self.activity.transfer_volume,
@@ -117,14 +118,14 @@ impl AllCohortMetrics {
)?;
self.unrealized.compute(
starting_indexes.height,
starting_lengths.height,
&prices.spot.cents.height,
&self.realized.price.cents.height,
exit,
)?;
self.asopr.compute_rest_part2(
starting_indexes,
starting_lengths,
&self.activity.transfer_volume.block.cents,
&self.realized.core.sopr.value_destroyed.block,
under_1h_value_created,
@@ -134,10 +135,10 @@ impl AllCohortMetrics {
let all_utxo_count = self.outputs.unspent_count.height.read_only_clone();
self.outputs
.compute_part2(starting_indexes.height, &all_utxo_count, exit)?;
.compute_part2(starting_lengths.height, &all_utxo_count, exit)?;
self.cost_basis.compute_prices(
starting_indexes,
starting_lengths,
&prices.spot.cents.height,
&self.unrealized.invested_capital.in_profit.cents.height,
&self.unrealized.invested_capital.in_loss.cents.height,
@@ -149,14 +150,14 @@ impl AllCohortMetrics {
)?;
self.unrealized
.compute_sentiment(starting_indexes, &prices.spot.cents.height, exit)?;
.compute_sentiment(starting_lengths, &prices.spot.cents.height, exit)?;
let own_supply_sats = self.supply.total.sats.height.read_only_clone();
self.supply
.compute_dominance(starting_indexes.height, &own_supply_sats, exit)?;
.compute_dominance(starting_lengths.height, &own_supply_sats, exit)?;
self.relative.compute(
starting_indexes.height,
starting_lengths.height,
&self.supply,
&self.unrealized,
&self.realized,
@@ -1,7 +1,8 @@
use brk_cohort::Filter;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Sats, StoredU64};
use brk_types::{Height, Sats, StoredU64};
use vecdb::{AnyStoredVec, Exit, ReadableVec, Rw, StorageMode};
use crate::{
@@ -61,31 +62,31 @@ impl BasicCohortMetrics {
pub(crate) fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
all_supply_sats: &impl ReadableVec<Height, Sats>,
all_utxo_count: &impl ReadableVec<Height, StoredU64>,
exit: &Exit,
) -> Result<()> {
self.realized.compute_rest_part2(
prices,
starting_indexes,
starting_lengths,
&self.supply.total.btc.height,
&self.activity.transfer_volume.sum._24h.cents.height,
exit,
)?;
self.unrealized.compute(
starting_indexes.height,
starting_lengths.height,
&prices.spot.cents.height,
&self.realized.price.cents.height,
exit,
)?;
self.supply
.compute_dominance(starting_indexes.height, all_supply_sats, exit)?;
.compute_dominance(starting_lengths.height, all_supply_sats, exit)?;
self.outputs
.compute_part2(starting_indexes.height, all_utxo_count, exit)?;
.compute_part2(starting_lengths.height, all_utxo_count, exit)?;
Ok(())
}
@@ -1,7 +1,8 @@
use brk_cohort::Filter;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Sats, StoredU64, Version};
use brk_types::{Height, Sats, StoredU64, Version};
use vecdb::{AnyStoredVec, Exit, ReadableVec, Rw, StorageMode};
use crate::{
@@ -63,32 +64,32 @@ impl CoreCohortMetrics {
/// Aggregate Core-tier fields from CohortMetricsBase sources (e.g. age_range -> under_age/over_age).
pub(crate) fn compute_from_base_sources<T: CohortMetricsBase>(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&T],
exit: &Exit,
) -> Result<()> {
self.supply.compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.supply()).collect::<Vec<_>>(),
exit,
)?;
self.outputs.compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.outputs()).collect::<Vec<_>>(),
exit,
)?;
self.activity.compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.activity_core()).collect::<Vec<_>>(),
exit,
)?;
self.realized.compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.realized_core()).collect::<Vec<_>>(),
exit,
)?;
self.unrealized.compute_from_stateful(
starting_indexes,
starting_lengths,
&others
.iter()
.map(|v| v.unrealized_core())
@@ -102,19 +103,19 @@ impl CoreCohortMetrics {
pub(crate) fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.supply.compute(prices, starting_indexes.height, exit)?;
self.supply.compute(prices, starting_lengths.height, exit)?;
self.outputs.compute_rest(starting_indexes.height, exit)?;
self.outputs.compute_rest(starting_lengths.height, exit)?;
self.activity
.compute_rest_part1(prices, starting_indexes, exit)?;
.compute_rest_part1(prices, starting_lengths, exit)?;
self.realized.compute_rest_part1(starting_indexes, exit)?;
self.realized.compute_rest_part1(starting_lengths, exit)?;
self.unrealized.compute_rest(starting_indexes, exit)?;
self.unrealized.compute_rest(starting_lengths, exit)?;
Ok(())
}
@@ -122,31 +123,31 @@ impl CoreCohortMetrics {
pub(crate) fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
all_supply_sats: &impl ReadableVec<Height, Sats>,
all_utxo_count: &impl ReadableVec<Height, StoredU64>,
exit: &Exit,
) -> Result<()> {
self.realized.compute_rest_part2(
prices,
starting_indexes,
starting_lengths,
&self.supply.total.btc.height,
&self.activity.transfer_volume.sum._24h.cents.height,
exit,
)?;
self.unrealized.compute(
starting_indexes.height,
starting_lengths.height,
&prices.spot.cents.height,
&self.realized.price.cents.height,
exit,
)?;
self.supply
.compute_dominance(starting_indexes.height, all_supply_sats, exit)?;
.compute_dominance(starting_lengths.height, all_supply_sats, exit)?;
self.outputs
.compute_part2(starting_indexes.height, all_utxo_count, exit)?;
.compute_part2(starting_lengths.height, all_utxo_count, exit)?;
Ok(())
}
@@ -1,7 +1,8 @@
use brk_cohort::Filter;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Dollars, Height, Indexes, Sats, StoredU64, Version};
use brk_types::{Dollars, Height, Sats, StoredU64, Version};
use vecdb::AnyStoredVec;
use vecdb::{Exit, ReadableVec, Rw, StorageMode};
@@ -90,7 +91,7 @@ impl ExtendedCohortMetrics {
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
height_to_market_cap: &impl ReadableVec<Height, Dollars>,
all_supply_sats: &impl ReadableVec<Height, Sats>,
all_utxo_count: &impl ReadableVec<Height, StoredU64>,
@@ -99,7 +100,7 @@ impl ExtendedCohortMetrics {
self.realized.compute_rest_part2(
blocks,
prices,
starting_indexes,
starting_lengths,
&self.supply.total.btc.height,
height_to_market_cap,
&self.activity.transfer_volume,
@@ -107,14 +108,14 @@ impl ExtendedCohortMetrics {
)?;
self.unrealized.compute(
starting_indexes.height,
starting_lengths.height,
&prices.spot.cents.height,
&self.realized.price.cents.height,
exit,
)?;
self.cost_basis.compute_prices(
starting_indexes,
starting_lengths,
&prices.spot.cents.height,
&self.unrealized.invested_capital.in_profit.cents.height,
&self.unrealized.invested_capital.in_loss.cents.height,
@@ -126,13 +127,13 @@ impl ExtendedCohortMetrics {
)?;
self.unrealized
.compute_sentiment(starting_indexes, &prices.spot.cents.height, exit)?;
.compute_sentiment(starting_lengths, &prices.spot.cents.height, exit)?;
self.supply
.compute_dominance(starting_indexes.height, all_supply_sats, exit)?;
.compute_dominance(starting_lengths.height, all_supply_sats, exit)?;
self.relative.compute(
starting_indexes.height,
starting_lengths.height,
&self.supply,
&self.unrealized,
&self.realized,
@@ -142,7 +143,7 @@ impl ExtendedCohortMetrics {
)?;
self.outputs
.compute_part2(starting_indexes.height, all_utxo_count, exit)?;
.compute_part2(starting_lengths.height, all_utxo_count, exit)?;
Ok(())
}
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Cents, Dollars, Height, Indexes, Sats, StoredU64, Version};
use brk_types::{Cents, Dollars, Height, Sats, StoredU64, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, Exit, ReadableVec, Rw, StorageMode};
@@ -62,7 +63,7 @@ impl ExtendedAdjustedCohortMetrics {
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
height_to_market_cap: &impl ReadableVec<Height, Dollars>,
under_1h_value_created: &impl ReadableVec<Height, Cents>,
under_1h_value_destroyed: &impl ReadableVec<Height, Cents>,
@@ -73,7 +74,7 @@ impl ExtendedAdjustedCohortMetrics {
self.inner.compute_rest_part2(
blocks,
prices,
starting_indexes,
starting_lengths,
height_to_market_cap,
all_supply_sats,
all_utxo_count,
@@ -81,7 +82,7 @@ impl ExtendedAdjustedCohortMetrics {
)?;
self.asopr.compute_rest_part2(
starting_indexes,
starting_lengths,
&self.inner.activity.transfer_volume.block.cents,
&self.inner.realized.core.sopr.value_destroyed.block,
under_1h_value_created,
@@ -1,7 +1,8 @@
use brk_cohort::Filter;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Sats, StoredU64};
use brk_types::{Height, Sats, StoredU64};
use vecdb::{AnyStoredVec, Exit, ReadableVec, Rw, StorageMode};
use crate::{
@@ -58,17 +59,17 @@ impl MinimalCohortMetrics {
/// Aggregate Minimal-tier metrics from other MinimalCohortMetrics sources.
pub(crate) fn compute_from_sources(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&MinimalCohortMetrics],
exit: &Exit,
) -> Result<()> {
self.supply.compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.supply.as_ref()).collect::<Vec<_>>(),
exit,
)?;
self.outputs.compute_from_stateful(
starting_indexes,
starting_lengths,
&others
.iter()
.map(|v| v.outputs.as_ref())
@@ -76,7 +77,7 @@ impl MinimalCohortMetrics {
exit,
)?;
self.activity.compute_from_stateful(
starting_indexes,
starting_lengths,
&others
.iter()
.map(|v| v.activity.as_ref())
@@ -84,7 +85,7 @@ impl MinimalCohortMetrics {
exit,
)?;
self.realized.compute_from_stateful(
starting_indexes,
starting_lengths,
&others
.iter()
.map(|v| v.realized.as_ref())
@@ -97,44 +98,44 @@ impl MinimalCohortMetrics {
pub(crate) fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.supply.compute(prices, starting_indexes.height, exit)?;
self.outputs.compute_rest(starting_indexes.height, exit)?;
self.supply.compute(prices, starting_lengths.height, exit)?;
self.outputs.compute_rest(starting_lengths.height, exit)?;
self.activity
.compute_rest_part1(prices, starting_indexes, exit)?;
self.realized.compute_rest_part1(starting_indexes, exit)?;
.compute_rest_part1(prices, starting_lengths, exit)?;
self.realized.compute_rest_part1(starting_lengths, exit)?;
Ok(())
}
pub(crate) fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
all_supply_sats: &impl ReadableVec<Height, Sats>,
all_utxo_count: &impl ReadableVec<Height, StoredU64>,
exit: &Exit,
) -> Result<()> {
self.realized.compute_rest_part2(
prices,
starting_indexes,
starting_lengths,
&self.supply.total.btc.height,
exit,
)?;
self.unrealized.compute(
starting_indexes.height,
starting_lengths.height,
&prices.spot.cents.height,
&self.realized.price.cents.height,
exit,
)?;
self.supply
.compute_dominance(starting_indexes.height, all_supply_sats, exit)?;
.compute_dominance(starting_lengths.height, all_supply_sats, exit)?;
self.outputs
.compute_part2(starting_indexes.height, all_utxo_count, exit)?;
.compute_part2(starting_lengths.height, all_utxo_count, exit)?;
Ok(())
}
@@ -1,7 +1,8 @@
use brk_cohort::Filter;
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Sats, StoredU64};
use brk_types::{Height, Sats, StoredU64};
use vecdb::{AnyStoredVec, Exit, ReadableVec, Rw, StorageMode};
use crate::{
@@ -59,44 +60,44 @@ impl TypeCohortMetrics {
pub(crate) fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.supply.compute(prices, starting_indexes.height, exit)?;
self.outputs.compute_rest(starting_indexes.height, exit)?;
self.supply.compute(prices, starting_lengths.height, exit)?;
self.outputs.compute_rest(starting_lengths.height, exit)?;
self.activity
.compute_rest_part1(prices, starting_indexes, exit)?;
self.realized.compute_rest_part1(starting_indexes, exit)?;
.compute_rest_part1(prices, starting_lengths, exit)?;
self.realized.compute_rest_part1(starting_lengths, exit)?;
Ok(())
}
pub(crate) fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
all_supply_sats: &impl ReadableVec<Height, Sats>,
all_utxo_count: &impl ReadableVec<Height, StoredU64>,
exit: &Exit,
) -> Result<()> {
self.realized.compute_rest_part2(
prices,
starting_indexes,
starting_lengths,
&self.supply.total.btc.height,
exit,
)?;
self.unrealized.compute(
starting_indexes.height,
starting_lengths.height,
&prices.spot.cents.height,
&self.realized.price.cents.height,
exit,
)?;
self.supply
.compute_dominance(starting_indexes.height, all_supply_sats, exit)?;
.compute_dominance(starting_lengths.height, all_supply_sats, exit)?;
self.outputs
.compute_part2(starting_indexes.height, all_utxo_count, exit)?;
.compute_part2(starting_lengths.height, all_utxo_count, exit)?;
Ok(())
}
@@ -1,7 +1,8 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::CentsSquaredSats;
use brk_types::{BasisPoints16, Cents, Height, Indexes, Sats, Version};
use brk_types::{BasisPoints16, Cents, Height, Sats, Version};
use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, Rw, StorageMode, WritableVec};
use crate::internal::{PERCENTILES_LEN, PerBlock, PercentPerBlock, PercentilesVecs, Price};
@@ -147,7 +148,7 @@ impl CostBasis {
#[allow(clippy::too_many_arguments)]
pub(crate) fn compute_prices(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
spot: &impl ReadableVec<Height, Cents>,
invested_cap_in_profit: &impl ReadableVec<Height, Cents>,
invested_cap_in_loss: &impl ReadableVec<Height, Cents>,
@@ -158,7 +159,7 @@ impl CostBasis {
exit: &Exit,
) -> Result<()> {
self.in_profit.per_coin.cents.height.compute_transform3(
starting_indexes.height,
starting_lengths.height,
invested_cap_in_profit,
supply_in_profit_sats,
spot,
@@ -175,7 +176,7 @@ impl CostBasis {
exit,
)?;
self.in_loss.per_coin.cents.height.compute_transform3(
starting_indexes.height,
starting_lengths.height,
invested_cap_in_loss,
supply_in_loss_sats,
spot,
@@ -192,7 +193,7 @@ impl CostBasis {
exit,
)?;
self.in_profit.per_dollar.cents.height.compute_transform3(
starting_indexes.height,
starting_lengths.height,
capitalized_cap_in_profit_raw,
invested_cap_in_profit,
spot,
@@ -209,7 +210,7 @@ impl CostBasis {
exit,
)?;
self.in_loss.per_dollar.cents.height.compute_transform3(
starting_indexes.height,
starting_lengths.height,
capitalized_cap_in_loss_raw,
invested_cap_in_loss,
spot,
@@ -140,7 +140,8 @@ pub use unrealized::{
use brk_cohort::Filter;
use brk_error::Result;
use brk_types::{Cents, Indexes, Version};
use brk_indexer::Lengths;
use brk_types::{Cents, Version};
use vecdb::{AnyStoredVec, Exit, StorageMode};
use crate::{
@@ -270,23 +271,23 @@ pub trait CohortMetricsBase:
fn compute_rest_part1(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.supply_mut()
.compute(prices, starting_indexes.height, exit)?;
.compute(prices, starting_lengths.height, exit)?;
self.outputs_mut()
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.activity_mut()
.compute_rest_part1(prices, starting_indexes, exit)?;
.compute_rest_part1(prices, starting_lengths, exit)?;
self.realized_mut()
.compute_rest_part1(starting_indexes, exit)?;
.compute_rest_part1(starting_lengths, exit)?;
let (supply, unrealized) = self.supply_and_unrealized_mut();
unrealized.compute_rest(
prices,
starting_indexes,
starting_lengths,
&supply.in_profit.sats.height,
&supply.in_loss.sats.height,
exit,
@@ -298,32 +299,32 @@ pub trait CohortMetricsBase:
/// Compute aggregate base metrics from source cohorts.
fn compute_base_from_others<T: CohortMetricsBase>(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&T],
exit: &Exit,
) -> Result<()> {
self.supply_mut().compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.supply()).collect::<Vec<_>>(),
exit,
)?;
self.outputs_mut().compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.outputs()).collect::<Vec<_>>(),
exit,
)?;
self.activity_mut().compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.activity_core()).collect::<Vec<_>>(),
exit,
)?;
self.realized_mut().compute_from_stateful(
starting_indexes,
starting_lengths,
&others.iter().map(|v| v.realized_core()).collect::<Vec<_>>(),
exit,
)?;
self.unrealized_core_mut().compute_from_stateful(
starting_indexes,
starting_lengths,
&others
.iter()
.map(|v| v.unrealized_core())
@@ -1,8 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{
BasisPointsSigned32, Height, Indexes, StoredF32, StoredI64, StoredU32, StoredU64, Version,
};
use brk_types::{BasisPointsSigned32, Height, StoredF32, StoredI64, StoredU32, StoredU64, Version};
use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, Rw, StorageMode, WritableVec};
use crate::{
@@ -83,19 +82,19 @@ impl OutputsBase {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
self.unspent_count.height.compute_sum_of_others(
starting_indexes.height,
starting_lengths.height,
&others
.iter()
.map(|v| &v.unspent_count.height)
.collect::<Vec<_>>(),
exit,
)?;
sum_others!(self, starting_indexes, others, exit; spent_count.block);
sum_others!(self, starting_lengths, others, exit; spent_count.block);
Ok(())
}
}
@@ -1,7 +1,8 @@
use brk_cohort::{Loss, Profit, ProfitabilityRange};
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{BasisPointsSigned32, Bitcoin, Cents, Dollars, Indexes, Sats, Version};
use brk_types::{BasisPointsSigned32, Bitcoin, Cents, Dollars, Sats, Version};
use vecdb::{AnyStoredVec, AnyVec, Database, Exit, Rw, StorageMode, WritableVec};
use crate::{
@@ -115,11 +116,11 @@ impl ProfitabilityBucket {
pub(crate) fn compute(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
is_profit: bool,
exit: &Exit,
) -> Result<()> {
let max_from = starting_indexes.height;
let max_from = starting_lengths.height;
self.supply.all.compute(prices, max_from, exit)?;
self.supply.sth.compute(prices, max_from, exit)?;
@@ -176,12 +177,12 @@ impl ProfitabilityBucket {
pub(crate) fn compute_from_ranges(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
is_profit: bool,
sources: &[&ProfitabilityBucket],
exit: &Exit,
) -> Result<()> {
let max_from = starting_indexes.height;
let max_from = starting_lengths.height;
self.supply.all.sats.height.compute_sum_of_others(
max_from,
@@ -216,7 +217,7 @@ impl ProfitabilityBucket {
exit,
)?;
self.compute(prices, starting_indexes, is_profit, exit)
self.compute(prices, starting_lengths, is_profit, exit)
}
pub(crate) fn collect_all_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> {
@@ -293,20 +294,20 @@ impl ProfitabilityMetrics {
pub(crate) fn compute(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
for (is_profit, bucket) in self.range.iter_mut_with_is_profit() {
bucket.compute(prices, starting_indexes, is_profit, exit)?;
bucket.compute(prices, starting_lengths, is_profit, exit)?;
}
let range_arr = self.range.as_array();
for (threshold, sources) in self.profit.iter_mut_with_growing_prefix(&range_arr) {
threshold.compute_from_ranges(prices, starting_indexes, true, sources, exit)?;
threshold.compute_from_ranges(prices, starting_lengths, true, sources, exit)?;
}
for (threshold, sources) in self.loss.iter_mut_with_growing_suffix(&range_arr) {
threshold.compute_from_ranges(prices, starting_indexes, false, sources, exit)?;
threshold.compute_from_ranges(prices, starting_lengths, false, sources, exit)?;
}
Ok(())
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Cents, Height, Indexes, StoredF64, Version};
use brk_types::{Cents, Height, StoredF64, Version};
use vecdb::{Exit, ReadableVec, Rw, StorageMode};
use crate::{
@@ -27,7 +28,7 @@ impl AdjustedSopr {
#[allow(clippy::too_many_arguments)]
pub(crate) fn compute_rest_part2(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
base_transfer_volume: &impl ReadableVec<Height, Cents>,
base_value_destroyed: &impl ReadableVec<Height, Cents>,
under_1h_transfer_volume: &impl ReadableVec<Height, Cents>,
@@ -35,22 +36,22 @@ impl AdjustedSopr {
exit: &Exit,
) -> Result<()> {
self.transfer_volume.block.compute_subtract(
starting_indexes.height,
starting_lengths.height,
base_transfer_volume,
under_1h_transfer_volume,
exit,
)?;
self.value_destroyed.block.compute_subtract(
starting_indexes.height,
starting_lengths.height,
base_value_destroyed,
under_1h_value_destroyed,
exit,
)?;
self.transfer_volume
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.value_destroyed
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
for ((sopr, tv), vd) in self
.ratio
@@ -60,7 +61,7 @@ impl AdjustedSopr {
.zip(self.value_destroyed.sum.as_array())
{
sopr.compute_binary::<Cents, Cents, RatioCents64>(
starting_indexes.height,
starting_lengths.height,
&tv.height,
&vd.height,
exit,
@@ -1,7 +1,8 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{
BasisPointsSigned32, Bitcoin, Cents, CentsSigned, Dollars, Height, Indexes, StoredF64, Version,
BasisPointsSigned32, Bitcoin, Cents, CentsSigned, Dollars, Height, StoredF64, Version,
};
use derive_more::{Deref, DerefMut};
use vecdb::{
@@ -124,31 +125,31 @@ impl RealizedCore {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
let minimal_refs: Vec<&RealizedMinimal> = others.iter().map(|o| &o.minimal).collect();
self.minimal
.compute_from_stateful(starting_indexes, &minimal_refs, exit)?;
.compute_from_stateful(starting_lengths, &minimal_refs, exit)?;
sum_others!(self, starting_indexes, others, exit; sopr.value_destroyed.block);
sum_others!(self, starting_lengths, others, exit; sopr.value_destroyed.block);
Ok(())
}
pub(crate) fn compute_rest_part1(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.minimal.compute_rest_part1(starting_indexes, exit)?;
self.minimal.compute_rest_part1(starting_lengths, exit)?;
self.sopr
.value_destroyed
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.net_pnl.block.cents.compute_transform2(
starting_indexes.height,
starting_lengths.height,
&self.minimal.profit.block.cents,
&self.minimal.loss.block.cents,
|(i, profit, loss, ..)| {
@@ -166,21 +167,21 @@ impl RealizedCore {
pub(crate) fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
height_to_supply: &impl ReadableVec<Height, Bitcoin>,
transfer_volume_sum_24h_cents: &impl ReadableVec<Height, Cents>,
exit: &Exit,
) -> Result<()> {
self.minimal
.compute_rest_part2(prices, starting_indexes, height_to_supply, exit)?;
.compute_rest_part2(prices, starting_lengths, height_to_supply, exit)?;
self.net_pnl.compute_rest(starting_indexes.height, exit)?;
self.net_pnl.compute_rest(starting_lengths.height, exit)?;
self.sopr
.ratio
._24h
.compute_binary::<Cents, Cents, RatioCents64>(
starting_indexes.height,
starting_lengths.height,
transfer_volume_sum_24h_cents,
&self.sopr.value_destroyed.sum._24h.height,
exit,
@@ -1,8 +1,9 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{
BasisPoints32, BasisPointsSigned32, Bitcoin, Cents, CentsSats, CentsSigned, CentsSquaredSats,
Dollars, Height, Indexes, StoredF64, Version,
Dollars, Height, StoredF64, Version,
};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, AnyVec, BytesVec, Exit, ReadableVec, Rw, StorageMode, WritableVec};
@@ -194,12 +195,12 @@ impl RealizedFull {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&RealizedCore],
exit: &Exit,
) -> Result<()> {
self.core
.compute_from_stateful(starting_indexes, others, exit)?;
.compute_from_stateful(starting_lengths, others, exit)?;
Ok(())
}
@@ -224,14 +225,14 @@ impl RealizedFull {
pub(crate) fn compute_rest_part1(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.core.compute_rest_part1(starting_indexes, exit)?;
self.core.compute_rest_part1(starting_lengths, exit)?;
self.peak_regret
.value
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
Ok(())
}
@@ -240,7 +241,7 @@ impl RealizedFull {
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
height_to_supply: &impl ReadableVec<Height, Bitcoin>,
height_to_market_cap: &impl ReadableVec<Height, Dollars>,
activity_transfer_volume: &ValuePerBlockCumulativeRolling,
@@ -248,7 +249,7 @@ impl RealizedFull {
) -> Result<()> {
self.core.compute_rest_part2(
prices,
starting_indexes,
starting_lengths,
height_to_supply,
&activity_transfer_volume.sum._24h.cents.height,
exit,
@@ -264,7 +265,7 @@ impl RealizedFull {
.zip(self.core.sopr.value_destroyed.sum.as_array()[1..].iter())
{
sopr.compute_binary::<Cents, Cents, RatioCents64>(
starting_indexes.height,
starting_lengths.height,
&vc.cents.height,
&vd.height,
exit,
@@ -273,18 +274,18 @@ impl RealizedFull {
// Gross PnL
self.gross_pnl.block.cents.compute_add(
starting_indexes.height,
starting_lengths.height,
&self.core.minimal.profit.block.cents,
&self.core.minimal.loss.block.cents,
exit,
)?;
self.gross_pnl.compute_rest(starting_indexes.height, exit)?;
self.gross_pnl.compute_rest(starting_lengths.height, exit)?;
// Net PnL 1m change relative to rcap and mcap
self.net_pnl
.change_1m_to_rcap
.compute_binary::<CentsSigned, Cents, RatioCentsSignedCentsBps32>(
starting_indexes.height,
starting_lengths.height,
&self.core.net_pnl.delta.absolute._1m.cents.height,
&self.core.minimal.cap.cents.height,
exit,
@@ -292,7 +293,7 @@ impl RealizedFull {
self.net_pnl
.change_1m_to_mcap
.compute_binary::<CentsSigned, Dollars, RatioCentsSignedDollarsBps32>(
starting_indexes.height,
starting_lengths.height,
&self.core.net_pnl.delta.absolute._1m.cents.height,
height_to_market_cap,
exit,
@@ -301,7 +302,7 @@ impl RealizedFull {
// Capitalized price ratio, percentiles and bands
self.capitalized
.price
.compute_rest(prices, starting_indexes, exit)?;
.compute_rest(prices, starting_lengths, exit)?;
// Sell-side risk ratios
for (ssrr, rv) in self
@@ -311,7 +312,7 @@ impl RealizedFull {
.zip(self.gross_pnl.sum.as_array())
{
ssrr.compute_binary::<Cents, Cents, RatioCentsBp32>(
starting_indexes.height,
starting_lengths.height,
&rv.cents.height,
&self.core.minimal.cap.cents.height,
exit,
@@ -321,7 +322,7 @@ impl RealizedFull {
// Realized cap relative to own market cap
self.cap_to_own_mcap
.compute_binary::<Dollars, Dollars, RatioDollarsBp32>(
starting_indexes.height,
starting_lengths.height,
&self.core.minimal.cap.usd.height,
height_to_market_cap,
exit,
@@ -336,7 +337,7 @@ impl RealizedFull {
.zip(self.core.minimal.loss.sum.as_array())
{
ratio.compute_binary::<Cents, Cents, RatioCents64>(
starting_indexes.height,
starting_lengths.height,
&profit.cents.height,
&loss.cents.height,
exit,
@@ -345,7 +346,7 @@ impl RealizedFull {
// Price ratio: percentiles, sma and std dev bands
self.price_ratio_percentiles.compute(
starting_indexes,
starting_lengths,
exit,
&self.core.minimal.price.ratio.height,
&self.core.minimal.price.cents.height,
@@ -353,14 +354,14 @@ impl RealizedFull {
self.price_ratio_sma.compute(
blocks,
starting_indexes,
starting_lengths,
exit,
&self.core.minimal.price.ratio.height,
)?;
self.price_ratio_std_dev.compute(
blocks,
starting_indexes,
starting_lengths,
exit,
&self.core.minimal.price.ratio.height,
&self.core.minimal.price.cents.height,
@@ -1,8 +1,9 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{
BasisPoints32, BasisPointsSigned32, Bitcoin, Cents, CentsSigned, Height, Indexes, Sats,
StoredF32, Version,
BasisPoints32, BasisPointsSigned32, Bitcoin, Cents, CentsSigned, Height, Sats, StoredF32,
Version,
};
use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, Rw, StorageMode, WritableVec};
@@ -81,38 +82,38 @@ impl RealizedMinimal {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
sum_others!(self, starting_indexes, others, exit; cap.cents.height);
sum_others!(self, starting_indexes, others, exit; profit.block.cents);
sum_others!(self, starting_indexes, others, exit; loss.block.cents);
sum_others!(self, starting_lengths, others, exit; cap.cents.height);
sum_others!(self, starting_lengths, others, exit; profit.block.cents);
sum_others!(self, starting_lengths, others, exit; loss.block.cents);
Ok(())
}
pub(crate) fn compute_rest_part1(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
exit: &Exit,
) -> Result<()> {
self.profit.compute_rest(starting_indexes.height, exit)?;
self.loss.compute_rest(starting_indexes.height, exit)?;
self.profit.compute_rest(starting_lengths.height, exit)?;
self.loss.compute_rest(starting_lengths.height, exit)?;
Ok(())
}
pub(crate) fn compute_rest_part2(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
height_to_supply: &impl ReadableVec<Height, Bitcoin>,
exit: &Exit,
) -> Result<()> {
let cap = &self.cap.cents.height;
self.price
.compute_all(prices, starting_indexes, exit, |v| {
.compute_all(prices, starting_lengths, exit, |v| {
Ok(v.compute_transform2(
starting_indexes.height,
starting_lengths.height,
cap,
height_to_supply,
|(i, cap_cents, supply, ..)| {
@@ -9,7 +9,7 @@ pub use full::{RealizedFull, RealizedFullAccum};
pub use minimal::RealizedMinimal;
use brk_error::Result;
use brk_types::Indexes;
use brk_indexer::Lengths;
use vecdb::Exit;
use crate::distribution::state::{CohortState, CostBasisData, RealizedState, WithCapital};
@@ -19,10 +19,10 @@ pub trait RealizedLike: Send + Sync {
fn as_core_mut(&mut self) -> &mut RealizedCore;
fn min_stateful_len(&self) -> usize;
fn push_state(&mut self, state: &CohortState<RealizedState, CostBasisData<WithCapital>>);
fn compute_rest_part1(&mut self, starting_indexes: &Indexes, exit: &Exit) -> Result<()>;
fn compute_rest_part1(&mut self, starting_lengths: &Lengths, exit: &Exit) -> Result<()>;
fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&RealizedCore],
exit: &Exit,
) -> Result<()>;
@@ -42,16 +42,16 @@ impl RealizedLike for RealizedCore {
fn push_state(&mut self, state: &CohortState<RealizedState, CostBasisData<WithCapital>>) {
self.push_state(state)
}
fn compute_rest_part1(&mut self, starting_indexes: &Indexes, exit: &Exit) -> Result<()> {
self.compute_rest_part1(starting_indexes, exit)
fn compute_rest_part1(&mut self, starting_lengths: &Lengths, exit: &Exit) -> Result<()> {
self.compute_rest_part1(starting_lengths, exit)
}
fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&RealizedCore],
exit: &Exit,
) -> Result<()> {
self.compute_from_stateful(starting_indexes, others, exit)
self.compute_from_stateful(starting_lengths, others, exit)
}
}
@@ -69,15 +69,15 @@ impl RealizedLike for RealizedFull {
fn push_state(&mut self, state: &CohortState<RealizedState, CostBasisData<WithCapital>>) {
self.push_state(state)
}
fn compute_rest_part1(&mut self, starting_indexes: &Indexes, exit: &Exit) -> Result<()> {
self.compute_rest_part1(starting_indexes, exit)
fn compute_rest_part1(&mut self, starting_lengths: &Lengths, exit: &Exit) -> Result<()> {
self.compute_rest_part1(starting_lengths, exit)
}
fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&RealizedCore],
exit: &Exit,
) -> Result<()> {
self.compute_from_stateful(starting_indexes, others, exit)
self.compute_from_stateful(starting_lengths, others, exit)
}
}
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{BasisPoints16, BasisPointsSigned32, Height, Indexes, Sats, SatsSigned, Version};
use brk_types::{BasisPoints16, BasisPointsSigned32, Height, Sats, SatsSigned, Version};
use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, Rw, StorageMode, WritableVec};
use crate::{
@@ -86,12 +87,12 @@ impl SupplyBase {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
self.total.sats.height.compute_sum_of_others(
starting_indexes.height,
starting_lengths.height,
&others
.iter()
.map(|v| &v.total.sats.height)
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Version};
use brk_types::{Height, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, AnyVec, Exit, Rw, StorageMode, WritableVec};
@@ -87,15 +88,15 @@ impl SupplyCore {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
let base_refs: Vec<&SupplyBase> = others.iter().map(|o| &o.base).collect();
self.base
.compute_from_stateful(starting_indexes, &base_refs, exit)?;
sum_others!(self, starting_indexes, others, exit; in_profit.sats.height);
sum_others!(self, starting_indexes, others, exit; in_loss.sats.height);
.compute_from_stateful(starting_lengths, &base_refs, exit)?;
sum_others!(self, starting_lengths, others, exit; in_profit.sats.height);
sum_others!(self, starting_lengths, others, exit; in_loss.sats.height);
Ok(())
}
}
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Cents, Dollars, Indexes, Version};
use brk_types::{Cents, Dollars, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableCloneableVec, Rw, StorageMode, WritableVec};
@@ -67,12 +68,12 @@ impl UnrealizedBasic {
pub(crate) fn compute_from_sources(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
sum_others!(self, starting_indexes, others, exit; profit.cents.height);
sum_others!(self, starting_indexes, others, exit; loss.cents.height);
sum_others!(self, starting_lengths, others, exit; profit.cents.height);
sum_others!(self, starting_lengths, others, exit; loss.cents.height);
Ok(())
}
}
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Cents, CentsSigned, Indexes, Version};
use brk_types::{Cents, CentsSigned, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, Exit, Rw, StorageMode};
@@ -47,22 +48,22 @@ impl UnrealizedCore {
pub(crate) fn compute_from_stateful(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
let basic_refs: Vec<&UnrealizedBasic> = others.iter().map(|o| &o.basic).collect();
self.basic
.compute_from_sources(starting_indexes, &basic_refs, exit)?;
.compute_from_sources(starting_lengths, &basic_refs, exit)?;
Ok(())
}
pub(crate) fn compute_rest(&mut self, starting_indexes: &Indexes, exit: &Exit) -> Result<()> {
pub(crate) fn compute_rest(&mut self, starting_lengths: &Lengths, exit: &Exit) -> Result<()> {
self.net_pnl
.cents
.height
.compute_binary::<Cents, Cents, CentsSubtractToCentsSigned>(
starting_indexes.height,
starting_lengths.height,
&self.basic.profit.cents.height,
&self.basic.loss.cents.height,
exit,
@@ -1,6 +1,7 @@
use brk_error::Result;
use brk_indexer::Lengths;
use brk_traversable::Traversable;
use brk_types::{Cents, CentsSigned, CentsSquaredSats, Height, Indexes, Sats, Version};
use brk_types::{Cents, CentsSigned, CentsSquaredSats, Height, Sats, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, AnyVec, BytesVec, Exit, ReadableVec, Rw, StorageMode, WritableVec};
@@ -99,16 +100,16 @@ impl UnrealizedFull {
pub(crate) fn compute_rest_all(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
supply_in_profit_sats: &(impl ReadableVec<Height, Sats> + Sync),
supply_in_loss_sats: &(impl ReadableVec<Height, Sats> + Sync),
exit: &Exit,
) -> Result<()> {
self.inner.compute_rest(starting_indexes, exit)?;
self.inner.compute_rest(starting_lengths, exit)?;
// gross_pnl = profit + loss
self.gross_pnl.cents.height.compute_add(
starting_indexes.height,
starting_lengths.height,
&self.inner.basic.profit.cents.height,
&self.inner.basic.loss.cents.height,
exit,
@@ -120,7 +121,7 @@ impl UnrealizedFull {
.cents
.height
.compute_transform3(
starting_indexes.height,
starting_lengths.height,
supply_in_profit_sats,
&prices.spot.cents.height,
&self.inner.basic.profit.cents.height,
@@ -140,7 +141,7 @@ impl UnrealizedFull {
.cents
.height
.compute_transform3(
starting_indexes.height,
starting_lengths.height,
supply_in_loss_sats,
&prices.spot.cents.height,
&self.inner.basic.loss.cents.height,
@@ -158,7 +159,7 @@ impl UnrealizedFull {
/// Called after cost_basis.in_profit/loss are computed at the cohort level.
pub(crate) fn compute_sentiment(
&mut self,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
spot: &impl ReadableVec<Height, Cents>,
exit: &Exit,
) -> Result<()> {
@@ -166,7 +167,7 @@ impl UnrealizedFull {
// capitalized_price = capitalized_cap / invested_cap
// invested_cap is in Cents (already / ONE_BTC), multiply back for CentsSats scale
self.sentiment.greed_index.cents.height.compute_transform3(
starting_indexes.height,
starting_lengths.height,
&self.capitalized_cap_in_profit_raw,
&self.invested_capital.in_profit.cents.height,
spot,
@@ -187,7 +188,7 @@ impl UnrealizedFull {
// pain = capitalized_price_losers - spot
self.sentiment.pain_index.cents.height.compute_transform3(
starting_indexes.height,
starting_lengths.height,
&self.capitalized_cap_in_loss_raw,
&self.invested_capital.in_loss.cents.height,
spot,
@@ -212,7 +213,7 @@ impl UnrealizedFull {
.cents
.height
.compute_binary::<Cents, Cents, CentsSubtractToCentsSigned>(
starting_indexes.height,
starting_lengths.height,
&self.sentiment.greed_index.cents.height,
&self.sentiment.pain_index.cents.height,
exit,
@@ -9,7 +9,8 @@ pub use full::UnrealizedFull;
pub use minimal::UnrealizedMinimal;
use brk_error::Result;
use brk_types::{Height, Indexes, Sats};
use brk_indexer::Lengths;
use brk_types::{Height, Sats};
use vecdb::{Exit, ReadableVec};
use crate::{distribution::state::UnrealizedState, prices};
@@ -22,7 +23,7 @@ pub trait UnrealizedLike: Send + Sync {
fn compute_rest(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
supply_in_profit_sats: &(impl ReadableVec<Height, Sats> + Sync),
supply_in_loss_sats: &(impl ReadableVec<Height, Sats> + Sync),
exit: &Exit,
@@ -46,12 +47,12 @@ impl UnrealizedLike for UnrealizedCore {
fn compute_rest(
&mut self,
_prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
_supply_in_profit_sats: &(impl ReadableVec<Height, Sats> + Sync),
_supply_in_loss_sats: &(impl ReadableVec<Height, Sats> + Sync),
exit: &Exit,
) -> Result<()> {
self.compute_rest(starting_indexes, exit)
self.compute_rest(starting_lengths, exit)
}
}
@@ -72,14 +73,14 @@ impl UnrealizedLike for UnrealizedFull {
fn compute_rest(
&mut self,
prices: &prices::Vecs,
starting_indexes: &Indexes,
starting_lengths: &Lengths,
supply_in_profit_sats: &(impl ReadableVec<Height, Sats> + Sync),
supply_in_loss_sats: &(impl ReadableVec<Height, Sats> + Sync),
exit: &Exit,
) -> Result<()> {
self.compute_rest_all(
prices,
starting_indexes,
starting_lengths,
supply_in_profit_sats,
supply_in_loss_sats,
exit,
+23 -27
View File
@@ -5,8 +5,8 @@ use brk_error::Result;
use brk_indexer::Indexer;
use brk_traversable::Traversable;
use brk_types::{
Cents, EmptyAddrData, EmptyAddrIndex, FundedAddrData, FundedAddrIndex, Height, Indexes,
StoredF64, SupplyState, Timestamp, TxIndex, Version,
Cents, EmptyAddrData, EmptyAddrIndex, FundedAddrData, FundedAddrIndex, Height, StoredF64,
SupplyState, Timestamp, TxIndex, Version,
};
use rayon::prelude::*;
use tracing::{debug, info};
@@ -317,18 +317,19 @@ impl Vecs {
transactions: &transactions::Vecs,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
starting_indexes: &mut Indexes,
exit: &Exit,
) -> Result<()> {
self.db.sync_bg_tasks()?;
let starting_lengths = indexer.safe_lengths();
// 1. Find minimum height we have data for across stateful vecs
let current_height = Height::from(self.supply_state.len());
let min_stateful = self.min_stateful_len();
// 2. Determine start mode and recover/reset state
// Clamp to starting_indexes.height to handle reorg (indexer may require earlier start)
let resume_target = current_height.min(starting_indexes.height);
// Clamp to starting_lengths.height to handle reorg (indexer may require earlier start)
let resume_target = current_height.min(starting_lengths.height);
if resume_target < current_height {
info!(
"Reorg detected: rolling back from {} to {}",
@@ -451,11 +452,6 @@ impl Vecs {
recovered_height
};
// Update starting_indexes if we need to recompute from an earlier point
if starting_height < starting_indexes.height {
starting_indexes.height = starting_height;
}
// 2c. Validate computed versions
debug!("validating computed versions");
let base_version = VERSION;
@@ -510,11 +506,11 @@ impl Vecs {
let (r1, r2) = rayon::join(
|| {
self.utxo_cohorts
.compute_overlapping_vecs(starting_indexes, exit)
.compute_overlapping_vecs(&starting_lengths, exit)
},
|| {
self.addr_cohorts
.compute_overlapping_vecs(starting_indexes, exit)
.compute_overlapping_vecs(&starting_lengths, exit)
},
);
r1?;
@@ -523,7 +519,7 @@ impl Vecs {
// 5b. Compute coinblocks_destroyed cumulative from raw
self.coinblocks_destroyed
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
// 6. Compute rest part1 (day1 mappings)
info!("Computing rest part 1...");
@@ -531,11 +527,11 @@ impl Vecs {
let (r1, r2) = rayon::join(
|| {
self.utxo_cohorts
.compute_rest_part1(prices, starting_indexes, exit)
.compute_rest_part1(prices, &starting_lengths, exit)
},
|| {
self.addr_cohorts
.compute_rest_part1(prices, starting_indexes, exit)
.compute_rest_part1(prices, &starting_lengths, exit)
},
);
r1?;
@@ -543,8 +539,8 @@ impl Vecs {
}
// 6b. Compute address count sum (by addr_type -> all)
self.addrs.funded.compute_rest(starting_indexes, exit)?;
self.addrs.empty.compute_rest(starting_indexes, exit)?;
self.addrs.funded.compute_rest(&starting_lengths, exit)?;
self.addrs.empty.compute_rest(&starting_lengths, exit)?;
let t = &self.utxo_cohorts.type_;
let type_supply_sats = ByAddrType::new(|filter| {
let Filter::Type(ot) = filter else {
@@ -554,7 +550,7 @@ impl Vecs {
});
let all_supply_sats = &self.utxo_cohorts.all.metrics.supply.total.sats.height;
self.addrs.reused.compute_rest(
starting_indexes,
&starting_lengths,
&outputs.by_type,
&inputs.by_type,
prices,
@@ -563,7 +559,7 @@ impl Vecs {
exit,
)?;
self.addrs.respent.compute_rest(
starting_indexes,
&starting_lengths,
&outputs.by_type,
&inputs.by_type,
prices,
@@ -572,7 +568,7 @@ impl Vecs {
exit,
)?;
self.addrs.exposed.compute_rest(
starting_indexes,
&starting_lengths,
prices,
all_supply_sats,
&type_supply_sats,
@@ -586,7 +582,7 @@ impl Vecs {
&all_m.supply.total.sats.height,
&all_m.outputs.unspent_count.height,
&self.addrs.funded.all.height,
starting_indexes.height,
starting_lengths.height,
exit,
)?;
for ((ot, avg), (_, funded)) in self
@@ -602,14 +598,14 @@ impl Vecs {
&type_m.supply.total.sats.height,
&type_m.outputs.unspent_count.height,
&funded.height,
starting_indexes.height,
starting_lengths.height,
exit,
)?;
}
// 6c. Compute total_addr_count = addr_count + empty_addr_count
self.addrs.total.compute(
starting_indexes.height,
starting_lengths.height,
&self.addrs.funded,
&self.addrs.empty,
exit,
@@ -617,10 +613,10 @@ impl Vecs {
self.addrs
.activity
.compute_rest(starting_indexes.height, exit)?;
.compute_rest(starting_lengths.height, exit)?;
self.addrs
.new
.compute(starting_indexes.height, &self.addrs.total, exit)?;
.compute(starting_lengths.height, &self.addrs.total, exit)?;
// 7. Compute rest part2 (relative metrics)
let height_to_market_cap = self
@@ -637,7 +633,7 @@ impl Vecs {
self.utxo_cohorts.compute_rest_part2(
blocks,
prices,
starting_indexes,
&starting_lengths,
&height_to_market_cap,
exit,
)?;
@@ -661,7 +657,7 @@ impl Vecs {
.read_only_clone();
self.addr_cohorts.compute_rest_part2(
prices,
starting_indexes,
&starting_lengths,
&all_supply_sats,
&all_utxo_count,
exit,