swiftness_proof_parser/annotations/
annotation_kind.rs1use 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}