# Cirq

## Circuits

Circuits are the primary unit of a #quantum-program, represented using the Cirquit class. A Cirquit consists of several Moment objects, which itself is a collection of Operation objects. A Moment represents a slice of time, while it’s Operations represent some effect on a specific subset of #qubits.

GateOperation is the most commonly used type of Operation.

Circuit is an iterable of Moment objects.

### Insert Strategies

InsertStrategy defines how Moments are automatically constructed when Cirquit.append() is passed multiple Operation objects that touch the same qubit(s). In short, it allows to pass in a series of operations that have a defined order, but can happen simultaneously so long as the operations are operating on different qubits. See InsertStrategies.

### OP_TREE

An OP_TREE is a contract that states: if the input can be iteratively flattened into a list of operations, then the input is an OP_TREE

### Optimizers

Circuits can be optimized for different hardware architectures or to compact single qubit gates to optimize runtime complexity/parallelization within Moment time slices. For more details, see Cirq docs.

### Local R Gates

Implemented as special cases of the {X,Y,Z}PowGates, the rx, ry, and rz gates are functions that return instances of their corresponding PowGate, converting the “x-turn” format into radians: $$x/\pi$$

Where $$x$$ is the phi argument to the r{x,y,x} function.

### Serialization

Cirq has some support for JSON serialization. The gates all seem to support the to_json method, but it looks like ParallelGateOperation isn’t supported by the serialization framework.