global: snap

This commit is contained in:
nym21
2026-04-04 00:59:37 +02:00
parent 59c767a9e2
commit 883b38c77c
35 changed files with 86 additions and 65 deletions

View File

@@ -23,7 +23,7 @@ impl Vecs {
self.hodl_bank.compute_cumulative_transformed_binary(
starting_indexes.height,
&prices.spot.usd.height,
&prices.cached_spot_usd,
&self.vocdd_median_1y,
|price, median| StoredF64::from(f64::from(price) - f64::from(median)),
exit,
@@ -31,7 +31,7 @@ impl Vecs {
self.value.height.compute_divide(
starting_indexes.height,
&prices.spot.usd.height,
&prices.cached_spot_usd,
&self.hodl_bank,
exit,
)?;

View File

@@ -24,7 +24,7 @@ impl Vecs {
.compute(starting_indexes.height, exit, |vec| {
vec.compute_multiply(
starting_indexes.height,
&prices.spot.usd.height,
&prices.cached_spot_usd,
&coinblocks_destroyed.block,
exit,
)?;
@@ -34,7 +34,7 @@ impl Vecs {
self.created.compute(starting_indexes.height, exit, |vec| {
vec.compute_multiply(
starting_indexes.height,
&prices.spot.usd.height,
&prices.cached_spot_usd,
&activity.coinblocks_created.block,
exit,
)?;
@@ -44,7 +44,7 @@ impl Vecs {
self.stored.compute(starting_indexes.height, exit, |vec| {
vec.compute_multiply(
starting_indexes.height,
&prices.spot.usd.height,
&prices.cached_spot_usd,
&activity.coinblocks_stored.block,
exit,
)?;
@@ -57,7 +57,7 @@ impl Vecs {
self.vocdd.compute(starting_indexes.height, exit, |vec| {
vec.compute_transform3(
starting_indexes.height,
&prices.spot.usd.height,
&prices.cached_spot_usd,
&coindays_destroyed.block,
circulating_supply,
|(i, price, cdd, supply, _): (_, Dollars, StoredF64, Bitcoin, _)| {

View File

@@ -119,7 +119,7 @@ impl AllCohortMetrics {
self.unrealized.compute(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized.price.cents.height,
exit,
)?;
@@ -139,7 +139,7 @@ impl AllCohortMetrics {
self.cost_basis.compute_prices(
starting_indexes,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.unrealized.invested_capital.in_profit.cents.height,
&self.unrealized.invested_capital.in_loss.cents.height,
&self.supply.in_profit.sats.height,
@@ -150,7 +150,7 @@ impl AllCohortMetrics {
)?;
self.unrealized
.compute_sentiment(starting_indexes, &prices.spot.cents.height, exit)?;
.compute_sentiment(starting_indexes, &prices.cached_spot_cents, exit)?;
self.relative.compute(
starting_indexes.height,

View File

@@ -82,7 +82,7 @@ impl BasicCohortMetrics {
self.unrealized.compute(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized.price.cents.height,
exit,
)?;

View File

@@ -140,7 +140,7 @@ impl CoreCohortMetrics {
self.unrealized.compute(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized.price.cents.height,
exit,
)?;

View File

@@ -108,14 +108,14 @@ impl ExtendedCohortMetrics {
self.unrealized.compute(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized.price.cents.height,
exit,
)?;
self.cost_basis.compute_prices(
starting_indexes,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.unrealized.invested_capital.in_profit.cents.height,
&self.unrealized.invested_capital.in_loss.cents.height,
&self.supply.in_profit.sats.height,
@@ -126,7 +126,7 @@ impl ExtendedCohortMetrics {
)?;
self.unrealized
.compute_sentiment(starting_indexes, &prices.spot.cents.height, exit)?;
.compute_sentiment(starting_indexes, &prices.cached_spot_cents, exit)?;
self.relative.compute(
starting_indexes.height,

View File

@@ -124,7 +124,7 @@ impl MinimalCohortMetrics {
self.unrealized.compute(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized.price.cents.height,
exit,
)?;

View File

@@ -86,7 +86,7 @@ impl TypeCohortMetrics {
self.unrealized.compute(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized.price.cents.height,
exit,
)?;

View File

@@ -126,7 +126,7 @@ impl ProfitabilityBucket {
self.unrealized_pnl.all.height.compute_transform3(
max_from,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized_cap.all.height,
&self.supply.all.sats.height,
|(i, spot, cap, supply, ..)| {
@@ -139,7 +139,7 @@ impl ProfitabilityBucket {
)?;
self.unrealized_pnl.sth.height.compute_transform3(
max_from,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized_cap.sth.height,
&self.supply.sth.sats.height,
|(i, spot, cap, supply, ..)| {
@@ -153,7 +153,7 @@ impl ProfitabilityBucket {
self.nupl.bps.height.compute_transform3(
max_from,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.realized_cap.all.height,
&self.supply.all.sats.height,
|(i, spot, cap_dollars, supply_sats, ..)| {

View File

@@ -122,7 +122,7 @@ impl UnrealizedFull {
.compute_transform3(
starting_indexes.height,
supply_in_profit_sats,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.inner.basic.profit.cents.height,
|(h, supply_sats, spot, profit, ..): (_, Sats, Cents, Cents, _)| {
let market_value = supply_sats.as_u128() * spot.as_u128() / Sats::ONE_BTC_U128;
@@ -142,7 +142,7 @@ impl UnrealizedFull {
.compute_transform3(
starting_indexes.height,
supply_in_loss_sats,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.inner.basic.loss.cents.height,
|(h, supply_sats, spot, loss, ..): (_, Sats, Cents, Cents, _)| {
let market_value = supply_sats.as_u128() * spot.as_u128() / Sats::ONE_BTC_U128;

View File

@@ -1,7 +1,7 @@
use brk_error::Result;
use brk_traversable::Traversable;
use brk_types::{Cents, Height, Indexes, StoredI8, Version};
use vecdb::{AnyVec, Database, EagerVec, Exit, PcoVec, ReadableVec, Rw, StorageMode, WritableVec};
use vecdb::{AnyVec, Database, Exit, ReadableVec, Rw, StorageMode, WritableVec};
use crate::{
cointime, distribution, indexes,
@@ -123,7 +123,7 @@ impl RealizedEnvelope {
exit,
)?;
let spot = &prices.spot.cents.height;
let spot = &prices.cached_spot_cents;
// Zone: spot vs own envelope bands (-4 to +4)
self.compute_index(spot, starting_indexes, exit)?;
@@ -136,7 +136,7 @@ impl RealizedEnvelope {
fn compute_index(
&mut self,
spot: &EagerVec<PcoVec<Height, Cents>>,
spot: &impl ReadableVec<Height, Cents>,
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
@@ -214,7 +214,7 @@ impl RealizedEnvelope {
fn compute_score(
&mut self,
models: &[&RatioPerBlockPercentiles; 10],
spot: &EagerVec<PcoVec<Height, Cents>>,
spot: &impl ReadableVec<Height, Cents>,
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {

View File

@@ -59,7 +59,7 @@ impl AmountPerBlock {
self.cents.compute_binary::<Sats, Cents, SatsToCents>(
max_from,
&self.sats.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
exit,
)?;
Ok(())

View File

@@ -50,7 +50,7 @@ impl AmountBlock {
self.cents.compute_binary::<Sats, Cents, SatsToCents>(
max_from,
&self.sats,
&prices.spot.cents.height,
&prices.cached_spot_cents,
exit,
)?;
Ok(())

View File

@@ -98,6 +98,7 @@ impl<T: NumericValue + JsonSchema> PerBlockDistribution<T> {
let count_indexes_batch: Vec<brk_types::StoredU64> =
count_indexes.collect_range_at(start, fi_len);
let zero = T::from(0_usize);
let mut values: Vec<T> = Vec::new();
first_indexes_batch
@@ -114,8 +115,11 @@ impl<T: NumericValue + JsonSchema> PerBlockDistribution<T> {
&mut values,
);
if skip_count > 0 {
values.retain(|v| *v > zero);
}
if values.is_empty() {
let zero = T::from(0_usize);
for vec in [
&mut *min,
&mut *max,

View File

@@ -71,7 +71,7 @@ impl PriceWithRatioPerBlock {
F: FnMut(&mut EagerVec<PcoVec<Height, Cents>>) -> Result<()>,
{
compute_price(&mut self.cents.height)?;
self.compute_ratio(starting_indexes, &prices.spot.cents.height, exit)
self.compute_ratio(starting_indexes, &prices.cached_spot_cents, exit)
}
}
@@ -104,7 +104,7 @@ impl PriceWithRatioExtendedPerBlock {
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
let close_price = &prices.spot.cents.height;
let close_price = &prices.cached_spot_cents;
self.base
.compute_ratio(starting_indexes, close_price, exit)?;
self.percentiles.compute(

View File

@@ -102,7 +102,7 @@ impl Vecs {
{
returns.compute_binary::<Cents, Cents, RatioDiffCentsBps32>(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&average_price.cents.height,
exit,
)?;
@@ -163,7 +163,7 @@ impl Vecs {
{
returns.compute_binary::<Cents, Cents, RatioDiffCentsBps32>(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&lookback_price.cents.height,
exit,
)?;
@@ -266,7 +266,7 @@ impl Vecs {
{
returns.compute_binary::<Cents, Cents, RatioDiffCentsBps32>(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&average_price.cents.height,
exit,
)?;

View File

@@ -15,7 +15,7 @@ impl Vecs {
) -> Result<()> {
self.high.cents.height.compute_all_time_high(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
exit,
)?;
@@ -23,7 +23,7 @@ impl Vecs {
self.days_since.height.compute_transform3(
starting_indexes.height,
&self.high.cents.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&indexes.timestamp.monotonic,
|(i, ath, price, ts, slf)| {
if ath_ts.is_none() {
@@ -68,7 +68,7 @@ impl Vecs {
self.drawdown.compute_drawdown(
starting_indexes.height,
&prices.spot.cents.height,
&prices.cached_spot_cents,
&self.high.cents.height,
exit,
)?;

View File

@@ -13,7 +13,7 @@ impl Vecs {
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
let price = &prices.spot.cents.height;
let price = &prices.cached_spot_cents;
for (price_past, days) in self.price_past.iter_mut_with_days() {
let window_starts = blocks.lookback.start_vec(days as usize);

View File

@@ -13,7 +13,7 @@ impl Vecs {
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
let close = &prices.spot.cents.height;
let close = &prices.cached_spot_cents;
for (sma, period) in [
(&mut self.sma._1w, 7),

View File

@@ -13,7 +13,7 @@ impl Vecs {
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
let price = &prices.spot.cents.height;
let price = &prices.cached_spot_cents;
for (min_vec, max_vec, starts) in [
(

View File

@@ -24,7 +24,7 @@ impl Vecs {
{
returns.compute_binary::<Dollars, Dollars, RatioDiffDollarsBps32>(
starting_indexes.height,
&prices.spot.usd.height,
&prices.cached_spot_usd,
&lookback_price.usd.height,
exit,
)?;

View File

@@ -16,7 +16,7 @@ pub(super) fn compute(
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
let close = &prices.spot.usd.height;
let close = &prices.cached_spot_usd;
let ws_fast = blocks.lookback.start_vec(fast_days);
let ws_slow = blocks.lookback.start_vec(slow_days);
let ws_signal = blocks.lookback.start_vec(signal_days);

View File

@@ -6,7 +6,8 @@ use std::path::Path;
use brk_traversable::Traversable;
use brk_types::Version;
use vecdb::{Database, ReadableCloneableVec, Rw, StorageMode};
use brk_types::{Cents, Dollars, Height};
use vecdb::{CachedVec, Database, LazyVecFrom1, ReadableCloneableVec, Rw, StorageMode};
use crate::{
indexes,
@@ -27,6 +28,11 @@ pub struct Vecs<M: StorageMode = Rw> {
#[traversable(skip)]
pub db: Database,
#[traversable(skip)]
pub cached_spot_cents: CachedVec<Height, Cents>,
#[traversable(skip)]
pub cached_spot_usd: LazyVecFrom1<Height, Dollars, Height, Cents>,
pub split: SplitByUnit<M>,
pub ohlc: OhlcByUnit<M>,
pub spot: PriceByUnit<M>,
@@ -169,6 +175,13 @@ impl Vecs {
sats: ohlc_sats,
};
let cached_spot_cents = CachedVec::new(&price_cents.height);
let cached_spot_usd = LazyVecFrom1::transformed::<CentsUnsignedToDollars>(
"price",
version,
cached_spot_cents.read_only_boxed_clone(),
);
let spot = PriceByUnit {
usd: price_usd,
cents: price_cents,
@@ -177,6 +190,8 @@ impl Vecs {
Ok(Self {
db: db.clone(),
cached_spot_cents,
cached_spot_usd,
split,
ohlc,
spot,

View File

@@ -5,8 +5,8 @@ use vecdb::{Database, EagerVec, ImportableVec};
use super::Vecs;
use crate::{indexes, internal::PerTxDistribution};
/// Bump this when fee/feerate aggregation logic changes (e.g., skip coinbase).
const VERSION: Version = Version::new(2);
/// Bump this when fee/feerate aggregation logic changes (e.g., skip coinbase, skip zero-fee).
const VERSION: Version = Version::new(3);
impl Vecs {
pub(crate) fn forced_import(