Skip to content

Commit

Permalink
Merge pull request #369 from Takishima/release/0.5.1
Browse files Browse the repository at this point in the history
ProjectQ v0.5.1
  • Loading branch information
Takishima committed Jun 5, 2020
2 parents f4a82f2 + 1920531 commit 659304d
Show file tree
Hide file tree
Showing 31 changed files with 2,294 additions and 344 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -71,6 +71,7 @@ instance/

# Sphinx documentation
docs/_build/
docs/_doc_gen/
docs/doxygen

# PyBuilder
Expand Down
30 changes: 26 additions & 4 deletions README.rst
Expand Up @@ -102,13 +102,35 @@ Instead of simulating a quantum program, one can use our resource counter (as a
**Running a quantum program on IBM's QE chips**

To run a program on the IBM Quantum Experience chips, all one has to do is choose the `IBMBackend` and the corresponding compiler:
To run a program on the IBM Quantum Experience chips, all one has to do is choose the `IBMBackend` and the corresponding setup:

.. code-block:: python
compiler_engines = projectq.setups.ibm16.get_engine_list()
eng = MainEngine(IBMBackend(use_hardware=True, num_runs=1024,
verbose=False, device='ibmqx5'),
import projectq.setups.ibm
from projectq.backends import IBMBackend
token='MY_TOKEN'
device='ibmq_16_melbourne'
compiler_engines = projectq.setups.ibm.get_engine_list(token=token,device=device)
eng = MainEngine(IBMBackend(token=token, use_hardware=True, num_runs=1024,
verbose=False, device=device),
engine_list=compiler_engines)
**Running a quantum program on AQT devices**

To run a program on the AQT trapped ion quantum computer, choose the `AQTBackend` and the corresponding setup:

.. code-block:: python
import projectq.setups.aqt
from projectq.backends import AQTBackend
token='MY_TOKEN'
device='aqt_device'
compiler_engines = projectq.setups.aqt.get_engine_list(token=token,device=device)
eng = MainEngine(AQTBackend(token=token,use_hardware=True, num_runs=1024,
verbose=False, device=device),
engine_list=compiler_engines)
Expand Down
8 changes: 5 additions & 3 deletions docs/conf.py
@@ -1,3 +1,4 @@

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
Expand Down Expand Up @@ -28,7 +29,6 @@
import projectq.setups.default
import projectq.setups.grid
import projectq.setups.ibm
import projectq.setups.ibm16
import projectq.setups.linear
import projectq.setups.restrictedgateset
import projectq.setups.decompositions
Expand Down Expand Up @@ -527,9 +527,11 @@ def linkcode_resolve(domain, info):
# ------------------------------------------------------------------------------
# Automatically generate ReST files for each package of ProjectQ

docgen_path = os.path.join(os.path.dirname(os.path.abspath('__file__')),
'_doc_gen')
os.mkdir(docgen_path)
for desc in descriptions:
fname = os.path.join(os.path.dirname(os.path.abspath('__file__')),
'projectq.{}.rst'.format(desc.name))
fname = os.path.join(docgen_path, 'projectq.{}.rst'.format(desc.name))
lines = None
if os.path.exists(fname):
with open(fname, 'r') as fd:
Expand Down
51 changes: 23 additions & 28 deletions docs/package_description.py
Expand Up @@ -6,8 +6,12 @@
class PackageDescription(object):
package_list = []

def __init__(self, name, desc='', module_special_members='__init__',
submodule_special_members='', submodules_desc='',
def __init__(self,
pkg_name,
desc='',
module_special_members='__init__',
submodule_special_members='',
submodules_desc='',
helper_submodules=None):
"""
Args:
Expand All @@ -25,24 +29,24 @@ def __init__(self, name, desc='', module_special_members='__init__',
automodule_properties)
"""

self.name = name
self.name = pkg_name
self.desc = desc
if name not in PackageDescription.package_list:
PackageDescription.package_list.append(name)
if pkg_name not in PackageDescription.package_list:
PackageDescription.package_list.append(pkg_name)

self.module = sys.modules['projectq.{}'.format(self.name)]
self.module_special_members = module_special_members

self.submodule_special_members = module_special_members
self.submodule_special_members = submodule_special_members
self.submodules_desc = submodules_desc

self.helper_submodules = helper_submodules

module_root = os.path.dirname(self.module.__file__)
sub = [(name, obj) for name, obj in inspect.getmembers(
self.module,
lambda obj: inspect.ismodule(obj) and module_root in obj.__file__)
if name[0] != '_']
self.module, lambda obj: inspect.ismodule(obj) and hasattr(
obj, '__file__') and module_root in obj.__file__)
if pkg_name[0] != '_']

self.subpackages = []
self.submodules = []
Expand All @@ -56,19 +60,10 @@ def __init__(self, name, desc='', module_special_members='__init__',
self.subpackages.sort(key=lambda x: x[0].lower())
self.submodules.sort(key=lambda x: x[0].lower())

self.members = [(name, obj)
for name, obj in inspect.getmembers(
self.module,
lambda obj: (inspect.isclass(obj)
or inspect.isfunction(obj)
or isinstance(obj, (int,
float,
tuple,
list,
dict,
set,
frozenset,
str))))
self.members = [(name, obj) for name, obj in inspect.getmembers(
self.module, lambda obj:
(inspect.isclass(obj) or inspect.isfunction(obj) or isinstance(
obj, (int, float, tuple, list, dict, set, frozenset, str))))
if name[0] != '_']
self.members.sort(key=lambda x: x[0].lower())

Expand Down Expand Up @@ -100,13 +95,13 @@ def get_ReST(self):
new_lines.append('')
if self.submodules:
for name, _ in self.submodules:
new_lines.append('\tprojectq.{}.{}'.format(self.name,
name))
new_lines.append('\tprojectq.{}.{}'.format(
self.name, name))
new_lines.append('')
if self.members:
for name, _ in self.members:
new_lines.append('\tprojectq.{}.{}'.format(self.name,
name))
new_lines.append('\tprojectq.{}.{}'.format(
self.name, name))
new_lines.append('')

if self.submodules:
Expand All @@ -121,8 +116,8 @@ def get_ReST(self):
new_lines.append('.. autosummary::')
new_lines.append('')
for name, _ in self.submodules:
new_lines.append(' projectq.{}.{}'.format(self.name,
name))
new_lines.append(' projectq.{}.{}'.format(
self.name, name))
new_lines.append('')

for name, _ in self.submodules:
Expand Down
14 changes: 7 additions & 7 deletions docs/projectq.rst
Expand Up @@ -11,12 +11,12 @@ For a detailed documentation of a subpackage or module, click on its name below:
:maxdepth: 1
:titlesonly:

projectq.backends
projectq.cengines
projectq.libs
projectq.meta
projectq.ops
projectq.setups
projectq.types
_doc_gen/projectq.backends
_doc_gen/projectq.cengines
_doc_gen/projectq.libs
_doc_gen/projectq.meta
_doc_gen/projectq.ops
_doc_gen/projectq.setups
_doc_gen/projectq.types


67 changes: 67 additions & 0 deletions examples/aqt.py
@@ -0,0 +1,67 @@
import matplotlib.pyplot as plt
import getpass

from projectq import MainEngine
from projectq.backends import AQTBackend
from projectq.libs.hist import histogram
from projectq.ops import Measure, Entangle, All
import projectq.setups.aqt


def run_entangle(eng, num_qubits=3):
"""
Runs an entangling operation on the provided compiler engine.
Args:
eng (MainEngine): Main compiler engine to use.
num_qubits (int): Number of qubits to entangle.
Returns:
measurement (list<int>): List of measurement outcomes.
"""
# allocate the quantum register to entangle
qureg = eng.allocate_qureg(num_qubits)

# entangle the qureg
Entangle | qureg

# measure; should be all-0 or all-1
All(Measure) | qureg

# run the circuit
eng.flush()

# access the probabilities via the back-end:
# results = eng.backend.get_probabilities(qureg)
# for state in results:
# print("Measured {} with p = {}.".format(state, results[state]))
# or plot them directly:
histogram(eng.backend, qureg)
plt.show()

# return one (random) measurement outcome.
return [int(q) for q in qureg]


if __name__ == "__main__":
#devices available to subscription:
# aqt_simulator (11 qubits)
# aqt_simulator_noise (11 qubits)
# aqt_device (4 qubits)
#
# To get a subscription, create a profile at :
# https://gateway-portal.aqt.eu/
#
device = None # replace by the AQT device name you want to use
token = None # replace by the token given by AQT
if token is None:
token = getpass.getpass(prompt='AQT token > ')
if device is None:
device = getpass.getpass(prompt='AQT device > ')
# create main compiler engine for the AQT back-end
eng = MainEngine(AQTBackend(use_hardware=True, token=token, num_runs=200,
verbose=False, device=device),
engine_list=projectq.setups.aqt.get_engine_list(
token=token, device=device))
# run the circuit and print the result
print(run_entangle(eng))
11 changes: 9 additions & 2 deletions examples/bellpair_circuit.py
@@ -1,13 +1,20 @@
import matplotlib.pyplot as plt

from projectq import MainEngine
from projectq.backends import CircuitDrawer
from projectq.setups.default import get_engine_list
from projectq.libs.hist import histogram

from teleport import create_bell_pair

# create a main compiler engine
drawing_engine = CircuitDrawer()
eng = MainEngine(drawing_engine)
eng = MainEngine(engine_list = get_engine_list() + [drawing_engine])

create_bell_pair(eng)
qb0, qb1 = create_bell_pair(eng)

eng.flush()
print(drawing_engine.get_latex())

histogram(eng.backend, [qb0, qb1])
plt.show()
35 changes: 23 additions & 12 deletions examples/ibm.py
@@ -1,8 +1,11 @@
import projectq.setups.ibm
import matplotlib.pyplot as plt
import getpass

from projectq import MainEngine
from projectq.backends import IBMBackend
from projectq.libs.hist import histogram
from projectq.ops import Measure, Entangle, All
from projectq import MainEngine
import getpass
import projectq.setups.ibm


def run_entangle(eng, num_qubits=3):
Expand All @@ -29,25 +32,33 @@ def run_entangle(eng, num_qubits=3):
eng.flush()

# access the probabilities via the back-end:
results = eng.backend.get_probabilities(qureg)
for state in results:
print("Measured {} with p = {}.".format(state, results[state]))
# results = eng.backend.get_probabilities(qureg)
# for state in results:
# print("Measured {} with p = {}.".format(state, results[state]))
# or plot them directly:
histogram(eng.backend, qureg)
plt.show()

# return one (random) measurement outcome.
return [int(q) for q in qureg]


if __name__ == "__main__":
#devices commonly available :
#ibmq_16_melbourne (15 qubit)
#ibmq_essex (5 qubit)
#ibmq_qasm_simulator (32 qubits)
device = None #replace by the IBM device name you want to use
token = None #replace by the token given by IBMQ
# ibmq_16_melbourne (15 qubit)
# ibmq_essex (5 qubit)
# ibmq_qasm_simulator (32 qubits)
# and plenty of other 5 qubits devices!
#
# To get a token, create a profile at:
# https://quantum-computing.ibm.com/
#
device = None # replace by the IBM device name you want to use
token = None # replace by the token given by IBMQ
if token is None:
token = getpass.getpass(prompt='IBM Q token > ')
if device is None:
token = getpass.getpass(prompt='IBM device > ')
device = getpass.getpass(prompt='IBM device > ')
# create main compiler engine for the IBM back-end
eng = MainEngine(IBMBackend(use_hardware=True, token=token, num_runs=1024,
verbose=False, device=device),
Expand Down
43 changes: 0 additions & 43 deletions examples/ibm16.py

This file was deleted.

0 comments on commit 659304d

Please sign in to comment.