mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-07-21 07:58:11 -07:00
global: adding support for safe lengths
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user