tensor/
tensor.rs

1use std::sync::Arc;
2
3use algebra::{
4    AdemAlgebra, SteenrodAlgebra,
5    module::{FDModule, TensorModule, steenrod_module},
6};
7use anyhow::anyhow;
8use ext::utils::parse_module_name;
9use fp::prime::{Prime, ValidPrime};
10use serde_json::json;
11
12fn main() -> anyhow::Result<()> {
13    ext::utils::init_logging()?;
14
15    let left = query::with_default("Left module", "S_2", parse_module_name);
16    let p = left["p"].as_u64().unwrap();
17
18    let right = query::with_default("Right module", "S_2", |name| {
19        let module = parse_module_name(name)?;
20        if module["p"].as_u64() == Some(p) {
21            Ok(module)
22        } else {
23            Err(anyhow!("Two modules must be over the same prime"))
24        }
25    });
26
27    let p = ValidPrime::new(p as u32);
28    let algebra = Arc::new(SteenrodAlgebra::AdemAlgebra(AdemAlgebra::new(p, false)));
29    let left_module = steenrod_module::from_json(Arc::clone(&algebra), &left)?;
30    let right_module = steenrod_module::from_json(Arc::clone(&algebra), &right)?;
31
32    let mut tensor = FDModule::from(&TensorModule::new(
33        Arc::new(left_module),
34        Arc::new(right_module),
35    ));
36    tensor.name = String::new();
37
38    let mut output = json!({
39        "p": p.as_u32(),
40    });
41    tensor.to_json(&mut output);
42
43    println!("{output}");
44    Ok(())
45}