it doesn't make sense to have more than the 255'th derivative in a single direction

This commit is contained in:
Alain Emilia Anna Zscheile 2024-07-23 23:08:24 +02:00
parent 783d60b117
commit 938cf2de3b
2 changed files with 11 additions and 11 deletions

View file

@ -19,29 +19,29 @@ struct PreHasseNode {
* split the derivation-vectors into levels (sum of their components)
*/
fn sum(drvs: &[u16]) -> usize {
fn sum(drvs: &[u8]) -> usize {
drvs.iter().copied().map(usize::from).sum::<usize>()
}
fn parents(drvs: &[u16]) -> impl Iterator<Item = Box<[u16]>> + '_ {
fn parents(drvs: &[u8]) -> impl Iterator<Item = Box<[u8]>> + '_ {
drvs.iter()
.enumerate()
.filter_map(|(n, i)| i.checked_sub(1).map(|i2| (n, i2)))
.map(|(n, j)| {
let mut i2: Box<[u16]> = drvs.to_owned().into_boxed_slice();
let mut i2: Box<[u8]> = drvs.to_owned().into_boxed_slice();
i2[n] = j;
i2
})
}
/// calculate votes for each possible parent
fn calculate_votes(mut que: Vec<Box<[u16]>>) -> Vec<BTreeMap<Box<[u16]>, u16>> {
fn calculate_votes(mut que: Vec<Box<[u8]>>) -> Vec<BTreeMap<Box<[u8]>, u16>> {
assert!(que.len() <= usize::from(u16::MAX));
// split que into levels
let mut levels = core::iter::repeat_with(BTreeMap::new)
.take(que.iter().map(|i| sum(&i[..])).max().map(|i| i.checked_add(1).unwrap()).unwrap_or(0))
.collect::<Vec<BTreeMap<Box<[u16]>, u16>>>();
.collect::<Vec<BTreeMap<Box<[u8]>, u16>>>();
for i in core::mem::replace(&mut que, Vec::new()) {
let mut l = &mut levels[sum(&i[..])];

View file

@ -12,7 +12,7 @@ use yz_string_utils::StrLexerBase;
/// A reference to a PDE variable or derivative of such
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Link(pub u16, pub Box<[u16]>);
pub struct Link(pub u16, pub Box<[u8]>);
#[derive(Clone, Debug, PartialEq)]
pub enum Expr<L> {
@ -167,7 +167,7 @@ impl ParseLink for Link {
if dr.is_empty() {
break;
}
let dr = dr.parse::<u16>()?;
let dr = dr.parse::<u8>()?;
derivatives.push(dr);
}
@ -259,11 +259,11 @@ pub fn parse_expr_final<L: Clone + ParseLink>(slb: &mut StrLexerBase) -> Result<
```
%vs
# u_t + 0.11 u_x = 0
0; prod(-0.11, 0_0_)
0; prod(-0.11, 0_1)
%mons
# monitor u @ 1 + sin(t)
0_; sum(1.0, sin(.))
0_0; sum(1.0, sin(.))
```
# Syntax:
@ -374,11 +374,11 @@ mod tests {
println!("{:?}", parse_system("
%vs
# u_t + 0.11 u_x = 0
0; prod(-0.11, 0_0_)
0; prod(-0.11, 0_1_)
%mons
# monitor u @ 1 + sin(t)
0_; sum(1.0, sin(.))
0_0; sum(1.0, sin(.))
").unwrap());
}
}