{"id":41053655,"url":"https://github.com/christopher-altman/bqnn-benchmark","last_synced_at":"2026-01-22T11:31:09.315Z","repository":{"id":328437035,"uuid":"1112749149","full_name":"christopher-altman/bqnn-benchmark","owner":"christopher-altman","description":"Fully-functional benchmark harness for Binarized Quantum Neural Networks (BQNNs) that interpolates between classical and quantum regimes via a single quantumness parameter.","archived":false,"fork":false,"pushed_at":"2025-12-27T09:18:47.000Z","size":85,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-28T00:46:27.553Z","etag":null,"topics":["adaptive-quantum-networks","error-correction","quantum-advantage","quantum-coherence","quantum-computing","quantum-neural-network","quantum-neural-networks","quantum-supremacy"],"latest_commit_sha":null,"homepage":"http://christopheraltman.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/christopher-altman.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-09T03:39:59.000Z","updated_at":"2025-12-27T09:18:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/christopher-altman/bqnn-benchmark","commit_stats":null,"previous_names":["christopher-altman/bqnn-benchmark"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/christopher-altman/bqnn-benchmark","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christopher-altman%2Fbqnn-benchmark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christopher-altman%2Fbqnn-benchmark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christopher-altman%2Fbqnn-benchmark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christopher-altman%2Fbqnn-benchmark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/christopher-altman","download_url":"https://codeload.github.com/christopher-altman/bqnn-benchmark/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christopher-altman%2Fbqnn-benchmark/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28662085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adaptive-quantum-networks","error-correction","quantum-advantage","quantum-coherence","quantum-computing","quantum-neural-network","quantum-neural-networks","quantum-supremacy"],"created_at":"2026-01-22T11:31:08.465Z","updated_at":"2026-01-22T11:31:09.303Z","avatar_url":"https://github.com/christopher-altman.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BQNN Benchmark\n\n*A minimal but fully functional benchmark harness for **Binarized Quantum Neural Networks (BQNNs)** that interpolates between classical and quantum regimes via a single quantumness parameter* `a`.\n\n\n[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Google Scholar](https://img.shields.io/badge/Google_Scholar-Profile-blue?logo=google-scholar)](https://scholar.google.com/citations?user=tvwpCcgAAAAJ)\n[![Hugging Face](https://img.shields.io/badge/huggingface-Cohaerence-white)](https://huggingface.co/Cohaerence)\n\n[![X](https://img.shields.io/badge/X-@coherence-blue)](https://x.com/coherence)\n[![Website](https://img.shields.io/badge/website-christopheraltman.com-green)](https://www.christopheraltman.com)\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-Altman-blue?logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/Altman)\n\u003c!-- [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.XXXXXXX.svg)](https://doi.org/10.5281/zenodo.XXXXXXX) --\u003e\n\n\n## Key Results\n\n| Task | Classical | BQNN | Δ |\n|------|-----------|------|---|\n| Synthetic parity | 46.1% | 52.3% | **+6.2%** |\n| MNIST 0-vs-1 | 60.3% | 60.3% | 0% |\n\n**Scientific conclusion:** Quantum advantage exists on structured tasks (parity), not on linearly-separable ones (MNIST binary). The quantum layer acts as an equivalent nonlinearity to tanh when entanglement is disabled.\n\n---\n\n### Equation rendering (LaTeX as SVG)\nGitHub renders these equations via **Codecogs** (external) using SVG images:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://latex.codecogs.com/svg.image?\\dpi{120}\\Large%20K(x,x')%3D%7C%5Clangle%5Cpsi(x)%7C%5Cpsi(x')%5Crangle%7C%5E2\" /\u003e\n\u003c/p\u003e\n\n## Math Snapshot (BQNN core)\n\n\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\"\n      srcset=\"https://latex.codecogs.com/svg.image?%5Cdpi{120}%5CLarge%20%5Ccolor%7Bwhite%7D%20w_b%3D%5Coperatorname%7Bsign%7D(w)%20%5Cquad%20%5Ctext%7Bbinarization%7D\"\u003e\n    \u003cimg src=\"https://latex.codecogs.com/svg.image?%5Cdpi{120}%5CLarge%20w_b%3D%5Coperatorname%7Bsign%7D(w)%20%5Cquad%20%5Ctext%7Bbinarization%7D\" alt=\"equation\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\"\n      srcset=\"https://latex.codecogs.com/svg.image?%5Cdpi{120}%5CLarge%20%5Ccolor%7Bwhite%7D%20%5Cfrac%7B%5Cpartial%20w_b%7D%7B%5Cpartial%20w%7D%20%5Capprox%201%20%5Cquad%20%5Ctext%7BSTE%3A%20straight-through%20estimator%7D\"\u003e\n    \u003cimg src=\"https://latex.codecogs.com/svg.image?%5Cdpi{120}%5CLarge%20%5Cfrac%7B%5Cpartial%20w_b%7D%7B%5Cpartial%20w%7D%20%5Capprox%201%20%5Cquad%20%5Ctext%7BSTE%3A%20straight-through%20estimator%7D\" alt=\"equation\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\"\n      srcset=\"https://latex.codecogs.com/svg.image?%5Cdpi{120}%5CLarge%20%5Ccolor%7Bwhite%7D%20%5Ctheta(x%3Ba)%3D(1-a)%5C,%5Ctheta_%5Ctext%7Bcont%7D(x)%20%2B%20a%5C,%5Ctheta_%5Ctext%7Bbin%7D(%5Coperatorname%7Bsign%7D(x))\"\u003e\n    \u003cimg src=\"https://latex.codecogs.com/svg.image?%5Cdpi{120}%5CLarge%20%5Ctheta(x%3Ba)%3D(1-a)%5C,%5Ctheta_%5Ctext%7Bcont%7D(x)%20%2B%20a%5C,%5Ctheta_%5Ctext%7Bbin%7D(%5Coperatorname%7Bsign%7D(x))\" alt=\"equation\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\"\n      srcset=\"https://latex.codecogs.com/svg.image?%5Cdpi{120}%5CLarge%20%5Ccolor%7Bwhite%7D%20%7C%5Cpsi(x)%5Crangle%3D%5Cleft(%5Cprod_j%20R_X(%5Ctheta_j)%5Cright)%5Cleft(%5Cprod_k%20R_Z(%5Cvarphi_k)%5Cright)%5C,%7C0%5Crangle%5E%7B%5Cotimes%20n%7D\"\u003e\n    \u003cimg src=\"https://latex.codecogs.com/svg.image?%5Cdpi{120}%5CLarge%20%7C%5Cpsi(x)%5Crangle%3D%5Cleft(%5Cprod_j%20R_X(%5Ctheta_j)%5Cright)%5Cleft(%5Cprod_k%20R_Z(%5Cvarphi_k)%5Cright)%5C,%7C0%5Crangle%5E%7B%5Cotimes%20n%7D\" alt=\"equation\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n---\n\n## Pipeline\n\n```mermaid\nflowchart LR\n  A[Input x] --\u003e B[Binarize / continuous map];\n  B --\u003e C[RX encodings];\n  C --\u003e D[Trainable RZ phases];\n  D --\u003e E[Optional entanglement];\n  E --\u003e F[\u003cX\u003e measurements];\n  F --\u003e G[Classical head + loss];\n```\n\n---\n\n## Project Structure\n\n```\nbqnn-benchmark/\n├── pyproject.toml              # Package config \u0026 dependencies (v0.2.1)\n├── README.md                   # This file\n├── CHANGELOG.md                # Version history \u0026 bug fixes\n├── bqnn/                       # Core library\n│   ├── __init__.py             # Public API exports\n│   ├── model.py                # BQNNModel, DeepBQNNModel (PauliX, no entanglement)\n│   ├── classical_reference.py  # ClassicalBinarizedNet (STE gradients)\n│   ├── data.py                 # Synthetic \u0026 MNIST (seed + train split params)\n│   ├── quantization.py         # Binary→angle encoding + continuous option\n│   ├── training.py             # Trainer class, optimizer persistence\n│   ├── inference.py            # Evaluation \u0026 prediction utilities\n│   ├── noise_models.py         # Noise injection configuration\n│   └── utils/                  # Utilities subpackage\n│       ├── __init__.py         # (was missing — fixed!)\n│       ├── metrics.py          # Accuracy, F1, confusion matrix, gradients\n│       └── plots.py            # Visualization (axis labels fixed)\n└── experiments/                # Runnable experiments\n    ├── __init__.py\n    ├── exp_sweep_a.py          # Sweep quantumness parameter\n    ├── train_mnist_bqnn.py     # Classical vs BQNN on MNIST\n    └── exp_noise_threshold.py  # Noise robustness analysis\n```\n\n## Features\n\n### Models\n- **BQNNModel**: Quantum-classical hybrid with tunable quantumness\n- **DeepBQNNModel**: Multi-layer quantum circuits\n- **ClassicalBinarizedNet**: Classical baseline with STE gradients\n\n### Quantum Circuit\n- RX input encoding from binary features (or continuous angles)\n- Trainable RZ phase layer\n- Optional ring entanglement (disabled by default to avoid barren plateaus)\n- PauliX expectation measurements (required for θ gradients)\n- Configurable U U† noise pairs for hardware simulation\n\n### Encoding Modes\n- **Binary encoding** (default): Hard binarization via sign() + STE\n- **Continuous encoding**: tanh() mapping to [-π, π] (better for image data)\n\n### Training Infrastructure\n- **Trainer class** with persistent optimizer state\n- Gradient clipping and learning rate scheduling\n- Early stopping with patience\n- Gradient tracking for barren plateau detection\n- Comprehensive metrics (accuracy, F1, confusion matrix)\n\n### Data\n- Synthetic binary classification (parity task)\n- Tiny MNIST (4×4 downsampled, proper train/test splits)\n\n## Installation\n\n```bash\n# Basic installation\npip install -e .\n\n# With Qiskit backend support\npip install -e \".[qiskit]\"\n\n# Development dependencies\npip install -e \".[dev]\"\n```\n\n### Requirements\n- Python ≥3.10\n- PyTorch ≥2.0\n- PennyLane ≥0.33\n- NumPy, Matplotlib, torchvision\n\n## Quickstart\n\n```python\nfrom bqnn import (\n    BQNNModel,\n    get_synthetic_dataset,\n    train_epoch,\n    evaluate_accuracy,\n)\nimport torch\n\n# Create data loaders (proper train/test separation)\ntrain_loader = get_synthetic_dataset(n_samples=1024, seed=42)\ntest_loader = get_synthetic_dataset(n_samples=256, seed=12345)\n\n# Initialize model\nmodel = BQNNModel(\n    n_features=16,\n    n_hidden=8,\n    n_classes=2,\n    a=0.5,  # Quantumness parameter\n)\n\n# Train with persistent optimizer\nopt = torch.optim.Adam(model.parameters(), lr=1e-2)\nfor epoch in range(20):\n    stats = train_epoch(model, train_loader, optimizer=opt)\n    \nmetrics = evaluate_accuracy(model, test_loader)\nprint(f\"Accuracy: {metrics['accuracy']:.3f}\")\n```\n\n### Continuous Encoding (for image data)\n\nFor tasks like MNIST where binarization loses too much information:\n\n```python\nimport torch\nimport torch.nn as nn\nimport pennylane as qml\nimport numpy as np\n\nclass ContinuousBQNN(nn.Module):\n    \"\"\"BQNN with continuous angle encoding instead of hard binarization.\"\"\"\n    \n    def __init__(self, n_features=16, n_qubits=8, n_classes=2):\n        super().__init__()\n        self.fc1 = nn.Linear(n_features, n_qubits)\n        self.theta = nn.Parameter(0.1 * torch.randn(n_qubits))\n        self.fc_out = nn.Linear(n_qubits, n_classes)\n        \n        self.dev = qml.device('default.qubit', wires=n_qubits)\n        self.n_qubits = n_qubits\n        \n        @qml.qnode(self.dev, interface='torch', diff_method='backprop')\n        def circuit(angles, theta):\n            for i in range(n_qubits):\n                qml.RX(angles[i], wires=i)\n                qml.RZ(theta[i], wires=i)\n            return [qml.expval(qml.PauliX(i)) for i in range(n_qubits)]\n        self.circuit = circuit\n    \n    def forward(self, x):\n        # Continuous encoding: tanh maps to [-π, π]\n        h = torch.tanh(self.fc1(x)) * np.pi\n        \n        expvals = []\n        for i in range(h.shape[0]):\n            ev = self.circuit(h[i], self.theta)\n            expvals.append(torch.stack([\n                e if isinstance(e, torch.Tensor) else torch.tensor(e) \n                for e in ev\n            ]))\n        return self.fc_out(torch.stack(expvals).float())\n```\n\n## Experiments\n\n```bash\n# Sweep quantumness parameter a\npython3.14 -m experiments.exp_sweep_a\n\n# MNIST comparison (classical vs BQNN)\npython3.14 -m experiments.train_mnist_bqnn\n\n# Noise robustness analysis\npython3.14 -m experiments.exp_noise_threshold\n```\n\n## Benchmark Results\n\n### Synthetic Parity Task\n\n| Model | Accuracy | Notes |\n|-------|----------|-------|\n| Classical baseline | 46.1% | Hard task for both |\n| BQNN (a=1.0) | **52.3%** | +6.2% quantum advantage |\n| BQNN (a=0.0) | 47.7% | Near-classical limit |\n\n### MNIST 0-vs-1 (4×4)\n\n| Model | Accuracy | Notes |\n|-------|----------|-------|\n| Classical binarized | 62.7% | Sign activation |\n| Classical continuous | 60.3% | Tanh activation |\n| BQNN (binary) | 54.0% | Information loss |\n| BQNN (continuous) | 60.3% | Matches classical |\n\n**Key finding:** No quantum advantage on linearly-separable MNIST subset. The quantum layer acts as an equivalent nonlinearity to tanh when entanglement is disabled.\n\n## Theoretical Context\n\nThe BQNN architecture interpolates between:\n\n| Parameter | Regime | Behavior |\n|-----------|--------|----------|\n| `a = 0` | Classical | Fixed angle mapping, deterministic |\n| `a \u003e 0` | Quantum | Increased angular spread, measurement stochasticity |\n| `a = 1` | Full quantum | Maximum expressibility |\n\n### Quantumness Parameter\n\nThe parameter `a` controls the angle encoding:\n```\nangle = (π/2) × (2·bit - 1) × (1 + a)\n```\n\n- At `a=0`: angles are ±π/2 (classical-like)\n- At `a=1`: angles span ±π (maximum quantum variance)\n\n### Noise Model\n\nThe U U† noise pairs simulate coherent errors that should ideally cancel but accumulate on real hardware due to calibration imperfections.\n\n### Barren Plateau Considerations\n\nThis benchmark discovered several important design choices to avoid barren plateaus:\n\n1. **Measurement basis matters**: PauliZ after RZ has zero gradient (phase is invisible). Use PauliX instead.\n2. **Entanglement topology**: Full ring entanglement on 8+ qubits causes exponential gradient decay. Use local (nearest-neighbor) or no entanglement.\n3. **Parameter initialization**: Small random values (0.1 scale) work better than large.\n\n## API Reference\n\n### Models\n\n```python\n# Basic BQNN\nmodel = BQNNModel(n_features, n_hidden, n_classes, a=0.5, n_qubits=None)\nmodel.set_noise(n_pairs=4, angle=0.1)\nmodel.set_quantumness(a=0.7)\ninfo = model.get_circuit_info()\n\n# Deep BQNN\nmodel = DeepBQNNModel(n_features, n_hidden, n_classes, n_layers=3, a=0.5)\n\n# Classical baseline\nbaseline = ClassicalBinarizedNet(n_features, n_hidden, n_classes, use_ste=True)\n```\n\n### Training\n\n```python\n# Simple training loop (pass optimizer to preserve momentum!)\nfrom bqnn import train_epoch\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-2)\nstats = train_epoch(model, train_loader, device=\"cuda\", optimizer=optimizer)\n\n# Full training with validation\nfrom bqnn import train_model, TrainingConfig\nconfig = TrainingConfig(\n    lr=1e-3,\n    grad_clip=1.0,\n    scheduler=\"cosine\",\n    early_stopping_patience=5,\n    track_gradients=True,\n)\nhistory = train_model(model, train_loader, val_loader, n_epochs=20, config=config)\n```\n\n### Evaluation\n\n```python\nfrom bqnn import evaluate_accuracy, evaluate_full, get_quantum_features\n\n# Basic accuracy\nmetrics = evaluate_accuracy(model, test_loader)\n\n# Comprehensive metrics\nmetrics = evaluate_full(model, test_loader, n_classes=2)\n# Returns: accuracy, macro_f1, confusion_matrix, confidence stats\n\n# Extract quantum layer outputs\nfeatures, labels = get_quantum_features(model, test_loader)\n```\n\n## Known Limitations\n\n1. **No quantum advantage on simple tasks**: MNIST 0-vs-1 is too easy—quantum adds nothing over classical nonlinearities.\n\n2. **Barren plateaus**: Full entanglement on 8+ qubits causes vanishing gradients. Entanglement is disabled by default.\n\n3. **Simulation overhead**: Per-sample quantum circuit execution is slow. Batch simulation would require circuit restructuring.\n\n4. **Binary encoding information loss**: Hard binarization destroys gradient information. Use continuous encoding for image data.\n\n## Scientific Hypotheses for Future Work\n\n### 1. Temporal Feedback Loops\nIncorporate measurement statistics from previous forward passes as additional input features:\n```\nθ(t+1) = f(θ(t), ⟨X⟩(t))\n```\n\n### 2. Entanglement Entropy as Regularizer\nAdd entanglement entropy S = -Tr(ρ log ρ) as a regularization term to control expressibility vs barren plateaus.\n\n### 3. Adaptive Quantumness\nLearn the quantumness parameter `a` as a function of input:\n```\na(x) = σ(W_a · x + b_a)\n```\n\n### 4. Measurement-Induced Phase Transitions\nStudy the critical measurement rate that maximizes information extraction while avoiding barren plateaus.\n\n### 5. Tasks with Quantum Structure\nTest on problems with natural quantum structure:\n- Graph classification with adjacency encoding\n- Time series with phase relationships\n- Combinatorial optimization landscapes\n\n### Hyperparameter sweeps (grid or random)\n\nA sweep runs many short trainings across a small parameter grid (or a random subset),\nwrites a JSON + CSV table, and emits a few aggregated plots into a timestamped run folder.\n\n**Grid sweep**\n```bash\npython -m experiments.run_sweep \\\n  --name sweep_demo \\\n  --a 0.0 0.2 0.5 1.0 \\\n  --lr 1e-3 5e-4 \\\n  --noise-pairs 0 2 4 \\\n  --noise-angle 0.0 0.05 \\\n  --epochs 5\n```\n\n**Random sweep**\n```bash\npython -m experiments.run_sweep --search random --num-samples 12\n```\n\nArtifacts land under:\n- `results/sweeps/\u003ctimestamp\u003e_\u003cname\u003e/sweep_results.json`\n- `results/sweeps/\u003ctimestamp\u003e_\u003cname\u003e/sweep_results.csv`\n- `results/sweeps/\u003ctimestamp\u003e_\u003cname\u003e/*.png` and `*.pdf`\n\n---\n\n## References\n\n1. C. Altman, J. Pykacz \u0026 R. Zapatrin, “Superpositional Quantum Network Topologies,” *International Journal of Theoretical Physics* 43, 2029–2041 (2004).\n   DOI: [10.1023/B:IJTP.0000049008.51567.ec](https://doi.org/10.1023/B:IJTP.0000049008.51567.ec) · arXiv: [q-bio/0311016](https://arxiv.org/abs/q-bio/0311016)\n\n2. C. Altman \u0026 R. Zapatrin, “Backpropagation in Adaptive Quantum Networks,” *International Journal of Theoretical Physics* 49, 2991–2997 (2010).  \n   DOI: [10.1007/s10773-009-0103-1](https://doi.org/10.1007/s10773-009-0103-1) · arXiv: [0903.4416](https://arxiv.org/abs/0903.4416)\n\n\n---\n\n## Citations\n\nIf you use or build on this work, please cite:\n\n\u003e A Fully-functional benchmark harness for Binarized Quantum Neural Networks (BQNNs)\n\n```bibtex\n@software{altman2025bqnn-benchmark,\n  author = {Altman, Christopher},\n  title = {A Fully-functional Benchmark Harness for Binarized Quantum Neural Networks (BQNNs)},\n  year = {2025},\n  url = {https://github.com/christopher-altman/bqnn-benchmark}\n}\n```\n\n## License\n\nMIT License. See [LICENSE](LICENSE) for details.\n\n---\n\n## Contact\n\n- **Website:** [christopheraltman.com](https://christopheraltman.com)\n- **Research portfolio:** https://lab.christopheraltman.com/\n- **Portfolio mirror:** https://christopher-altman.github.io/\n- **GitHub:** [github.com/christopher-altman](https://github.com/christopher-altman)\n- **Google Scholar:** [scholar.google.com/citations?user=tvwpCcgAAAAJ](https://scholar.google.com/citations?user=tvwpCcgAAAAJ)\n- **Email:** x@christopheraltman.com\n\n---\n\n*Christopher Altman (2025)*\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchristopher-altman%2Fbqnn-benchmark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchristopher-altman%2Fbqnn-benchmark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchristopher-altman%2Fbqnn-benchmark/lists"}