[INFO] cloning repository https://github.com/Guap-Codes/gbrt-rs
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/Guap-Codes/gbrt-rs" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FGuap-Codes%2Fgbrt-rs", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FGuap-Codes%2Fgbrt-rs'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 8e0c0b383a247f5657c0f3046515a638d09a3fe4
[INFO] documenting Guap-Codes/gbrt-rs against da3f5c31e5535b3dc210067de660a45784ae1e9c for pr-162169
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FGuap-Codes%2Fgbrt-rs" "/workspace/builds/worker-4-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-4-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/Guap-Codes/gbrt-rs
[INFO] finished tweaking git repo https://github.com/Guap-Codes/gbrt-rs
[INFO] tweaked toml for git repo https://github.com/Guap-Codes/gbrt-rs written to /workspace/builds/worker-4-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/Guap-Codes/gbrt-rs on toolchain da3f5c31e5535b3dc210067de660a45784ae1e9c
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/Guap-Codes/gbrt-rs already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:8683fc1fc2eb5c9ac98e0d076ab094b2ffac7f99da555d2b6a2e27f346de2ec7" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678
[INFO] running `Command { std: "docker" "start" "6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678" "/opt/rustwide/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678" "/opt/rustwide/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "doc" "--frozen" "--no-deps" "--document-private-items" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling libm v0.2.15
[INFO] [stderr]    Compiling libc v0.2.177
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]     Checking arrow-schema v57.1.0
[INFO] [stderr]     Checking once_cell v1.21.3
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]     Checking lexical-util v1.0.7
[INFO] [stderr]    Compiling syn v2.0.110
[INFO] [stderr]     Checking aho-corasick v1.1.4
[INFO] [stderr]     Checking regex-syntax v0.8.8
[INFO] [stderr]    Compiling flatbuffers v25.9.23
[INFO] [stderr]     Checking csv-core v0.1.13
[INFO] [stderr]    Compiling matrixmultiply v0.3.10
[INFO] [stderr]     Checking simd-adler32 v0.3.7
[INFO] [stderr]     Checking simdutf8 v0.1.5
[INFO] [stderr]    Compiling snap v1.1.1
[INFO] [stderr]     Checking zlib-rs v0.5.3
[INFO] [stderr]     Checking anstream v0.6.21
[INFO] [stderr]     Checking indexmap v2.12.1
[INFO] [stderr]     Checking miniz_oxide v0.8.9
[INFO] [stderr]     Checking brotli-decompressor v5.0.0
[INFO] [stderr]     Checking integer-encoding v3.0.4
[INFO] [stderr]     Checking twox-hash v2.1.2
[INFO] [stderr]    Compiling virtue v0.0.18
[INFO] [stderr]     Checking rawpointer v0.2.1
[INFO] [stderr]     Checking clap_builder v4.5.51
[INFO] [stderr]     Checking lz4_flex v0.12.0
[INFO] [stderr]     Checking lexical-parse-integer v1.0.6
[INFO] [stderr]     Checking lexical-write-integer v1.0.6
[INFO] [stderr]     Checking lexical-parse-float v1.0.6
[INFO] [stderr]     Checking unty v0.0.4
[INFO] [stderr]    Compiling seq-macro v0.3.6
[INFO] [stderr]     Checking rayon v1.11.0
[INFO] [stderr]    Compiling bincode_derive v2.0.1
[INFO] [stderr]     Checking lexical-write-float v1.0.6
[INFO] [stderr]    Compiling jobserver v0.1.34
[INFO] [stderr]     Checking getrandom v0.3.4
[INFO] [stderr]     Checking getrandom v0.2.16
[INFO] [stderr]     Checking lexical-core v1.0.6
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]     Checking brotli v8.0.2
[INFO] [stderr]    Compiling cc v1.2.45
[INFO] [stderr]     Checking libz-rs-sys v0.5.3
[INFO] [stderr]     Checking flate2 v1.1.5
[INFO] [stderr]     Checking num-integer v0.1.46
[INFO] [stderr]     Checking num-complex v0.4.6
[INFO] [stderr]     Checking atoi v2.0.0
[INFO] [stderr]     Checking ordered-float v2.10.1
[INFO] [stderr]     Checking num-bigint v0.4.6
[INFO] [stderr]     Checking thrift v0.17.0
[INFO] [stderr]     Checking regex-automata v0.4.13
[INFO] [stderr]     Checking serde_json v1.0.145
[INFO] [stderr]     Checking csv v1.4.0
[INFO] [stderr]    Compiling zstd-sys v2.0.16+zstd.1.5.7
[INFO] [stderr]    Compiling zerocopy-derive v0.8.27
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling clap_derive v4.5.49
[INFO] [stderr]    Compiling thiserror-impl v2.0.17
[INFO] [stderr]     Checking regex v1.12.2
[INFO] [stderr]     Checking thiserror v2.0.17
[INFO] [stderr]     Checking zerocopy v0.8.27
[INFO] [stderr]     Checking clap v4.5.51
[INFO] [stderr]    Compiling zstd-safe v7.2.4
[INFO] [stderr]     Checking zstd v0.13.3
[INFO] [stderr]     Checking half v2.7.1
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]     Checking chrono v0.4.42
[INFO] [stderr]     Checking bincode v2.0.1
[INFO] [stderr]     Checking ndarray v0.17.1
[INFO] [stderr]     Checking arrow-buffer v57.1.0
[INFO] [stderr]     Checking rand_chacha v0.3.1
[INFO] [stderr]     Checking arrow-data v57.1.0
[INFO] [stderr]     Checking rand v0.8.5
[INFO] [stderr]     Checking arrow-array v57.1.0
[INFO] [stderr]     Checking arrow-select v57.1.0
[INFO] [stderr]     Checking arrow-arith v57.1.0
[INFO] [stderr]     Checking arrow-row v57.1.0
[INFO] [stderr]     Checking arrow-ord v57.1.0
[INFO] [stderr]     Checking arrow-ipc v57.1.0
[INFO] [stderr]     Checking arrow-string v57.1.0
[INFO] [stderr]     Checking arrow-cast v57.1.0
[INFO] [stderr]     Checking arrow-json v57.1.0
[INFO] [stderr]     Checking arrow-csv v57.1.0
[INFO] [stderr]     Checking parquet v57.1.0
[INFO] [stderr]     Checking arrow v57.1.0
[INFO] [stderr]  Documenting gbrt-rs v0.2.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: public documentation for `core` links to private item `config`
[INFO] [stdout]  --> src/core/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | //! - [`config`]: Configuration structures for gradient boosters and decision trees
[INFO] [stdout]   |         ^^^^^^ this item is private
[INFO] [stdout]   |
[INFO] [stdout]   = note: this link resolves only because you passed `--document-private-items`, but will break without
[INFO] [stdout]   = note: `#[warn(rustdoc::private_intra_doc_links)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: public documentation for `core` links to private item `loss`
[INFO] [stdout]   --> src/core/mod.rs:10:9
[INFO] [stdout]    |
[INFO] [stdout] 10 | //! - [`loss`]: Loss function trait and implementations for optimization
[INFO] [stdout]    |         ^^^^ this item is private
[INFO] [stdout]    |
[INFO] [stdout]    = note: this link resolves only because you passed `--document-private-items`, but will break without
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `validate`
[INFO] [stdout]    --> src/core/config.rs:162:12
[INFO] [stdout]     |
[INFO] [stdout] 162 | /// Call [`validate()`] to check parameter ranges before training.
[INFO] [stdout]     |            ^^^^^^^^^^ no item named `validate` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout]     = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `validate`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           Call [`validate()`] to check parameter ranges before training.
[INFO] [stdout]                 ^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `validate` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `gradient_booster`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`gradient_booster`]: Core gradient boosting implementation with training loop
[INFO] [stdout]              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `gradient_booster` in scope
[INFO] [stdout]   = help: there's a similarly named item `GradientBooster`
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `factory`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`factory`]: Factory functions for creating booster instances from configurations
[INFO] [stdout]              ^^^^^^^^^
[INFO] [stdout]   = note: no item named `factory` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `GBRTConfig`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`GBRTConfig`]: Model configuration (re-exported from [`crate::core`])
[INFO] [stdout]              ^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `GBRTConfig` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `fit`
[INFO] [stdout]    --> src/boosting/gradient_booster.rs:135:25
[INFO] [stdout]     |
[INFO] [stdout] 135 |     /// and ready for [`fit()`] to be called.
[INFO] [stdout]     |                         ^^^^^ no item named `fit` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `fit`
[INFO] [stdout]    --> src/boosting/gradient_booster.rs:278:65
[INFO] [stdout]     |
[INFO] [stdout] 278 |     /// - `PredictionError::ModelNotTrained` if called before [`fit()`]
[INFO] [stdout]     |                                                                 ^^^^^ no item named `fit` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `fit`
[INFO] [stdout]    --> src/boosting/gradient_booster.rs:318:65
[INFO] [stdout]     |
[INFO] [stdout] 318 |     /// - `PredictionError::ModelNotTrained` if called before [`fit()`]
[INFO] [stdout]     |                                                                 ^^^^^ no item named `fit` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: public documentation for `BoosterFactory` links to private item `GradientBoosterBuilder`
[INFO] [stdout]   --> src/boosting/factory.rs:18:22
[INFO] [stdout]    |
[INFO] [stdout] 18 | /// consider using [`GradientBoosterBuilder`] instead.
[INFO] [stdout]    |                      ^^^^^^^^^^^^^^^^^^^^^^ this item is private
[INFO] [stdout]    |
[INFO] [stdout]    = note: this link resolves only because you passed `--document-private-items`, but will break without
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `create_custom_tree_booster`
[INFO] [stdout]   --> src/boosting/factory.rs:67:15
[INFO] [stdout]    |
[INFO] [stdout] 67 |     /// use [`create_custom_tree_booster`] or the builder pattern.
[INFO] [stdout]    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^ no item named `create_custom_tree_booster` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `types`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`types`]: Core tree data structures (`Tree`, `TreeNode`)
[INFO] [stdout]              ^^^^^^^
[INFO] [stdout]   = note: no item named `types` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `decision_tree`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`decision_tree`]: High-level decision tree interface
[INFO] [stdout]              ^^^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `decision_tree` in scope
[INFO] [stdout]   = help: there's a similarly named item `DecisionTree`
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `node`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`node`]: Tree construction logic (`TreeBuilder`)
[INFO] [stdout]              ^^^^^^
[INFO] [stdout]   = note: no item named `node` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `splitter`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`splitter`]: Split finding algorithms (`BestSplitter`)
[INFO] [stdout]              ^^^^^^^^^^
[INFO] [stdout]   = note: no item named `splitter` in scope
[INFO] [stdout]   = help: there's a similarly named item `Splitter`
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `criterion`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`criterion`]: Split quality evaluation (`MSECriterion`, `FriedmanMSECriterion`)
[INFO] [stdout]              ^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `criterion` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `FriedmanMSECriterion`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`FriedmanMSECriterion`]: Enhanced criterion with L1/L2 regularization (XGBoost-style)
[INFO] [stdout]              ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `FriedmanMSECriterion` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `Internal`
[INFO] [stdout]   --> src/tree/types.rs:29:9
[INFO] [stdout]    |
[INFO] [stdout] 29 | /// - [`Internal`]: A decision node that splits on a feature threshold
[INFO] [stdout]    |         ^^^^^^^^ no item named `Internal` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `Leaf`
[INFO] [stdout]   --> src/tree/types.rs:30:9
[INFO] [stdout]    |
[INFO] [stdout] 30 | /// - [`Leaf`]: A terminal node that stores the prediction value
[INFO] [stdout]    |         ^^^^ no item named `Leaf` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `SplitCriterion`
[INFO] [stdout]   --> src/tree/node.rs:12:9
[INFO] [stdout]    |
[INFO] [stdout] 12 | //! - [`SplitCriterion`]: Evaluates split quality (default: [`MSECriterion`])
[INFO] [stdout]    |         ^^^^^^^^^^^^^^ no item named `SplitCriterion` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `BestSplitter`
[INFO] [stdout]   --> src/tree/node.rs:51:19
[INFO] [stdout]    |
[INFO] [stdout] 51 | /// - Splitter: [`BestSplitter`] (exhaustive search over feature thresholds)
[INFO] [stdout]    |                   ^^^^^^^^^^^^ no item named `BestSplitter` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `MSECriterion`
[INFO] [stdout]   --> src/tree/node.rs:52:20
[INFO] [stdout]    |
[INFO] [stdout] 52 | /// - Criterion: [`MSECriterion`] with the provided `lambda`
[INFO] [stdout]    |                    ^^^^^^^^^^^^ no item named `MSECriterion` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `BestSplitter`
[INFO] [stdout]   --> src/tree/node.rs:91:41
[INFO] [stdout]    |
[INFO] [stdout] 91 |     /// A `TreeBuilder` instance with [`BestSplitter`] and [`MSECriterion`]
[INFO] [stdout]    |                                         ^^^^^^^^^^^^ no item named `BestSplitter` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `MSECriterion`
[INFO] [stdout]   --> src/tree/node.rs:91:62
[INFO] [stdout]    |
[INFO] [stdout] 91 |     /// A `TreeBuilder` instance with [`BestSplitter`] and [`MSECriterion`]
[INFO] [stdout]    |                                                              ^^^^^^^^^^^^ no item named `MSECriterion` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `Splitter`
[INFO] [stdout]    --> src/tree/node.rs:122:58
[INFO] [stdout]     |
[INFO] [stdout] 122 |     /// * `splitter` - Boxed trait object implementing [`Splitter`]
[INFO] [stdout]     |                                                          ^^^^^^^^ no item named `Splitter` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `SplitCriterion`
[INFO] [stdout]    --> src/tree/node.rs:139:59
[INFO] [stdout]     |
[INFO] [stdout] 139 |     /// * `criterion` - Boxed trait object implementing [`SplitCriterion`]
[INFO] [stdout]     |                                                           ^^^^^^^^^^^^^^ no item named `SplitCriterion` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: public documentation for `build_tree` links to private item `Self::build_tree_node`
[INFO] [stdout]    --> src/tree/node.rs:153:64
[INFO] [stdout]     |
[INFO] [stdout] 153 |     /// 2. Recursively builds the tree via [`build_tree_node`](Self::build_tree_node)
[INFO] [stdout]     |                                                                ^^^^^^^^^^^^^^^^^^^^^ this item is private
[INFO] [stdout]     |
[INFO] [stdout]     = note: this link resolves only because you passed `--document-private-items`, but will break without
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `Internal`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`Internal`]: A decision node that splits on a feature threshold
[INFO] [stdout]              ^^^^^^^^^^
[INFO] [stdout]   = note: no item named `Internal` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `Leaf`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`Leaf`]: A terminal node that stores the prediction value
[INFO] [stdout]              ^^^^^^
[INFO] [stdout]   = note: no item named `Leaf` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `BestSplitter`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - Splitter: [`BestSplitter`] (exhaustive search over feature thresholds)
[INFO] [stdout]                        ^^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `BestSplitter` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `MSECriterion`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - Criterion: [`MSECriterion`] with the provided `lambda`
[INFO] [stdout]                         ^^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `MSECriterion` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `dataset`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`dataset`]: High-level dataset container with features, targets, and metadata
[INFO] [stdout]              ^^^^^^^^^
[INFO] [stdout]   = note: no item named `dataset` in scope
[INFO] [stdout]   = help: there's a similarly named item `Dataset`
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `feature_matrix`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`feature_matrix`]: Memory-efficient feature storage and access
[INFO] [stdout]              ^^^^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `feature_matrix` in scope
[INFO] [stdout]   = help: there's a similarly named item `FeatureMatrix`
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `validate`
[INFO] [stdout]   --> src/data/dataset.rs:32:49
[INFO] [stdout]    |
[INFO] [stdout] 32 | /// - All values must be finite (validated by [`validate()`])
[INFO] [stdout]    |                                                 ^^^^^^^^^^ no item named `validate` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `new`
[INFO] [stdout]   --> src/data/dataset.rs:81:19
[INFO] [stdout]    |
[INFO] [stdout] 81 |     /// Same as [`new()`] but with an additional name field for tracking.
[INFO] [stdout]    |                   ^^^^^ no item named `new` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `from_csv`
[INFO] [stdout]    --> src/data/dataset.rs:352:28
[INFO] [stdout]     |
[INFO] [stdout] 352 |     /// loaded back with [`from_csv()`].
[INFO] [stdout]     |                            ^^^^^^^^^^ no item named `from_csv` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `fit`
[INFO] [stdout]   --> src/data/preprocessing.rs:47:56
[INFO] [stdout]    |
[INFO] [stdout] 47 | /// Scalers learn parameters from training data (via [`fit()`]) and apply
[INFO] [stdout]    |                                                        ^^^^^ no item named `fit` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `transform`
[INFO] [stdout]   --> src/data/preprocessing.rs:48:51
[INFO] [stdout]    |
[INFO] [stdout] 48 | /// consistent transformations to new data (via [`transform()`]).
[INFO] [stdout]    |                                                   ^^^^^^^^^^^ no item named `transform` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `regression`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`regression`]: Regression objectives (MSE, MAE, Huber)
[INFO] [stdout]              ^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `regression` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `binary_classification`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`binary_classification`]: Binary classification objectives (Log Loss)
[INFO] [stdout]              ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `binary_classification` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `factory`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`factory`]: Factory functions for creating objective instances
[INFO] [stdout]              ^^^^^^^^^
[INFO] [stdout]   = note: no item named `factory` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `math`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`math`]: Mathematical operations for statistics and linear algebra
[INFO] [stdout]              ^^^^^^
[INFO] [stdout]   = note: no item named `math` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `validation`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`validation`]: Input validation and parameter constraint checking
[INFO] [stdout]              ^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `validation` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `serialization`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`serialization`]: Model persistence with metadata and versioning
[INFO] [stdout]              ^^^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `serialization` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `data_loader`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`data_loader`]: Dataset loading from CSV, JSON, Parquet, and custom formats
[INFO] [stdout]              ^^^^^^^^^^^^^
[INFO] [stdout]   = note: no item named `data_loader` in scope
[INFO] [stdout]   = help: there's a similarly named item `DataLoader`
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `model_io`
[INFO] [stdout]   |
[INFO] [stdout]   = note: the link appears in this line:
[INFO] [stdout]           
[INFO] [stdout]           - [`model_io`]: Model persistence, export, and management utilities
[INFO] [stdout]              ^^^^^^^^^^
[INFO] [stdout]   = note: no item named `model_io` in scope
[INFO] [stdout]   = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/core/config.rs:165:1
[INFO] [stdout]     |
[INFO] [stdout] 165 | / pub struct GBRTConfig {
[INFO] [stdout] 166 | |     /// Number of boosting iterations (trees to train).
[INFO] [stdout] 167 | |     /// 
[INFO] [stdout] 168 | |     /// More iterations generally improve performance up to a point,
[INFO] [stdout] ...   |
[INFO] [stdout] 226 | |     pub compute_feature_importance: bool,
[INFO] [stdout] 227 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `These configurations control model behavior, tree structure, and optimization`
[INFO] [stdout]     = help: ends near `Main configuration for Gradient Boosted Regression Trees.`
[INFO] [stdout]     = note: `#[deny(rustdoc::unportable_markdown)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/core/config.rs:37:1
[INFO] [stdout]    |
[INFO] [stdout] 37 | / pub enum LossFunction {
[INFO] [stdout] 38 | |     /// Mean Squared Error for regression tasks.
[INFO] [stdout] 39 | |     /// 
[INFO] [stdout] 40 | |     /// Best for normally distributed residuals but sensitive to outliers.
[INFO] [stdout] ...  |
[INFO] [stdout] 64 | |     LogLoss,
[INFO] [stdout] 65 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `These configurations control model behavior, tree structure, and optimization`
[INFO] [stdout]    = help: ends near `Loss functions for gradient boosting optimization.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/core/config.rs:90:1
[INFO] [stdout]     |
[INFO] [stdout]  90 | / pub struct TreeConfig {
[INFO] [stdout]  91 | | /// Maximum depth of each tree.
[INFO] [stdout]  92 | |     /// 
[INFO] [stdout]  93 | |     /// Deeper trees can capture more complex interactions but may overfit.
[INFO] [stdout] ...   |
[INFO] [stdout] 131 | |     pub lambda: f64,
[INFO] [stdout] 132 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `These configurations control model behavior, tree structure, and optimization`
[INFO] [stdout]     = help: ends near `Configuration for individual decision trees in the ensemble.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/core/loss.rs:45:1
[INFO] [stdout]    |
[INFO] [stdout] 45 | / pub trait Loss: Send + Sync + fmt::Debug {
[INFO] [stdout] 46 | |     /// Computes the loss value for given predictions and targets.
[INFO] [stdout] 47 | |     /// 
[INFO] [stdout] 48 | |     /// This is the objective function value that gradient boosting minimizes.
[INFO] [stdout] ...  |
[INFO] [stdout] 96 | |     fn name(&self) -> &str;
[INFO] [stdout] 97 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Loss functions define the objective that the gradient booster optimizes.`
[INFO] [stdout]    = help: ends near `Core trait for loss functions in gradient boosting.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/core/loss.rs:104:1
[INFO] [stdout]     |
[INFO] [stdout] 104 | / pub trait GradientLoss: Loss {
[INFO] [stdout] 105 | |     /// Computes both gradient and hessian in a single pass for efficiency.
[INFO] [stdout] 106 | |     /// 
[INFO] [stdout] 107 | |     /// # Parameters
[INFO] [stdout] ...   |
[INFO] [stdout] 113 | |     fn gradient_hessian(&self, y_true: &[f64], y_pred: &[f64]) -> (Array1<f64>, Array1<f64>);
[INFO] [stdout] 114 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Loss functions define the objective that the gradient booster optimizes.`
[INFO] [stdout]     = help: ends near `Extended trait for loss functions with efficient combined computation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/core/loss.rs:503:1
[INFO] [stdout]     |
[INFO] [stdout] 503 | / pub fn create_loss(loss_function: &crate::core::config::LossFunction) -> Box<dyn GradientLoss> {
[INFO] [stdout] 504 | |     match loss_function {
[INFO] [stdout] 505 | |         LossFunction::MSE => Box::new(MSELoss),
[INFO] [stdout] 506 | |         LossFunction::MAE => Box::new(MAELoss),
[INFO] [stdout] ...   |
[INFO] [stdout] 510 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Loss functions define the objective that the gradient booster optimizes.`
[INFO] [stdout]     = help: ends near `Factory function to create a loss implementation from configuration.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/types.rs:114:1
[INFO] [stdout]     |
[INFO] [stdout] 114 | / pub struct Tree {
[INFO] [stdout] 115 | |     /// Root node of the tree (entry point for predictions).
[INFO] [stdout] 116 | |     root: TreeNode,
[INFO] [stdout] 117 | |     /// Maximum depth from root to deepest leaf.
[INFO] [stdout] ...   |
[INFO] [stdout] 120 | |     n_leaves: usize,
[INFO] [stdout] 121 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Core tree data structures`
[INFO] [stdout]     = help: ends near `Complete decision tree structure with metadata and prediction capabilities.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/types.rs:114:1
[INFO] [stdout]     |
[INFO] [stdout] 114 | / pub struct Tree {
[INFO] [stdout] 115 | |     /// Root node of the tree (entry point for predictions).
[INFO] [stdout] 116 | |     root: TreeNode,
[INFO] [stdout] 117 | |     /// Maximum depth from root to deepest leaf.
[INFO] [stdout] ...   |
[INFO] [stdout] 120 | |     n_leaves: usize,
[INFO] [stdout] 121 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Complete decision tree structure with metadata and prediction capabilities.`
[INFO] [stdout]     = help: ends near `Complete decision tree structure with metadata and prediction capabilities.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/types.rs:32:1
[INFO] [stdout]    |
[INFO] [stdout] 32 | / pub enum TreeNode {
[INFO] [stdout] 33 | |     /// Internal node that splits data based on a feature threshold.
[INFO] [stdout] 34 | |     ///
[INFO] [stdout] 35 | |     /// The split is defined by `feature_index` and `split_value`. Samples where
[INFO] [stdout] ...  |
[INFO] [stdout] 61 | |     },
[INFO] [stdout] 62 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Core tree data structures`
[INFO] [stdout]    = help: ends near `Recursive enum representing a node in a decision tree.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/types.rs:32:1
[INFO] [stdout]    |
[INFO] [stdout] 32 | / pub enum TreeNode {
[INFO] [stdout] 33 | |     /// Internal node that splits data based on a feature threshold.
[INFO] [stdout] 34 | |     ///
[INFO] [stdout] 35 | |     /// The split is defined by `feature_index` and `split_value`. Samples where
[INFO] [stdout] ...  |
[INFO] [stdout] 61 | |     },
[INFO] [stdout] 62 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Recursive enum representing a node in a decision tree.`
[INFO] [stdout]    = help: ends near `Recursive enum representing a node in a decision tree.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/decision_tree.rs:49:1
[INFO] [stdout]    |
[INFO] [stdout] 49 | / pub struct DecisionTree {
[INFO] [stdout] 50 | |     /// Internal builder that handles the actual tree construction.
[INFO] [stdout] 51 | |     builder: TreeBuilder,
[INFO] [stdout] 52 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `High-level tree interface`
[INFO] [stdout]    = help: ends near `A decision tree for gradient boosting.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/decision_tree.rs:49:1
[INFO] [stdout]    |
[INFO] [stdout] 49 | / pub struct DecisionTree {
[INFO] [stdout] 50 | |     /// Internal builder that handles the actual tree construction.
[INFO] [stdout] 51 | |     builder: TreeBuilder,
[INFO] [stdout] 52 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `A decision tree for gradient boosting.`
[INFO] [stdout]    = help: ends near `A decision tree for gradient boosting.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/node.rs:58:1
[INFO] [stdout]    |
[INFO] [stdout] 58 | / pub struct TreeBuilder {
[INFO] [stdout] 59 | |     /// Maximum depth of the tree (controls model complexity).
[INFO] [stdout] 60 | |     pub max_depth: usize,
[INFO] [stdout] 61 | |     /// Minimum samples required to split an internal node.
[INFO] [stdout] ...  |
[INFO] [stdout] 74 | |     /// Metric for evaluating split quality (pluggable).
[INFO] [stdout] 75 | |     criterion: Box<dyn super::criterion::SplitCriterion>,}
[INFO] [stdout]    | |__________________________________________________________^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Tree construction`
[INFO] [stdout]    = help: ends near `Flexible tree builder with pluggable components and comprehensive regularization.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/node.rs:58:1
[INFO] [stdout]    |
[INFO] [stdout] 58 | / pub struct TreeBuilder {
[INFO] [stdout] 59 | |     /// Maximum depth of the tree (controls model complexity).
[INFO] [stdout] 60 | |     pub max_depth: usize,
[INFO] [stdout] 61 | |     /// Minimum samples required to split an internal node.
[INFO] [stdout] ...  |
[INFO] [stdout] 74 | |     /// Metric for evaluating split quality (pluggable).
[INFO] [stdout] 75 | |     criterion: Box<dyn super::criterion::SplitCriterion>,}
[INFO] [stdout]    | |__________________________________________________________^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Flexible tree builder with pluggable components and comprehensive regularization.`
[INFO] [stdout]    = help: ends near `Flexible tree builder with pluggable components and comprehensive regularization.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/splitter.rs:153:1
[INFO] [stdout]     |
[INFO] [stdout] 153 | / pub trait Splitter: Send + Sync {
[INFO] [stdout] 154 | |     /// Finds the best split across the specified features.
[INFO] [stdout] 155 | |     ///
[INFO] [stdout] 156 | |     /// This method searches for the optimal (feature, threshold) pair that maximizes
[INFO] [stdout] ...   |
[INFO] [stdout] 180 | |     ) -> Result<Option<SplitCandidate>, SplitterError>;
[INFO] [stdout] 181 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Split finding`
[INFO] [stdout]     = help: ends near `Trait for pluggable split-finding algorithms.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/splitter.rs:153:1
[INFO] [stdout]     |
[INFO] [stdout] 153 | / pub trait Splitter: Send + Sync {
[INFO] [stdout] 154 | |     /// Finds the best split across the specified features.
[INFO] [stdout] 155 | |     ///
[INFO] [stdout] 156 | |     /// This method searches for the optimal (feature, threshold) pair that maximizes
[INFO] [stdout] ...   |
[INFO] [stdout] 180 | |     ) -> Result<Option<SplitCandidate>, SplitterError>;
[INFO] [stdout] 181 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Trait for pluggable split-finding algorithms.`
[INFO] [stdout]     = help: ends near `Trait for pluggable split-finding algorithms.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/splitter.rs:204:1
[INFO] [stdout]     |
[INFO] [stdout] 204 | / pub struct BestSplitter {
[INFO] [stdout] 205 | |     /// Number of bins for histogram approximation (None = exact).
[INFO] [stdout] 206 | |     pub n_bins: Option<usize>,
[INFO] [stdout] 207 | |     /// Whether to disable approximation and use exact splits.
[INFO] [stdout] 208 | |     pub use_exact_splits: bool,
[INFO] [stdout] 209 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Split finding`
[INFO] [stdout]     = help: ends near `Default splitter that exhaustively searches for the optimal split.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/splitter.rs:204:1
[INFO] [stdout]     |
[INFO] [stdout] 204 | / pub struct BestSplitter {
[INFO] [stdout] 205 | |     /// Number of bins for histogram approximation (None = exact).
[INFO] [stdout] 206 | |     pub n_bins: Option<usize>,
[INFO] [stdout] 207 | |     /// Whether to disable approximation and use exact splits.
[INFO] [stdout] 208 | |     pub use_exact_splits: bool,
[INFO] [stdout] 209 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Default splitter that exhaustively searches for the optimal split.`
[INFO] [stdout]     = help: ends near `Default splitter that exhaustively searches for the optimal split.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/splitter.rs:75:1
[INFO] [stdout]    |
[INFO] [stdout] 75 | / pub struct SplitCandidate {
[INFO] [stdout] 76 | |     /// Index of the feature to split on.
[INFO] [stdout] 77 | |     pub feature_index: usize,
[INFO] [stdout] 78 | |     /// Threshold value for the split (samples <= go left, > go right).
[INFO] [stdout] ...  |
[INFO] [stdout] 93 | |     pub right_hess_sum: f64,
[INFO] [stdout] 94 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Split finding`
[INFO] [stdout]    = help: ends near `Represents a candidate split with precomputed statistics.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/splitter.rs:75:1
[INFO] [stdout]    |
[INFO] [stdout] 75 | / pub struct SplitCandidate {
[INFO] [stdout] 76 | |     /// Index of the feature to split on.
[INFO] [stdout] 77 | |     pub feature_index: usize,
[INFO] [stdout] 78 | |     /// Threshold value for the split (samples <= go left, > go right).
[INFO] [stdout] ...  |
[INFO] [stdout] 93 | |     pub right_hess_sum: f64,
[INFO] [stdout] 94 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Represents a candidate split with precomputed statistics.`
[INFO] [stdout]    = help: ends near `Represents a candidate split with precomputed statistics.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/splitter.rs:48:1
[INFO] [stdout]    |
[INFO] [stdout] 48 | / pub enum SplitterError {
[INFO] [stdout] 49 | |     /// Requested feature index is out of bounds.
[INFO] [stdout] 50 | |     #[error("Invalid feature index: {index} (max: {max})")]
[INFO] [stdout] 51 | |     InvalidFeatureIndex { index: usize, max: usize },
[INFO] [stdout] ...  |
[INFO] [stdout] 67 | |     EmptySamples,
[INFO] [stdout] 68 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Split finding`
[INFO] [stdout]    = help: ends near `Errors that can occur during split finding.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/splitter.rs:48:1
[INFO] [stdout]    |
[INFO] [stdout] 48 | / pub enum SplitterError {
[INFO] [stdout] 49 | |     /// Requested feature index is out of bounds.
[INFO] [stdout] 50 | |     #[error("Invalid feature index: {index} (max: {max})")]
[INFO] [stdout] 51 | |     InvalidFeatureIndex { index: usize, max: usize },
[INFO] [stdout] ...  |
[INFO] [stdout] 67 | |     EmptySamples,
[INFO] [stdout] 68 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Errors that can occur during split finding.`
[INFO] [stdout]    = help: ends near `Errors that can occur during split finding.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/criterion.rs:61:1
[INFO] [stdout]     |
[INFO] [stdout]  61 | / pub trait SplitCriterion: Send + Sync {
[INFO] [stdout]  62 | |     /// Computes the improvement (gain) from making a split.
[INFO] [stdout]  63 | |     ///
[INFO] [stdout]  64 | |     /// The gain measures how much the loss is reduced by splitting a parent node
[INFO] [stdout] ...   |
[INFO] [stdout] 122 | |     fn name(&self) -> &str;
[INFO] [stdout] 123 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Split criteria`
[INFO] [stdout]     = help: ends near `Core trait for evaluating split quality in decision trees.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/criterion.rs:61:1
[INFO] [stdout]     |
[INFO] [stdout]  61 | / pub trait SplitCriterion: Send + Sync {
[INFO] [stdout]  62 | |     /// Computes the improvement (gain) from making a split.
[INFO] [stdout]  63 | |     ///
[INFO] [stdout]  64 | |     /// The gain measures how much the loss is reduced by splitting a parent node
[INFO] [stdout] ...   |
[INFO] [stdout] 122 | |     fn name(&self) -> &str;
[INFO] [stdout] 123 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Core trait for evaluating split quality in decision trees.`
[INFO] [stdout]     = help: ends near `Core trait for evaluating split quality in decision trees.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/criterion.rs:142:1
[INFO] [stdout]     |
[INFO] [stdout] 142 | / pub struct MSECriterion {
[INFO] [stdout] 143 | |     /// L2 regularization parameter (lambda) for leaf weights.
[INFO] [stdout] 144 | |     ///
[INFO] [stdout] 145 | |     /// Larger values shrink leaf predictions toward zero, preventing overfitting.
[INFO] [stdout] ...   |
[INFO] [stdout] 150 | |     pub min_hessian: f64,
[INFO] [stdout] 151 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Split criteria`
[INFO] [stdout]     = help: ends near `Standard Mean Squared Error split criterion with L2 regularization.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/criterion.rs:142:1
[INFO] [stdout]     |
[INFO] [stdout] 142 | / pub struct MSECriterion {
[INFO] [stdout] 143 | |     /// L2 regularization parameter (lambda) for leaf weights.
[INFO] [stdout] 144 | |     ///
[INFO] [stdout] 145 | |     /// Larger values shrink leaf predictions toward zero, preventing overfitting.
[INFO] [stdout] ...   |
[INFO] [stdout] 150 | |     pub min_hessian: f64,
[INFO] [stdout] 151 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Standard Mean Squared Error split criterion with L2 regularization.`
[INFO] [stdout]     = help: ends near `Standard Mean Squared Error split criterion with L2 regularization.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/criterion.rs:302:1
[INFO] [stdout]     |
[INFO] [stdout] 302 | / pub struct FriedmanMSECriterion {
[INFO] [stdout] 303 | |     /// L2 regularization parameter for leaf weights.
[INFO] [stdout] 304 | |     ///
[INFO] [stdout] 305 | |     /// Controls the magnitude of leaf predictions to prevent overfitting.
[INFO] [stdout] ...   |
[INFO] [stdout] 318 | |     pub gamma: f64,
[INFO] [stdout] 319 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Split criteria`
[INFO] [stdout]     = help: ends near `Friedman's MSE criterion with regularization (XGBoost-style).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/criterion.rs:302:1
[INFO] [stdout]     |
[INFO] [stdout] 302 | / pub struct FriedmanMSECriterion {
[INFO] [stdout] 303 | |     /// L2 regularization parameter for leaf weights.
[INFO] [stdout] 304 | |     ///
[INFO] [stdout] 305 | |     /// Controls the magnitude of leaf predictions to prevent overfitting.
[INFO] [stdout] ...   |
[INFO] [stdout] 318 | |     pub gamma: f64,
[INFO] [stdout] 319 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Friedman's MSE criterion with regularization (XGBoost-style).`
[INFO] [stdout]     = help: ends near `Friedman's MSE criterion with regularization (XGBoost-style).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/criterion.rs:499:1
[INFO] [stdout]     |
[INFO] [stdout] 499 | / pub fn create_criterion(name: &str, lambda: f64, gamma: f64) -> Box<dyn SplitCriterion> {
[INFO] [stdout] 500 | |     match name {
[INFO] [stdout] 501 | |         "friedman_mse" => Box::new(FriedmanMSECriterion::new(lambda, gamma)),
[INFO] [stdout] 502 | |         "mse" | _ => Box::new(MSECriterion::new(lambda)),
[INFO] [stdout] 503 | |     }
[INFO] [stdout] 504 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Split criteria`
[INFO] [stdout]     = help: ends near `Factory function to create split criterion instances.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/tree/criterion.rs:499:1
[INFO] [stdout]     |
[INFO] [stdout] 499 | / pub fn create_criterion(name: &str, lambda: f64, gamma: f64) -> Box<dyn SplitCriterion> {
[INFO] [stdout] 500 | |     match name {
[INFO] [stdout] 501 | |         "friedman_mse" => Box::new(FriedmanMSECriterion::new(lambda, gamma)),
[INFO] [stdout] 502 | |         "mse" | _ => Box::new(MSECriterion::new(lambda)),
[INFO] [stdout] 503 | |     }
[INFO] [stdout] 504 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Factory function to create split criterion instances.`
[INFO] [stdout]     = help: ends near `Factory function to create split criterion instances.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/criterion.rs:35:1
[INFO] [stdout]    |
[INFO] [stdout] 35 | / pub enum CriterionError {
[INFO] [stdout] 36 | |     /// Input data is invalid for computation.
[INFO] [stdout] 37 | |     ///
[INFO] [stdout] 38 | |     /// This includes mismatched array lengths, non-finite values, or other
[INFO] [stdout] ...  |
[INFO] [stdout] 48 | |     InsufficientSamples { samples: usize, min: usize },
[INFO] [stdout] 49 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Split criteria`
[INFO] [stdout]    = help: ends near `Errors that can occur during split criterion computation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/tree/criterion.rs:35:1
[INFO] [stdout]    |
[INFO] [stdout] 35 | / pub enum CriterionError {
[INFO] [stdout] 36 | |     /// Input data is invalid for computation.
[INFO] [stdout] 37 | |     ///
[INFO] [stdout] 38 | |     /// This includes mismatched array lengths, non-finite values, or other
[INFO] [stdout] ...  |
[INFO] [stdout] 48 | |     InsufficientSamples { samples: usize, min: usize },
[INFO] [stdout] 49 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Errors that can occur during split criterion computation.`
[INFO] [stdout]    = help: ends near `Errors that can occur during split criterion computation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/math.rs:33:1
[INFO] [stdout]    |
[INFO] [stdout] 33 | / pub enum MathError {
[INFO] [stdout] 34 | |     /// Input values are invalid for the operation.
[INFO] [stdout] 35 | |     #[error("Invalid input: {0}")]
[INFO] [stdout] 36 | |     InvalidInput(String),
[INFO] [stdout] ...  |
[INFO] [stdout] 52 | |     DivisionByZero,
[INFO] [stdout] 53 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]    = help: ends near `Errors that can occur during mathematical computations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/math.rs:58:1
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub type MathResult<T> = std::result::Result<T, MathError>;
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]    = help: ends near `Result type for mathematical operations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/math.rs:64:1
[INFO] [stdout]    |
[INFO] [stdout] 64 | / pub trait Statistics {
[INFO] [stdout] 65 | |     /// Computes the arithmetic mean (average).
[INFO] [stdout] 66 | |     fn mean(&self) -> MathResult<f64>;
[INFO] [stdout] ...  |
[INFO] [stdout] 95 | |     fn kurtosis(&self) -> MathResult<f64>;
[INFO] [stdout] 96 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]    = help: ends near `Statistical operations for numeric collections.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:101:1
[INFO] [stdout]     |
[INFO] [stdout] 101 | / pub trait VectorMath {
[INFO] [stdout] 102 | |     /// Computes dot product with another vector.
[INFO] [stdout] 103 | |     fn dot(&self, other: &[f64]) -> MathResult<f64>;
[INFO] [stdout] ...   |
[INFO] [stdout] 127 | |     fn multiply(&self, scalar: f64) -> Vec<f64>;
[INFO] [stdout] 128 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Vector mathematical operations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:133:1
[INFO] [stdout]     |
[INFO] [stdout] 133 | / pub trait MatrixMath {
[INFO] [stdout] 134 | |     /// Computes mean along specified axis.
[INFO] [stdout] 135 | |     ///
[INFO] [stdout] 136 | |     /// - axis = 0: column means
[INFO] [stdout] ...   |
[INFO] [stdout] 147 | |     fn correlation_matrix(&self) -> MathResult<Array2<f64>>;
[INFO] [stdout] 148 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Matrix mathematical operations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:592:1
[INFO] [stdout]     |
[INFO] [stdout] 592 | / pub fn compute_mean(values: &[f64]) -> MathResult<f64> {
[INFO] [stdout] 593 | |     if values.is_empty() {
[INFO] [stdout] 594 | |         return Err(MathError::EmptyInput);
[INFO] [stdout] ...   |
[INFO] [stdout] 598 | |     Ok(sum / values.len() as f64)
[INFO] [stdout] 599 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Computes the arithmetic mean of a slice.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:616:1
[INFO] [stdout]     |
[INFO] [stdout] 616 | / pub fn compute_variance(values: &[f64]) -> MathResult<f64> {
[INFO] [stdout] 617 | |     if values.len() < 2 {
[INFO] [stdout] 618 | |         return Err(MathError::InvalidInput(
[INFO] [stdout] 619 | |             "Need at least 2 values for variance".to_string()
[INFO] [stdout] ...   |
[INFO] [stdout] 628 | |     Ok(sum_sq_diff / (values.len() - 1) as f64)
[INFO] [stdout] 629 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Computes sample variance (with Bessel's correction).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:642:1
[INFO] [stdout]     |
[INFO] [stdout] 642 | / pub fn compute_std_dev(values: &[f64]) -> MathResult<f64> {
[INFO] [stdout] 643 | |     let variance = compute_variance(values)?;
[INFO] [stdout] 644 | |     Ok(variance.sqrt())
[INFO] [stdout] 645 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Computes sample standard deviation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:662:1
[INFO] [stdout]     |
[INFO] [stdout] 662 | / pub fn softmax(values: &[f64]) -> MathResult<Vec<f64>> {
[INFO] [stdout] 663 | |     if values.is_empty() {
[INFO] [stdout] 664 | |         return Err(MathError::EmptyInput);
[INFO] [stdout] ...   |
[INFO] [stdout] 675 | |     Ok(exps.iter().map(|&x| x / sum_exps).collect())
[INFO] [stdout] 676 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Applies softmax function to convert logits to probabilities.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:689:1
[INFO] [stdout]     |
[INFO] [stdout] 689 | / pub fn sigmoid(x: f64) -> f64 {
[INFO] [stdout] 690 | |     1.0 / (1.0 + (-x).exp())
[INFO] [stdout] 691 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Applies sigmoid (logistic) function.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:706:1
[INFO] [stdout]     |
[INFO] [stdout] 706 | / pub fn logit(p: f64) -> MathResult<f64> {
[INFO] [stdout] 707 | |     if p <= 0.0 || p >= 1.0 {
[INFO] [stdout] 708 | |         return Err(MathError::InvalidInput(
[INFO] [stdout] 709 | |             format!("Probability must be in (0, 1), got {}", p)
[INFO] [stdout] ...   |
[INFO] [stdout] 713 | |     Ok((p / (1.0 - p)).ln())
[INFO] [stdout] 714 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Computes logit (inverse of sigmoid).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:897:1
[INFO] [stdout]     |
[INFO] [stdout] 897 | / pub fn rmse(predictions: &[f64], targets: &[f64]) -> MathResult<f64> {
[INFO] [stdout] 898 | |     if predictions.len() != targets.len() {
[INFO] [stdout] 899 | |         return Err(MathError::DimensionMismatch {
[INFO] [stdout] 900 | |             expected: predictions.len().to_string(),
[INFO] [stdout] ...   |
[INFO] [stdout] 914 | |     Ok(mse.sqrt())
[INFO] [stdout] 915 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Computes Root Mean Square Error (RMSE).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:727:1
[INFO] [stdout]     |
[INFO] [stdout] 727 | / pub fn l1_norm(values: &[f64]) -> f64 {
[INFO] [stdout] 728 | |     values.iter().map(|&x| x.abs()).sum()
[INFO] [stdout] 729 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Computes L1 norm (Manhattan distance).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:742:1
[INFO] [stdout]     |
[INFO] [stdout] 742 | / pub fn l2_norm(values: &[f64]) -> f64 {
[INFO] [stdout] 743 | |     values.iter().map(|&x| x.powi(2)).sum::<f64>().sqrt()
[INFO] [stdout] 744 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Computes L2 norm (Euclidean norm).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:760:1
[INFO] [stdout]     |
[INFO] [stdout] 760 | / pub fn euclidean_distance(a: &[f64], b: &[f64]) -> MathResult<f64> {
[INFO] [stdout] 761 | |     if a.len() != b.len() {
[INFO] [stdout] 762 | |         return Err(MathError::DimensionMismatch {
[INFO] [stdout] 763 | |             expected: a.len().to_string(),
[INFO] [stdout] ...   |
[INFO] [stdout] 773 | |     Ok(sum_sq.sqrt())
[INFO] [stdout] 774 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Computes Euclidean distance between two vectors.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:789:1
[INFO] [stdout]     |
[INFO] [stdout] 789 | / pub fn clip_values(values: &[f64], min: f64, max: f64) -> Vec<f64> {
[INFO] [stdout] 790 | |     values.iter()
[INFO] [stdout] 791 | |         .map(|&x| x.max(min).min(max))
[INFO] [stdout] 792 | |         .collect()
[INFO] [stdout] 793 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Clips values to a specified range.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:808:1
[INFO] [stdout]     |
[INFO] [stdout] 808 | / pub fn normalize_vector(values: &[f64]) -> MathResult<Vec<f64>> {
[INFO] [stdout] 809 | |     let norm = l2_norm(values);
[INFO] [stdout] 810 | |     if norm == 0.0 {
[INFO] [stdout] 811 | |         return Err(MathError::NumericalError("Cannot normalize zero vector".to_string()));
[INFO] [stdout] ...   |
[INFO] [stdout] 814 | |     Ok(values.iter().map(|&x| x / norm).collect())
[INFO] [stdout] 815 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Normalizes vector to unit length (L2 norm = 1).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/math.rs:830:1
[INFO] [stdout]     |
[INFO] [stdout] 830 | / pub fn standardize_vector(values: &[f64]) -> MathResult<Vec<f64>> {
[INFO] [stdout] 831 | |     let mean = compute_mean(values)?;
[INFO] [stdout] 832 | |     let std_dev = compute_std_dev(values)?;
[INFO] [stdout] ...   |
[INFO] [stdout] 838 | |     Ok(values.iter().map(|&x| (x - mean) / std_dev).collect())
[INFO] [stdout] 839 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes statistical functions, vector/matrix operations, activation`
[INFO] [stdout]     = help: ends near `Standardizes vector to zero mean and unit variance.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/validation.rs:34:1
[INFO] [stdout]    |
[INFO] [stdout] 34 | / pub enum ValidationError {
[INFO] [stdout] 35 | |     /// General validation failure with a descriptive message.
[INFO] [stdout] 36 | |     #[error("Validation failed: {0}")]
[INFO] [stdout] 37 | |     ValidationFailed(String),
[INFO] [stdout] ...  |
[INFO] [stdout] 70 | |     InvalidProbability { value: f64 },
[INFO] [stdout] 71 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]    = help: ends near `Errors that can occur during validation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/validation.rs:74:1
[INFO] [stdout]    |
[INFO] [stdout] 74 | pub type ValidationResult<T> = std::result::Result<T, ValidationError>;
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]    = help: ends near `Result type for validation operations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/validation.rs:80:1
[INFO] [stdout]    |
[INFO] [stdout] 80 | pub struct DataValidator;
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]    = help: ends near `Validator for input data integrity.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:204:1
[INFO] [stdout]     |
[INFO] [stdout] 204 | / pub struct ParameterValidator {
[INFO] [stdout] 205 | |     /// Map of parameter name to (min, max) constraint.
[INFO] [stdout] 206 | |     constraints: HashMap<String, (f64, f64)>, // (min, max) for each parameter
[INFO] [stdout] 207 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Validator for model parameters with configurable constraints.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:380:1
[INFO] [stdout]     |
[INFO] [stdout] 380 | / pub fn validate_features(
[INFO] [stdout] 381 | |     n_samples: usize, 
[INFO] [stdout] 382 | |     n_features: usize,
[INFO] [stdout] 383 | |     feature_names: Option<&[String]>
[INFO] [stdout] ...   |
[INFO] [stdout] 404 | |     Ok(())
[INFO] [stdout] 405 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Validates feature matrix dimensions and optional feature names.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:420:1
[INFO] [stdout]     |
[INFO] [stdout] 420 | / pub fn validate_targets(targets: &[f64], is_classification: bool) -> ValidationResult<()> {
[INFO] [stdout] 421 | |     if targets.is_empty() {
[INFO] [stdout] 422 | |         return Err(ValidationError::EmptyData);
[INFO] [stdout] ...   |
[INFO] [stdout] 438 | |     Ok(())
[INFO] [stdout] 439 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Validates target values for regression or classification.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:556:1
[INFO] [stdout]     |
[INFO] [stdout] 556 | / pub fn validate_model_params(
[INFO] [stdout] 557 | |     n_estimators: usize,
[INFO] [stdout] 558 | |     learning_rate: f64,
[INFO] [stdout] 559 | |     max_depth: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 578 | |     Ok(())
[INFO] [stdout] 579 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Validates common gradient boosting model hyperparameters.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:326:1
[INFO] [stdout]     |
[INFO] [stdout] 326 | / pub fn check_finite(values: &[f64]) -> ValidationResult<()> {
[INFO] [stdout] 327 | |     if values.iter().any(|&x| !x.is_finite()) {
[INFO] [stdout] 328 | |         return Err(ValidationError::NonFiniteValue);
[INFO] [stdout] ...   |
[INFO] [stdout] 331 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Checks that all values in a slice are finite (not NaN, Inf, or -Inf).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:342:1
[INFO] [stdout]     |
[INFO] [stdout] 342 | / pub fn check_positive(values: &[f64]) -> ValidationResult<()> {
[INFO] [stdout] 343 | |     if values.iter().any(|&x| x <= 0.0) {
[INFO] [stdout] 344 | |         return Err(ValidationError::ValidationFailed(
[INFO] [stdout] 345 | |             "All values must be positive".to_string()
[INFO] [stdout] ...   |
[INFO] [stdout] 348 | |     Ok(())
[INFO] [stdout] 349 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Checks that all values are positive (> 0.0).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:360:1
[INFO] [stdout]     |
[INFO] [stdout] 360 | / pub fn check_probability(values: &[f64]) -> ValidationResult<()> {
[INFO] [stdout] 361 | |     for &value in values {
[INFO] [stdout] 362 | |         if value < 0.0 || value > 1.0 {
[INFO] [stdout] 363 | |             return Err(ValidationError::InvalidProbability { value });
[INFO] [stdout] ...   |
[INFO] [stdout] 366 | |     Ok(())
[INFO] [stdout] 367 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Checks that all values are valid probabilities (in [0, 1]).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:451:1
[INFO] [stdout]     |
[INFO] [stdout] 451 | / pub fn assert_same_length(a: &[f64], b: &[f64]) -> ValidationResult<()> {
[INFO] [stdout] 452 | |     if a.len() != b.len() {
[INFO] [stdout] 453 | |         return Err(ValidationError::DimensionMismatch {
[INFO] [stdout] 454 | |             expected: a.len().to_string(),
[INFO] [stdout] ...   |
[INFO] [stdout] 458 | |     Ok(())
[INFO] [stdout] 459 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Asserts that two slices have the same length.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/validation.rs:470:1
[INFO] [stdout]     |
[INFO] [stdout] 470 | / pub fn assert_non_empty(values: &[f64]) -> ValidationResult<()> {
[INFO] [stdout] 471 | |     if values.is_empty() {
[INFO] [stdout] 472 | |         return Err(ValidationError::EmptyData);
[INFO] [stdout] ...   |
[INFO] [stdout] 475 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes validators for data integrity, parameter constraints,`
[INFO] [stdout]     = help: ends near `Asserts that a slice is not empty.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/serialization.rs:30:1
[INFO] [stdout]    |
[INFO] [stdout] 30 | / pub enum SerializationError {
[INFO] [stdout] 31 | |     /// Underlying filesystem or IO operation failed.
[INFO] [stdout] 32 | |     #[error("IO error: {0}")]
[INFO] [stdout] 33 | |     IoError(#[from] std::io::Error),
[INFO] [stdout] ...  |
[INFO] [stdout] 57 | |     SerializationFailed(String),
[INFO] [stdout] 58 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]    = help: ends near `Errors that can occur during model serialization/deserialization.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/serialization.rs:61:1
[INFO] [stdout]    |
[INFO] [stdout] 61 | pub type SerializationResult<T> = std::result::Result<T, SerializationError>;
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]    = help: ends near `Result type for serialization operations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:160:1
[INFO] [stdout]     |
[INFO] [stdout] 160 | / pub enum SerializationFormat {
[INFO] [stdout] 161 | |     /// JSON format (human-readable, good interoperability).
[INFO] [stdout] 162 | |     Json,
[INFO] [stdout] 163 | |     /// Bincode format (compact binary, fastest serialization).
[INFO] [stdout] 164 | |     Bincode,
[INFO] [stdout] 165 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Supported serialization formats.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:149:1
[INFO] [stdout]     |
[INFO] [stdout] 149 | / pub struct ModelSerializer {
[INFO] [stdout] 150 | |     /// Whether to compress the output with gzip.
[INFO] [stdout] 151 | |     compression: bool,
[INFO] [stdout] 152 | |     /// Serialization format to use.
[INFO] [stdout] 153 | |     format: SerializationFormat,
[INFO] [stdout] 154 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Main serializer with configurable format and compression.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/utils/serialization.rs:68:1
[INFO] [stdout]    |
[INFO] [stdout] 68 | / pub struct ModelMetadata {
[INFO] [stdout] 69 | |     /// Semantic version of the library that created the model.
[INFO] [stdout] 70 | |     pub version: String,
[INFO] [stdout] 71 | |     /// Timestamp when the model was first saved.
[INFO] [stdout] ...  |
[INFO] [stdout] 82 | |     pub parameters: std::collections::HashMap<String, String>,
[INFO] [stdout] 83 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]    = help: ends near `Metadata describing a serialized model.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:285:1
[INFO] [stdout]     |
[INFO] [stdout] 285 | / pub fn save_model<T: Serialize>(
[INFO] [stdout] 286 | |     model: &T,
[INFO] [stdout] 287 | |     metadata: &ModelMetadata,
[INFO] [stdout] 288 | |     path: &Path,
[INFO] [stdout] ...   |
[INFO] [stdout] 327 | |     Ok(())
[INFO] [stdout] 328 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Saves model to file with explicit format and compression settings.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:345:1
[INFO] [stdout]     |
[INFO] [stdout] 345 | / pub fn load_model<T: DeserializeOwned>(path: &Path) -> SerializationResult<(T, ModelMetadata)> {
[INFO] [stdout] 346 | |     let file = File::open(path)?;
[INFO] [stdout] 347 | |     let mut reader = BufReader::new(file);
[INFO] [stdout] ...   |
[INFO] [stdout] 384 | |     Ok((model, metadata))
[INFO] [stdout] 385 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Loads model from file (auto-detects format and compression).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:399:1
[INFO] [stdout]     |
[INFO] [stdout] 399 | / pub fn validate_model_file(path: &Path) -> SerializationResult<ModelMetadata> {
[INFO] [stdout] 400 | |     let file = File::open(path)?;
[INFO] [stdout] 401 | |     let reader = BufReader::new(file);
[INFO] [stdout] ...   |
[INFO] [stdout] 420 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Validates a model file without loading the complete model.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:433:1
[INFO] [stdout]     |
[INFO] [stdout] 433 | / pub fn serialize_to_json<T: Serialize>(value: &T) -> SerializationResult<String> {
[INFO] [stdout] 434 | |     Ok(serde_json::to_string_pretty(value)?)
[INFO] [stdout] 435 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Serializes a value to a pretty-printed JSON string.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:446:1
[INFO] [stdout]     |
[INFO] [stdout] 446 | / pub fn deserialize_from_json<T: DeserializeOwned>(json: &str) -> SerializationResult<T> {
[INFO] [stdout] 447 | |     Ok(serde_json::from_str(json)?)
[INFO] [stdout] 448 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Deserializes from a JSON string.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:459:1
[INFO] [stdout]     |
[INFO] [stdout] 459 | / pub fn serialize_to_bincode<T: Serialize>(value: &T) -> SerializationResult<Vec<u8>> {
[INFO] [stdout] 460 | |     let config = bincode::config::standard();
[INFO] [stdout] 461 | |     let mut bytes = Vec::new();
[INFO] [stdout] 462 | |     bincode::serde::encode_into_std_write(value, &mut bytes, config)?;
[INFO] [stdout] 463 | |     Ok(bytes)
[INFO] [stdout] 464 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Serializes a value to bincode bytes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/utils/serialization.rs:475:1
[INFO] [stdout]     |
[INFO] [stdout] 475 | / pub fn deserialize_from_bincode<T: DeserializeOwned>(bytes: &[u8]) -> SerializationResult<T> {
[INFO] [stdout] 476 | |     let config = bincode::config::standard();
[INFO] [stdout] 477 | |     let mut cursor = std::io::Cursor::new(bytes);
[INFO] [stdout] 478 | |     Ok(bincode::serde::decode_from_std_read(&mut cursor, config)?)
[INFO] [stdout] 479 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `This includes model persistence with versioning, metadata tracking,`
[INFO] [stdout]     = help: ends near `Deserializes from bincode bytes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/data_loader.rs:244:1
[INFO] [stdout]     |
[INFO] [stdout] 244 | / pub struct DataLoader {
[INFO] [stdout] 245 | |     /// Configuration options for loading behavior.
[INFO] [stdout] 246 | |     options: LoadOptions,
[INFO] [stdout] 247 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]     = help: ends near `Main data loader for various file formats with preprocessing capabilities.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/io/data_loader.rs:46:1
[INFO] [stdout]    |
[INFO] [stdout] 46 | / pub enum DataLoaderError {
[INFO] [stdout] 47 | |     /// File system I/O error.
[INFO] [stdout] 48 | |     #[error("IO error: {0}")]
[INFO] [stdout] 49 | |     IoError(#[from] std::io::Error),
[INFO] [stdout] ...  |
[INFO] [stdout] 97 | |     ParquetError(#[from] parquet::errors::ParquetError),
[INFO] [stdout] 98 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]    = help: ends near `Errors that can occur during data loading operations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/data_loader.rs:101:1
[INFO] [stdout]     |
[INFO] [stdout] 101 | pub type DataLoaderResult<T> = std::result::Result<T, DataLoaderError>;
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]     = help: ends near `Result type for data loader operations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/data_loader.rs:107:1
[INFO] [stdout]     |
[INFO] [stdout] 107 | / pub enum DataFormat {
[INFO] [stdout] 108 | |     /// Comma-separated values with headers.
[INFO] [stdout] 109 | |     Csv,
[INFO] [stdout] 110 | |     /// JSON array of objects.
[INFO] [stdout] ...   |
[INFO] [stdout] 115 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]     = help: ends near `Supported data file formats for loading and saving.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/data_loader.rs:150:1
[INFO] [stdout]     |
[INFO] [stdout] 150 | / pub struct LoadOptions {
[INFO] [stdout] 151 | |     /// Field delimiter for CSV files (default: comma).
[INFO] [stdout] 152 | |     pub delimiter: u8,
[INFO] [stdout] 153 | |     /// Whether first row contains headers (default: true).
[INFO] [stdout] ...   |
[INFO] [stdout] 166 | |     pub encoding: String,
[INFO] [stdout] 167 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]     = help: ends near `Configuration options for data loading.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/data_loader.rs:619:1
[INFO] [stdout]     |
[INFO] [stdout] 619 | / pub fn load_csv<P: AsRef<Path>>(
[INFO] [stdout] 620 | |     path: P,
[INFO] [stdout] 621 | |     options: &LoadOptions,
[INFO] [stdout] 622 | | ) -> DataLoaderResult<Dataset> {
[INFO] [stdout] ...   |
[INFO] [stdout] 752 | |         .map_err(DataLoaderError::DataError)
[INFO] [stdout] 753 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]     = help: ends near `Loads dataset from CSV file (legacy implementation).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/data_loader.rs:777:1
[INFO] [stdout]     |
[INFO] [stdout] 777 | / pub fn load_json<P: AsRef<Path>>(
[INFO] [stdout] 778 | |     path: P,
[INFO] [stdout] 779 | |     options: &LoadOptions,
[INFO] [stdout] 780 | | ) -> DataLoaderResult<Dataset> {
[INFO] [stdout] ...   |
[INFO] [stdout] 876 | |         .map_err(DataLoaderError::DataError)
[INFO] [stdout] 877 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]     = help: ends near `Loads dataset from JSON file.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/io/data_loader.rs:932:1
[INFO] [stdout]      |
[INFO] [stdout]  932 | / pub fn load_parquet<P: AsRef<Path>>(
[INFO] [stdout]  933 | |     path: P,
[INFO] [stdout]  934 | |     options: &LoadOptions,
[INFO] [stdout]  935 | | ) -> DataLoaderResult<Dataset> {
[INFO] [stdout] ...    |
[INFO] [stdout] 1067 | |         .map_err(DataLoaderError::DataError)
[INFO] [stdout] 1068 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]      = help: ends near `Loads a dataset from an Apache Parquet file.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/data_loader.rs:581:1
[INFO] [stdout]     |
[INFO] [stdout] 581 | / pub fn load_from_file<P: AsRef<Path>>(
[INFO] [stdout] 582 | |     path: P,
[INFO] [stdout] 583 | |     options: &LoadOptions,
[INFO] [stdout] 584 | | ) -> DataLoaderResult<Dataset> {
[INFO] [stdout] ...   |
[INFO] [stdout] 598 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]     = help: ends near `Loads dataset from file with auto-detected format (CSV, JSON, Parquet).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/io/data_loader.rs:1150:1
[INFO] [stdout]      |
[INFO] [stdout] 1150 | / pub fn save_dataset<P: AsRef<Path>>(
[INFO] [stdout] 1151 | |     dataset: &Dataset,
[INFO] [stdout] 1152 | |     path: P,
[INFO] [stdout] 1153 | |     format: DataFormat,
[INFO] [stdout] ...    |
[INFO] [stdout] 1160 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]      = help: ends near `Saves dataset to file in specified format.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/io/data_loader.rs:1266:1
[INFO] [stdout]      |
[INFO] [stdout] 1266 | / pub fn split_data(
[INFO] [stdout] 1267 | |     dataset: &Dataset,
[INFO] [stdout] 1268 | |     test_size: f64,
[INFO] [stdout] 1269 | |     shuffle: bool,
[INFO] [stdout] ...    |
[INFO] [stdout] 1280 | |         .map_err(DataLoaderError::DataError)
[INFO] [stdout] 1281 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]      = help: ends near `Splits dataset into training and testing sets.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/io/data_loader.rs:1300:1
[INFO] [stdout]      |
[INFO] [stdout] 1300 | / pub fn cross_validation_split(
[INFO] [stdout] 1301 | |     dataset: &Dataset,
[INFO] [stdout] 1302 | |     n_splits: usize,
[INFO] [stdout] 1303 | |     shuffle: bool,
[INFO] [stdout] ...    |
[INFO] [stdout] 1350 | |     Ok(splits)
[INFO] [stdout] 1351 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Provides dataset ingestion from multiple file formats with options for`
[INFO] [stdout]      = help: ends near `Creates k-fold cross-validation splits.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:230:1
[INFO] [stdout]     |
[INFO] [stdout] 230 | / pub struct ModelIO {
[INFO] [stdout] 231 | |     save_options: SaveOptions,
[INFO] [stdout] 232 | |     load_options: LoadOptions,
[INFO] [stdout] 233 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Main model I/O handler for saving and loading gradient boosted models.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/io/model_io.rs:35:1
[INFO] [stdout]    |
[INFO] [stdout] 35 | / pub enum ModelIOError {
[INFO] [stdout] 36 | |     /// File system I/O error.
[INFO] [stdout] 37 | |     #[error("IO error: {0}")]
[INFO] [stdout] 38 | |     IoError(#[from] std::io::Error),
[INFO] [stdout] ...  |
[INFO] [stdout] 66 | |     ModelNotFound(String),
[INFO] [stdout] 67 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]    = help: ends near `Errors that can occur during model I/O operations.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/io/model_io.rs:76:1
[INFO] [stdout]    |
[INFO] [stdout] 76 | / pub enum ModelFormat {
[INFO] [stdout] 77 | |     /// Binary format for compact storage and fast loading.
[INFO] [stdout] 78 | |     Binary,
[INFO] [stdout] 79 | |     /// JSON format for human-readability and interoperability.
[INFO] [stdout] 80 | |     Json,
[INFO] [stdout] 81 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]    = help: ends near `Supported model serialization formats.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:118:1
[INFO] [stdout]     |
[INFO] [stdout] 118 | / pub struct SaveOptions {
[INFO] [stdout] 119 | |     /// Serialization format to use (Binary or JSON).
[INFO] [stdout] 120 | |     pub format: ModelFormat,
[INFO] [stdout] 121 | |     /// Whether to compress the model file.
[INFO] [stdout] ...   |
[INFO] [stdout] 128 | |     pub metadata: HashMap<String, String>,
[INFO] [stdout] 129 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Configuration options for saving models.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:190:1
[INFO] [stdout]     |
[INFO] [stdout] 190 | / pub struct LoadOptions {
[INFO] [stdout] 191 | |     /// Whether to verify model integrity (default: true).
[INFO] [stdout] 192 | |     pub verify_integrity: bool,
[INFO] [stdout] 193 | |     /// Whether to enforce strict version checking (default: false).
[INFO] [stdout] 194 | |     pub strict_version_check: bool,
[INFO] [stdout] 195 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Configuration options for loading models.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:463:1
[INFO] [stdout]     |
[INFO] [stdout] 463 | / pub fn save_model<P: AsRef<Path>>(
[INFO] [stdout] 464 | |     model: &GradientBooster,  // Changed from GBRT to GradientBooster
[INFO] [stdout] 465 | |     path: P,
[INFO] [stdout] 466 | |     model_name: &str,
[INFO] [stdout] ...   |
[INFO] [stdout] 520 | |     Ok(())
[INFO] [stdout] 521 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Saves a gradient boosting model to a directory.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:537:1
[INFO] [stdout]     |
[INFO] [stdout] 537 | / pub fn load_model<P: AsRef<Path>>(
[INFO] [stdout] 538 | |     path: P,
[INFO] [stdout] 539 | |     options: &LoadOptions,
[INFO] [stdout] 540 | | ) -> ModelIOResult<GradientBooster> {  // Changed return type
[INFO] [stdout] ...   |
[INFO] [stdout] 571 | |     Ok(model)
[INFO] [stdout] 572 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Loads a gradient boosting model from file.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:588:1
[INFO] [stdout]     |
[INFO] [stdout] 588 | / pub fn export_model<P: AsRef<Path>>(
[INFO] [stdout] 589 | |     model: &GradientBooster,  // Changed from GBRT to GradientBooster
[INFO] [stdout] 590 | |     path: P,
[INFO] [stdout] 591 | |     format: ModelFormat,
[INFO] [stdout] ...   |
[INFO] [stdout] 607 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Exports a model to a different format.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:622:1
[INFO] [stdout]     |
[INFO] [stdout] 622 | / pub fn import_model<P: AsRef<Path>>(
[INFO] [stdout] 623 | |     path: P,
[INFO] [stdout] 624 | |     format: ModelFormat,
[INFO] [stdout] 625 | | ) -> ModelIOResult<GradientBooster> {  // Changed return type
[INFO] [stdout] ...   |
[INFO] [stdout] 638 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Imports a model from a specific format.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:652:1
[INFO] [stdout]     |
[INFO] [stdout] 652 | / pub fn list_saved_models<P: AsRef<Path>>(directory: P) -> ModelIOResult<Vec<PathBuf>> {
[INFO] [stdout] 653 | |     let directory = directory.as_ref();
[INFO] [stdout] 654 | |     let mut model_files = Vec::new();
[INFO] [stdout] ...   |
[INFO] [stdout] 674 | |     Ok(model_files)
[INFO] [stdout] 675 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Lists all model files in a directory.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:694:1
[INFO] [stdout]     |
[INFO] [stdout] 694 | / pub fn get_model_info<P: AsRef<Path>>(path: P) -> ModelIOResult<ModelMetadata> {
[INFO] [stdout] 695 | |     let path = path.as_ref();
[INFO] [stdout] ...   |
[INFO] [stdout] 721 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Retrieves metadata for a saved model.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/io/model_io.rs:739:1
[INFO] [stdout]     |
[INFO] [stdout] 739 | / pub fn validate_model_file<P: AsRef<Path>>(path: P) -> ModelIOResult<bool> {
[INFO] [stdout] 740 | |     let metadata = get_model_info(path)?;
[INFO] [stdout] ...   |
[INFO] [stdout] 751 | |     Ok(true)
[INFO] [stdout] 752 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Provides model persistence, export/import, and file management`
[INFO] [stdout]     = help: ends near `Validates a model file by checking integrity and consistency.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not document `gbrt-rs`
[INFO] running `Command { std: "docker" "inspect" "6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678", kill_on_drop: false }`
[INFO] [stdout] 6f2664636618e01492a8f1e2fa1317a2685204d6c80d38508832fd1e0256c678
