-
Notifications
You must be signed in to change notification settings - Fork 69
qb2qmasm
qb2qmasm
—Convert Qubist input to QMASM input
qb2qmasm
[-h
] [-o
file] [-f
format] [file]
- file
- Qubist-format input file (default: standard input)
- -h, --help
- show this help message and exit
- -o file, --output=file
- file to which to write QMASM code (default: stdandard output)
- -f format, --format=format
-
printf
-style format string for formatting qubit numbers (default:%d
)
qb2qmasm
converts a Hamiltonian function expressed in the numerical format used by D-Wave's Qubist Web interface into the symbolic format accepted by qmasm
. The result can then easily be wrapped in a macro and incorporated into other QMASM programs.
The input to qb2qmasm
need only be syntactically correct. The program does not consider the physical network topology but rather assumes all-to-all connectivity of qubits. The program does not consider hardware limitations on the range of weights and strengths but rather allows all floating-point numbers to be used.
Qubist format is fairly simple. The first line specifies the maximum qubit number plus 1 and the number of line that follow. Each subsequent line specifies two qubit numbers and a coefficient. If the two qubit numbers are the same, the coefficient represents a point weight (h); otherwise, the coefficient represents a coupler strength (J).
A Fredkin gate (a.k.a. a CSWAP gate) conditionally swaps its two inputs (i1 and i2) when producing two outputs (o1 and o2) based on a control bit (c). The corresponding truth table looks like this:
c | i1 | i2 | o1 | o2 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
One way to express that table in Qubist format is as follows:
1152 34
680 680 0.5
681 681 0.041666666666666664
682 682 0.125
683 683 0.125
684 684 0.125
685 685 -0.0625
686 686 0.125
687 687 0.041666666666666664
690 690 0.0
692 692 0.0
693 693 -0.0625
695 695 0.041666666666666664
680 684 0.5
681 684 -0.0625
682 684 0.125
683 684 -1.0
680 685 -0.25
681 685 0.125
682 685 -0.125
683 685 -0.5
680 686 0.5
681 686 0.0625
682 686 -1.0
683 686 0.125
680 687 0.25
681 687 -1.0
682 687 0.0625
683 687 -0.0625
684 692 0.375
690 692 -1.0
685 693 -1.0
690 693 -0.375
687 695 -1.0
690 695 -0.25
The preceding code is based on the following mappings of variables to physical qubits:
c | i1 | i2 | o1 | o2 |
---|---|---|---|---|
682, 686 | 681, 687, 695 | 685, 693 | 683, 684 | 690, 692 |
In QMASM format, there is no header line, and lines representing point weights specify a single qubit as opposed to two identical qubits:
$ qb2qmasm fredkin.qb
680 0.5
681 0.041666666666666664
682 0.125
683 0.125
684 0.125
685 -0.0625
686 0.125
687 0.041666666666666664
690 0.0
692 0.0
693 -0.0625
695 0.041666666666666664
680 684 0.5
681 684 -0.0625
682 684 0.125
683 684 -1.0
680 685 -0.25
681 685 0.125
682 685 -0.125
683 685 -0.5
680 686 0.5
681 686 0.0625
682 686 -1.0
683 686 0.125
680 687 0.25
681 687 -1.0
682 687 0.0625
683 687 -0.0625
684 692 0.375
690 692 -1.0
685 693 -1.0
690 693 -0.375
687 695 -1.0
690 695 -0.25
QMASM qubits are named rather than numbered. The --format
option facilitates assigning qubit names as a function of their number:
$ qb2qmasm --format='cs$%d' fredkin.qb
cs$680 0.5
cs$681 0.041666666666666664
cs$682 0.125
cs$683 0.125
cs$684 0.125
cs$685 -0.0625
cs$686 0.125
cs$687 0.041666666666666664
cs$690 0.0
cs$692 0.0
cs$693 -0.0625
cs$695 0.041666666666666664
cs$680 cs$684 0.5
cs$681 cs$684 -0.0625
cs$682 cs$684 0.125
cs$683 cs$684 -1.0
cs$680 cs$685 -0.25
cs$681 cs$685 0.125
cs$682 cs$685 -0.125
cs$683 cs$685 -0.5
cs$680 cs$686 0.5
cs$681 cs$686 0.0625
cs$682 cs$686 -1.0
cs$683 cs$686 0.125
cs$680 cs$687 0.25
cs$681 cs$687 -1.0
cs$682 cs$687 0.0625
cs$683 cs$687 -0.0625
cs$684 cs$692 0.375
cs$690 cs$692 -1.0
cs$685 cs$693 -1.0
cs$690 cs$693 -0.375
cs$687 cs$695 -1.0
cs$690 cs$695 -0.25