pub struct NeuralBlendNet {
pub w1: Vec<Vec<f64>>,
pub b1: Vec<f64>,
pub w2: Vec<Vec<f64>>,
pub b2: Vec<f64>,
pub output_names: Vec<String>,
}Expand description
A 2-layer MLP (input → hidden ReLU → output softmax) used to predict morph-target blend weights from anthropometric measurements.
Weights are stored in row-major order:
w1: shape[HIDDEN_SIZE][INPUT_SIZE]— input→hiddenb1: shape[HIDDEN_SIZE]— hidden biasesw2: shape[N_OUTPUT][HIDDEN_SIZE]— hidden→outputb2: shape[N_OUTPUT]— output biases
Fields§
§w1: Vec<Vec<f64>>Rows = hidden units, cols = inputs. w1[h][i]
b1: Vec<f64>Hidden-layer bias. b1[h]
w2: Vec<Vec<f64>>Rows = outputs, cols = hidden units. w2[o][h]
b2: Vec<f64>Output-layer bias. b2[o]
output_names: Vec<String>Names of the output morph targets (same length as w2).
Implementations§
Source§impl NeuralBlendNet
impl NeuralBlendNet
Sourcepub fn new(
w1: Vec<Vec<f64>>,
b1: Vec<f64>,
w2: Vec<Vec<f64>>,
b2: Vec<f64>,
output_names: Vec<String>,
) -> Self
pub fn new( w1: Vec<Vec<f64>>, b1: Vec<f64>, w2: Vec<Vec<f64>>, b2: Vec<f64>, output_names: Vec<String>, ) -> Self
Construct a network with explicit weight matrices.
§Panics (only in debug mode)
Inconsistent dimensions trigger a panic — call from tests only.
Sourcepub fn default_body_predictor() -> Self
pub fn default_body_predictor() -> Self
Build a default body-shape predictor with handcrafted weights that reflect anthropometric archetypes (not random values).
The hidden layer encodes four primitive body-feature detectors:
- Units 0-3: height patterns (tall / short / average / threshold)
- Units 4-7: weight/BMI patterns (light / heavy / moderate / obese)
- Units 8-11: age patterns (youth / middle / elder / crossover)
- Units 12-15: fitness/lean patterns (athletic / sedentary / mixed / peak)
The output layer maps these features to BODY_TARGET_NAMES softmax
probabilities calibrated on anthropometric population data.
Sourcepub fn forward(&self, inputs: &[f64]) -> Vec<f64>
pub fn forward(&self, inputs: &[f64]) -> Vec<f64>
Run a forward pass through the network.
inputs must have exactly INPUT_SIZE elements; extra elements are
ignored, missing elements default to 0.0.
Returns the softmax-normalized output vector (sums to 1.0).
Sourcepub fn predict_morph_weights(
&self,
height_cm: f64,
weight_kg: f64,
age: f64,
fitness_0_1: f64,
) -> HashMap<String, f64>
pub fn predict_morph_weights( &self, height_cm: f64, weight_kg: f64, age: f64, fitness_0_1: f64, ) -> HashMap<String, f64>
Predict morph-target blend weights from anthropometric measurements.
Inputs are normalised internally:
- height_cm →
(h - 170) / 15 - weight_kg →
(w - 70) / 20 - age →
(a - 35) / 20 - fitness → passed as-is (already
[0, 1])
The returned map has exactly output_names.len() entries, with all
values in (0, 1) and summing to 1.0.
Trait Implementations§
Source§impl Clone for NeuralBlendNet
impl Clone for NeuralBlendNet
Source§fn clone(&self) -> NeuralBlendNet
fn clone(&self) -> NeuralBlendNet
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for NeuralBlendNet
impl RefUnwindSafe for NeuralBlendNet
impl Send for NeuralBlendNet
impl Sync for NeuralBlendNet
impl Unpin for NeuralBlendNet
impl UnsafeUnpin for NeuralBlendNet
impl UnwindSafe for NeuralBlendNet
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more