This is an automated email from the ASF dual-hosted git repository.

hcr pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/mahout.git


The following commit(s) were added to refs/heads/main by this push:
     new eb67e67d1 Fix LaTeX rendering on website (#889)
eb67e67d1 is described below

commit eb67e67d149509b855d533938dc5b86c99dd39db
Author: Guan-Ming (Wesley) Chiu <[email protected]>
AuthorDate: Wed Jan 21 09:50:19 2026 +0800

    Fix LaTeX rendering on website (#889)
---
 website/_includes/head.html                        |  8 +++--
 website/_layouts/default.html                      |  1 -
 website/_layouts/doc-default.html                  |  2 --
 website/qumat/qdp/concepts/index.md                | 40 +++++++++++-----------
 .../quantum-computing-primer/03_qubits/index.md    | 30 +++++++---------
 .../04_quantum_gates/index.md                      |  4 +--
 .../07_quantum_algorithms/index.md                 |  2 +-
 7 files changed, 41 insertions(+), 46 deletions(-)

diff --git a/website/_includes/head.html b/website/_includes/head.html
index 00339c23b..8ac6d75ed 100644
--- a/website/_includes/head.html
+++ b/website/_includes/head.html
@@ -24,14 +24,15 @@
   <link rel="canonical" href="{{ page.url | replace:'index.html','' | 
absolute_url }}">
   <link rel="alternate" type="application/rss+xml" title="{{ site.title | 
escape }}" href="{{'/feed.xml' | relative_url }}">
 
