Skip to content

Commit a1d149b

Browse files
authored
Fix parameter handling for complex association schemes (#290)
1 parent b4ae868 commit a1d149b

File tree

5 files changed

+43
-25
lines changed

5 files changed

+43
-25
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ libm = "0.2"
4242
gauss-quad = "0.2"
4343
approx = "0.5"
4444
criterion = "0.5"
45-
arrayvec = "0.7"
4645

4746
feos-core = { version = "0.8", path = "crates/feos-core" }
4847
feos-dft = { version = "0.8", path = "crates/feos-dft" }

crates/feos-core/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ indexmap = { workspace = true, features = ["serde"] }
2727
rayon = { workspace = true, optional = true }
2828
typenum = { workspace = true }
2929
itertools = { workspace = true }
30-
arrayvec = { workspace = true, features = ["serde"] }
3130

3231
[dev-dependencies]
3332
approx = { workspace = true }

crates/feos-core/src/parameter/association.rs

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
use super::{BinaryParameters, BinaryRecord, GroupCount, PureParameters};
22
use crate::{FeosError, FeosResult, parameter::PureRecord};
3-
use arrayvec::ArrayString;
43
use ndarray::Array1;
54
use num_traits::Zero;
65
use serde::{Deserialize, Serialize};
76
use std::collections::{HashMap, HashSet};
87

9-
type SiteId = ArrayString<8>;
10-
118
/// Pure component association parameters.
12-
#[derive(Serialize, Deserialize, Clone, Copy, Debug)]
9+
#[derive(Serialize, Deserialize, Clone, Debug)]
1310
pub struct AssociationRecord<A> {
14-
#[serde(skip_serializing_if = "SiteId::is_empty")]
11+
#[serde(skip_serializing_if = "String::is_empty")]
1512
#[serde(default)]
16-
pub id: SiteId,
13+
pub id: String,
1714
#[serde(flatten)]
1815
pub parameters: Option<A>,
1916
/// \# of association sites of type A
@@ -35,7 +32,7 @@ impl<A> AssociationRecord<A> {
3532
Self::with_id(Default::default(), parameters, na, nb, nc)
3633
}
3734

38-
pub fn with_id(id: SiteId, parameters: Option<A>, na: f64, nb: f64, nc: f64) -> Self {
35+
pub fn with_id(id: String, parameters: Option<A>, na: f64, nb: f64, nc: f64) -> Self {
3936
Self {
4037
id,
4138
parameters,
@@ -47,16 +44,16 @@ impl<A> AssociationRecord<A> {
4744
}
4845

4946
/// Binary association parameters.
50-
#[derive(Serialize, Deserialize, Clone, Copy, Debug)]
47+
#[derive(Serialize, Deserialize, Clone, Debug)]
5148
pub struct BinaryAssociationRecord<A> {
5249
// Identifier of the association site on the first molecule.
53-
#[serde(skip_serializing_if = "SiteId::is_empty")]
50+
#[serde(skip_serializing_if = "String::is_empty")]
5451
#[serde(default)]
55-
pub id1: SiteId,
52+
pub id1: String,
5653
// Identifier of the association site on the second molecule.
57-
#[serde(skip_serializing_if = "SiteId::is_empty")]
54+
#[serde(skip_serializing_if = "String::is_empty")]
5855
#[serde(default)]
59-
pub id2: SiteId,
56+
pub id2: String,
6057
// Binary association parameters
6158
#[serde(flatten)]
6259
pub parameters: A,
@@ -67,7 +64,7 @@ impl<A> BinaryAssociationRecord<A> {
6764
Self::with_id(Default::default(), Default::default(), parameters)
6865
}
6966

70-
pub fn with_id(id1: SiteId, id2: SiteId, parameters: A) -> Self {
67+
pub fn with_id(id1: String, id2: String, parameters: A) -> Self {
7168
Self {
7269
id1,
7370
id2,
@@ -76,16 +73,16 @@ impl<A> BinaryAssociationRecord<A> {
7673
}
7774
}
7875

79-
#[derive(Clone, Copy, Debug)]
76+
#[derive(Clone, Debug)]
8077
pub struct AssociationSite<A> {
8178
pub assoc_comp: usize,
82-
pub id: SiteId,
79+
pub id: String,
8380
pub n: f64,
8481
pub parameters: A,
8582
}
8683

8784
impl<A> AssociationSite<A> {
88-
fn new(assoc_comp: usize, id: SiteId, n: f64, parameters: A) -> Self {
85+
fn new(assoc_comp: usize, id: String, n: f64, parameters: A) -> Self {
8986
Self {
9087
assoc_comp,
9188
id,
@@ -120,13 +117,28 @@ impl<A: Clone> AssociationParameters<A> {
120117
for site in record.association_sites.iter() {
121118
let par = &site.parameters;
122119
if site.na > 0.0 {
123-
sites_a.push(AssociationSite::new(i, site.id, site.na, par.clone()));
120+
sites_a.push(AssociationSite::new(
121+
i,
122+
site.id.clone(),
123+
site.na,
124+
par.clone(),
125+
));
124126
}
125127
if site.nb > 0.0 {
126-
sites_b.push(AssociationSite::new(i, site.id, site.nb, par.clone()));
128+
sites_b.push(AssociationSite::new(
129+
i,
130+
site.id.clone(),
131+
site.nb,
132+
par.clone(),
133+
));
127134
}
128135
if site.nc > 0.0 {
129-
sites_c.push(AssociationSite::new(i, site.id, site.nc, par.clone()));
136+
sites_c.push(AssociationSite::new(
137+
i,
138+
site.id.clone(),
139+
site.nc,
140+
par.clone(),
141+
));
130142
}
131143
}
132144
}
@@ -212,15 +224,15 @@ impl<A: Clone> AssociationParameters<A> {
212224
let par = &site.parameters;
213225
if site.na > 0.0 {
214226
let na = site.na * record.count.into_f64();
215-
sites_a.push(AssociationSite::new(i, site.id, na, par.clone()));
227+
sites_a.push(AssociationSite::new(i, site.id.clone(), na, par.clone()));
216228
}
217229
if site.nb > 0.0 {
218230
let nb = site.nb * record.count.into_f64();
219-
sites_b.push(AssociationSite::new(i, site.id, nb, par.clone()));
231+
sites_b.push(AssociationSite::new(i, site.id.clone(), nb, par.clone()));
220232
}
221233
if site.nc > 0.0 {
222234
let nc = site.nc * record.count.into_f64();
223-
sites_c.push(AssociationSite::new(i, site.id, nc, par.clone()));
235+
sites_c.push(AssociationSite::new(i, site.id.clone(), nc, par.clone()));
224236
}
225237
}
226238
}

crates/feos-core/src/parameter/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,15 @@ impl<P: Clone, B: Clone, A: Clone> Parameters<P, B, A> {
252252
.iter()
253253
.enumerate()
254254
.array_combinations()
255+
.chain(
256+
// Somehow there is no array_combinations_with_replacement in itertools
257+
// ii combinations are not intuitive here, but potentially needed for
258+
// molecules with multiple association sites.
259+
pure_records
260+
.iter()
261+
.enumerate()
262+
.map(|(i, p)| [(i, p), (i, p)]),
263+
)
255264
.map(|[(i1, p1), (i2, p2)]| {
256265
let Some(id1) = p1.identifier.as_str(identifier_option) else {
257266
return Err(FeosError::MissingParameters(format!(

crates/feos/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ indexmap = { workspace = true }
2222
rayon = { workspace = true, optional = true }
2323
itertools = { workspace = true }
2424
typenum = { workspace = true }
25-
arrayvec = { workspace = true, features = ["serde"] }
2625

2726
feos-core = { workspace = true }
2827
feos-derive = { workspace = true }

0 commit comments

Comments
 (0)