diff --git a/Cargo.lock b/Cargo.lock index 6e47fbd..a563763 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -99,12 +99,43 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + [[package]] name = "crunchy" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + [[package]] name = "equivalent" version = "1.0.2" @@ -117,6 +148,7 @@ version = "0.1.0" dependencies = [ "chrono", "indexmap", + "rayon", "rhai", "serde", "serde_json", @@ -294,6 +326,26 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "rhai" version = "1.23.6" diff --git a/Cargo.toml b/Cargo.toml index 16857ec..8987030 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ authors = ["OpenAI Codex"] chrono = { version = "=0.4.44", features = ["serde"] } indexmap = { version = "=2.11.4", features = ["serde"] } reqwest = { version = "=0.12.24", default-features = false, features = ["json", "rustls-tls"] } +rayon = "=1.12.0" rhai = { version = "=1.23.6", features = ["sync"] } serde = { version = "=1.0.228", features = ["derive"] } serde_json = "=1.0.145" diff --git a/crates/fidc-core/Cargo.toml b/crates/fidc-core/Cargo.toml index 9f48992..149e877 100644 --- a/crates/fidc-core/Cargo.toml +++ b/crates/fidc-core/Cargo.toml @@ -8,6 +8,7 @@ authors.workspace = true [dependencies] chrono.workspace = true indexmap.workspace = true +rayon.workspace = true rhai.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/fidc-core/src/data.rs b/crates/fidc-core/src/data.rs index d7a33c2..138def1 100644 --- a/crates/fidc-core/src/data.rs +++ b/crates/fidc-core/src/data.rs @@ -2,6 +2,7 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use std::sync::{Arc, OnceLock}; use chrono::{NaiveDate, NaiveDateTime}; +use rayon::prelude::*; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -1250,14 +1251,14 @@ impl DataSet { .push(row.as_ref()); } let market_series_by_symbol = market_rows_by_symbol - .into_iter() + .into_par_iter() .map(|(symbol, rows)| { let series = Arc::new(SymbolPriceSeries::new(symbol.clone(), rows)); (symbol, series) }) .collect::>(); let adjusted_close_series_by_symbol = market_series_by_symbol - .iter() + .par_iter() .filter_map(|(symbol, market)| { AdjustedCloseSeries::new(market, &factor_by_date) .map(|series| (symbol.clone(), Arc::new(series)))