-  <script type="text/javascript" 
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS_HTML";>
+  <script type="text/x-mathjax-config">
     MathJax.Hub.Config({
       "HTML-CSS": {
         availableFonts: ["TeX"],
       },
       tex2jax: {
-        inlineMath: [['$','$'],["\\(","\\)"]]},
-      displayMath: [ ['$$','$$'], ['\[','\]'] ],
+        inlineMath: [['$','$'],["\\(","\\)"]],
+        displayMath: [['$$','$$'],['\\[','\\]']]
+      },
       TeX: {
         extensions: ["AMSmath.js", "AMSsymbols.js", "color.js"],
         equationNumbers: {
@@ -44,4 +45,5 @@
       "AssistiveMML": { disabled: true }
     });
   </script>
+  <script type="text/javascript" 
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS_HTML";></script>
 </head>
diff --git a/website/_layouts/default.html b/website/_layouts/default.html
index d15854683..1d5d03c07 100644
--- a/website/_layouts/default.html
+++ b/website/_layouts/default.html
@@ -13,6 +13,5 @@
   <script src="/assets/vendor/popper/popper.min.js"></script>
   <script src="/assets/vendor/bootstrap/js/bootstrap.min.js"></script>
   <script src="/assets/header.js"></script>
-  <script 
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
 type="text/javascript"></script>
 </body>
 </html>
diff --git a/website/_layouts/doc-default.html 
b/website/_layouts/doc-default.html
index 63fa5f590..33b1e0052 100644
--- a/website/_layouts/doc-default.html
+++ b/website/_layouts/doc-default.html
@@ -15,8 +15,6 @@
   <script src="/assets/vendor/popper/popper.min.js"></script>
   <script src="/assets/vendor/bootstrap/js/bootstrap.min.js"></script>
   <script src="/assets/header.js"></script>
-  <script 
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
 type="text/javascript"></script>
-
 </body>
 
 </html>
diff --git a/website/qumat/qdp/concepts/index.md 
b/website/qumat/qdp/concepts/index.md
index 2e99cca32..c1acf6373 100644
--- a/website/qumat/qdp/concepts/index.md
+++ b/website/qumat/qdp/concepts/index.md
@@ -30,9 +30,9 @@ Python (qumat.qdp)  →  _qdp (PyO3)  →  qdp-core (Rust)  →  
qdp-kernels (CU
 
 ## 2. What QDP produces: a GPU-resident state vector
 
-QDP encodes classical data into a **state vector** \(|\psi\rangle\) for \(n\) 
qubits.
+QDP encodes classical data into a **state vector** $\vert\psi\rangle$ for $n$ 
qubits.
 
-- **State length**: \(2^{n}\)
+- **State length**: $2^{n}$
 - **Type**: complex numbers (on GPU)
 - **Shape exposed via DLPack**:
   - Single sample: `[1, 2^n]` (always 2D)
@@ -54,11 +54,11 @@ QDP uses a strategy pattern for encoding methods:
 
 All encoders perform input validation (at minimum):
 
-- \(1 \le n \le 30\)
+- $1 \le n \le 30$
 - input is not empty
 - for vector-based encodings: `len(data) <= 2^n`
 
-Note: \(n=30\) is already very large—just the output state for a single sample 
is on the order of \(2^{30}\) complex numbers.
+Note: $n=30$ is already very large—just the output state for a single sample 
is on the order of $2^{30}$ complex numbers.
 
 ---
 
@@ -66,15 +66,15 @@ Note: \(n=30\) is already very large—just the output state 
for a single sample
 
 ### 4.1 Amplitude encoding
 
-**Goal**: represent a real-valued feature vector \(x\) as quantum amplitudes:
+**Goal**: represent a real-valued feature vector $x$ as quantum amplitudes:
 
-\[
-|\psi\rangle = \sum_{i=0}^{2^{n}-1} \frac{x_i}{\|x\|_2}\,|i\rangle
-\]
+$$
+\vert\psi\rangle = \sum_{i=0}^{2^{n}-1} \frac{x_i}{\|x\|_2}\,\vert i\rangle
+$$
 
 Key properties in QDP:
 
-- **Normalization**: QDP computes \(\|x\|_2\) and rejects zero-norm inputs.
+- **Normalization**: QDP computes $\|x\|_2$ and rejects zero-norm inputs.
 - **Padding**: if `len(x) < 2^n`, the remaining amplitudes are treated as 
zeros.
 - **GPU execution**: the normalization and write into the GPU state vector is 
performed by CUDA kernels.
 - **Batch support**: amplitude encoding supports a batch path to reduce kernel 
launch / allocation overhead (recommended when encoding many samples).
@@ -85,16 +85,16 @@ When to use it:
 
 Trade-offs:
 
-- Output size grows exponentially with `num_qubits` (\(2^n\)), so it can 
become memory-heavy quickly.
+- Output size grows exponentially with `num_qubits` ($2^n$), so it can become 
memory-heavy quickly.
 
 ### 4.2 Basis encoding
 
-**Goal**: map an integer index \(i\) into a computational basis state 
\(|i\rangle\).
+**Goal**: map an integer index $i$ into a computational basis state $\vert 
i\rangle$.
 
-For \(n\) qubits with \(0 \le i < 2^n\):
+For $n$ qubits with $0 \le i < 2^n$:
 
-- \(\psi[i] = 1\)
-- \(\psi[j] = 0\) for all \(j \ne i\)
+- $\psi[i] = 1$
+- $\psi[j] = 0$ for all $j \ne i$
 
 Key properties in QDP:
 
@@ -110,7 +110,7 @@ When to use it:
 
 ### 4.3 Angle encoding (planned)
 
-Angle encoding typically maps features to rotation angles (e.g., via 
\(R_x(\theta)\), \(R_y(\theta)\), \(R_z(\theta)\)) and constructs a state by 
applying rotations across qubits.
+Angle encoding typically maps features to rotation angles (e.g., via 
$R_x(\theta)$, $R_y(\theta)$, $R_z(\theta)$) and constructs a state by applying 
rotations across qubits.
 
 **Current status in this codebase**:
 
@@ -125,12 +125,12 @@ QDP is designed to keep the encoded states on the GPU and 
to avoid unnecessary a
 
 ### 5.1 Output state vector allocation
 
-For each encoded sample, QDP allocates a state vector of size \(2^n\). Memory 
usage grows exponentially:
+For each encoded sample, QDP allocates a state vector of size $2^n$. Memory 
usage grows exponentially:
 
 - complex128 uses 16 bytes per element
 - rough output size (single sample) is:
-  - \(2^n \times 16\) bytes for complex128
-  - \(2^n \times 8\) bytes for complex64
+  - $2^n \times 16$ bytes for complex128
+  - $2^n \times 8$ bytes for complex64
 
 QDP performs **pre-flight checks** before large allocations to fail fast with 
an OOM-aware message (e.g., suggesting smaller `num_qubits` or batch size).
 
@@ -174,7 +174,7 @@ Conceptually:
 1. Rust allocates GPU memory for the state vector.
 2. Rust wraps it into a DLPack `DLManagedTensor`.
 3. Python returns an object that implements `__dlpack__`.
-4. PyTorch calls `torch.from_dlpack(qtensor)` and takes ownership via DLPack’s 
deleter.
+4. PyTorch calls `torch.from_dlpack(qtensor)` and takes ownership via DLPack's 
deleter.
 
 Important details:
 
@@ -194,7 +194,7 @@ Important details:
 ### 7.2 Choosing parameters wisely
 
 - **Prefer batch encoding** when encoding many samples (lower overhead, better 
GPU utilization).
-- **Keep `num_qubits` realistic**. Output size is \(2^n\) and becomes the 
dominant cost quickly.
+- **Keep `num_qubits` realistic**. Output size is $2^n$ and becomes the 
dominant cost quickly.
 - **Pick the right encoding**:
   - amplitude: dense real-valued vectors
   - basis: discrete indices / categorical states
diff --git a/website/qumat/quantum-computing-primer/03_qubits/index.md 
b/website/qumat/quantum-computing-primer/03_qubits/index.md
index a5c986cfb..eacd775f0 100644
--- a/website/qumat/quantum-computing-primer/03_qubits/index.md
+++ b/website/qumat/quantum-computing-primer/03_qubits/index.md
@@ -9,36 +9,32 @@ title: Quantum Bits (Qubits)
 
 In classical computing, the fundamental unit of information is the **bit**, 
which can exist in one of two states: `0` or `1`. Quantum computing, however, 
introduces the concept of a **qubit**, which can exist in a **superposition** 
of both states simultaneously. This means a qubit can be in a state that is a 
combination of `0` and `1`, represented as:
 
-$$|\psi\rangle = \alpha|0\rangle + \beta|1\rangle$$
+$$\vert\psi\rangle = \alpha\vert 0\rangle + \beta\vert 1\rangle$$
 
-{% raw %}
 where $\alpha$ and $\beta$ are complex numbers representing the probability
-amplitudes of the qubit being in the $|0\rangle$ and $|1\rangle$ states,
+amplitudes of the qubit being in the $\vert 0\rangle$ and $\vert 1\rangle$ 
states,
 respectively. The probabilities of measuring the qubit in either state are 
given
-by $|\alpha|^2$ and $|\beta|^2$, and they must satisfy the normalization 
condition:
-{% endraw %}
+by $\vert\alpha\vert^2$ and $\vert\beta\vert^2$, and they must satisfy the 
normalization condition:
 
-$$|\alpha|^2 + |\beta|^2 = 1$$
+$$\vert\alpha\vert^2 + \vert\beta\vert^2 = 1$$
 
 ## 3.2 Representing Qubits
 
 Qubits can be visualized using the **Bloch sphere**, a geometric representation
 of the quantum state of a single qubit. The Bloch sphere is a unit sphere where
-the north and south poles represent the $|0\rangle$ and $|1\rangle$ states,
+the north and south poles represent the $\vert 0\rangle$ and $\vert 1\rangle$ 
states,
 respectively. Any point on the surface of the sphere represents a valid quantum
 state of the qubit.
 
 The state of a qubit can also be described using a **state vector** in a
-two-dimensional complex vector space. For example, the state $|0\rangle$ is
+two-dimensional complex vector space. For example, the state $\vert 0\rangle$ 
is
 represented as:
 
-$$|0\rangle = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$$
+$$\vert 0\rangle = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$$
 
-{% raw %}
-and the state $|1\rangle$ is represented as:
-{% endraw %}
+and the state $\vert 1\rangle$ is represented as:
 
-$$|1\rangle = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$$
+$$\vert 1\rangle = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$$
 
 ## 3.3 Creating Qubits with `qumat`
 
@@ -64,11 +60,11 @@ In this example, we initialize a quantum circuit with one 
qubit using the qiskit
 
 ### Example: Applying a Hadamard Gate
 
-The Hadamard gate ((H)) is a fundamental quantum gate that puts a qubit into a
+The Hadamard gate ($H$) is a fundamental quantum gate that puts a qubit into a
 superposition state. Applying the Hadamard gate to a qubit initially in the
-$|0\rangle$ state results in the state:
+$\vert 0\rangle$ state results in the state:
 
-$$H|0\rangle = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)$$
+$$H\vert 0\rangle = \frac{1}{\sqrt{2}}(\vert 0\rangle + \vert 1\rangle)$$
 
 Here's how you can apply a Hadamard gate to a qubit using qumat:
 
@@ -83,7 +79,7 @@ print(result)
 
 In this example, the Hadamard gate is applied to the qubit at index 0, and the
 circuit is executed to obtain the measurement results. The output will show the
-probabilities of measuring the qubit in the $|0\rangle$ and $|1\rangle$ states.
+probabilities of measuring the qubit in the $\vert 0\rangle$ and $\vert 
1\rangle$ states.
 
 ### Visualizing the Circuit
 
diff --git a/website/qumat/quantum-computing-primer/04_quantum_gates/index.md 
b/website/qumat/quantum-computing-primer/04_quantum_gates/index.md
index ab5a747b7..2892ec28f 100644
--- a/website/qumat/quantum-computing-primer/04_quantum_gates/index.md
+++ b/website/qumat/quantum-computing-primer/04_quantum_gates/index.md
@@ -40,9 +40,9 @@ Multi-qubit gates operate on two or more qubits, enabling 
entanglement and more
 complex quantum operations. Some of the most common multi-qubit gates include:
 
 - **CNOT Gate (Controlled-NOT)**: Flips the target qubit if the control qubit 
is
-in the state $|1\rangle$.
+in the state $\vert 1\rangle$.
 - **Toffoli Gate (CCNOT)**: A controlled-controlled-NOT gate that flips the
-target qubit if both control qubits are in the state $|1\rangle$.
+target qubit if both control qubits are in the state $\vert 1\rangle$.
 - **SWAP Gate**: Exchanges the states of two qubits.
 
 ### Example: Applying a CNOT Gate
diff --git 
a/website/qumat/quantum-computing-primer/07_quantum_algorithms/index.md 
b/website/qumat/quantum-computing-primer/07_quantum_algorithms/index.md
index c1479692f..5275db968 100644
--- a/website/qumat/quantum-computing-primer/07_quantum_algorithms/index.md
+++ b/website/qumat/quantum-computing-primer/07_quantum_algorithms/index.md
@@ -118,7 +118,7 @@ print(result)
 ```
 
 ### Explanation
-- The oracle marks the desired state (e.g., $|110\rangle$).
+- The oracle marks the desired state (e.g., $\vert 110\rangle$).
 - The diffusion operator amplifies the probability of measuring the marked 
state.
 - After running the algorithm, the marked state will have a higher probability 
of being measured.
 

Reply via email to