fandhe-ai 0.13.0

Facade crate for a from-scratch Rust AI/ML library: tensors, autodiff, and CPU/CUDA/Metal backends behind one composition root
Documentation
//! Dataset/DataLoader 公開面(イシュー #1615・親 #1602。`docs/
//! dataset-dataloader-design.md`)。
//!
//! `fandhe_ai_tensor_core::data`(`Dataset`・`TensorDataset`・
//! `DataLoader`・`DataLoaderConfig`・`Batches`・`DataError`)と、
//! イシュー #2182 で追加し #2505(ルート #2499 本文「承認範囲」節の一括承認。適用記録は
//! `docs/compat-api-scope.md`、公開形は
//! `docs/tensor-core-data-sampler-hooks-decision.md` §5)で公開した
//! Sampler/フック系 11 名(`Sampler`・`SequentialSampler`・
//! `RandomSampler`・`WeightedRandomSampler`・`SamplerDataLoader`・
//! `SamplerBatches`・`HookedDataLoader`・`HookedBatches`・`TransformFn`・
//! `CollateFn`・`default_collate`)をそのまま再エクスポートする
//! さらにイシュー #2183 のマルチワーカー prefetch 3 名(`PrefetchConfig`・
//! `PrefetchDataLoader`・`PrefetchBatches`)も #2506(ルート #2499 の承認。
//! 公開形は `docs/tensor-core-data-prefetch-decision.md` §4・§8)で公開した。
//! prefetch は `std::thread`/`mpsc` ベースで rayon は使わず、
//! `Sequential::fit` へは結線しない。
//! これらをそのまま再エクスポートする
//! **純再エクスポートモジュール**(`crate::optim` と同型。facade 独自の
//! 型・関数は持ち込まず、既存 `DataLoader` への統合もしない)。
//!
//! Dataset/DataLoader はホスト側だけで完結するバッチ供給ユーティリティ
//! であり `Op`/`BackendOps`/VJP を経由しないため、`autodiff`
//! (`fandhe_ai_autodiff`)を経由せず `fandhe_ai_tensor_core` から直接
//! 再エクスポートする(`crate::{Device, Tensor}` 等の既存トップレベル
//! 再エクスポートと同じ経路。`fandhe_ai::rng`/`creation` 相当のモジュール
//! を今後追加する場合も同型になる想定)。
//!
//! # 利用例
//!
//! ```
//! use fandhe_ai::data::{DataLoader, DataLoaderConfig, Dataset, TensorDataset};
//! use fandhe_ai::Tensor;
//!
//! let features = Tensor::new(vec![0.0f32, 1.0, 2.0, 3.0], &[4, 1]).unwrap();
//! let labels = Tensor::new(vec![0i32, 1, 0, 1], &[4]).unwrap();
//! let dataset = (
//!     TensorDataset::new(features).unwrap(),
//!     TensorDataset::new(labels).unwrap(),
//! );
//! let loader = DataLoader::new(dataset, DataLoaderConfig::new(2)).unwrap();
//! assert_eq!(loader.len(), 2);
//! for batch in &loader {
//!     let (x, y) = batch.unwrap();
//!     assert_eq!(x.shape()[0], y.shape()[0]);
//! }
//! ```
//!
//! # Sampler/フックの利用例
//!
//! ```
//! use fandhe_ai::Tensor;
//! use fandhe_ai::data::{HookedDataLoader, SequentialSampler, TensorDataset};
//!
//! let features = Tensor::new(vec![0.0f32, 1.0, 2.0, 3.0], &[4, 1]).unwrap();
//! let dataset = TensorDataset::new(features).unwrap();
//! let sampler = SequentialSampler::new(4, 2, false).unwrap();
//! let mut loader = HookedDataLoader::new(dataset, sampler)
//!     .unwrap()
//!     .with_transform(|t| {
//!         let scaled: Vec<f32> = t.host_slice().iter().map(|&v| v * 10.0).collect();
//!         Tensor::new(scaled, t.shape()).unwrap()
//!     });
//! let mut seen = Vec::new();
//! for batch in loader.iter() {
//!     let b = batch.unwrap();
//!     assert_eq!(b.shape(), &[2, 1]);
//!     seen.extend(b.host_slice().iter().copied());
//! }
//! assert_eq!(seen, vec![0.0, 10.0, 20.0, 30.0]);
//! ```

//! # マルチワーカー prefetch の利用例
//!
//! ```
//! use fandhe_ai::Tensor;
//! use fandhe_ai::data::{PrefetchConfig, PrefetchDataLoader, SequentialSampler, TensorDataset};
//!
//! let features = Tensor::new(vec![0.0f32, 1.0, 2.0, 3.0], &[4, 1]).unwrap();
//! let dataset = TensorDataset::new(features).unwrap();
//! let sampler = SequentialSampler::new(4, 2, false).unwrap();
//! let cfg = PrefetchConfig::new(2, 2).unwrap();
//! let mut loader = PrefetchDataLoader::new(dataset, sampler, cfg).unwrap();
//! let mut seen = Vec::new();
//! let mut batches = 0;
//! for batch in loader.iter() {
//!     let b = batch.unwrap();
//!     seen.extend(b.host_slice().iter().copied());
//!     batches += 1;
//! }
//! assert_eq!(batches, 2);
//! assert_eq!(seen, vec![0.0, 1.0, 2.0, 3.0]);
//! ```

//! # Dataset 合成・iterable・バッチサンプラー(イシュー #2679)
//!
//! `Subset`・`ConcatDataset`・`ConcatBatch`・`random_split`・`random_split_fractions`
//! (`docs/tensor-core-dataset-compose-decision.md` §5)と、`IterableDataset`・
//! `IterableDataLoader`・`IterableBatches`・`StackSamples`・`BatchSampler`
//! (`docs/tensor-core-iterable-dataset-batch-sampler-decision.md` §5)を、承認
//! (ルート #2499 のコメント)に従い同じく純再エクスポートする。公開面は
//! `api_surface.rs` の `facade_exposes_phase4_training_data_only_in_approved_shape` が固定する。
//!
//! ```
//! use fandhe_ai::Tensor;
//! use fandhe_ai::data::{Dataset, TensorDataset, random_split};
//!
//! let features = Tensor::new(vec![0.0f32, 1.0, 2.0, 3.0], &[4, 1]).unwrap();
//! let dataset = TensorDataset::new(features).unwrap();
//! let parts = random_split(dataset, &[3, 1]).unwrap();
//! assert_eq!((parts[0].len(), parts[1].len()), (3, 1));
//! ```

pub use fandhe_ai_tensor_core::data::{BatchSampler, IterableBatches, IterableDataLoader};
pub use fandhe_ai_tensor_core::data::{Batches, DataError, DataLoader};
pub use fandhe_ai_tensor_core::data::{CollateFn, TransformFn, default_collate};
pub use fandhe_ai_tensor_core::data::{ConcatBatch, ConcatDataset, Subset};
pub use fandhe_ai_tensor_core::data::{DataLoaderConfig, Dataset, TensorDataset};
pub use fandhe_ai_tensor_core::data::{HookedBatches, HookedDataLoader};
pub use fandhe_ai_tensor_core::data::{IterableDataset, StackSamples};
pub use fandhe_ai_tensor_core::data::{PrefetchBatches, PrefetchConfig, PrefetchDataLoader};
pub use fandhe_ai_tensor_core::data::{RandomSampler, Sampler, SequentialSampler};
pub use fandhe_ai_tensor_core::data::{SamplerBatches, SamplerDataLoader, WeightedRandomSampler};
pub use fandhe_ai_tensor_core::data::{random_split, random_split_fractions};