p3_commit/adapters/
extension_mmcs.rs

1use alloc::vec::Vec;
2use core::marker::PhantomData;
3use core::ops::Deref;
4
5use p3_field::{ExtensionField, Field};
6use p3_matrix::extension::FlatMatrixView;
7use p3_matrix::{Dimensions, Matrix};
8
9use crate::Mmcs;
10
11#[derive(Clone, Debug)]
12pub struct ExtensionMmcs<F, EF, InnerMmcs> {
13    inner: InnerMmcs,
14    _phantom: PhantomData<(F, EF)>,
15}
16
17impl<F, EF, InnerMmcs> ExtensionMmcs<F, EF, InnerMmcs> {
18    pub const fn new(inner: InnerMmcs) -> Self {
19        Self {
20            inner,
21            _phantom: PhantomData,
22        }
23    }
24}
25
26impl<F, EF, InnerMmcs> Mmcs<EF> for ExtensionMmcs<F, EF, InnerMmcs>
27where
28    F: Field,
29    EF: ExtensionField<F>,
30    InnerMmcs: Mmcs<F>,
31{
32    type ProverData<M> = InnerMmcs::ProverData<FlatMatrixView<F, EF, M>>;
33    type Commitment = InnerMmcs::Commitment;
34    type Proof = InnerMmcs::Proof;
35    type Error = InnerMmcs::Error;
36
37    fn commit<M: Matrix<EF>>(&self, inputs: Vec<M>) -> (Self::Commitment, Self::ProverData<M>) {
38        self.inner
39            .commit(inputs.into_iter().map(FlatMatrixView::new).collect())
40    }
41
42    fn open_batch<M: Matrix<EF>>(
43        &self,
44        index: usize,
45        prover_data: &Self::ProverData<M>,
46    ) -> (Vec<Vec<EF>>, Self::Proof) {
47        let (opened_base_values, proof) = self.inner.open_batch(index, prover_data);
48        let opened_ext_values = opened_base_values
49            .into_iter()
50            .map(|row| row.chunks(EF::D).map(EF::from_base_slice).collect())
51            .collect();
52        (opened_ext_values, proof)
53    }
54
55    fn get_matrices<'a, M: Matrix<EF>>(&self, prover_data: &'a Self::ProverData<M>) -> Vec<&'a M> {
56        self.inner
57            .get_matrices(prover_data)
58            .into_iter()
59            .map(|mat| mat.deref())
60            .collect()
61    }
62
63    fn verify_batch(
64        &self,
65        commit: &Self::Commitment,
66        dimensions: &[Dimensions],
67        index: usize,
68        opened_values: &[Vec<EF>],
69        proof: &Self::Proof,
70    ) -> Result<(), Self::Error> {
71        let opened_base_values: Vec<Vec<F>> = opened_values
72            .iter()
73            .map(|row| {
74                row.iter()
75                    .flat_map(|el| el.as_base_slice())
76                    .copied()
77                    .collect()
78            })
79            .collect();
80        let base_dimensions = dimensions
81            .iter()
82            .map(|dim| Dimensions {
83                width: dim.width * EF::D,
84                height: dim.height,
85            })
86            .collect::<Vec<_>>();
87        self.inner
88            .verify_batch(commit, &base_dimensions, index, &opened_base_values, proof)
89    }
90}