Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
00c1030
add CircuitElement mixin class
ShellyGarion Sep 30, 2021
1bb861f
update Instruction class
ShellyGarion Sep 30, 2021
34317d9
reformat instruction.py
ShellyGarion Sep 30, 2021
ea0f117
Merge branch 'main' into circuit_element
levbishop Sep 30, 2021
4d35d3c
first pass on adding CircuitElement mixin to Clifford
alexanderivrii Oct 6, 2021
df319e3
Merge pull request #3 from alexanderivrii/circuit_element
ShellyGarion Oct 6, 2021
3dba19c
style edits
ShellyGarion Oct 6, 2021
a73cf37
add docstring in CircuitElement class
ShellyGarion Oct 6, 2021
946a44c
remove duplicate instruction
ShellyGarion Oct 6, 2021
c0ac0cd
remove unused import instruction from instructionset
ShellyGarion Oct 6, 2021
665efa9
adding @property to functions in instruction.py related to CircuitEle…
alexanderivrii Oct 7, 2021
44ac031
Merge pull request #5 from alexanderivrii/circuit_element
ShellyGarion Oct 7, 2021
16a2710
For Instruction class: fixes related to @property decorator, and addi…
alexanderivrii Oct 7, 2021
2c91561
Merge pull request #6 from alexanderivrii/circuit_element
ShellyGarion Oct 7, 2021
ce47b1a
fix comment following review
ShellyGarion Oct 7, 2021
fb613fc
remove setter from Instruction
ShellyGarion Oct 8, 2021
51c9a82
add name setter since CI is failing
ShellyGarion Oct 8, 2021
0fca3e6
update num_params
ShellyGarion Oct 8, 2021
83a1adc
making QuantumCircuit inherit QuantumElementMixin
alexanderivrii Oct 10, 2021
badde7c
making sure that to_instruction still gets called for Clifford and Qu…
alexanderivrii Oct 10, 2021
ef1c1eb
updating description for params
alexanderivrii Oct 10, 2021
a510115
Merge pull request #9 from alexanderivrii/circuit_element
ShellyGarion Oct 10, 2021
daf4a69
Merge branch 'main' into circuit_element
ShellyGarion Oct 11, 2021
44eecfe
refactor CircuitElement --> Operation
ShellyGarion Oct 13, 2021
37573b2
update comments
ShellyGarion Oct 13, 2021
3033663
style
ShellyGarion Oct 13, 2021
1a49f9b
revert to original Instruction class
ShellyGarion Oct 14, 2021
e1cbf4f
revert code in instructionset and quantumcircuit
ShellyGarion Oct 14, 2021
9dda899
revert instructionset import
ShellyGarion Oct 14, 2021
16e6b6c
make Gate an Operation Mixin
ShellyGarion Oct 14, 2021
f90d68c
update Gate
ShellyGarion Oct 14, 2021
a999d8d
remove params from gate.py
ShellyGarion Oct 18, 2021
38aa966
style
ShellyGarion Oct 18, 2021
cbb90e3
update quantumcircuit following review
ShellyGarion Oct 19, 2021
682c817
add to_instruction method to Operation
ShellyGarion Oct 19, 2021
63e69a5
style
ShellyGarion Oct 19, 2021
f408dfe
fix to_instruction method in Operation
ShellyGarion Oct 19, 2021
77be67c
fix to_instruction method in Operation
ShellyGarion Oct 19, 2021
674a899
remove to_instruction method from Operation
ShellyGarion Oct 19, 2021
2b714f1
style
ShellyGarion Oct 19, 2021
3c47c3d
adding Operation mixing to Barrier, Measure, and Reset
alexanderivrii Oct 20, 2021
ee40fb4
Merge pull request #11 from alexanderivrii/circuit_element2
ShellyGarion Oct 20, 2021
f53c1bf
implementing name, num_qubits, num_clbits directly in Operation; remo…
alexanderivrii Oct 26, 2021
dd6ecc8
copy-pasting is evil
alexanderivrii Oct 26, 2021
45b0a8b
Merge pull request #12 from alexanderivrii/circuit_element
ShellyGarion Oct 26, 2021
4b9188b
fix conflict with main branch
ShellyGarion Oct 26, 2021
4607f6f
fix clifford name to Clifford
ShellyGarion Oct 26, 2021
6f08181
add super to QuantumCircuit
ShellyGarion Oct 26, 2021
80f9b45
fix super in QuantumCircuit
ShellyGarion Oct 26, 2021
51ac2ce
Fixing name is QuantumCircuit constructor
alexanderivrii Oct 26, 2021
0af6037
Merge pull request #13 from alexanderivrii/circuit_element
ShellyGarion Oct 26, 2021
1ca8db2
replace params with parameters in super
ShellyGarion Oct 26, 2021
04093d7
revert super in QuantumCircuit
ShellyGarion Oct 27, 2021
464487d
Merge branch 'main' into main_shelly_5
ShellyGarion Oct 27, 2021
4afcc1b
add Operation mixin to CNOTDiheral class
ShellyGarion Oct 27, 2021
237db1a
Adding Operation mixin to isometry and initializer
alexanderivrii Oct 27, 2021
85ef076
Merge pull request #14 from alexanderivrii/circuit_element
ShellyGarion Oct 27, 2021
200e549
add Operation mixin to Pauli class
ShellyGarion Oct 27, 2021
aecf2f3
add release notes
ShellyGarion Oct 27, 2021
a17e7c2
change _name to name in Gate class
ShellyGarion Oct 31, 2021
f3b5d72
add description to Operation docstring
ShellyGarion Oct 31, 2021
aeea5f4
raising CircuitError to disallow direct instantiation of Operation (b…
alexanderivrii Nov 2, 2021
cb6d667
Eli pointed out that calling Operation.__init__ is bad Python practic…
alexanderivrii Nov 2, 2021
00f7b05
running black
alexanderivrii Nov 2, 2021
10bccc9
Merge pull request #17 from alexanderivrii/circuit_element
ShellyGarion Nov 2, 2021
ea961e3
temporarily remove _new_ in Operation class
ShellyGarion Nov 2, 2021
2b7e258
remove CircuitError import from Operation
ShellyGarion Nov 2, 2021
a964fd2
fix signature errors when estimating free parameters
ewinston Nov 3, 2021
ef87ef9
Merge pull request #18 from ewinston/shelly/circuit_element
ShellyGarion Nov 4, 2021
abe8187
add CircuitError back to Operation
ShellyGarion Nov 4, 2021
8db4cbe
Adding pylint-disable messages for C3XGate and MCXGate (both implemen…
alexanderivrii Nov 9, 2021
3b4cc6f
Disabling pylint complaints that __new__ does not use args and kwargs…
alexanderivrii Nov 9, 2021
4256d7b
Fixed comparison between str and constant string
alexanderivrii Nov 9, 2021
aa22f38
Adding test for Operation class
alexanderivrii Nov 9, 2021
6d48741
Reformatting using black
alexanderivrii Nov 9, 2021
5d8a6ea
Merge pull request #19 from alexanderivrii/circuit_element
ShellyGarion Nov 9, 2021
5f45ae1
remove Operation mixin from QuantumCircuit class
ShellyGarion Nov 10, 2021
0c07a44
remove QuantumCircuit from documentation and release notes
ShellyGarion Nov 10, 2021
4117677
update names to lower case
ShellyGarion Nov 11, 2021
2aee5c7
refactor: params --> operands
ShellyGarion Nov 11, 2021
1be374a
Merge branch 'main' into circuit_element
ShellyGarion Dec 8, 2021
e974e4c
Updating the Operation class following the meeting with the quantum s…
alexanderivrii Dec 9, 2021
7cb8a11
Merge pull request #26 from alexanderivrii/circuit_element
ShellyGarion Dec 9, 2021
316c6b6
style fixes
ShellyGarion Dec 9, 2021
bf638b6
fix lint
ShellyGarion Dec 9, 2021
d537fda
remove import Operation from test
ShellyGarion Dec 9, 2021
052b923
minor fixes
alexanderivrii Dec 13, 2021
a792b8f
Merge pull request #27 from alexanderivrii/circuit_element
ShellyGarion Dec 13, 2021
f898e1b
Merge branch 'main' into circuit_element
ShellyGarion Dec 13, 2021
3e56045
Merge branch 'main' into circuit_element
ShellyGarion Jan 9, 2022
cd7f373
revert line in Gate class
ShellyGarion Jan 9, 2022
2b14079
revert pylint disable in x.py
ShellyGarion Jan 9, 2022
54ec96e
revert changes in gate_utils in test
ShellyGarion Jan 10, 2022
72f54cf
add more detailed doc and an example
ShellyGarion Jan 11, 2022
d005e97
Merge branch 'main' into circuit_element
mergify[bot] Jan 11, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions qiskit/circuit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@
from .controlledgate import ControlledGate
from .instruction import Instruction
from .instructionset import InstructionSet
from .operation import Operation
from .barrier import Barrier
from .delay import Delay
from .measure import Measure
Expand Down
3 changes: 2 additions & 1 deletion qiskit/circuit/barrier.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@

from qiskit.exceptions import QiskitError
from .instruction import Instruction
from .operation import Operation


class Barrier(Instruction):
class Barrier(Instruction, Operation):
"""Barrier instruction."""

_directive = True
Expand Down
3 changes: 2 additions & 1 deletion qiskit/circuit/gate.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@
from qiskit.circuit.parameterexpression import ParameterExpression
from qiskit.circuit.exceptions import CircuitError
from .instruction import Instruction
from .operation import Operation


class Gate(Instruction):
class Gate(Instruction, Operation):
"""Unitary gate."""

def __init__(
Expand Down
36 changes: 33 additions & 3 deletions qiskit/circuit/instruction.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ def __init__(self, name, num_qubits, num_clbits, params, duration=None, unit="dt
raise CircuitError(
"bad instruction dimensions: %d qubits, %d clbits." % num_qubits, num_clbits
)
self.name = name
self.num_qubits = num_qubits
self.num_clbits = num_clbits
self._name = name
self._num_qubits = num_qubits
self._num_clbits = num_clbits

self._params = [] # a list of gate params stored
# Custom instruction label
Expand Down Expand Up @@ -546,3 +546,33 @@ def condition_bits(self) -> List[Clbit]:
return [self.condition[0]]
else: # ClassicalRegister
return list(self.condition[0])

@property
def name(self):
"""Return the name."""
return self._name

@name.setter
def name(self, name):
"""Set the name."""
self._name = name

Comment thread
ShellyGarion marked this conversation as resolved.
@property
def num_qubits(self):
"""Return the number of qubits."""
return self._num_qubits

@num_qubits.setter
def num_qubits(self, num_qubits):
"""Set num_qubits."""
self._num_qubits = num_qubits

Comment thread
ShellyGarion marked this conversation as resolved.
@property
def num_clbits(self):
"""Return the number of clbits."""
return self._num_clbits

@num_clbits.setter
def num_clbits(self, num_clbits):
"""Set num_clbits."""
self._num_clbits = num_clbits
3 changes: 2 additions & 1 deletion qiskit/circuit/measure.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
import warnings

from qiskit.circuit.instruction import Instruction
from qiskit.circuit.operation import Operation
from qiskit.circuit.exceptions import CircuitError


class Measure(Instruction):
class Measure(Instruction, Operation):
"""Quantum measurement in the computational basis."""

def __init__(self):
Expand Down
61 changes: 61 additions & 0 deletions qiskit/circuit/operation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# This code is part of Qiskit.
#
# (C) Copyright IBM 2017.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

"""Quantum Operation Mixin."""

from abc import ABC, abstractmethod


class Operation(ABC):
Comment thread
ShellyGarion marked this conversation as resolved.
"""Quantum Operation Interface Class.
For objects that can be added to a :class:`~qiskit.circuit.QuantumCircuit`.
These objects include :class:`~qiskit.circuit.Gate`, :class:`~qiskit.circuit.Reset`,
:class:`~qiskit.circuit.Barrier`, :class:`~qiskit.circuit.Measure`,
and operators such as :class:`~qiskit.quantum_info.Clifford`.
The main purpose is to add an :class:`~qiskit.circuit.Operation` to a
:class:`~qiskit.circuit.QuantumCircuit` without synthesizing it before the transpilation.

Example:

Add a Clifford and a Toffoli gate to a QuantumCircuit.

.. jupyter-execute::

from qiskit import QuantumCircuit
from qiskit.quantum_info import Clifford, random_clifford

qc = QuantumCircuit(3)
cliff = random_clifford(2)
qc.append(cliff, [0, 1])
qc.ccx(0, 1, 2)
qc.draw()
"""
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here and in the release note, it would be good to have a simple example of how users should expect to use this class and some details on its motivation. e.g. Clifford is probably a more representative example than Reset.


__slots__ = ()

@property
Comment thread
ShellyGarion marked this conversation as resolved.
@abstractmethod
def name(self):
"""Unique string identifier for operation type."""
raise NotImplementedError

@property
Comment thread
ShellyGarion marked this conversation as resolved.
@abstractmethod
def num_qubits(self):
"""Number of qubits."""
raise NotImplementedError

@property
@abstractmethod
def num_clbits(self):
"""Number of classical bits."""
raise NotImplementedError
3 changes: 2 additions & 1 deletion qiskit/circuit/reset.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@
import warnings

from qiskit.circuit.instruction import Instruction
from qiskit.circuit.operation import Operation


class Reset(Instruction):
class Reset(Instruction, Operation):
"""Qubit reset."""

def __init__(self):
Expand Down
4 changes: 2 additions & 2 deletions qiskit/extensions/quantum_initializer/initializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from qiskit.exceptions import QiskitError
from qiskit.circuit import QuantumCircuit
from qiskit.circuit import QuantumRegister
from qiskit.circuit import Instruction
from qiskit.circuit import Instruction, Operation
from qiskit.circuit.exceptions import CircuitError
from qiskit.circuit.library.standard_gates.x import CXGate, XGate
from qiskit.circuit.library.standard_gates.h import HGate
Expand All @@ -32,7 +32,7 @@
_EPS = 1e-10 # global variable used to chop very small numbers to zero


class Initialize(Instruction):
class Initialize(Instruction, Operation):
"""Complex amplitude initialization.

Class that implements the (complex amplitude) initialization of some
Expand Down
3 changes: 2 additions & 1 deletion qiskit/extensions/quantum_initializer/isometry.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

from qiskit.circuit.exceptions import CircuitError
from qiskit.circuit.instruction import Instruction
from qiskit.circuit.operation import Operation
from qiskit.circuit.quantumcircuit import QuantumCircuit
from qiskit.circuit.quantumregister import QuantumRegister
from qiskit.exceptions import QiskitError
Expand All @@ -35,7 +36,7 @@
_EPS = 1e-10 # global variable used to chop very small numbers to zero


class Isometry(Instruction):
class Isometry(Instruction, Operation):
"""
Decomposition of arbitrary isometries from m to n qubits. In particular, this allows to
decompose unitaries (m=n) and to do state preparation (m=0).
Expand Down
14 changes: 12 additions & 2 deletions qiskit/quantum_info/operators/dihedral/dihedral.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@
from qiskit.quantum_info.operators.scalar_op import ScalarOp
from qiskit.quantum_info.synthesis.cnotdihedral_decompose import decompose_cnotdihedral
from qiskit.quantum_info.operators.mixins import generate_apidocs, AdjointMixin
from qiskit.circuit import QuantumCircuit, Instruction
from qiskit.circuit import QuantumCircuit, Instruction, Operation
from .dihedral_circuits import _append_circuit
from .polynomial import SpecialPolynomial


class CNOTDihedral(BaseOperator, AdjointMixin):
class CNOTDihedral(BaseOperator, AdjointMixin, Operation):
"""An N-qubit operator from the CNOT-Dihedral group.

The CNOT-Dihedral group is generated by the quantum gates,
Expand Down Expand Up @@ -160,6 +160,16 @@ def __init__(self, data=None, num_qubits=None, validate=True):
if validate and not self._is_valid():
raise QiskitError("Invalid CNOTDihedral element.")

@property
def name(self):
"""Unique string identifier for operation type."""
return "cnotdihedral"

@property
def num_clbits(self):
"""Number of classical bits."""
return 0

def _z2matmul(self, left, right):
"""Compute product of two n x n z2 matrices."""
prod = np.mod(np.dot(left, right), 2)
Expand Down
19 changes: 17 additions & 2 deletions qiskit/quantum_info/operators/symplectic/clifford.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import numpy as np

from qiskit.exceptions import QiskitError
from qiskit.circuit import QuantumCircuit, Instruction
from qiskit.circuit import QuantumCircuit, Instruction, Operation
from qiskit.circuit.library.standard_gates import IGate, XGate, YGate, ZGate, HGate, SGate
from qiskit.quantum_info.operators.base_operator import BaseOperator
from qiskit.quantum_info.operators.operator import Operator
Expand All @@ -27,7 +27,7 @@
from .clifford_circuits import _append_circuit


class Clifford(BaseOperator, AdjointMixin):
class Clifford(BaseOperator, AdjointMixin, Operation):
"""An N-qubit unitary operator from the Clifford group.

**Representation**
Expand Down Expand Up @@ -137,6 +137,21 @@ def __init__(self, data, validate=True):
# Initialize BaseOperator
super().__init__(num_qubits=self._table.num_qubits)

@property
def name(self):
"""Unique string identifier for operation type."""
return "clifford"

@property
def num_qubits(self):
"""Number of qubits."""
return self._table.num_qubits

@property
def num_clbits(self):
"""Number of classical bits."""
return 0

def __repr__(self):
return f"Clifford({repr(self.table)})"

Expand Down
14 changes: 12 additions & 2 deletions qiskit/quantum_info/operators/symplectic/pauli.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

import numpy as np

from qiskit.circuit import Instruction, QuantumCircuit
from qiskit.circuit import Instruction, QuantumCircuit, Operation
from qiskit.circuit.barrier import Barrier
from qiskit.circuit.library.generalized_gates import PauliGate
from qiskit.circuit.library.standard_gates import IGate, XGate, YGate, ZGate
Expand All @@ -31,7 +31,7 @@
from qiskit.utils.deprecation import deprecate_function


class Pauli(BasePauli):
class Pauli(BasePauli, Operation):
r"""N-qubit Pauli operator.

This class represents an operator :math:`P` from the full :math:`n`-qubit
Expand Down Expand Up @@ -202,6 +202,16 @@ def __init__(self, data=None, x=None, *, z=None, label=None):
raise QiskitError("Input is not a single Pauli")
super().__init__(base_z, base_x, base_phase)

@property
def name(self):
"""Unique string identifier for operation type."""
return "pauli"

@property
def num_clbits(self):
"""Number of classical bits."""
return 0

def __repr__(self):
"""Display representation."""
return f"Pauli('{self.__str__()}')"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
features:
- |
A new :class:`~qiskit.circuit.Operation` base class for objects
that can be added to a :class:`~qiskit.circuit.QuantumCircuit`.
These objects include :class:`~qiskit.circuit.Gate`, :class:`~qiskit.circuit.Reset`,
:class:`~qiskit.circuit.Barrier`, :class:`~qiskit.circuit.Measure`,
and operators such as :class:`~qiskit.quantum_info.Clifford`.
The main purpose is to add an :class:`~qiskit.circuit.Operation` to a
:class:`~qiskit.circuit.QuantumCircuit` without synthesizing it before the transpilation.
Loading