swiftness_proof_parser/annotations/
annotation_kind.rs

1use super::extract::{extract_annotations, extract_z_and_alpha};
2use num_bigint::BigUint;
3
4#[derive(Debug, Clone, PartialEq, PartialOrd)]
5pub struct ZAlpha {
6    pub z: BigUint,
7    pub alpha: BigUint,
8}
9
10impl ZAlpha {
11    pub fn extract(annotations: &[&str]) -> anyhow::Result<Self> {
12        extract_z_and_alpha(annotations)
13    }
14}
15
16pub enum Annotation {
17    OriginalCommitmentHash,
18    InteractionCommitmentHash,
19    CompositionCommitmentHash,
20    OodsValues,
21    FriLayersCommitments,
22    FriLastLayerCoefficients,
23    ProofOfWorkNonce,
24    OriginalWitnessLeaves,
25    OriginalWitnessAuthentications,
26    InteractionWitnessLeaves,
27    InteractionWitnessAuthentications,
28    CompositionWitnessLeaves,
29    CompositionWitnessAuthentications,
30    FriWitnessesLeaves(usize),
31    FriWitnessesAuthentications(usize),
32}
33
34impl Annotation {
35    pub fn extract(&self, annotations: &[&str]) -> anyhow::Result<Vec<BigUint>> {
36        let PrefixAndKind { prefix, kinds } = self.prefix_and_kinds();
37        Ok(kinds
38            .to_strs()
39            .iter()
40            .map(|k| extract_annotations(annotations, &prefix, k))
41            .collect::<anyhow::Result<Vec<_>>>()?
42            .into_iter()
43            .flatten()
44            .collect())
45    }
46
47    pub fn prefix_and_kinds(&self) -> PrefixAndKind {
48        match self {
49            Annotation::OriginalCommitmentHash => PrefixAndKind {
50                prefix: "STARK/Original/Commit on Trace".to_string(),
51                kinds: AnnotationKinds::Hash,
52            },
53            Annotation::InteractionCommitmentHash => PrefixAndKind {
54                prefix: "STARK/Interaction/Commit on Trace".to_string(),
55                kinds: AnnotationKinds::Hash,
56            },
57            Annotation::CompositionCommitmentHash => PrefixAndKind {
58                prefix: "STARK/Out Of Domain Sampling/Commit on Trace".to_string(),
59                kinds: AnnotationKinds::Hash,
60            },
61            Annotation::OodsValues => PrefixAndKind {
62                prefix: "STARK/Out Of Domain Sampling/OODS values".to_string(),
63                kinds: AnnotationKinds::FieldElements,
64            },
65            Annotation::FriLayersCommitments => PrefixAndKind {
66                prefix: "STARK/FRI/Commitment/Layer [0-9]+".to_string(),
67                kinds: AnnotationKinds::Hash,
68            },
69            Annotation::FriLastLayerCoefficients => PrefixAndKind {
70                prefix: "STARK/FRI/Commitment/Last Layer".to_string(),
71                kinds: AnnotationKinds::FieldElements,
72            },
73            Annotation::ProofOfWorkNonce => PrefixAndKind {
74                prefix: "STARK/FRI/Proof of Work".to_string(),
75                kinds: AnnotationKinds::Data,
76            },
77            Annotation::OriginalWitnessLeaves => PrefixAndKind {
78                prefix: "STARK/FRI/Decommitment/Layer 0/Virtual Oracle/Trace 0".to_string(),
79                kinds: AnnotationKinds::FieldElement,
80            },
81            Annotation::OriginalWitnessAuthentications => PrefixAndKind {
82                prefix: "STARK/FRI/Decommitment/Layer 0/Virtual Oracle/Trace 0".to_string(),
83                kinds: AnnotationKinds::DataAndHash,
84            },
85            Annotation::InteractionWitnessLeaves => PrefixAndKind {
86                prefix: "STARK/FRI/Decommitment/Layer 0/Virtual Oracle/Trace 1".to_string(),
87                kinds: AnnotationKinds::FieldElement,
88            },
89            Annotation::InteractionWitnessAuthentications => PrefixAndKind {
90                prefix: "STARK/FRI/Decommitment/Layer 0/Virtual Oracle/Trace 1".to_string(),
91                kinds: AnnotationKinds::DataAndHash,
92            },
93            Annotation::CompositionWitnessLeaves => PrefixAndKind {
94                prefix: "STARK/FRI/Decommitment/Layer 0/Virtual Oracle/Trace 2".to_string(),
95                kinds: AnnotationKinds::FieldElement,
96            },
97            Annotation::CompositionWitnessAuthentications => PrefixAndKind {
98                prefix: "STARK/FRI/Decommitment/Layer 0/Virtual Oracle/Trace 2".to_string(),
99                kinds: AnnotationKinds::DataAndHash,
100            },
101            Annotation::FriWitnessesLeaves(layer) => PrefixAndKind {
102                prefix: format!("STARK/FRI/Decommitment/Layer {layer}"),
103                kinds: AnnotationKinds::FieldElement,
104            },
105            Annotation::FriWitnessesAuthentications(layer) => PrefixAndKind {
106                prefix: format!("STARK/FRI/Decommitment/Layer {layer}"),
107                kinds: AnnotationKinds::Hash,
108            },
109        }
110    }
111}
112
113pub enum AnnotationKinds {
114    Data,
115    Hash,
116    FieldElement,
117    FieldElements,
118    DataAndHash,
119}
120
121impl AnnotationKinds {
122    pub fn to_strs(&self) -> Vec<&'static str> {
123        match self {
124            AnnotationKinds::Data => vec!["Data"],
125            AnnotationKinds::Hash => vec!["Hash"],
126            AnnotationKinds::FieldElement => vec!["Field Element"],
127            AnnotationKinds::FieldElements => vec!["Field Elements"],
128            AnnotationKinds::DataAndHash => vec!["Data", "Hash"],
129        }
130    }
131}
132
133pub struct PrefixAndKind {
134    pub prefix: String,
135    pub kinds: AnnotationKinds,
136}