Adds data type filed to ExpressionContent::Variable.

This commit is contained in:
Alexander Meißner 2023-09-20 11:44:48 +02:00
parent a55d7a79c1
commit 63d99f1583
4 changed files with 43 additions and 37 deletions

View file

@ -10,7 +10,7 @@ pub enum DataType<'a> {
#[derive(PartialEq, Eq, Clone, Debug)] #[derive(PartialEq, Eq, Clone, Debug)]
pub enum ExpressionContent<'a> { pub enum ExpressionContent<'a> {
None, None,
Variable(&'static str), Variable(DataType<'a>, &'static str),
InvokeClassMethod(&'a MultiVectorClass, &'static str, Vec<(DataType<'a>, Expression<'a>)>), InvokeClassMethod(&'a MultiVectorClass, &'static str, Vec<(DataType<'a>, Expression<'a>)>),
InvokeInstanceMethod(DataType<'a>, Box<Expression<'a>>, &'static str, Vec<(DataType<'a>, Expression<'a>)>), InvokeInstanceMethod(DataType<'a>, Box<Expression<'a>>, &'static str, Vec<(DataType<'a>, Expression<'a>)>),
Conversion(&'a MultiVectorClass, &'a MultiVectorClass, Box<Expression<'a>>), Conversion(&'a MultiVectorClass, &'a MultiVectorClass, Box<Expression<'a>>),

View file

@ -255,7 +255,7 @@ impl MultiVectorClass {
content: ExpressionContent::Gather( content: ExpressionContent::Gather(
Box::new(Expression { Box::new(Expression {
size: parameter_a.multi_vector_class().grouped_basis[a_group_index].len(), size: parameter_a.multi_vector_class().grouped_basis[a_group_index].len(),
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
a_indices, a_indices,
), ),
@ -333,7 +333,7 @@ impl MultiVectorClass {
} else { } else {
size size
}, },
content: ExpressionContent::Variable(parameter.name), content: ExpressionContent::Variable(parameter.data_type.clone(), parameter.name),
}), }),
terms.iter().map(|(_factor, index_pair)| index_pair).cloned().collect(), terms.iter().map(|(_factor, index_pair)| index_pair).cloned().collect(),
), ),
@ -471,11 +471,11 @@ impl MultiVectorClass {
assert!(contraction.1.content == ExpressionContent::None); assert!(contraction.1.content == ExpressionContent::None);
contraction.0 = Expression { contraction.0 = Expression {
size: parameter_a.multi_vector_class().grouped_basis[a_group_index].len(), size: parameter_a.multi_vector_class().grouped_basis[a_group_index].len(),
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}; };
contraction.1 = Expression { contraction.1 = Expression {
size: parameter_b.multi_vector_class().grouped_basis[b_group_index].len(), size: parameter_b.multi_vector_class().grouped_basis[b_group_index].len(),
content: ExpressionContent::Variable(parameter_b.name), content: ExpressionContent::Variable(parameter_b.data_type.clone(), parameter_b.name),
}; };
contraction.2 = a_indices.iter().map(|(a_group_index, _)| (*a_group_index, 0)).collect(); contraction.2 = a_indices.iter().map(|(a_group_index, _)| (*a_group_index, 0)).collect();
contraction.3 = b_indices.iter().map(|(b_group_index, _)| (*b_group_index, 0)).collect(); contraction.3 = b_indices.iter().map(|(b_group_index, _)| (*b_group_index, 0)).collect();
@ -500,7 +500,7 @@ impl MultiVectorClass {
content: ExpressionContent::Gather( content: ExpressionContent::Gather(
Box::new(Expression { Box::new(Expression {
size: parameter_a.multi_vector_class().grouped_basis[a_group_index].len(), size: parameter_a.multi_vector_class().grouped_basis[a_group_index].len(),
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
a_indices, a_indices,
), ),
@ -513,7 +513,7 @@ impl MultiVectorClass {
content: ExpressionContent::Gather( content: ExpressionContent::Gather(
Box::new(Expression { Box::new(Expression {
size: parameter_b.multi_vector_class().grouped_basis[b_group_index].len(), size: parameter_b.multi_vector_class().grouped_basis[b_group_index].len(),
content: ExpressionContent::Variable(parameter_b.name), content: ExpressionContent::Variable(parameter_b.data_type.clone(), parameter_b.name),
}), }),
b_indices, b_indices,
), ),
@ -615,7 +615,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
scalar_product_result.name, scalar_product_result.name,
vec![( vec![(
@ -626,7 +626,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
involution_result.name, involution_result.name,
vec![], vec![],
@ -665,7 +665,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
geometric_product_result.name, geometric_product_result.name,
vec![( vec![(
@ -679,7 +679,7 @@ impl MultiVectorClass {
DataType::SimdVector(1), DataType::SimdVector(1),
Expression { Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_b.name), content: ExpressionContent::Variable(parameter_b.data_type.clone(), parameter_b.name),
}, },
)], )],
), ),
@ -718,7 +718,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
squared_magnitude_result.name, squared_magnitude_result.name,
vec![], vec![],
@ -756,7 +756,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
geometric_product_result.name, geometric_product_result.name,
vec![( vec![(
@ -784,7 +784,10 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(
parameter_a.data_type.clone(),
parameter_a.name,
),
}), }),
magnitude_result.name, magnitude_result.name,
vec![], vec![],
@ -832,7 +835,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
involution_result.name, involution_result.name,
vec![], vec![],
@ -864,7 +867,10 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(
parameter_a.data_type.clone(),
parameter_a.name,
),
}), }),
squared_magnitude_result.name, squared_magnitude_result.name,
vec![], vec![],
@ -909,7 +915,7 @@ impl MultiVectorClass {
content: ExpressionContent::Equal( content: ExpressionContent::Equal(
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_b.name), content: ExpressionContent::Variable(parameter_b.data_type.clone(), parameter_b.name),
}), }),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
@ -935,7 +941,7 @@ impl MultiVectorClass {
content: ExpressionContent::LessThan( content: ExpressionContent::LessThan(
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_b.name), content: ExpressionContent::Variable(parameter_b.data_type.clone(), parameter_b.name),
}), }),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
@ -949,7 +955,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
inverse_result.name, inverse_result.name,
vec![], vec![],
@ -957,7 +963,7 @@ impl MultiVectorClass {
}), }),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
), ),
}), }),
@ -979,7 +985,7 @@ impl MultiVectorClass {
DataType::Integer, DataType::Integer,
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_b.name), content: ExpressionContent::Variable(parameter_b.data_type.clone(), parameter_b.name),
}), }),
"Abs", "Abs",
vec![], vec![],
@ -996,7 +1002,7 @@ impl MultiVectorClass {
}), }),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("n"), content: ExpressionContent::Variable(DataType::Integer, "n"),
}), }),
), ),
}), }),
@ -1010,7 +1016,7 @@ impl MultiVectorClass {
content: ExpressionContent::LogicAnd( content: ExpressionContent::LogicAnd(
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("n"), content: ExpressionContent::Variable(DataType::Integer, "n"),
}), }),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
@ -1033,14 +1039,14 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("x"), content: ExpressionContent::Variable(parameter_a.data_type.clone(), "x"),
}), }),
geometric_product_result.name, geometric_product_result.name,
vec![( vec![(
DataType::MultiVector(parameter_a.multi_vector_class()), DataType::MultiVector(parameter_a.multi_vector_class()),
Expression { Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("y"), content: ExpressionContent::Variable(parameter_a.data_type.clone(), "y"),
}, },
)], )],
), ),
@ -1056,14 +1062,14 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("x"), content: ExpressionContent::Variable(parameter_a.data_type.clone(), "x"),
}), }),
geometric_product_result.name, geometric_product_result.name,
vec![( vec![(
DataType::MultiVector(parameter_a.multi_vector_class()), DataType::MultiVector(parameter_a.multi_vector_class()),
Expression { Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("x"), content: ExpressionContent::Variable(parameter_a.data_type.clone(), "x"),
}, },
)], )],
), ),
@ -1077,7 +1083,7 @@ impl MultiVectorClass {
content: ExpressionContent::BitShiftRight( content: ExpressionContent::BitShiftRight(
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("n"), content: ExpressionContent::Variable(DataType::Integer, "n"),
}), }),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
@ -1095,14 +1101,14 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("x"), content: ExpressionContent::Variable(parameter_a.data_type.clone(), "x"),
}), }),
geometric_product_result.name, geometric_product_result.name,
vec![( vec![(
DataType::MultiVector(parameter_a.multi_vector_class()), DataType::MultiVector(parameter_a.multi_vector_class()),
Expression { Expression {
size: 1, size: 1,
content: ExpressionContent::Variable("y"), content: ExpressionContent::Variable(parameter_a.data_type.clone(), "y"),
}, },
)], )],
), ),
@ -1134,7 +1140,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
geometric_product_result.name, geometric_product_result.name,
vec![( vec![(
@ -1145,7 +1151,7 @@ impl MultiVectorClass {
parameter_b.data_type.clone(), parameter_b.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_b.name), content: ExpressionContent::Variable(parameter_b.data_type.clone(), parameter_b.name),
}), }),
inverse_result.name, inverse_result.name,
vec![], vec![],
@ -1180,14 +1186,14 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
geometric_product_result.name, geometric_product_result.name,
vec![( vec![(
DataType::MultiVector(parameter_b.multi_vector_class()), DataType::MultiVector(parameter_b.multi_vector_class()),
Expression { Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_b.name), content: ExpressionContent::Variable(parameter_b.data_type.clone(), parameter_b.name),
}, },
)], )],
), ),
@ -1201,7 +1207,7 @@ impl MultiVectorClass {
parameter_a.data_type.clone(), parameter_a.data_type.clone(),
Box::new(Expression { Box::new(Expression {
size: 1, size: 1,
content: ExpressionContent::Variable(parameter_a.name), content: ExpressionContent::Variable(parameter_a.data_type.clone(), parameter_a.name),
}), }),
involution_result.name, involution_result.name,
vec![], vec![],

View file

@ -17,7 +17,7 @@ fn emit_data_type<W: std::io::Write>(collector: &mut W, data_type: &DataType) ->
fn emit_expression<W: std::io::Write>(collector: &mut W, expression: &Expression) -> std::io::Result<()> { fn emit_expression<W: std::io::Write>(collector: &mut W, expression: &Expression) -> std::io::Result<()> {
match &expression.content { match &expression.content {
ExpressionContent::None => unreachable!(), ExpressionContent::None => unreachable!(),
ExpressionContent::Variable(name) => { ExpressionContent::Variable(_data_type, name) => {
collector.write_all(name.bytes().collect::<Vec<_>>().as_slice())?; collector.write_all(name.bytes().collect::<Vec<_>>().as_slice())?;
} }
ExpressionContent::InvokeClassMethod(_, _, arguments) | ExpressionContent::InvokeInstanceMethod(_, _, _, arguments) => { ExpressionContent::InvokeClassMethod(_, _, arguments) | ExpressionContent::InvokeInstanceMethod(_, _, _, arguments) => {

View file

@ -15,7 +15,7 @@ fn emit_data_type<W: std::io::Write>(collector: &mut W, data_type: &DataType) ->
fn emit_expression<W: std::io::Write>(collector: &mut W, expression: &Expression) -> std::io::Result<()> { fn emit_expression<W: std::io::Write>(collector: &mut W, expression: &Expression) -> std::io::Result<()> {
match &expression.content { match &expression.content {
ExpressionContent::None => unreachable!(), ExpressionContent::None => unreachable!(),
ExpressionContent::Variable(name) => { ExpressionContent::Variable(_data_type, name) => {
collector.write_all(name.bytes().collect::<Vec<_>>().as_slice())?; collector.write_all(name.bytes().collect::<Vec<_>>().as_slice())?;
} }
ExpressionContent::InvokeClassMethod(_, method_name, arguments) | ExpressionContent::InvokeInstanceMethod(_, _, method_name, arguments) => { ExpressionContent::InvokeClassMethod(_, method_name, arguments) | ExpressionContent::InvokeInstanceMethod(_, _, method_name, arguments) => {