Esempio n. 1
0
def test_tf_gate_wrapper_gate_inheritance_parametrized(g):
    inst = g(0.01)(q(0))
    wrapped = tf_gate_wrapper(inst)
    unitary = cirq.unitary(inst)
    wrapped = tf_gate_wrapper(inst, tf.complex64)
    with tf.Session() as sess:
        tf_inst = sess.run(wrapped._tensor)
    np.testing.assert_array_almost_equal(cirq.unitary(inst), tf_inst)
Esempio n. 2
0
def test_tf_gate_wrapper_tensor_inputs():
    # TODO
    init_t = np.pi / 2
    t = tf.Variable(init_t)
    inst = cirq.YPowGate(exponent=t)(q(0))
    wrapped = tf_gate_wrapper(inst)
    print(wrapped._tensor)
Esempio n. 3
0
def test_tf_gate_wrapper_parity_gate():
    for g in [cirq.ZZPowGate]:
        inst = g(exponent=3.84)(q(0), q(1))
        wrapped = tf_gate_wrapper(inst)
        with tf.Session() as sess:
            tf_inst = sess.run(wrapped._tensor).reshape((4, 4))
        np.testing.assert_array_almost_equal(cirq.unitary(inst), tf_inst)
Esempio n. 4
0
def test_tf_gate_wrapper_gate_inheritance(g):
    """Wrapping a gate instance with a wrapper base class."""
    inst = g(q(0))
    wrapped = tf_gate_wrapper(inst, tf.complex64)
    with tf.Session() as sess:
        tf_inst = sess.run(wrapped._tensor)
    np.testing.assert_array_almost_equal(cirq.unitary(inst), tf_inst)
Esempio n. 5
0
    def simulate_sweep(
            self,
            program: Union[circuits.Circuit],
            params: study.Sweepable,
            qubit_order: ops.QubitOrderOrList = ops.QubitOrder.DEFAULT,
            initial_state: Any = None) -> List[tf.Tensor]:
        """Simulates the supplied Circuit or Schedule.

        Note: This differs from cirq.WaveFunctionSimulator in the return
        type, which is List[tf.tensor] instead of List[SimulationTrialResult].

        This method returns a result which allows access to the entire
        wave function. In contrast to simulate, this allows for sweeping
        over different parameter values.

        Args:
            program: The circuit or schedule to simulate.
            params: Parameters to run with the program.
            qubit_order: Determines the canonical ordering of the qubits. This
                is often used in specifying the initial state, i.e. the
                ordering of the computational basis states.
            initial_state: The initial state for the simulation. The form of
                this state depends on the simulation implementation.  See
                documentation of the implementing class for details.

        Returns:
            List of wavefunctions for this run, one for each possible parameter
                resolver.
        """
        # 1. checking/promotion of initial state to track qubits
        # TODO: enforce sizing on initial_state; don't want any stray/missing qubits
        if initial_state is None:
            initial_state = np.zeros((2**len(program.all_qubits()), ))
            initial_state[0] = 1
        if isinstance(initial_state, np.ndarray):
            initial_qubits = range(int(np.log2(initial_state.shape[0])))
            # enforce tensor shape 2,2,2,2,...
            initial_state = initial_state.reshape((2, ) * len(initial_qubits))
            state = tf.convert_to_tensor(value=initial_state,
                                         dtype=self._dtype)
            # fixme: util here:
            # state = TFWaveFunctionSimulatorState(state, initial_qubits)

        # TODO: gather a set of all qubits acted on in this circuit

        # FIXME: initialize buffer variable
        # buf = tf.Variable(tf.zeros_like(state, dtype=self._dtype), name='buffer')
        # Moment-wise construction of a set of matrices to apply wall
        self.ops = []
        self.indices = []
        for moment in program:
            # FIXME: empty moment?
            for op in moment.operations:
                self.ops.append(tf_gate_wrapper(op, dtype=self._dtype))
                self.indices.append([q.x for q in op.qubits])

        param_resolvers = study.to_resolvers(params)
        trial_results = []
        qubit_order = ops.QubitOrder.as_qubit_order(qubit_order)
        for param_resolver in param_resolvers:

            # prepare to iteratively construct graph down the line of ops
            state_and_buff = _StateAndBuffer(state, None)  # initializer
            for op, inds in zip(self.ops, self.indices):
                # can't flush the buffer!!
                # buf = tf.assign(tf.get_variable(name='buffer'), tf.zeros_like(state, dtype=self._dtype))
                buf = tf.zeros_like(state, dtype=self._dtype)
                state_and_buff = _StateAndBuffer(state_and_buff.state, buf)
                state_and_buff = self._simulate_unitary(
                    op, state_and_buff, inds)

            # TODO: actually make sweep usable by supplying parameters here..?
            # trial_results.append(
            #     SimulationTrialResult(
            #         params=param_resolver,
            #         measurements={},
            #         final_simulator_state=state_and_buff.state))
            trial_results.append(state_and_buff.state)

        return trial_results
Esempio n. 6
0
def test_tf_gate_wrapper_single_qubit_eigengate(g):
    inst = g(exponent=3.84)(q(0), q(1))
    wrapped = tf_gate_wrapper(inst)
    with tf.Session() as sess:
        tf_inst = sess.run(wrapped._tensor).reshape((4, 4))
    np.testing.assert_array_almost_equal(cirq.unitary(inst), tf_inst)
Esempio n. 7
0
def test_tf_gate_wrapper_single_qubit_eigengate(g):
    inst = g(exponent=1.5)(q(0))
    wrapped = tf_gate_wrapper(inst, tf.complex64)
    with tf.Session() as sess:
        tf_inst = sess.run(wrapped._tensor)
    np.testing.assert_array_almost_equal(cirq.unitary(inst), tf_inst)
Esempio n. 8
0
def test_tf_gate_wrapper_gate_inheritance(g):
    inst = g(q(0), q(1))
    wrapped = tf_gate_wrapper(inst, tf.complex64)
    with tf.Session() as sess:
        tf_inst = sess.run(wrapped._tensor).reshape((4, 4))
    np.testing.assert_array_almost_equal(cirq.unitary(inst), tf_inst)