graphblas_sparse_linear_algebra/operators/options/
descriptor.rs

1use std::ptr;
2
3use suitesparse_graphblas_sys::{
4    GrB_DESC_C, GrB_DESC_CT0, GrB_DESC_CT0T1, GrB_DESC_CT1, GrB_DESC_R, GrB_DESC_RC, GrB_DESC_RCT0,
5    GrB_DESC_RCT0T1, GrB_DESC_RCT1, GrB_DESC_RS, GrB_DESC_RSC, GrB_DESC_RSCT0, GrB_DESC_RSCT0T1,
6    GrB_DESC_RSCT1, GrB_DESC_RST0, GrB_DESC_RST0T1, GrB_DESC_RST1, GrB_DESC_RT0, GrB_DESC_RT0T1,
7    GrB_DESC_RT1, GrB_DESC_S, GrB_DESC_SC, GrB_DESC_SCT0, GrB_DESC_SCT0T1, GrB_DESC_SCT1,
8    GrB_DESC_ST0, GrB_DESC_ST0T1, GrB_DESC_ST1, GrB_DESC_T0, GrB_DESC_T0T1, GrB_DESC_T1,
9    GrB_Descriptor,
10};
11
12pub trait GetGraphblasDescriptor {
13    fn graphblas_descriptor(&self) -> GrB_Descriptor;
14}
15
16pub(crate) fn graphblas_descriptor(
17    clear_output_before_use: bool,
18    use_mask_structure_of_stored_values_as_mask: bool,
19    use_mask_complement: bool,
20    transpose_input0: bool,
21    transpose_input1: bool,
22) -> GrB_Descriptor {
23    match (
24        clear_output_before_use,
25        use_mask_structure_of_stored_values_as_mask,
26        use_mask_complement,
27        transpose_input0,
28        transpose_input1,
29    ) {
30        (false, false, false, false, false) => ptr::null_mut(),
31        (false, false, false, false, true) => unsafe { GrB_DESC_T1 },
32        (false, false, false, true, false) => unsafe { GrB_DESC_T0 },
33        (false, false, false, true, true) => unsafe { GrB_DESC_T0T1 },
34        (false, false, true, false, false) => unsafe { GrB_DESC_C },
35        (false, false, true, false, true) => unsafe { GrB_DESC_CT1 },
36        (false, false, true, true, false) => unsafe { GrB_DESC_CT0 },
37        (false, false, true, true, true) => unsafe { GrB_DESC_CT0T1 },
38        (false, true, false, false, false) => unsafe { GrB_DESC_S },
39        (false, true, false, false, true) => unsafe { GrB_DESC_ST1 },
40        (false, true, false, true, false) => unsafe { GrB_DESC_ST0 },
41        (false, true, false, true, true) => unsafe { GrB_DESC_ST0T1 },
42        (false, true, true, false, false) => unsafe { GrB_DESC_SC },
43        (false, true, true, true, false) => unsafe { GrB_DESC_SCT0 },
44        (false, true, true, false, true) => unsafe { GrB_DESC_SCT1 },
45        (false, true, true, true, true) => unsafe { GrB_DESC_SCT0T1 },
46        (true, false, false, false, false) => unsafe { GrB_DESC_R },
47        (true, false, false, false, true) => unsafe { GrB_DESC_RT1 },
48        (true, false, false, true, false) => unsafe { GrB_DESC_RT0 },
49        (true, false, false, true, true) => unsafe { GrB_DESC_RT0T1 },
50        (true, false, true, false, false) => unsafe { GrB_DESC_RC },
51        (true, false, true, false, true) => unsafe { GrB_DESC_RCT1 },
52        (true, false, true, true, false) => unsafe { GrB_DESC_RCT0 },
53        (true, false, true, true, true) => unsafe { GrB_DESC_RCT0T1 },
54        (true, true, false, false, false) => unsafe { GrB_DESC_RS },
55        (true, true, false, false, true) => unsafe { GrB_DESC_RST1 },
56        (true, true, false, true, false) => unsafe { GrB_DESC_RST0 },
57        (true, true, false, true, true) => unsafe { GrB_DESC_RST0T1 },
58        (true, true, true, false, false) => unsafe { GrB_DESC_RSC },
59        (true, true, true, true, false) => unsafe { GrB_DESC_RSCT0 },
60        (true, true, true, false, true) => unsafe { GrB_DESC_RSCT1 },
61        (true, true, true, true, true) => unsafe { GrB_DESC_RSCT0T1 },
62    }
63}