From f77d24e695117d415cb75b94207eb9cae9f43f48 Mon Sep 17 00:00:00 2001
From: HEME Clement <clement.heme@student.isae-supaero.fr>
Date: Wed, 19 Mar 2025 09:35:22 +0100
Subject: [PATCH] Added Latex support for doc

---
 Cargo.toml |  1 +
 Makefile   |  2 +-
 katex.html | 15 +++++++++++++++
 src/fec.rs | 38 +++++++++++++++-----------------------
 4 files changed, 32 insertions(+), 24 deletions(-)
 create mode 100644 katex.html

diff --git a/Cargo.toml b/Cargo.toml
index fe2526e0..b2797fda 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -50,6 +50,7 @@ fs = []
 
 [package.metadata.docs.rs]
 features = ["kzg", "aplonk"]
+rustdoc-args = [ "--html-in-header", "katex.html" ]
 
 [[example]]
 name = "kzg"
diff --git a/Makefile b/Makefile
index e0a254ab..bdc91117 100644
--- a/Makefile
+++ b/Makefile
@@ -63,7 +63,7 @@ show:
 
 .PHONY: doc
 doc:
-	cargo doc --document-private-items --no-deps --open
+	RUSTDOCFLAGS="--html-in-header katex.html" cargo doc --no-deps --open
 
 .PHONY: build-examples
 build-examples:
diff --git a/katex.html b/katex.html
new file mode 100644
index 00000000..32ac35a4
--- /dev/null
+++ b/katex.html
@@ -0,0 +1,15 @@
+<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.css" integrity="sha384-9eLZqc9ds8eNjO3TmqPeYcDj8n+Qfa4nuSiGYa6DjLNcv9BtN69ZIulL9+8CqC9Y" crossorigin="anonymous">
+<script src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.js"                  integrity="sha384-K3vbOmF2BtaVai+Qk37uypf7VrgBubhQreNQe9aGsz9lB63dIFiQVlJbr92dw2Lx" crossorigin="anonymous"></script>
+<script src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/contrib/auto-render.min.js"    integrity="sha384-kmZOZB5ObwgQnS/DuDg6TScgOiWWBiVt0plIRkZCmE6rDZGrEOQeHM5PcHi+nyqe" crossorigin="anonymous"></script>
+<script>
+    document.addEventListener("DOMContentLoaded", function() {
+        renderMathInElement(document.body, {
+            delimiters: [
+                {left: "$$", right: "$$", display: true},
+                {left: "\\(", right: "\\)", display: false},
+                {left: "$", right: "$", display: false},
+                {left: "\\[", right: "\\]", display: true}
+            ]
+        });
+    });
+</script>
diff --git a/src/fec.rs b/src/fec.rs
index 2329a21e..715ef2f8 100644
--- a/src/fec.rs
+++ b/src/fec.rs
@@ -17,7 +17,7 @@ pub struct Shard<F: PrimeField> {
     ///
     /// this effectively allows support for _recoding_.
     ///
-    /// If we denote the $k$ source shards by $(s_i)_{0 \le i \lt k}$, the linear combination by $k$
+    /// If we denote the $k$ source shards by $(s\_i)\_\{0 \le i \lt k\}$, the linear combination by $k$
     /// coefficients $(\alpha_i)_{0 \le i \lt k}$ and $s$ the shard itself, then
     ///
     /// $$ s = \sum\limits_{i = 0}^{k - 1} \alpha_i s_i$$
@@ -31,6 +31,14 @@ pub struct Shard<F: PrimeField> {
 }
 
 impl<F: PrimeField> Shard<F> {
+    fn dual_combination(this: &Vec<F>, alpha: F, other: &Vec<F>, beta: F) -> Vec<F> {
+        this
+            .iter()
+            .zip(other.iter())
+            .map(|(s, o)| s.mul(alpha) + o.mul(beta))
+            .collect()
+    }
+ 
     /// compute the linear combination between two [`Shard`]s
     ///
     /// if we denote the [`Shard`] itself and the other [`Shard`] by $s$ and $o$ respectively, the
@@ -45,19 +53,9 @@ impl<F: PrimeField> Shard<F> {
 
         Shard {
             k: self.k,
-            linear_combination: self
-                .linear_combination
-                .iter()
-                .zip(other.linear_combination.iter())
-                .map(|(l, r)| l.mul(alpha) + r.mul(beta))
-                .collect(),
+            linear_combination: Self::dual_combination(&self.linear_combination, alpha, &other.linear_combination, beta),
             hash: self.hash.clone(),
-            data: self
-                .data
-                .iter()
-                .zip(other.data.iter())
-                .map(|(es, eo)| es.mul(alpha) + eo.mul(beta))
-                .collect(),
+            data: Self::dual_combination(&self.data, alpha, &other.data, beta),
             size: self.size,
         }
     }
@@ -72,8 +70,8 @@ impl<F: PrimeField> Shard<F> {
 /// > returns [`None`] if the number of shards is not the same as the number of
 /// > coefficients or if no shards are provided.
 ///
-/// if the shards are the $(s_i)_{1 \le i \le n}$ and the coefficients the
-/// $(\alpha_i)_{0 \le i \le n}$, then the output will be
+/// if the shards are the $(s \_i)\_\{1 \le i \le n\}$ and the coefficients the
+/// $(\alpha\_i)\_\{0 \le i \le n\}$, then the output will be
 ///
 /// $$ \sum\limits_{i = 1}^{n} \alpha_i s_i$$
 pub fn recode_with_coeffs<F: PrimeField>(shards: &[Shard<F>], coeffs: &[F]) -> Option<Shard<F>> {
@@ -104,10 +102,7 @@ pub fn recode_with_coeffs<F: PrimeField>(shards: &[Shard<F>], coeffs: &[F]) -> O
 /// > **Note**
 /// >
 /// > this is a wrapper around [`recode_with_coeffs`].
-pub fn recode_random<F: PrimeField>(
-    shards: &[Shard<F>],
-    rng: &mut impl RngCore,
-) -> Result<Option<Shard<F>>, KomodoError> {
+pub fn recode_random<F: PrimeField>(shards: &[Shard<F>], rng: &mut impl RngCore) -> Result<Option<Shard<F>>, KomodoError> {
     for (i, (s1, s2)) in shards.iter().zip(shards.iter().skip(1)).enumerate() {
         if s1.k != s2.k {
             return Err(KomodoError::IncompatibleShards(format!(
@@ -144,10 +139,7 @@ pub fn recode_random<F: PrimeField>(
 /// matrix. (see [`algebra::split_data_into_field_elements`])
 ///
 /// This is the inverse of [`decode`].
-pub fn encode<F: PrimeField>(
-    data: &[u8],
-    encoding_mat: &Matrix<F>,
-) -> Result<Vec<Shard<F>>, KomodoError> {
+pub fn encode<F: PrimeField>(data: &[u8], encoding_mat: &Matrix<F>) -> Result<Vec<Shard<F>>, KomodoError> {
     let hash = Sha256::hash(data).to_vec();
 
     let k = encoding_mat.height;
-- 
GitLab