This repository contains the sources for dq - the DIKU Quantum Simulation Framework. The source code is structured to separate the concerns of specifying and drawing circuits from providing a semantics and an evaluation framework for circuits.
Multiple state-vector simulators are available ranging from semantics-based simulators, based on the unitaries that circuits denote, over more efficient simulators where gates work directly as strided operations over a global state vector, to specialising simulators that work by generating optimised data-parallel code to be executed on GPUs. These GPU simulators are based on a Futhark quantum simulation library, which is also part of the sources.
The framework also provides tools for converting between circuit representations.
-
fut/: Futhark data-parallel gate library. The library can be used on its own for writing quantum algorithms (e.g., Grover's algorithm or QFT) or it can be used as a target library for high-level languages. The library supports gate fusion for 1-qubit gates as long as gates are applied immediately after each other on the same qubit. -
src/: Modules for specifying and drawing circuits, modules for giving the semantics for circuits, modules for executing circuits and for compiling circuits into data-parallel Futhark code, toolqsim2futfor parsing qsim circuit files and converting them into futhark programs. -
examples/: Example quantum algorithms. Currently, only Grover's algorithm is available...
The framework builds with both the MLKit and
MLton compilers and uses
smlpkg to fetch relevant libraries,
including sml-complex and
sml-matrix, libraries for easily
working with complex numbers and matrices in Standard ML.
On macos, you may install smlpkg and mlkit using brew install smlpkg mlkit, assuming you have Homebrew installed.
On Linux, you may download binaries from the respective repositories.
As mentioned, the framework also supports the generation of Futhark [1] code for simulating circuits. Futhark is available for most platforms. For installation details, see http://futhark-lang.org.
To compile the source code and run the tests, just execute make test in the
source directory. The default is to use mlkit as a compiler. If you must use
MLton, execute MLCOMP=mlton make test instead.
Here is a simple example run:
$ cd src
$ mlkit quantum_ex1.mlb
...
bash-3.2$ ./run
Circuit for c = (I ** H oo CX oo Z ** Z oo CX oo I ** H) ** I oo I ** SW oo CX ** Y:
.---.
----------*---| Z |---*-----------------*----
| '---' | |
| | |
.---. .-+-. .---. .-+-. .---. .-+-.
--| H |-| X |-| Z |-| X |-| H |-. .-| X |--
'---' '---' '---' '---' '---' \ / '---'
/
/ \ .---.
--------------------------------' '-| Y |--
'---'
Semantics of c:
~i 0 0 0 0 0 0 0
0 0 i 0 0 0 0 0
0 ~i 0 0 0 0 0 0
0 0 0 i 0 0 0 0
0 0 0 0 0 ~i 0 0
0 0 0 0 0 0 0 i
0 0 0 0 ~i 0 0 0
0 0 0 0 0 0 i 0
Result distribution when evaluating c on |101> :
|000> : 0
|001> : 0
|010> : 0
|011> : 0
|100> : 1
|101> : 0
|110> : 0
|111> : 0
- The framework contains an implementation of Grover's algorithm written using
Standard ML combinators (
examples/grover/grover.sml) and an implementation written directly in Futhark using Futhark state-vector transformations (fut/grover.fut).
[1] Martin Elsman, Troels Henriksen, and Cosmin Oancea. Parallel Programming in Futhark. Edition 0.8. Department of Computer Science, University of Copenhagen. Edition Nov 22, 2023. latest-pdf.