diff --git a/crates/fidc-core/src/data.rs b/crates/fidc-core/src/data.rs index 1ccf1cd..b3f815d 100644 --- a/crates/fidc-core/src/data.rs +++ b/crates/fidc-core/src/data.rs @@ -2456,6 +2456,13 @@ impl DataSet { .unwrap_or_default() } + pub fn market_snapshot_rows_on(&self, date: NaiveDate) -> &[DailyMarketSnapshot] { + self.market_by_date + .get(&date) + .map(Vec::as_slice) + .unwrap_or(&[]) + } + pub fn candidate_snapshots_on(&self, date: NaiveDate) -> Vec<&CandidateEligibility> { self.candidate_by_date .get(&date) @@ -2463,6 +2470,13 @@ impl DataSet { .unwrap_or_default() } + pub fn candidate_snapshot_rows_on(&self, date: NaiveDate) -> &[CandidateEligibility] { + self.candidate_by_date + .get(&date) + .map(Vec::as_slice) + .unwrap_or(&[]) + } + pub fn bundle_on(&self, date: NaiveDate) -> Result { let benchmark = self .benchmark(date) diff --git a/crates/fidc-core/src/engine.rs b/crates/fidc-core/src/engine.rs index be7bf87..189275a 100644 --- a/crates/fidc-core/src/engine.rs +++ b/crates/fidc-core/src/engine.rs @@ -1778,11 +1778,11 @@ where .filter(|date| self.config.end_date.map(|end| *date <= end).unwrap_or(true)) .collect::>(); let has_decision_inputs = |date: NaiveDate| { - !self.data.factor_snapshots_on(date).is_empty() - && !self.data.candidate_snapshots_on(date).is_empty() + !self.data.factor_snapshot_rows_on(date).is_empty() + && !self.data.candidate_snapshot_rows_on(date).is_empty() }; let has_execution_market = - |date: NaiveDate| !self.data.market_snapshots_on(date).is_empty(); + |date: NaiveDate| !self.data.market_snapshot_rows_on(date).is_empty(); let mut execution_dates = Vec::new(); let mut decision_slots = Vec::new(); for (calendar_idx, execution_date) in calendar_dates.iter().copied().enumerate() { diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index f1b6aa2..5624451 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -3678,8 +3678,8 @@ impl PlatformExprStrategy { is_month_end, available_factor_names: if self.stock_extra_factors_required { ctx.data - .factor_snapshots_on(date) - .into_iter() + .factor_snapshot_rows_on(date) + .iter() .flat_map(|row| row.extra_factors.keys().map(|key| key.to_string())) .collect() } else { @@ -7797,7 +7797,7 @@ impl PlatformExprStrategy { return; }; let mut map = Map::new(); - for snapshot in ctx.data.market_snapshots_on(date) { + for snapshot in ctx.data.market_snapshot_rows_on(date) { if let Some(value) = Self::market_scope_value(snapshot, field) { map.insert(snapshot.symbol.clone().into(), Dynamic::from(value)); } diff --git a/crates/fidc-core/src/strategy.rs b/crates/fidc-core/src/strategy.rs index 8c8aed1..3470740 100644 --- a/crates/fidc-core/src/strategy.rs +++ b/crates/fidc-core/src/strategy.rs @@ -2541,7 +2541,7 @@ impl OmniMicroCapStrategy { date: NaiveDate, ) -> Vec { let mut decisions = Vec::new(); - for factor in ctx.data.factor_snapshots_on(date) { + for factor in ctx.data.factor_snapshot_rows_on(date) { if ctx.has_dynamic_universe() && !ctx.dynamic_universe_contains(&factor.symbol) { continue; } diff --git a/crates/fidc-core/src/universe.rs b/crates/fidc-core/src/universe.rs index c92b556..8c6d959 100644 --- a/crates/fidc-core/src/universe.rs +++ b/crates/fidc-core/src/universe.rs @@ -80,7 +80,7 @@ impl SelectionContext<'_> { } }; let mut decisions = Vec::new(); - for factor in self.data.factor_snapshots_on(self.decision_date) { + for factor in self.data.factor_snapshot_rows_on(self.decision_date) { if self .dynamic_universe .is_some_and(|symbols| !symbols.is_empty() && !symbols.contains(&factor.symbol)) @@ -213,7 +213,7 @@ impl UniverseSelector for DynamicMarketCapBandSelector { risk_decisions: Vec::new(), }; - diagnostics.factor_total = ctx.data.factor_snapshots_on(ctx.decision_date).len(); + diagnostics.factor_total = ctx.data.factor_snapshot_rows_on(ctx.decision_date).len(); diagnostics.risk_decisions = ctx.selection_risk_decisions(); diagnostics.not_eligible_count = diagnostics.risk_decisions.len(); diagnostics.paused_count = diagnostics