A minimal framework to simulate quantum computation using matrix and tensor maths.
Project description
Tiny-Q
Tiny-Q is a minimal framework to show quantum computation basics in a tensor/matrix perspective view.
Install
⚪ From PyPI
ℹ Due to the name conflict with an existing pypi package, you have to address TinyQSim rather than TinyQ :(
pip install TinyQSim
⚪ From source
git clone https://github.com/Kahsolt/Tiny-Qcd Tiny-Qpip install .- you can see exmaples or run
run_unnittest.cmdto verify installation
Features
⚪ Tiny-Q interactive playground
Start interactive python shell with Tiny-Q environment: python -m tiny_q
(InteractiveConsole)
>>> v('00')
array([1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], dtype=complex64)
>>> H
array([[ 0.7071+0.j, 0.7071+0.j],
[ 0.7071+0.j, -0.7071+0.j]], dtype=complex64)
>>> CNOT
array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j]], dtype=complex64)
>>> q = CNOT * (H @ I) | v('00')
>>> q.info()
|phi>
state: [0.7071+0.j 0. +0.j 0. +0.j 0.7071+0.j]
amp: [0.7071 0. 0. 0.7071]
prob: [0.5 0. 0. 0.5]
density: [[0.5+0.j 0. +0.j 0. +0.j 0.5+0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0.5+0.j 0. +0.j 0. +0.j 0.5+0.j]]
trace: (0.99999994+0j)
>>> q > Measure()
{'00': 489, '01': 0, '10': 0, '11': 511}
>>> q < Measure
>>> q.info()
|phi>
state: [1.+0.j 0.+0.j 0.+0.j 0.+0.j]
amp: [1. 0. 0. 0.]
prob: [1. 0. 0. 0.]
density: [[1.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j]]
trace: (1+0j)
>>> Ctrl+D
now exiting InteractiveConsole...
⚪ Tiny-Q syntax / notations
Tiny-Q strictly distinguishes the following four categories of operations, an re-assigin each to a different python operator, making expresssions syntax formula-like thus more clear :)
system expansion (@)is the hadamard productgate composition (*) and gate construction (<<)are the matrix productgate application (|)is the quantum state evolutionvirtual measure (>) and real measure (<)are the quantum measurements
# use matmul @ for system expansion (gate/state tensor product)
# u = Gate @ Gate
u = H @ I
# q = State @ State
q = v0 @ v1
# NOTE: the low qubit starts from **right**
q = v_high @ v_mid @ v_low # => |high,mid,low>
# use mul * for gate composition
# u = Gate * Gate (more like math formula, reducing from **right**)
u = X * H
u = gate3 * gate2 * gate1
# use lshift << for gate construction
# u = Gate << Gate (more like programs, running from **left**, modify **inplace**)
u = H << X
u = gate1 << gate2 << gate3
# use pipe | for gate application
# q = Gate | State
q = X | v0
# use > for virtual measure, the state does not really change
# r = State > Measure, single shot
r = H | v0 > Measure
# r = State > Measure(count), multi shots
r = CNOT * (H @ I) | State.zero(2) > Measure(1000)
# p = State > State, project by state
p = v0 > h0
# p = State > MeasureOp, project by measure operator
p = h0 > M0
# use < for real measure, the state will collapse
# State < Measure
q = CNOT * (H @ I) | v('00')
q < Measure
API stub
class Meta:
.n_qubits -> int # qubit count of current system
.dagger -> Meta # dagger of State/Gate/MeasureOp
class State(Meta):
.zero() -> State # alloc a |0> string
.one() -> State # alloc a |1> string
.__eq__() -> bool # state equality (ignoring global phase)
.__matmul__() -> State # v0 @ v1: state expansion
.__lt__() -> Union # v0 < Measure, real measure with state collapse
.__gt__() -> Union # v0 > Measure|Measure()|State|MeasureOp, virtual measurements
.is_pure -> bool # purity
.amp -> ndarray # amplitude
.prob -> ndarray # probabilty distribution
.density -> ndarray # density matrix
.trace -> float # trace of density matrix
.info() # quick show info
.plot_prob() # plot probabilty distribution
.plot_density() # plot density matrix
.plots() # plot all figures
class Gate(Meta):
.__eq__() -> bool # gate equality
.__neg__() -> Gate # -H, global negative
.__xor__() -> Gate # H^alpha, gate self-power
.__mul__() -> Gate # X * H: gate composition
.__lshift__() -> Gate # H << X: gate composition (reverse order of __mul__)
.__matmul__() -> Gate # X @ H: gate expansion
.__or__() -> State # X | v0: gate application
.is_unitary -> bool # unitary (should always be True)
.is_hermitian -> bool # hermitian (True for most gates)
.info() # quick show info
class MeasureOp(Meta):
.check_completeness() -> bool
by Armit 2023/03/15
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file TinyQSim-1.0.tar.gz.
File metadata
- Download URL: TinyQSim-1.0.tar.gz
- Upload date:
- Size: 14.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.9.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c3282255ba7170a4526a15fe6f5e635064b9af851243fa0a708e8bd6b309284
|
|
| MD5 |
522bc9776b1468b1117714936d961056
|
|
| BLAKE2b-256 |
cf746a089579529f490276139ee3d271e3c26a5904247e8e9da05ee906d3465b
|
File details
Details for the file TinyQSim-1.0-py2.py3-none-any.whl.
File metadata
- Download URL: TinyQSim-1.0-py2.py3-none-any.whl
- Upload date:
- Size: 13.1 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.9.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8da9a43d8e57d7010d298f4a11adeacd7e09fad541ccdc137d161629c5abb325
|
|
| MD5 |
1e5b6ed3544b838d4637339b2e38935b
|
|
| BLAKE2b-256 |
8e0866a184303551786915cc71a90866d2e8610d7787df8ee4eb0b4a143c76f5
|