dense-evolution 8.0.2__tar.gz → 8.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/PKG-INFO +667 -138
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/README.md +658 -133
- dense_evolution-8.0.4/dash.py +4075 -0
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/dense_evolution.egg-info/PKG-INFO +667 -138
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/dense_evolution.egg-info/SOURCES.txt +1 -0
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/dense_evolution.egg-info/requires.txt +6 -0
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/dense_evolution.egg-info/top_level.txt +1 -0
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/dense_evolution.py +45 -6
- dense_evolution-8.0.4/pyproject.toml +38 -0
- dense_evolution-8.0.2/pyproject.toml +0 -73
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/dense_evolution.egg-info/dependency_links.txt +0 -0
- {dense_evolution-8.0.2 → dense_evolution-8.0.4}/setup.cfg +0 -0
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dense-evolution
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.4
|
|
4
4
|
Summary: Micro-optimized High-Performance NISQ Statevector Quantum Circuit Simulator (Hardware-Adaptive Integration of Native NumPy, CUDA-Accelerated CuPy, and Linear Kernel Fusion via JAX JIT/XLA Compilation)
|
|
5
5
|
Author-email: Salvatore Pennacchio <jtatopenn@libero.it>
|
|
6
|
-
License:
|
|
6
|
+
License: Proprietary
|
|
7
7
|
Project-URL: Homepage, https://github.com/tatopenn-cell/Dense-Evolution
|
|
8
|
-
Project-URL: Documentation, https://github.com/tatopenn-cell/Dense-Evolution/
|
|
8
|
+
Project-URL: Documentation, https://github.com/tatopenn-cell/Dense-Evolution/blob/main/LICENSE
|
|
9
9
|
Project-URL: Repository, https://github.com/tatopenn-cell/Dense-Evolution
|
|
10
10
|
Project-URL: Bug Tracker, https://github.com/tatopenn-cell/Dense-Evolution/blob/main/dense_evolution.py
|
|
11
|
-
Keywords: quantum-computing,quantum-simulation,statevector,jax,cupy,cuda-acceleration,openqasm,nisq-noise,hpc,linear-kernel-fusion
|
|
11
|
+
Keywords: quantum-computing,quantum-simulation,statevector,jax,cupy,cuda-acceleration,openqasm,nisq-noise,hpc,linear-kernel-fusion,dashboard,visualization
|
|
12
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
13
|
Classifier: Intended Audience :: Science/Research
|
|
14
14
|
Classifier: Intended Audience :: Developers
|
|
15
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
16
15
|
Classifier: Programming Language :: Python :: 3
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.9
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -30,18 +29,23 @@ Requires-Dist: jax>=0.4.0; extra == "jax"
|
|
|
30
29
|
Requires-Dist: jaxlib>=0.4.0; extra == "jax"
|
|
31
30
|
Provides-Extra: gpu
|
|
32
31
|
Requires-Dist: cupy-cuda12x>=12.0.0; extra == "gpu"
|
|
32
|
+
Provides-Extra: dashboard
|
|
33
|
+
Requires-Dist: dash>=2.0.0; extra == "dashboard"
|
|
34
|
+
Requires-Dist: plotly>=5.0.0; extra == "dashboard"
|
|
33
35
|
Provides-Extra: full
|
|
34
36
|
Requires-Dist: jax>=0.4.0; extra == "full"
|
|
35
37
|
Requires-Dist: jaxlib>=0.4.0; extra == "full"
|
|
36
38
|
Requires-Dist: cupy-cuda12x>=12.0.0; extra == "full"
|
|
39
|
+
Requires-Dist: dash>=2.0.0; extra == "full"
|
|
40
|
+
Requires-Dist: plotly>=5.0.0; extra == "full"
|
|
37
41
|
|
|
38
|
-
# 💎 Dense Evolution
|
|
42
|
+
# 💎 Dense Evolution 8.0.4
|
|
39
43
|
|
|
40
44
|
|
|
41
45
|
[](https://github.com/tatopenn-cell/Dense-Evolution/actions/workflows/ci.yml)
|
|
42
46
|
[](https://pypi.org/project/dense-evolution/)
|
|
43
47
|
[](https://www.python.org/)
|
|
44
|
-
[](https://github.com/tatopenn-cell/Dense-Evolution/blob/main/LICENSE)
|
|
45
49
|
[](https://github.com/tatopenn-cell/Dense-Evolution/actions)
|
|
46
50
|
|
|
47
51
|
# pip install dense-evolution
|
|
@@ -330,32 +334,76 @@ Dense-Evolution/
|
|
|
330
334
|
|
|
331
335
|
---
|
|
332
336
|
|
|
333
|
-
## 📜
|
|
337
|
+
## 📜 License and Legal Notice
|
|
338
|
+
|
|
339
|
+
This project is distributed under the terms of the **Business Source License 1.1 (BSL 1.1)**.
|
|
340
|
+
|
|
341
|
+
* **Non-Commercial Use:** Completely free and open for research, academic, and non-commercial purposes.
|
|
342
|
+
* **Limited Commercial Use:** Free for commercial production up to **24 qubits** and **1,000 circuits (with max 10,000 shots each) per day**. Any use beyond these limits requires a separate commercial license.
|
|
343
|
+
* **Future Open Source Transition:** On **June 1, 2026**, this project will automatically transition to a fully open-source **Apache License 2.0**.
|
|
334
344
|
|
|
335
|
-
Il progetto è interamente distribuito sotto i termini della licenza **MIT**.
|
|
336
345
|
|
|
337
346
|
```text
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
of
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
347
|
+
# Business Source License 1.1 (BSL 1.1)
|
|
348
|
+
|
|
349
|
+
**Software:** Dense Evolution
|
|
350
|
+
**Licensor:** Salvatore Pennacchio <jtatopenn@libero.it> [tatopenn-cell]
|
|
351
|
+
|
|
352
|
+
This Business Source License (the "License") applies to the source code, object code, algorithms, and configuration files of the software named "Dense Evolution" (the "Software").
|
|
353
|
+
|
|
354
|
+
## 1. License Parameters
|
|
355
|
+
|
|
356
|
+
* **Licensor:** Salvatore Pennacchio <jtatopenn@libero.it> [tatopenn-cell]
|
|
357
|
+
* **Software:** Dense Evolution (including updates, patches, kernel optimizations, and derivative works provided by the Licensor)
|
|
358
|
+
* **Change Date:** June 1, 2029
|
|
359
|
+
* **Change License:** Apache License, Version 2.0 (or subsequent versions, at the Licensor's sole discretion)
|
|
360
|
+
* **Licensed Use for Production:** Strictly non-commercial use. For use in commercial or industrial production environments, the computational limits set forth in Section 4 (Additional Use Grant) shall strictly apply.
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## 2. Grant of License and Attribution Obligation
|
|
365
|
+
|
|
366
|
+
Subject to the terms and computational limitations established herein, the Licensor hereby grants to the Licensee a non-exclusive, worldwide, royalty-free, and irrevocable (conditional upon continuous compliance with these terms) license to use, reproduce, distribute, modify, and create derivative works of the Software.
|
|
367
|
+
|
|
368
|
+
**Mandatory Attribution Condition:** Any copy, portion, or derivative work of the Software (including third-party software, cloud platforms, or API interfaces integrating Dense Evolution) must visibly, permanently, and unaltered include the original copyright notice and attribution to the Licensor in the following format:
|
|
369
|
+
`© 2026 Salvatore Pennacchio <jtatopenn@libero.it> [tatopenn-cell] - Dense Evolution`.
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## 3. General Use Conditions and Restrictions
|
|
374
|
+
|
|
375
|
+
The Software may be used, reproduced, distributed, and modified, provided that such use is **not intended for commercial production purposes** or for providing commercial cloud/computational services that compete directly with the products or services offered by the Licensor, except as expressly permitted under Section 4 or as of the Change Date (Section 5).
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## 4. Additional Use Grant (Limited Commercial Use)
|
|
380
|
+
|
|
381
|
+
Notwithstanding the restrictions in Section 3, the Licensee is authorized to use the Software for commercial production, industrial, or paid consulting purposes, without the need for a separate paid license, exclusively if the following computational limits are respected:
|
|
382
|
+
|
|
383
|
+
* **Total Qubit Limit:** The executed quantum simulation must not exceed a size of **24 qubits allocated in memory**. This limit applies to the cumulative sum of all instances, processes, threads, or parallel cluster nodes running concurrently by the same organization or end user.
|
|
384
|
+
* **Circuits and Shots Limit:** The maximum computational volume allowed in a production environment is fixed at **1000 distinct quantum circuit structures per day**, each of which may be executed for a maximum of **10,000 equivalent samples (shots)** per individual circuit.
|
|
385
|
+
|
|
386
|
+
Any use that exceeds or circumvents (via splitting, wrapping, or proxy techniques) any single parameter listed above strictly requires the prior execution of a separate commercial license agreement with the Licensor.
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## 5. Transition to Change License
|
|
391
|
+
|
|
392
|
+
As of **June 1, 2029** (the "Change Date"), this License shall automatically cease to have effect on the Software and all versions released prior to that date. From that moment forward, the Software will permanently and freely become available under the terms of the **Apache License 2.0**. Until the Change Date, this BSL 1.1 License shall remain in full force, validity, and effect.
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## 6. Disclaimer of Warranty and Limitation of Liability
|
|
397
|
+
|
|
398
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
399
|
+
|
|
400
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## 7. Governing Law and Jurisdiction
|
|
405
|
+
|
|
406
|
+
This License shall be governed by, construed, and enforced in accordance with the laws of **Italy**. Any dispute arising out of or in connection with the interpretation, execution, or validity of this License shall be submitted to the exclusive jurisdiction of the **Court of Milan, Italy**.
|
|
359
407
|
```
|
|
360
408
|
|
|
361
409
|
## 💎 Technical Appendix: Advanced JAX XLA Optimizations
|
|
@@ -399,75 +447,47 @@ jax.block_until_ready(sv_final)
|
|
|
399
447
|
|
|
400
448
|
print(f"🚀 Tempo di calcolo puro in Beast Mode: {time.time() - start:.6f} secondi")
|
|
401
449
|
```
|
|
402
|
-
## 🛠️ 2. Native OpenQASM 2.0 Integration via QASMParser
|
|
403
|
-
The QASMParser module parses OpenQASM 2.0 source code, translating instructions directly into the flat linear format required by the simulation backend. The raw text string is processed natively by the parse() method, which outputs a valid QASMCircuit object. This architecture eliminates the need for external dictionary maps or manual type adapters.
|
|
404
|
-
Before execution, the circuit object can be verified through the native validate() method to guarantee structural integrity and prevent runtime exceptions during deep JIT compilation.
|
|
405
450
|
|
|
406
|
-
## OpenQASM
|
|
451
|
+
## 🪐 High-Performance OpenQASM 3.0 Hybrid Execution Engine
|
|
407
452
|
|
|
408
|
-
|
|
409
|
-
import dense_evolution as de
|
|
453
|
+
The `DenseSVSimulator` features an integrated OpenQASM 3.0 compilation pipeline. It bridges hardware specifications with optimized static compilation layers. The engine maps high-level instructions directly into unified JAX XLA operations, eliminating tracking degradation and runtime interpreter bottlenecks.
|
|
410
454
|
|
|
411
|
-
|
|
412
|
-
qasm_string = """
|
|
413
|
-
OPENQASM 2.0;
|
|
414
|
-
include "qelib1.inc";
|
|
415
|
-
qreg q[2];
|
|
416
|
-
h q[0];
|
|
417
|
-
cx q[0], q[1];"""
|
|
455
|
+
### ⚙️ Key Computational Paradigms
|
|
418
456
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
# 2. Parsing direct
|
|
424
|
-
parsed_circuit = parser.parse(qasm_string)
|
|
425
|
-
|
|
426
|
-
# DEBUG: Print the structure of parsed_circuit.ops
|
|
427
|
-
print(f"DEBUG: parsed_circuit.ops type: {type(parsed_circuit.ops)}")
|
|
428
|
-
print(f"DEBUG: parsed_circuit.ops content: {parsed_circuit.ops}")
|
|
429
|
-
|
|
430
|
-
# 3. Esecution of circuit in Beast Mode
|
|
431
|
-
# According to dense_evolution.py source code, the QASMCircuit object stores gates in 'ops' attribute.
|
|
432
|
-
# The previous KeyError indicates a format mismatch, not an AttributeError.
|
|
433
|
-
# We need to convert parsed_circuit.ops to the format expected by run_circuit_jit_beast_mode.
|
|
457
|
+
* **Zero-Overhead Control Flow**
|
|
458
|
+
Conditional `if/else` branches compile without breaking execution streams.
|
|
459
|
+
This setup eliminates host-level loop delays during mid-circuit measurements.
|
|
434
460
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
gate_name = op['name']
|
|
439
|
-
qubits = op['qubits']
|
|
440
|
-
# Combine name and qubits into a tuple, ensuring qubits are appended as individual arguments
|
|
441
|
-
converted_circuit_list.append(tuple([gate_name] + qubits))
|
|
461
|
+
* **Micro-Fused AST Translation**
|
|
462
|
+
The `QASMParser` resolves complex sub-routines and multi-dimensional registers.
|
|
463
|
+
It generates a flattened primitive topology for the Beast Mode engine.
|
|
442
464
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
print(f"✅ State final after parsing QASM: {statevector}")
|
|
447
|
-
print(f"Probability extraction: {sim.get_probabilities()}")
|
|
448
|
-
```
|
|
465
|
+
* **Deterministic Resource Bound**
|
|
466
|
+
Strictly handles dynamic mathematical arguments like $\text{rx}(\pi/4 \times \theta)$.
|
|
467
|
+
It preserves a machine-epsilon zero-drift footprint ($\Delta = 1.11 \times 10^{-16}$) during updates.
|
|
449
468
|
|
|
450
|
-
## Simulating and Measuring the QASM 3.0 Circuit
|
|
451
|
-
Now, let's simulate the QASM 3.0 circuit we just parsed and see the measurement results using the DenseSVSimulator's measure method.
|
|
452
469
|
|
|
453
470
|
```python
|
|
454
471
|
import dense_evolution as de
|
|
472
|
+
import numpy as np
|
|
455
473
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
qubit[
|
|
474
|
+
sim = de.DenseSVSimulator(n_qubits=3, use_gpu=False, use_float32=False)
|
|
475
|
+
|
|
476
|
+
qasm3_program = """OPENQASM 3.0;
|
|
477
|
+
include "stdgates.inc";
|
|
478
|
+
qubit[3] q;
|
|
461
479
|
bit[2] c;
|
|
462
480
|
h q[0];
|
|
463
481
|
cx q[0], q[1];
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
482
|
+
bit c[0] = measure q[0];
|
|
483
|
+
if (c[0] == 1) {
|
|
484
|
+
x q[2];
|
|
485
|
+
}
|
|
467
486
|
"""
|
|
468
|
-
parsed_circuit = parser.parse(qasm3_circuit_str)
|
|
469
487
|
|
|
470
|
-
|
|
488
|
+
parser = de.QASMParser()
|
|
489
|
+
parsed_circuit = parser.parse(qasm3_program)
|
|
490
|
+
|
|
471
491
|
def convert_ops_for_simulator(ops_list):
|
|
472
492
|
converted_ops = []
|
|
473
493
|
for op in ops_list:
|
|
@@ -475,50 +495,26 @@ def convert_ops_for_simulator(ops_list):
|
|
|
475
495
|
qubits = op['qubits']
|
|
476
496
|
params = op['params']
|
|
477
497
|
if params:
|
|
478
|
-
# For parametric gates, format is (name, param1, ..., paramN, qubit1, ..., qubitN)
|
|
479
498
|
converted_ops.append(tuple([name] + params + qubits))
|
|
480
499
|
else:
|
|
481
|
-
# For non-parametric gates, format is (name, qubit1, ..., qubitN)
|
|
482
500
|
converted_ops.append(tuple([name] + qubits))
|
|
483
501
|
return converted_ops
|
|
484
502
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
# Instantiate the DenseSVSimulator
|
|
489
|
-
sim = de.DenseSVSimulator(n_qubits=parsed_circuit.n_qubits)
|
|
490
|
-
|
|
491
|
-
# Run the parsed circuit through the simulator
|
|
492
|
-
# We'll run it a few times to see different measurement outcomes due to quantum randomness
|
|
493
|
-
print("\n--- Simulating and Measuring ---")
|
|
494
|
-
num_shots = 10
|
|
495
|
-
measurements = []
|
|
496
|
-
for _ in range(num_shots):
|
|
497
|
-
sim.set_initial_state() # Corrected: used set_initial_state() instead of reset_state()
|
|
498
|
-
sim.run_circuit_jit_beast_mode(simulator_ops) # Use the converted operations list
|
|
503
|
+
circuit_operations = convert_ops_for_simulator(parsed_circuit.ops)
|
|
504
|
+
sim.run_circuit_jit_beast_mode(circuit_operations)
|
|
499
505
|
|
|
500
|
-
|
|
501
|
-
# sim.measure(qubit_idx) returns 0 or 1 for the specified qubit
|
|
502
|
-
measured_c0 = sim.measure(0) # Measure q[0] into c[0]
|
|
503
|
-
measured_c1 = sim.measure(1) # Measure q[1] into c[1]
|
|
504
|
-
measurements.append((measured_c0, measured_c1))
|
|
506
|
+
final_state = sim.get_statevector()
|
|
505
507
|
|
|
506
|
-
print(
|
|
508
|
+
print("\n" + "="*60)
|
|
509
|
+
print("📊 REPORT - DENSE-EVOLUTION OPENQASM 3.0")
|
|
510
|
+
print("="*60)
|
|
511
|
+
print(f"🔹 Probability Vector:\n{sim.get_probabilities()}\n")
|
|
507
512
|
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
print("
|
|
511
|
-
|
|
512
|
-
sim.run_circuit_jit_beast_mode(simulator_ops)
|
|
513
|
-
probabilities = sim.get_probabilities()
|
|
514
|
-
print(probabilities)
|
|
513
|
+
norma = np.sum(np.abs(final_state)**2)
|
|
514
|
+
print(f"🔹 State Unitary Tolerance: {norma:.4f}")
|
|
515
|
+
print("🔍 Drift Verification:", "DONE" if np.isclose(norma, 1.0) else "ANOMALY")
|
|
516
|
+
print("="*60)
|
|
515
517
|
|
|
516
|
-
# Display top probabilities for clarity
|
|
517
|
-
import numpy as np
|
|
518
|
-
sorted_indices = np.argsort(probabilities)[::-1]
|
|
519
|
-
print("\nTop 5 probabilities:")
|
|
520
|
-
for i in sorted_indices[:5]:
|
|
521
|
-
print(f"State |{i:0{parsed_circuit.n_qubits}b}⟩: {probabilities[i]:.4f}")
|
|
522
518
|
```
|
|
523
519
|
------------------------------
|
|
524
520
|
## 🧠 3. Stochastic Noise Simulation (NoiseModel)
|
|
@@ -1144,34 +1140,567 @@ print("="*80)
|
|
|
1144
1140
|
* Circuit optimization loops: VQE, QAOA, variational algorithms with fixed structure
|
|
1145
1141
|
* Shot-based sampling simulation: Execute same circuit many times with different measurements
|
|
1146
1142
|
|
|
1147
|
-
## ⚠️
|
|
1143
|
+
## ⚠️ Performance & Scaling Limitations
|
|
1144
|
+
|
|
1145
|
+
* **Memory Overhead:** The dense statevector simulation approach scales exponentially. On standard hardware architectures, execution is optimal up to **~24 qubits**. For deep or larger scale systems, consider alternative approaches like Matrix Product States (MPS).
|
|
1146
|
+
* **Licensing Threshold:** Please note that while the hardware can push further, commercial production use is capped at **24 qubits** under the terms of the BSL 1.1 license.
|
|
1147
|
+
|
|
1148
|
+
## 🚀 Hardware Recommendations & Benchmarks
|
|
1149
|
+
|
|
1150
|
+
|
|
1151
|
+
| Hardware Platform | Max Practical Qubits (Dense) | Performance Gain vs Qiskit | Operational Notes |
|
|
1152
|
+
| :--- | :---: | :---: | :--- |
|
|
1153
|
+
| **Standard CPU** *(e.g., Colab Free)* | 24 | **120x – 5,000x+** | Verified and benchmarked baseline configuration. |
|
|
1154
|
+
| **High-RAM CPU** *(16+ GB RAM)* | 26 | **120x – 5,000x+** | Performance scales with host memory bandwidth. |
|
|
1155
|
+
| **NVIDIA GPU** *(CUDA-Enabled)* | 28+ | **10,000x+** * | Accelerated via CuPy backend execution. |
|
|
1156
|
+
| **Google Cloud TPU** | 28+ | **20,000x+** * | Optimized via JAX native XLA compilation. |
|
|
1148
1157
|
|
|
1149
|
-
|
|
1158
|
+
*\*Note: GPU/TPU performance gains are projected based on JAX/XLA scaling characteristics and native kernel execution profiles. Full automated benchmarks will be introduced in upcoming releases.*
|
|
1150
1159
|
|
|
1151
|
-
##
|
|
1160
|
+
## 🧠 Architectural Insights: Why is it so fast?
|
|
1152
1161
|
|
|
1153
|
-
|
|
1162
|
+
1. **JAX JIT Compilation:** Circuit operations are JIT-compiled directly into highly optimized XLA machine code, entirely bypassing the Python interpreter overhead.
|
|
1163
|
+
2. **Linear Kernel Fusion:** Multiple sequential gate operations are fused dynamically into single monolithic CPU/GPU computational kernels, minimizing memory roundtrips.
|
|
1164
|
+
3. **Hardware-Adaptive Memory Layout:** Contiguous statevector memory storage architecture, highly optimized for vectorization and parallel cache locality.
|
|
1165
|
+
4. **Graph Caching:** Compiled execution graphs are automatically cached and reused across subsequent execution loops or optimization shots.
|
|
1166
|
+
|
|
1167
|
+
## 🤝 Contribute Benchmarks
|
|
1168
|
+
|
|
1169
|
+
Discovered different scaling behavior or performance metrics on your specific hardware stack? Help us refine and map the performance of **Dense Evolution**! Please open an Issue or Pull Request providing:
|
|
1170
|
+
|
|
1171
|
+
* **Hardware Topology:** Exact CPU/GPU models, Host RAM, and CUDA toolkit version.
|
|
1172
|
+
* **Reproducible Example:** Code snippet or script used for the test run.
|
|
1173
|
+
* **Execution Metrics:** Timing results and memory allocation logs.
|
|
1174
|
+
|
|
1175
|
+
# Dense Evolution — Enterprise Dashboard v8.0.4
|
|
1176
|
+
|
|
1177
|
+
**Interactive scientific visualization suite for the Dense Evolution quantum simulation ecosystem.**
|
|
1178
|
+
|
|
1179
|
+
---
|
|
1180
|
+
|
|
1181
|
+
## Table of Contents
|
|
1182
|
+
|
|
1183
|
+
1. [Overview](#1-overview)
|
|
1184
|
+
2. [Quick Start](#2-quick-start)
|
|
1185
|
+
3. [Configuration](#3-configuration)
|
|
1186
|
+
4. [Architecture](#4-architecture)
|
|
1187
|
+
5. [Control Panel Reference](#5-control-panel-reference)
|
|
1188
|
+
6. [Circuit Library](#6-circuit-library)
|
|
1189
|
+
7. [VQE Engine & ADAM Optimizer](#7-vqe-engine--adam-optimizer)
|
|
1190
|
+
8. [Hamiltonian Library](#8-hamiltonian-library)
|
|
1191
|
+
9. [Noise Models](#9-noise-models)
|
|
1192
|
+
10. [Molecular Dynamics](#10-molecular-dynamics)
|
|
1193
|
+
11. [Visualization Panels](#11-visualization-panels)
|
|
1194
|
+
12. [Export & Provenance](#12-export--provenance)
|
|
1195
|
+
13. [Technical Reference](#13-technical-reference)
|
|
1196
|
+
14. [Troubleshooting](#14-troubleshooting)
|
|
1197
|
+
15. [License](#15-license)
|
|
1198
|
+
|
|
1199
|
+
---
|
|
1200
|
+
|
|
1201
|
+
## 1. Overview
|
|
1202
|
+
|
|
1203
|
+
The Dense Evolution Enterprise Dashboard is a high-throughput interactive visualization layer built on top of the `dense-evolution` core engine. It runs entirely inside Google Colab or any Jupyter-compatible environment via `ipywidgets` and `matplotlib`, with zero external server dependencies.
|
|
1204
|
+
|
|
1205
|
+
**Key capabilities:**
|
|
1206
|
+
|
|
1207
|
+
- Live statevector simulation on up to 24 qubits (commercial-grade; up to 33 qubits in research mode) via a JAX XLA JIT-compiled backend with optional GPU acceleration
|
|
1208
|
+
- Six parallel telemetry channels: VQE energy, Von Neumann entropy, state purity, gradient norm, noise factor, and θ correction, updated on every run
|
|
1209
|
+
- Dynamic routing across six visualization panels — Overview, State Physics, 1008q Mosaic, VQE Results, MD Simulation Results, and Performance
|
|
1210
|
+
- Full NISQ noise simulation (depolarizing, amplitude damping, phase damping) with Bhattacharyya fidelity and TVD metrics computed live
|
|
1211
|
+
- Variational quantum eigensolver (VQE) with analytical Hellmann-Feynman gradient via JAX automatic differentiation and ADAM optimizer
|
|
1212
|
+
- Molecular dynamics (QM/MM) simulation with Pearson correlation heatmap across all telemetry variables
|
|
1213
|
+
- One-click JSON provenance export and publication-ready PNG output at 300 DPI
|
|
1214
|
+
- BSL 1.1 licensed with automatic Apache 2.0 conversion on 1 June 2029
|
|
1215
|
+
|
|
1216
|
+
---
|
|
1217
|
+
|
|
1218
|
+
## 2. Quick Start
|
|
1219
|
+
|
|
1220
|
+
### Installation
|
|
1221
|
+
|
|
1222
|
+
```bash
|
|
1223
|
+
pip install dense-evolution
|
|
1224
|
+
```
|
|
1225
|
+
|
|
1226
|
+
The dashboard auto-installs the core engine on first run if not detected.
|
|
1227
|
+
|
|
1228
|
+
### Launch
|
|
1229
|
+
|
|
1230
|
+
Upload `dash.py`, `dashboard.toml`, and optionally your custom QASM files to your Colab workspace, then run:
|
|
1231
|
+
|
|
1232
|
+
```python
|
|
1233
|
+
from dash import dashboard_unificata
|
|
1234
|
+
from IPython.display import display
|
|
1235
|
+
|
|
1236
|
+
display(dashboard_unificata)
|
|
1237
|
+
```
|
|
1238
|
+
|
|
1239
|
+
The full control panel appears inline. Press **▶ Run Simulation** to execute the selected circuit and render all panels.
|
|
1240
|
+
|
|
1241
|
+
### Minimal Example (headless)
|
|
1242
|
+
|
|
1243
|
+
```python
|
|
1244
|
+
import dense_evolution as de
|
|
1245
|
+
|
|
1246
|
+
sim = de.DenseSVSimulator(n_qubits=4, use_gpu=False, use_float32=False)
|
|
1247
|
+
parser = de.QASMParser()
|
|
1248
|
+
circuit = parser.parse(QASM_LIBRARY['Bell |Φ+⟩'])
|
|
1249
|
+
sim.run_circuit_jit_beast_mode(circuit.ops)
|
|
1250
|
+
|
|
1251
|
+
print(sim.get_probabilities()) # [0.5, 0.0, 0.0, 0.5]
|
|
1252
|
+
print(sim.memory_mb()) # 0.000256 MB
|
|
1253
|
+
```
|
|
1254
|
+
|
|
1255
|
+
---
|
|
1256
|
+
|
|
1257
|
+
## 3. Configuration
|
|
1258
|
+
|
|
1259
|
+
Persistent settings are stored in `dashboard.toml`. All values are readable by the dashboard on load; changes take effect on the next kernel restart.
|
|
1260
|
+
|
|
1261
|
+
```toml
|
|
1262
|
+
[theme]
|
|
1263
|
+
style = "dark"
|
|
1264
|
+
primary_color = "#FFA500"
|
|
1265
|
+
secondary_color = "#8A2BE2"
|
|
1266
|
+
background = "#0D0E15"
|
|
1267
|
+
font_family = "monospace"
|
|
1268
|
+
|
|
1269
|
+
[simulator_defaults]
|
|
1270
|
+
max_qubits = 24 # BSL commercial limit
|
|
1271
|
+
default_qubits = 4
|
|
1272
|
+
precision = "float64"
|
|
1273
|
+
use_gpu = false
|
|
1274
|
+
use_jax = true
|
|
1275
|
+
sealed_compiler_v4 = true # enables XLA kernel fusion
|
|
1276
|
+
|
|
1277
|
+
[nisq_settings]
|
|
1278
|
+
default_shots = 4096
|
|
1279
|
+
default_seed = 42
|
|
1280
|
+
default_noise_model = "ideal"
|
|
1281
|
+
default_p_noise = 0.00
|
|
1282
|
+
|
|
1283
|
+
[vqe_settings]
|
|
1284
|
+
epochs = 100
|
|
1285
|
+
learning_rate = 0.01
|
|
1286
|
+
beta1 = 0.90
|
|
1287
|
+
beta2 = 1.00
|
|
1288
|
+
optimizer = "ADAM"
|
|
1289
|
+
gradient_method = "Hellmann-Feynman"
|
|
1290
|
+
|
|
1291
|
+
[md_settings]
|
|
1292
|
+
steps = 100
|
|
1293
|
+
temperature_k = 300.00
|
|
1294
|
+
force_engine = "QM/MM"
|
|
1295
|
+
```
|
|
1296
|
+
|
|
1297
|
+
---
|
|
1298
|
+
|
|
1299
|
+
## 4. Architecture
|
|
1300
|
+
|
|
1301
|
+
```
|
|
1302
|
+
dash.py
|
|
1303
|
+
│
|
|
1304
|
+
├── PART 1 — JIT Compute Engine
|
|
1305
|
+
│ ├── dense-evolution auto-install & parametric patch injection
|
|
1306
|
+
│ ├── QASM_LIBRARY (80+ built-in circuits)
|
|
1307
|
+
│ ├── estrai_valore_puro() (deep AST token unwrapper)
|
|
1308
|
+
│ └── core_calcolo_quantistico()
|
|
1309
|
+
│ ├── QASMParser → AST → comandi_beast_mode[]
|
|
1310
|
+
│ ├── DenseSVSimulator.run_circuit_jit_beast_mode()
|
|
1311
|
+
│ ├── NoiseModel.apply_to_sv() (if noise ≠ ideal)
|
|
1312
|
+
│ ├── Shannon entropy, Bhattacharyya fidelity, TVD
|
|
1313
|
+
│ └── returns res{} dict → all panels
|
|
1314
|
+
│
|
|
1315
|
+
├── PART 2 — VQE Engine (ottimizza_vqe)
|
|
1316
|
+
│ ├── positional parameter injection into AST
|
|
1317
|
+
│ ├── QMMMForceEngine (Hellmann-Feynman via JAX AD)
|
|
1318
|
+
│ ├── ADAM optimizer (m, v moments, bias correction)
|
|
1319
|
+
│ └── df_vqe_telemetry → Step, VQE_Energy, Entropy,
|
|
1320
|
+
│ Purity, Gradient, Noise_Factor,
|
|
1321
|
+
│ Theta_Correction
|
|
1322
|
+
│
|
|
1323
|
+
├── PART 3 — MD Simulation (run_md_simulation_dummy)
|
|
1324
|
+
│ ├── df_md_telemetry
|
|
1325
|
+
│ └── matrice_correlazione (Pearson, full × full)
|
|
1326
|
+
│
|
|
1327
|
+
├── PART 4 — Visualization Panels
|
|
1328
|
+
│ ├── build_panel_overview() 8-row scientific dashboard
|
|
1329
|
+
│ ├── build_panel_fisica() state physics analysis
|
|
1330
|
+
│ ├── build_panel_mosaico() 1008-qubit probability mosaic
|
|
1331
|
+
│ ├── build_panel_vqe_results() VQE-specific telemetry
|
|
1332
|
+
│ ├── build_panel_md_results() MD telemetry + correlation heatmap
|
|
1333
|
+
│ └── build_panel_performance() benchmark metrics
|
|
1334
|
+
│
|
|
1335
|
+
└── PART 5 — ipywidgets UI + routing
|
|
1336
|
+
├── dashboard_unificata (VBox)
|
|
1337
|
+
├── trigger_esecuzione_dashboard() → run → route → display
|
|
1338
|
+
└── auxiliary triggers: benchmark, export, PNG, history
|
|
1339
|
+
```
|
|
1340
|
+
|
|
1341
|
+
**Data flow on each run:**
|
|
1342
|
+
|
|
1343
|
+
```
|
|
1344
|
+
▶ Run → core_calcolo_quantistico() → res{}
|
|
1345
|
+
│
|
|
1346
|
+
┌────────────────────┤
|
|
1347
|
+
│ │
|
|
1348
|
+
ottimizza_vqe() run_md_simulation_dummy()
|
|
1349
|
+
│ │
|
|
1350
|
+
df_vqe_telemetry df_md_telemetry + matrice_correlazione
|
|
1351
|
+
│ │
|
|
1352
|
+
└────────────────────┘
|
|
1353
|
+
│
|
|
1354
|
+
build_panel_*(res) → Figure → display()
|
|
1355
|
+
```
|
|
1356
|
+
|
|
1357
|
+
---
|
|
1358
|
+
|
|
1359
|
+
## 5. Control Panel Reference
|
|
1360
|
+
|
|
1361
|
+
### Source
|
|
1362
|
+
|
|
1363
|
+
| Control | Type | Description |
|
|
1364
|
+
|---|---|---|
|
|
1365
|
+
| **Source Mode** | RadioButtons | `Libreria Built-in` uses a preset from the QASM library. `Custom QASM Textarea` enables direct QASM 2.0 input. |
|
|
1366
|
+
| **Circuit** | Dropdown | Active when source mode is Built-in. Selects from 80+ preset circuits organized across five categories. |
|
|
1367
|
+
| **QASM Area** | Textarea | Active when source mode is Custom. Accepts any valid OpenQASM 2.0 string. |
|
|
1368
|
+
|
|
1369
|
+
### Hamiltonian
|
|
1370
|
+
|
|
1371
|
+
| Control | Type | Description |
|
|
1372
|
+
|---|---|---|
|
|
1373
|
+
| **Enable Hamiltonian Settings** | Checkbox | Activates the Hamiltonian sub-panel. When disabled, the engine uses a random diagonal Hamiltonian. |
|
|
1374
|
+
| **Hamiltonian Mode** | RadioButtons | `Hamiltonian Built-in` selects from the built-in chemical library. `Custom Hamiltonian Textarea` accepts a JSON array of energy eigenvalues. |
|
|
1375
|
+
| **Hamiltonian Selector** | Dropdown | Filters to Hamiltonians compatible with the declared qubit count. |
|
|
1376
|
+
| **Hamiltonian Area** | Textarea | JSON format: `[-1.13, -0.45, 0.12, 0.64]`. Length must equal `2^n_qubits`. |
|
|
1377
|
+
|
|
1378
|
+
### NISQ Settings
|
|
1379
|
+
|
|
1380
|
+
| Control | Type | Range | Description |
|
|
1381
|
+
|---|---|---|---|
|
|
1382
|
+
| **Noise Model** | Dropdown | ideal / depolarizing / amplitude_damping / phase_damping | Applies a Kraus channel to the statevector post-circuit. |
|
|
1383
|
+
| **p noise** | FloatSlider | 0.000 – 0.100 | Error probability per qubit per gate. |
|
|
1384
|
+
| **Shots** | IntSlider | 512 – 65536 | Number of projective measurement samples for the shot histogram. |
|
|
1385
|
+
| **Seed RND** | IntText | any int | NumPy seed for reproducible noise and shot sampling. |
|
|
1386
|
+
| **Double Precision** | Checkbox | — | Forces `complex128` / `float64` throughout. Disabled = `complex64` / `float32`. |
|
|
1387
|
+
|
|
1388
|
+
### VQE Settings
|
|
1389
|
+
|
|
1390
|
+
| Control | Type | Range | Description |
|
|
1391
|
+
|---|---|---|---|
|
|
1392
|
+
| **Enable VQE** | Checkbox | — | Activates the full `ottimizza_vqe()` pipeline. When disabled, `df_vqe_telemetry` is cleared. |
|
|
1393
|
+
| **VQE Epochs** | IntText | 1 – ∞ | Optimization iterations. |
|
|
1394
|
+
| **Adam LR** | FloatSlider | 0.0001 – 0.1 | ADAM learning rate α. |
|
|
1395
|
+
| **Adam Beta1** | FloatSlider | 0.0 – 0.999 | First-moment decay rate. |
|
|
1396
|
+
| **Adam Beta2** | FloatSlider | 0.0 – 0.999 | Second-moment decay rate. |
|
|
1397
|
+
|
|
1398
|
+
### MD Settings
|
|
1399
|
+
|
|
1400
|
+
| Control | Type | Range | Description |
|
|
1401
|
+
|---|---|---|---|
|
|
1402
|
+
| **Enable MD** | Checkbox | — | Activates `run_md_simulation_dummy()`. When disabled, `df_md_telemetry` and `matrice_correlazione` are cleared. |
|
|
1403
|
+
| **MD Steps** | IntSlider | 10 – 1000 | Number of molecular dynamics integration steps. |
|
|
1404
|
+
| **Temperature (K)** | FloatSlider | 0.1 – 1000.0 | Thermal bath temperature in Kelvin. |
|
|
1405
|
+
|
|
1406
|
+
### Panel Selector
|
|
1407
|
+
|
|
1408
|
+
| Panel | Description |
|
|
1409
|
+
|---|---|
|
|
1410
|
+
| **Overview** | 8-panel scientific dashboard (probability, top states, helix 3D, metrics, noise, shots, VQE telemetry × 6, correlation heatmap) |
|
|
1411
|
+
| **Fisica Stato** | State physics: Bloch-sphere projection, Schmidt rank, coherence vector |
|
|
1412
|
+
| **Mosaico 1008q** | 2D probability density map up to 1008 qubits |
|
|
1413
|
+
| **VQE Results** | Dedicated VQE telemetry: energy convergence, entropy, purity, gradient, noise factor, θ correction |
|
|
1414
|
+
| **MD Simulation Results** | MD energy + entropy + purity + gradient + noise + θ correction + full Pearson heatmap |
|
|
1415
|
+
| **Performance** | Benchmark metrics: gate throughput, JIT compile time, memory usage |
|
|
1416
|
+
|
|
1417
|
+
### Action Buttons
|
|
1418
|
+
|
|
1419
|
+
| Button | Description |
|
|
1420
|
+
|---|---|
|
|
1421
|
+
| **▶ Run Simulation** | Executes the full pipeline: circuit → VQE → MD → panel render |
|
|
1422
|
+
| **📊 Benchmark χ** | Runs the χ-scaling benchmark across qubit counts and plots throughput |
|
|
1423
|
+
| **💾 Export Provenance** | Saves a JSON file with full run metadata, circuit name, qubit count, entropy, dominant state, and timestamp |
|
|
1424
|
+
| **📄 Paper-Ready PNG** | Exports the current figure at 300 DPI to `figure_paper.png` |
|
|
1425
|
+
| **🕒 Cronologia** | Prints the run history log to the output cell |
|
|
1426
|
+
| **💊 Save Hamiltonian** | Serializes the current Hamiltonian configuration to the provenance record |
|
|
1427
|
+
|
|
1428
|
+
---
|
|
1429
|
+
|
|
1430
|
+
## 6. Circuit Library
|
|
1431
|
+
|
|
1432
|
+
The library ships with 30+ preset circuits across 4 categories. All circuits are stored as OpenQASM 2.0 strings in `QASM_LIBRARY` and can be extended without modifying the engine.
|
|
1433
|
+
|
|
1434
|
+
### Standard
|
|
1435
|
+
|
|
1436
|
+
Bell |Φ+⟩, QFT 4 qubit, Toffoli (CCX), Adder 2-bit, Deutsch-Jozsa balanced, Bernstein-Vazirani (101)
|
|
1437
|
+
|
|
1438
|
+
### Quantum Algorithms
|
|
1439
|
+
|
|
1440
|
+
Grover 3q Oracle |111⟩, Simon Algorithm 4q s=11, Shor 15 (Simplified), HHL Matrix Inversion, QAOA Max-Cut 4q, QPE Precision 5q, QFT 8q High-Res, Quantum Walk, Quantum Teleportation
|
|
1441
|
+
|
|
1442
|
+
### Advanced Topological
|
|
1443
|
+
|
|
1444
|
+
Anyonic Braiding Fibonacci 6q, Topological Charge Pump 8q, MultiControlled-Z 5q, Hyper Inversion 8q, Deep Topological Unified 8q
|
|
1445
|
+
|
|
1446
|
+
---
|
|
1447
|
+
|
|
1448
|
+
## 7. VQE Engine & ADAM Optimizer
|
|
1449
|
+
|
|
1450
|
+
### Positional Parameter Injection
|
|
1451
|
+
|
|
1452
|
+
Because the `QASMParser` tokenizes all parameter literals to `0.0` in the AST for maximum JIT throughput, the VQE engine uses a **positional injection** strategy:
|
|
1453
|
+
|
|
1454
|
+
1. Scan the AST and count parametric gates (`rx`, `ry`, `rz`, `u1`, `p`, `cp`, `crz`) — this gives `n_params`.
|
|
1455
|
+
2. Allocate `θ ∈ ℝⁿ` initialized uniformly in `[-π, π]`.
|
|
1456
|
+
3. On each epoch, inject `θ[i]` sequentially by gate appearance order in the AST via `risolvi_qasm()`.
|
|
1457
|
+
|
|
1458
|
+
This makes the engine compatible with any valid OpenQASM 2.0 custom circuit without pre-labelling parameters.
|
|
1459
|
+
|
|
1460
|
+
### Hellmann-Feynman Gradient
|
|
1461
|
+
|
|
1462
|
+
The gradient is computed analytically via JAX automatic differentiation through the `QMMMForceEngine`:
|
|
1463
|
+
|
|
1464
|
+
```
|
|
1465
|
+
∂E/∂θᵢ = ⟨ψ(θ)| ∂H/∂θᵢ |ψ(θ)⟩
|
|
1466
|
+
```
|
|
1467
|
+
|
|
1468
|
+
where the QM/MM Hamiltonian includes classical electrostatic contributions from atomic positions `r`, charges `q`, and orbital centers.
|
|
1469
|
+
|
|
1470
|
+
The gradient norm `‖∇L‖` per epoch is logged to `df_vqe_telemetry['Gradient']`.
|
|
1471
|
+
|
|
1472
|
+
### ADAM Update Rule
|
|
1473
|
+
|
|
1474
|
+
```
|
|
1475
|
+
mₜ = β₁ · mₜ₋₁ + (1 − β₁) · g
|
|
1476
|
+
vₜ = β₂ · vₜ₋₁ + (1 − β₂) · g²
|
|
1477
|
+
m̂ₜ = mₜ / (1 − β₁ᵗ)
|
|
1478
|
+
v̂ₜ = vₜ / (1 − β₂ᵗ)
|
|
1479
|
+
θ ← θ − α · m̂ₜ / (√v̂ₜ + ε)
|
|
1480
|
+
```
|
|
1481
|
+
|
|
1482
|
+
`Theta_Correction` per epoch = `‖α · m̂ₜ / (√v̂ₜ + ε)‖` — logged to `df_vqe_telemetry['Theta_Correction']`.
|
|
1483
|
+
|
|
1484
|
+
### Telemetry Columns
|
|
1485
|
+
|
|
1486
|
+
| Column | Unit | Description |
|
|
1487
|
+
|---|---|---|
|
|
1488
|
+
| `VQE_Energy` | Ha | `⟨ψ|H|ψ⟩` expectation value |
|
|
1489
|
+
| `Entropy` | bit | Von Neumann entropy S = −Tr(ρ log₂ ρ) |
|
|
1490
|
+
| `Purity` | — | Tr(ρ²) ∈ [1/d, 1] |
|
|
1491
|
+
| `Gradient` | — | `‖∇L‖` Euclidean norm of parameter gradient |
|
|
1492
|
+
| `Noise_Factor` | — | Fidelity-derived noise proxy (heuristic) |
|
|
1493
|
+
| `Theta_Correction` | rad | ADAM step norm per epoch |
|
|
1494
|
+
|
|
1495
|
+
### Fallback Mock
|
|
1496
|
+
|
|
1497
|
+
If the circuit has no parametric gates (`n_params == 0`), the engine falls back to `_run_vqe_mock_simulation()`, which generates physically plausible synthetic telemetry curves for demonstration purposes. The output DataFrame has the same schema as the analytical run.
|
|
1498
|
+
|
|
1499
|
+
---
|
|
1500
|
+
|
|
1501
|
+
## 8. Hamiltonian Library
|
|
1502
|
+
|
|
1503
|
+
Real chemical Hamiltonians derived from molecular integrals. Automatically filtered by qubit count to prevent shape mismatch errors.
|
|
1504
|
+
|
|
1505
|
+
| Molecule | Qubits | Bond length | E₀ (Ha) |
|
|
1154
1506
|
|---|---|---|---|
|
|
1155
|
-
|
|
|
1156
|
-
|
|
|
1157
|
-
|
|
|
1158
|
-
|
|
|
1507
|
+
| H₂ (Hydrogen) | 2 | 0.74 Å (equilibrium) | −1.13 |
|
|
1508
|
+
| H₃⁺ (Trihydrogen cation, linear) | 3 | 0.85 Å | −1.28 |
|
|
1509
|
+
| LiH (Lithium hydride) | 4 | 1.40 Å (minimum) | −2.31 |
|
|
1510
|
+
| H₂O (Water, embedding core) | 5 | 0.96 Å | −4.12 |
|
|
1511
|
+
|
|
1512
|
+
Custom Hamiltonians are accepted as JSON arrays of diagonal energy eigenvalues (length must equal `2^n_qubits`):
|
|
1513
|
+
|
|
1514
|
+
```json
|
|
1515
|
+
[-4.12, -3.79, -3.47, -3.15, -2.83, -2.51, -2.18, -1.85,
|
|
1516
|
+
-1.52, -1.19, -0.86, -0.53, -0.20, 0.13, 0.46, 0.79,
|
|
1517
|
+
1.12, 1.45, 1.78, 2.11, 2.44, 2.77, 3.10, 3.43,
|
|
1518
|
+
3.76, 4.09, 4.42, 4.75, 5.08, 5.41, 5.74, 6.07]
|
|
1519
|
+
```
|
|
1520
|
+
|
|
1521
|
+
---
|
|
1159
1522
|
|
|
1160
|
-
|
|
1523
|
+
## 9. Noise Models
|
|
1161
1524
|
|
|
1162
|
-
|
|
1525
|
+
All models are applied as Kraus channels to the full statevector after circuit execution.
|
|
1163
1526
|
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1527
|
+
| Model | Kraus operators | Physical process |
|
|
1528
|
+
|---|---|---|
|
|
1529
|
+
| `ideal` | Identity | Noiseless simulation |
|
|
1530
|
+
| `depolarizing` | {√(1−p)I, √(p/3)X, √(p/3)Y, √(p/3)Z} | Equiprobable Pauli errors |
|
|
1531
|
+
| `amplitude_damping` | {K₀, K₁} | Energy relaxation T₁ decay |
|
|
1532
|
+
| `phase_damping` | {K₀, K₁} | Dephasing T₂ decay |
|
|
1168
1533
|
|
|
1169
|
-
|
|
1170
|
-
Found better (or worse) results on your hardware? Open an issue or PR with:
|
|
1534
|
+
**Fidelity metrics computed on every noisy run:**
|
|
1171
1535
|
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1536
|
+
- **Bhattacharyya Fidelity**: `F = Σᵢ √(pᵢ · qᵢ)` where p = ideal distribution, q = noisy distribution
|
|
1537
|
+
- **Total Variation Distance**: `TVD = ½ Σᵢ |pᵢ − qᵢ|`
|
|
1538
|
+
- **Theoretical depolarizing fidelity**: `F(p,n) = (1 − p(d−1)/d)ⁿ` where d = 2ⁿ, shown as an inset curve in the Noise Analysis panel
|
|
1539
|
+
|
|
1540
|
+
**Dtype alignment note:** The engine enforces a consistent dtype across all Kraus branches before `jax.lax.cond` evaluation to prevent `TypeError: cond branches must have equal output types`. The alignment patch is injected automatically via `de.patch_dense_parametric()` on startup.
|
|
1541
|
+
|
|
1542
|
+
---
|
|
1175
1543
|
|
|
1176
|
-
|
|
1544
|
+
## 10. Molecular Dynamics
|
|
1545
|
+
|
|
1546
|
+
The MD module (`run_md_simulation_dummy`) simulates quantum-classical (QM/MM) dynamics and populates two globals:
|
|
1547
|
+
|
|
1548
|
+
- `df_md_telemetry` — per-step DataFrame with the same six telemetry columns as VQE
|
|
1549
|
+
- `matrice_correlazione` — Pearson correlation matrix across all telemetry variables
|
|
1550
|
+
|
|
1551
|
+
Convergence validation (1500-epoch stress test at 5 K) confirms:
|
|
1552
|
+
|
|
1553
|
+
- Hellmann-Feynman gradient decays rigorously to zero at the molecular energy minimum (e.g., −4.1200 Ha for H₂O), certifying geometric stability.
|
|
1554
|
+
- Activating `depolarizing` or `amplitude_damping` noise introduces coherent micro-jitter on entropy and stabilizes purity below the ideal threshold — consistent with real noisy-chip behavior.
|
|
1555
|
+
|
|
1556
|
+
---
|
|
1557
|
+
|
|
1558
|
+
## 11. Visualization Panels
|
|
1559
|
+
|
|
1560
|
+
### Overview (8-row layout)
|
|
1561
|
+
|
|
1562
|
+
| Row | Left | Right |
|
|
1563
|
+
|---|---|---|
|
|
1564
|
+
| 0 | Header bar: circuit name, qubit count, gate count, wall time, RAM, noise parameters | — |
|
|
1565
|
+
| 1 | Probability distribution P(\|n⟩) with custom cyan→rose colormap, dominant state highlighted | Top-12 states ranked by probability, plasma colormap |
|
|
1566
|
+
| 2 | Wavefunction helix 3D: amplitude-colored scatter on (Re(ψ), Im(ψ), \|n⟩) | Simulation metrics table: 13 key values |
|
|
1567
|
+
| 3 | Noise Analysis: model label, p-gauge, fidelity/TVD table, theoretical F(p) curve inset | NISQ Shot Histogram with expected distribution overlay and σ annotation |
|
|
1568
|
+
| 4 | VQE Energy (Ha) — convergence epoch marked | Von Neumann Entropy (bit) |
|
|
1569
|
+
| 5 | State Purity Tr(ρ²) — ideal reference at 1.0 | ‖∇L‖ Gradient Norm — barren plateau detection |
|
|
1570
|
+
| 6 | Noise Factor — reference at 1.0 | θ Correction (rad) — reference at 0.0 |
|
|
1571
|
+
| 7 | Pearson Correlation Matrix (full width) — masked upper triangle, RdBu_r diverging colormap | — |
|
|
1572
|
+
|
|
1573
|
+
**Barren plateau detection (Row 5, gradient panel):** epochs where `|g| < 0.01 · max|g|` are highlighted with an `axvspan` region and labeled inline.
|
|
1574
|
+
|
|
1575
|
+
**Value badges:** every VQE telemetry panel carries a top-right badge showing the final epoch value (e.g., `Eₙ = −1.1302 Ha`).
|
|
1576
|
+
|
|
1577
|
+
### VQE Results
|
|
1578
|
+
|
|
1579
|
+
Dedicated 6-subplot panel showing all six telemetry columns from `df_vqe_telemetry` with the same enhanced rendering as Overview rows 4–6: fill-under area, rolling mean overlay, convergence annotations, and value badges.
|
|
1580
|
+
|
|
1581
|
+
### MD Simulation Results
|
|
1582
|
+
|
|
1583
|
+
Six time-series plots for `df_md_telemetry` plus a full-width masked Pearson correlation heatmap. Font size on the heatmap annotations is automatically scaled to `72 / n_variables` to remain legible at any matrix size.
|
|
1584
|
+
|
|
1585
|
+
---
|
|
1586
|
+
|
|
1587
|
+
## 12. Export & Provenance
|
|
1588
|
+
|
|
1589
|
+
### JSON Provenance
|
|
1590
|
+
|
|
1591
|
+
Triggered by **💾 Export Provenance**. Saves to `provenance_rnd42.json` (configurable in `dashboard.toml`):
|
|
1592
|
+
|
|
1593
|
+
```json
|
|
1594
|
+
{
|
|
1595
|
+
"run_id": "uuid4",
|
|
1596
|
+
"timestamp": "2026-05-30T14:22:11Z",
|
|
1597
|
+
"circuit": "Grover_3q_Oracle_111",
|
|
1598
|
+
"n_qubits": 3,
|
|
1599
|
+
"entropy": 1.584962,
|
|
1600
|
+
"dominant_state": "111",
|
|
1601
|
+
"p_dominant": 0.970312,
|
|
1602
|
+
"noise_model": "depolarizing",
|
|
1603
|
+
"noise_p": 0.005,
|
|
1604
|
+
"shots": 4096,
|
|
1605
|
+
"seed": 42,
|
|
1606
|
+
"wall_time_ms": 3.14,
|
|
1607
|
+
"ram_mb": 0.000064,
|
|
1608
|
+
"vqe_epochs": 100,
|
|
1609
|
+
"adam_lr": 0.01,
|
|
1610
|
+
"annotation": "optional user note"
|
|
1611
|
+
}
|
|
1612
|
+
```
|
|
1613
|
+
|
|
1614
|
+
### PNG Export
|
|
1615
|
+
|
|
1616
|
+
Triggered by **📄 Paper-Ready PNG** is work in progress...wain next upgrade
|
|
1617
|
+
|
|
1618
|
+
---
|
|
1619
|
+
|
|
1620
|
+
## 13. Technical Reference
|
|
1621
|
+
|
|
1622
|
+
### `core_calcolo_quantistico()`
|
|
1623
|
+
|
|
1624
|
+
Main compute function. Parses the QASM string, builds `comandi_beast_mode[]`, runs `DenseSVSimulator.run_circuit_jit_beast_mode()`, optionally applies noise, and returns `res{}`.
|
|
1625
|
+
|
|
1626
|
+
**Return dict keys:**
|
|
1627
|
+
|
|
1628
|
+
| Key | Type | Description |
|
|
1629
|
+
|---|---|---|
|
|
1630
|
+
| `prob` | ndarray | Measurement probability distribution |
|
|
1631
|
+
| `prob_ideal` | ndarray | Noiseless probability distribution |
|
|
1632
|
+
| `noise_factor` | ndarray | 100-point fidelity decay curve |
|
|
1633
|
+
| `fidelity` | float | Bhattacharyya fidelity (ideal vs noisy) |
|
|
1634
|
+
| `n_qubits` | int | Allocated qubit count |
|
|
1635
|
+
| `entropy` | float | Shannon entropy (bit) |
|
|
1636
|
+
| `idx_max` | int | Index of dominant computational basis state |
|
|
1637
|
+
| `stato_dominante` | str | Binary string of dominant state |
|
|
1638
|
+
| `tempo` | float | Wall-clock time (seconds) |
|
|
1639
|
+
| `ram` | float | Statevector RAM (MB) |
|
|
1640
|
+
| `nome` | str | Circuit name |
|
|
1641
|
+
| `porte_count` | int | Executed gate count |
|
|
1642
|
+
| `shots_data` | ndarray | Sampled measurement outcomes |
|
|
1643
|
+
| `sim` | DenseSVSimulator | Live simulator instance |
|
|
1644
|
+
| `parser` | QASMParser | Reusable parser instance |
|
|
1645
|
+
|
|
1646
|
+
### `estrai_valore_puro(elemento)`
|
|
1647
|
+
|
|
1648
|
+
Recursive deep-unwrapper for AST tokens. Handles callables, objects with `.index` or `.value` attributes, numpy scalars, and plain Python numerics. Returns a pure `int`, `float`, or `str`. Required because the `QASMParser` can return heterogeneous token types depending on gate context.
|
|
1649
|
+
|
|
1650
|
+
### `risolvi_qasm(parametric_commands, param_dict, n_qubits, theta_params, current_param_counter)`
|
|
1651
|
+
|
|
1652
|
+
Converts raw AST command dicts to the `[gate_name, target, control_or_param, ...]` list format accepted by `run_circuit_jit_beast_mode()`. Injects `theta_params[i]` sequentially into parametric gates via positional counter.
|
|
1653
|
+
|
|
1654
|
+
### Global Telemetry Variables
|
|
1655
|
+
|
|
1656
|
+
| Variable | Type | Description |
|
|
1657
|
+
|---|---|---|
|
|
1658
|
+
| `df_vqe_telemetry` | DataFrame | VQE per-epoch telemetry, index = Step |
|
|
1659
|
+
| `df_md_telemetry` | DataFrame | MD per-step telemetry, index = Step |
|
|
1660
|
+
| `matrice_correlazione` | DataFrame | Pearson correlation matrix |
|
|
1661
|
+
| `CRONOLOGIA_RUNS` | list[dict] | Run history log |
|
|
1662
|
+
|
|
1663
|
+
---
|
|
1664
|
+
|
|
1665
|
+
## 14. Troubleshooting
|
|
1666
|
+
|
|
1667
|
+
**`TypeError: cond branches must have equal output types`**
|
|
1668
|
+
|
|
1669
|
+
Occurs when the simulator's 1-qubit branch produces `complex128` while the 2-qubit branch produces `complex64`. Fixed automatically by `de.patch_dense_parametric(de.DenseSVSimulator)` on startup. If the error persists, check that the `dense-evolution` version is ≥ 8.0.4 and that the patch call succeeded in the startup cell.
|
|
1670
|
+
|
|
1671
|
+
**VQE telemetry is empty / plots show `[VQE_Energy — no data]`**
|
|
1672
|
+
|
|
1673
|
+
Either the **Enable VQE Settings** checkbox is unchecked, or the circuit has no parametric gates and `_run_vqe_mock_simulation` could not be found. Check that all dashboard cells have been executed top-to-bottom in order.
|
|
1674
|
+
|
|
1675
|
+
**Custom Hamiltonian size mismatch warning**
|
|
1676
|
+
|
|
1677
|
+
The JSON array length must equal `2^n_qubits` exactly. For a 4-qubit circuit, supply exactly 16 values. The dashboard prints a warning and falls back to a random Hamiltonian rather than crashing.
|
|
1678
|
+
|
|
1679
|
+
**Barren plateau span not visible on gradient plot**
|
|
1680
|
+
|
|
1681
|
+
Triggered only when more than 3 consecutive epochs have `|g| < 0.01 · max|g|`. With short runs (< 50 epochs) or fast-converging circuits, the threshold may never be crossed. Increase epochs or reduce the learning rate.
|
|
1682
|
+
|
|
1683
|
+
**`display(dashboard_unificata)` shows nothing in JupyterLab**
|
|
1684
|
+
|
|
1685
|
+
Ensure `ipywidgets` is enabled: `jupyter labextension install @jupyter-widgets/jupyterlab-manager`. In Google Colab this is pre-installed.
|
|
1686
|
+
|
|
1687
|
+
**Memory error on high-qubit circuits**
|
|
1688
|
+
|
|
1689
|
+
The statevector for n qubits requires `2ⁿ × 16 bytes` (`float64` complex). At 24 qubits: 268 MB. At 33 qubits: 536 GB — only feasible with high-RAM runtimes or GPU backends. Use `use_float32=True` to halve memory at reduced precision.
|
|
1690
|
+
|
|
1691
|
+
---
|
|
1692
|
+
|
|
1693
|
+
## 15. License
|
|
1694
|
+
|
|
1695
|
+
Dense Evolution is licensed under the **Business Source License 1.1 (BSL 1.1)**.
|
|
1696
|
+
|
|
1697
|
+
- **Non-commercial use:** unrestricted.
|
|
1698
|
+
- **Commercial use:** permitted up to 24 allocated qubits and 1000 distinct circuits / 10,000 shots per circuit per day without a separate commercial license.
|
|
1699
|
+
- **Change date:** 1 June 2029 — the software converts permanently to **Apache License 2.0** on that date.
|
|
1700
|
+
- **Attribution required:** all copies or derivatives must carry `© 2026 Salvatore Pennacchio <jtatopenn@libero.it> — Dense Evolution`.
|
|
1701
|
+
|
|
1702
|
+
Full license text: [LICENSE.md](LICENSE.md)
|
|
1703
|
+
|
|
1704
|
+
---
|
|
1177
1705
|
|
|
1706
|
+
*© 2026 Salvatore Pennacchio — Dense Evolution v8.0.4*
|