polysim_core/polymer/
ensemble.rs1use crate::error::PolySimError;
2
3use super::PolymerChain;
4
5#[derive(Debug, Clone)]
7pub struct PolymerEnsemble {
8 chains: Vec<PolymerChain>,
9}
10
11impl PolymerEnsemble {
12 pub fn new(chains: Vec<PolymerChain>) -> Result<Self, PolySimError> {
18 if chains.is_empty() {
19 return Err(PolySimError::EmptyEnsemble);
20 }
21 Ok(Self { chains })
22 }
23
24 pub fn chains(&self) -> &[PolymerChain] {
26 &self.chains
27 }
28
29 pub fn len(&self) -> usize {
31 self.chains.len()
32 }
33
34 pub fn is_empty(&self) -> bool {
36 false
37 }
38
39 pub fn mn(&self) -> f64 {
41 let sum: f64 = self.chains.iter().map(|c| c.mn).sum();
42 sum / self.chains.len() as f64
43 }
44
45 pub fn mw(&self) -> f64 {
47 let sum_mi: f64 = self.chains.iter().map(|c| c.mn).sum();
48 let sum_mi2: f64 = self.chains.iter().map(|c| c.mn * c.mn).sum();
49 sum_mi2 / sum_mi
50 }
51
52 pub fn pdi(&self) -> f64 {
54 self.mw() / self.mn()
55 }
56}