Adds data type filed to ExpressionContent::Variable.
This commit is contained in:
parent
a55d7a79c1
commit
63d99f1583
4 changed files with 43 additions and 37 deletions
|
|
@ -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>>),
|
||||||
|
|
|
||||||
|
|
@ -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![],
|
||||||
|
|
|
||||||
|
|
@ -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) => {
|
||||||
|
|
|
||||||
|
|
@ -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) => {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue