Ejemplo n.º 1
0
 def test_qubits_qubits_given_mismatch(self):
     """ qubits 5 given mismatch test """
     with self.assertRaises(AquaError):
         _ = Custom(5, state_vector=[1.0] * 23)
Ejemplo n.º 2
0
    def test_evolution(self):
        SIZE = 2
        #SPARSITY = 0
        #X = [[0, 1], [1, 0]]
        #Y = [[0, -1j], [1j, 0]]
        Z = [[1, 0], [0, -1]]
        I = [[1, 0], [0, 1]]
        # + 0.5 * np.kron(Y, X)# + 0.3 * np.kron(Z, X) + 0.4 * np.kron(Z, Y)
        h1 = np.kron(I, Z)

        # np.random.seed(2)
        temp = np.random.random((2 ** SIZE, 2 ** SIZE))
        h1 = temp + temp.T
        qubit_op = Operator(matrix=h1)
        # qubit_op_jw.chop_by_threshold(10 ** -10)

        if qubit_op.grouped_paulis is None:
            qubit_op._matrix_to_paulis()
            qubit_op._paulis_to_grouped_paulis()

        for ps in qubit_op.grouped_paulis:
            for p1 in ps:
                for p2 in ps:
                    if p1 != p2:
                        np.testing.assert_almost_equal(
                            p1[1].to_matrix() @ p2[1].to_matrix(),
                            p2[1].to_matrix() @ p1[1].to_matrix()
                        )

        state_in = Custom(SIZE, state='random')

        evo_time = 1
        num_time_slices = 3

        # announces params
        self.log.debug('evo time:        {}'.format(evo_time))
        self.log.debug('num time slices: {}'.format(num_time_slices))
        self.log.debug('state_in:        {}'.format(state_in._state_vector))

        # get the exact state_out from raw matrix multiplication
        state_out_exact = qubit_op.evolve(
            state_in=state_in.construct_circuit('vector'),
            evo_time=evo_time,
            evo_mode='matrix',
            num_time_slices=0
        )
        # self.log.debug('exact:\n{}'.format(state_out_exact))
        qubit_op_temp = copy.deepcopy(qubit_op)
        for expansion_mode in ['trotter', 'suzuki']:
            self.log.debug(
                'Under {} expansion mode:'.format(expansion_mode))
            for expansion_order in [1, 2, 3, 4] if expansion_mode == 'suzuki' else [1]:
                # assure every time the operator from the original one
                qubit_op = copy.deepcopy(qubit_op_temp)
                if expansion_mode == 'suzuki':
                    self.log.debug(
                        'With expansion order {}:'.format(expansion_order))
                state_out_matrix = qubit_op.evolve(
                    state_in=state_in.construct_circuit('vector'),
                    evo_time=evo_time,
                    evo_mode='matrix',
                    num_time_slices=num_time_slices,
                    expansion_mode=expansion_mode,
                    expansion_order=expansion_order
                )

                quantum_registers = QuantumRegister(qubit_op.num_qubits, name='q')
                qc = QuantumCircuit(quantum_registers)
                qc += state_in.construct_circuit(
                    'circuit', quantum_registers)
                qc += qubit_op.evolve(
                    evo_time=evo_time,
                    evo_mode='circuit',
                    num_time_slices=num_time_slices,
                    quantum_registers=quantum_registers,
                    expansion_mode=expansion_mode,
                    expansion_order=expansion_order,
                )
                job = q_execute(qc, BasicAer.get_backend('statevector_simulator'))
                state_out_circuit = np.asarray(
                    job.result().get_statevector(qc, decimals=16))

                self.log.debug('The fidelity between exact and matrix:   {}'.format(
                    state_fidelity(state_out_exact, state_out_matrix)
                ))
                self.log.debug('The fidelity between exact and circuit:  {}'.format(
                    state_fidelity(state_out_exact, state_out_circuit)
                ))
                f_mc = state_fidelity(state_out_matrix, state_out_circuit)
                self.log.debug(
                    'The fidelity between matrix and circuit: {}'.format(f_mc))
                self.assertAlmostEqual(f_mc, 1)
Ejemplo n.º 3
0
    def __init__(self,
                 oracle: Oracle, init_state: Optional[InitialState] = None,
                 incremental: bool = False,
                 num_iterations: int = 1,
                 lam: float = 1.34,
                 rotation_counts: Optional[list] = None,
                 mct_mode: str = 'basic',
                 quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
        # pylint: disable=line-too-long
        r"""
        Args:
            oracle: The oracle component
            init_state: An optional initial quantum state. If None (default) then Grover's Search
                 by default uses uniform superposition to initialize its quantum state. However,
                 an initial state may be supplied, if useful, for example, if the user has some
                 prior knowledge regarding where the search target(s) might be located.
            incremental: Whether to use incremental search mode (True) or not (False).
                 Supplied *num_iterations* is ignored when True and instead the search task will
                 be carried out in successive rounds, using circuits built with incrementally
                 higher number of iterations for the repetition of the amplitude amplification
                 until a target is found or the maximal number :math:`\log N` (:math:`N` being the
                 total number of elements in the set from the oracle used) of iterations is
                 reached. The implementation follows Section 4 of [2].
            lam: For incremental search mode, the maximum number of repetition of amplitude
                 amplification increases by factor lam in every round,
                 :math:`R_{i+1} = lam \times R_{i}`. If this parameter is not set, the default
                 value lam = 1.34 is used, which is proved to be optimal [1].
            rotation_counts: For incremental mode, if rotation_counts is defined, parameter *lam*
                is ignored. rotation_counts is the list of integers that defines the number of
                repetition of amplitude amplification for each round.
            num_iterations: How many times the marking and reflection phase sub-circuit is
                repeated to amplify the amplitude(s) of the target(s). Has a minimum value of 1.
            mct_mode: Multi-Control Toffoli mode ('basic' | 'basic-dirty-ancilla' |
                'advanced' | 'noancilla')
            quantum_instance: Quantum Instance or Backend

        Raises:
            AquaError: evaluate_classically() missing from the input oracle

        References:
            [1]: Baritompa et al., Grover's Quantum Algorithm Applied to Global Optimization
                 `<https://www.researchgate.net/publication/220133694_Grover%27s_Quantum_Algorithm_Applied_to_Global_Optimization>`_
            [2]: Boyer et al., Tight bounds on quantum searching
                 `<https://arxiv.org/abs/quant-ph/9605034>`_
        """
        validate_min('num_iterations', num_iterations, 1)
        validate_in_set('mct_mode', mct_mode,
                        {'basic', 'basic-dirty-ancilla',
                         'advanced', 'noancilla'})
        super().__init__(quantum_instance)

        if not callable(getattr(oracle, "evaluate_classically", None)):
            raise AquaError(
                'Missing the evaluate_classically() method from the provided oracle instance.'
            )

        self._oracle = oracle
        self._mct_mode = mct_mode
        self._init_state = \
            init_state if init_state else Custom(len(oracle.variable_register), state='uniform')
        self._init_state_circuit = \
            self._init_state.construct_circuit(mode='circuit', register=oracle.variable_register)
        self._init_state_circuit_inverse = self._init_state_circuit.inverse()

        self._diffusion_circuit = self._construct_diffusion_circuit()
        self._max_num_iterations = np.ceil(2 ** (len(oracle.variable_register) / 2))
        self._incremental = incremental
        self._lam = lam
        self._rotation_counts = rotation_counts
        self._num_iterations = num_iterations if not incremental else 1
        if incremental:
            logger.debug('Incremental mode specified, ignoring "num_iterations".')
        else:
            if num_iterations > self._max_num_iterations:
                logger.warning('The specified value %s for "num_iterations" '
                               'might be too high.', num_iterations)
        self._ret = {}  # type: Dict[str, Any]
        self._qc_aa_iteration = None
        self._qc_amplitude_amplification = None
        self._qc_measurement = None
Ejemplo n.º 4
0
 def test_qubits_2_given_vector(self):
     self.custom = Custom(2, state_vector=[0.5] * 4)
     cct = self.custom.construct_circuit('vector')
     np.testing.assert_array_equal(cct, [0.5] * 4)
Ejemplo n.º 5
0
 def test_qubits_5_randgiven_vector(self):
     self.custom = Custom(5, state_vector=np.random.rand(32))
     cct = self.custom.construct_circuit('vector')
     prob = np.sqrt(np.sum([x**2 for x in cct]))
     self.assertAlmostEqual(prob, 1.0)
Ejemplo n.º 6
0
 def test_qubits_5_zero_circuit(self):
     self.custom = Custom(5, state='zero')
     cct = self.custom.construct_circuit('circuit')
     self.assertEqual(cct.qasm(),
                      'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[5];\n')
Ejemplo n.º 7
0
 def test_qubits_2_uniform_circuit(self):
     self.custom = Custom(2, state='uniform')
     cct = self.custom.construct_circuit('circuit')
     self.assertEqual(
         cct.qasm(), 'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[2];\n'
         'u2(0.0,3.14159265358979) q[0];\nu2(0.0,3.14159265358979) q[1];\n')
Ejemplo n.º 8
0
 # Initialize qGAN
qgan = QGAN(real_data, bounds, num_qubits, batch_size, num_epochs, snapshot_dir=None)
qgan.seed = 1
# Set quantum instance to run the quantum generator
quantum_instance = QuantumInstance(backend=Aer.get_backend('statevector_simulator'))

# Set entangler map
entangler_map = [[0, 1]]

# Set an initial state for the generator circuit
init_dist = UniformDistribution(sum(num_qubits), low=bounds[0], high=bounds[1])
print(init_dist.probabilities)
q = QuantumRegister(sum(num_qubits), name='q')
qc = QuantumCircuit(q)
init_dist.build(qc, q)
init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)
var_form = RY(int(np.sum(num_qubits)), depth=1, initial_state = init_distribution, 
              entangler_map=entangler_map, entanglement_gate='cz')
# Set generator's initial parameters
init_params = aqua_globals.random.rand(var_form._num_parameters) * 2 * np.pi
# Set generator circuit
g_circuit = UnivariateVariationalDistribution(int(sum(num_qubits)), var_form, init_params,
                                              low=bounds[0], high=bounds[1])
# Set quantum generator
qgan.set_generator(generator_circuit=g_circuit)
# Set classical discriminator neural network
discriminator = NumpyDiscriminator(len(num_qubits))
qgan.set_discriminator(discriminator)
# -

# Run qGAN
Ejemplo n.º 9
0
 def build(self, qc, q, q_ancillas=None, params=None):
     """ build """
     custom_state = Custom(self.num_target_qubits,
                           state_vector=np.sqrt(self.probabilities))
     qc.extend(custom_state.construct_circuit('circuit', q))
Ejemplo n.º 10
0
 def test_qubits_5_random_vector(self):
     """ qubits 5 random vector test """
     custom = Custom(5, state='random')
     cct = custom.construct_circuit('vector')
     prob = np.sqrt(np.sum([x**2 for x in cct]))
     self.assertAlmostEqual(prob, 1.0)
Ejemplo n.º 11
0
def fidelity(hhl, ref):
    solution_hhl_normed = hhl / np.linalg.norm(hhl)
    solution_ref_normed = ref / np.linalg.norm(ref)
    fidelity = state_fidelity(solution_hhl_normed, solution_ref_normed)
    print("fidelity %f" % fidelity)


orig_size = len(vector)
matrix, vector, truncate_powerdim, truncate_hermitian = HHL.matrix_resize(
    matrix, vector)

# Initialize eigenvalue finding module
eigs = create_eigs(matrix, 3, False)
num_q, num_a = eigs.get_register_sizes()

# Initialize initial state module
init_state = Custom(num_q, state_vector=vector)

# Initialize reciprocal rotation module
reci = LookupRotation(negative_evals=eigs._negative_evals,
                      evo_time=eigs._evo_time)

algo = HHL(matrix, vector, truncate_powerdim, truncate_hermitian, eigs,
           init_state, reci, num_q, num_a, orig_size)
result = algo.run(
    QuantumInstance(BasicAer.get_backend('statevector_simulator')))

print(np.round(result['solution'], 5))

# IBMQ.save_account('2014e54721e8677688e0c1dffdc92dfe0f39dbae5d75dd5b14fd087c4f93349b6ea92cbbc872d9a838e946527e10144d554b04587662f5567309b75aca0085f0')
# IBMQ.load_account()
Ejemplo n.º 12
0
 def test_qubits_2_uniform_vector(self):
     """ qubits 2 uniform vector test """
     custom = Custom(2, state='uniform')
     cct = custom.construct_circuit('vector')
     np.testing.assert_array_equal(cct, [0.5] * 4)
Ejemplo n.º 13
0
 def test_qubits_2_zero_circuit(self):
     """ qubits 2 zero circuit test """
     custom = Custom(2, state='zero')
     cct = custom.construct_circuit('circuit')
     self.assertEqual(cct.qasm(),
                      'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[2];\n')
Ejemplo n.º 14
0
 def test_qubits_2_zero_vector_wrong_cct_mode(self):
     """ qubits 2 zero vector wrong cct mode test """
     custom = Custom(5, state='zero')
     with self.assertRaises(AquaError):
         _ = custom.construct_circuit('matrix')
Ejemplo n.º 15
0
class TestInitialStateCustom(QiskitAquaTestCase):
    def test_qubits_2_zero_vector(self):
        self.custom = Custom(2, state='zero')
        cct = self.custom.construct_circuit('vector')
        np.testing.assert_array_equal(cct, [1.0, 0.0, 0.0, 0.0])

    def test_qubits_5_zero_vector(self):
        self.custom = Custom(5, state='zero')
        cct = self.custom.construct_circuit('vector')
        np.testing.assert_array_equal(cct, [
            1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
            0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
            0.0, 0.0, 0.0, 0.0, 0.0, 0.0
        ])

    def test_qubits_2_zero_circuit(self):
        self.custom = Custom(2, state='zero')
        cct = self.custom.construct_circuit('circuit')
        self.assertEqual(cct.qasm(),
                         'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[2];\n')

    def test_qubits_5_zero_circuit(self):
        self.custom = Custom(5, state='zero')
        cct = self.custom.construct_circuit('circuit')
        self.assertEqual(cct.qasm(),
                         'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[5];\n')

    def test_qubits_2_uniform_vector(self):
        self.custom = Custom(2, state='uniform')
        cct = self.custom.construct_circuit('vector')
        np.testing.assert_array_equal(cct, [0.5] * 4)

    def test_qubits_5_uniform_vector(self):
        self.custom = Custom(5, state='uniform')
        cct = self.custom.construct_circuit('vector')
        np.testing.assert_array_almost_equal(cct, [0.1767767] * 32)

    def test_qubits_2_uniform_circuit(self):
        self.custom = Custom(2, state='uniform')
        cct = self.custom.construct_circuit('circuit')
        self.assertEqual(
            cct.qasm(), 'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[2];\n'
            'u2(0.0,3.14159265358979) q[0];\nu2(0.0,3.14159265358979) q[1];\n')

    def test_qubits_2_random_vector(self):
        self.custom = Custom(2, state='random')
        cct = self.custom.construct_circuit('vector')
        prob = np.sqrt(np.sum([x**2 for x in cct]))
        self.assertAlmostEqual(prob, 1.0)

    def test_qubits_5_random_vector(self):
        self.custom = Custom(5, state='random')
        cct = self.custom.construct_circuit('vector')
        prob = np.sqrt(np.sum([x**2 for x in cct]))
        self.assertAlmostEqual(prob, 1.0)

    def test_qubits_2_given_vector(self):
        self.custom = Custom(2, state_vector=[0.5] * 4)
        cct = self.custom.construct_circuit('vector')
        np.testing.assert_array_equal(cct, [0.5] * 4)

    def test_qubits_5_given_vector(self):
        self.custom = Custom(5, state_vector=[1.0] * 32)
        cct = self.custom.construct_circuit('vector')
        np.testing.assert_array_almost_equal(cct, [0.1767767] * 32)

    def test_qubits_5_randgiven_vector(self):
        self.custom = Custom(5, state_vector=np.random.rand(32))
        cct = self.custom.construct_circuit('vector')
        prob = np.sqrt(np.sum([x**2 for x in cct]))
        self.assertAlmostEqual(prob, 1.0)

    def test_qubits_qubits_given_mistmatch(self):
        with self.assertRaises(ValueError):
            self.custom = Custom(5, state_vector=[1.0] * 23)

    def test_qubits_2_zero_vector_wrong_cct_mode(self):
        self.custom = Custom(5, state='zero')
        with self.assertRaises(ValueError):
            cct = self.custom.construct_circuit('matrix')
Ejemplo n.º 16
0
bounds = np.array([0.,7.])
# Set number of qubits used in the uncertainty model
num_qubits = [3]

# Set entangler map
entangler_map = []
for i in range(sum(num_qubits)):
    entangler_map.append([i, int(np.mod(i+1, sum(num_qubits)))])

# Load the trained circuit parameters
g_params = [0.29399714, 0.38853322, 0.9557694, 0.07245791, 6.02626428, 0.13537225]

# Set an initial state for the generator circuit
init_dist = NormalDistribution(sum(num_qubits), mu=1., sigma=1., low=bounds[0], high=bounds[1])
init_distribution = np.sqrt(init_dist.probabilities)
init_distribution = Custom(num_qubits=sum(num_qubits), state_vector=init_distribution)

# construct the variational form
var_form = RealAmplitudes(sum(num_qubits), entanglement=entangler_map, reps=1, initial_state=init_distribution)
var_form.entanglement_blocks = 'cz'
theta = ParameterVector('θ', var_form.num_parameters)
var_form = var_form.assign_parameters(theta)

# Set generator circuit
g_circuit = UnivariateVariationalDistribution(sum(num_qubits), var_form, g_params,
                                              low=bounds[0], high=bounds[1])
g_circuit._var_form_params = theta

# construct circuit factory for uncertainty model
uncertainty_model = g_circuit
Ejemplo n.º 17
0
 def test_qubits_2_zero_vector(self):
     self.custom = Custom(2, state='zero')
     cct = self.custom.construct_circuit('vector')
     np.testing.assert_array_equal(cct, [1.0, 0.0, 0.0, 0.0])
Ejemplo n.º 18
0
    def setUp(self):
        super().setUp()

        self.seed = 7
        aqua_globals.random_seed = self.seed
        # Number training data samples
        n_v = 5000
        # Load data samples from log-normal distribution with mean=1 and standard deviation=1
        m_u = 1
        sigma = 1
        self._real_data = aqua_globals.random.lognormal(mean=m_u,
                                                        sigma=sigma,
                                                        size=n_v)
        # Set upper and lower data values as list of k
        # min/max data values [[min_0,max_0],...,[min_k-1,max_k-1]]
        self._bounds = [0., 3.]
        # Set number of qubits per data dimension as list of k qubit values[#q_0,...,#q_k-1]
        num_qubits = [2]
        # Batch size
        batch_size = 100
        # Set number of training epochs
        # num_epochs = 10
        num_epochs = 5

        # Initialize qGAN
        self.qgan = QGAN(self._real_data,
                         self._bounds,
                         num_qubits,
                         batch_size,
                         num_epochs,
                         snapshot_dir=None)
        self.qgan.seed = 7
        # Set quantum instance to run the quantum generator
        self.qi_statevector = QuantumInstance(
            backend=BasicAer.get_backend('statevector_simulator'),
            seed_simulator=2,
            seed_transpiler=2)
        self.qi_qasm = QuantumInstance(
            backend=BasicAer.get_backend('qasm_simulator'),
            shots=1000,
            seed_simulator=2,
            seed_transpiler=2)
        # Set entangler map
        entangler_map = [[0, 1]]

        # Set an initial state for the generator circuit
        init_dist = UniformDistribution(sum(num_qubits),
                                        low=self._bounds[0],
                                        high=self._bounds[1])
        q = QuantumRegister(sum(num_qubits), name='q')
        qc = QuantumCircuit(q)
        init_dist.build(qc, q)
        init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)

        # Set generator's initial parameters
        init_params = aqua_globals.random.random(
            2 * sum(num_qubits)) * 2 * 1e-2

        # Set variational form
        var_form = RealAmplitudes(sum(num_qubits),
                                  reps=1,
                                  initial_state=init_distribution,
                                  entanglement=entangler_map)
        self.generator_circuit = var_form
        warnings.filterwarnings('ignore', category=DeprecationWarning)
        self.generator_factory = UnivariateVariationalDistribution(
            sum(num_qubits),
            var_form,
            init_params,
            low=self._bounds[0],
            high=self._bounds[1])
        warnings.filterwarnings('always', category=DeprecationWarning)
Ejemplo n.º 19
0
 def test_qubits_5_uniform_vector(self):
     self.custom = Custom(5, state='uniform')
     cct = self.custom.construct_circuit('vector')
     np.testing.assert_array_almost_equal(cct, [0.1767767] * 32)
Ejemplo n.º 20
0
    def test_iqpe(self, qubitOp, simulator):
        self.algorithm = 'IQPE'
        self.log.debug('Testing IQPE')

        self.qubitOp = qubitOp

        exact_eigensolver = ExactEigensolver(self.qubitOp, k=1)
        results = exact_eigensolver.run()

        w = results['eigvals']
        v = results['eigvecs']

        self.qubitOp.to_matrix()
        np.testing.assert_almost_equal(self.qubitOp._matrix @ v[0],
                                       w[0] * v[0])
        np.testing.assert_almost_equal(
            expm(-1.j * sparse.csc_matrix(self.qubitOp._matrix)) @ v[0],
            np.exp(-1.j * w[0]) * v[0])

        self.ref_eigenval = w[0]
        self.ref_eigenvec = v[0]
        self.log.debug('The exact eigenvalue is:       {}'.format(
            self.ref_eigenval))
        self.log.debug('The corresponding eigenvector: {}'.format(
            self.ref_eigenvec))

        num_time_slices = 50
        num_iterations = 6
        state_in = Custom(self.qubitOp.num_qubits,
                          state_vector=self.ref_eigenvec)
        iqpe = IQPE(self.qubitOp,
                    state_in,
                    num_time_slices,
                    num_iterations,
                    expansion_mode='suzuki',
                    expansion_order=2,
                    shallow_circuit_concat=True)

        backend = BasicAer.get_backend(simulator)
        quantum_instance = QuantumInstance(backend,
                                           shots=100,
                                           pass_manager=PassManager())

        result = iqpe.run(quantum_instance)

        self.log.debug('top result str label:         {}'.format(
            result['top_measurement_label']))
        self.log.debug('top result in decimal:        {}'.format(
            result['top_measurement_decimal']))
        self.log.debug('stretch:                      {}'.format(
            result['stretch']))
        self.log.debug('translation:                  {}'.format(
            result['translation']))
        self.log.debug('final eigenvalue from IQPE:   {}'.format(
            result['energy']))
        self.log.debug('reference eigenvalue:         {}'.format(
            self.ref_eigenval))
        self.log.debug('ref eigenvalue (transformed): {}'.format(
            (self.ref_eigenval + result['translation']) * result['stretch']))
        self.log.debug('reference binary str label:   {}'.format(
            decimal_to_binary(
                (self.ref_eigenval.real + result['translation']) *
                result['stretch'],
                max_num_digits=num_iterations + 3,
                fractional_part_only=True)))

        np.testing.assert_approx_equal(result['energy'],
                                       self.ref_eigenval.real,
                                       significant=2)
Ejemplo n.º 21
0
 def test_qubits_2_random_vector(self):
     self.custom = Custom(2, state='random')
     cct = self.custom.construct_circuit('vector')
     prob = np.sqrt(np.sum([x**2 for x in cct]))
     self.assertAlmostEqual(prob, 1.0)
Ejemplo n.º 22
0
if __name__ == '__main__':
    import numpy as np
    from qiskit import Aer
    from qiskit.aqua.algorithms.minimum_eigen_solvers import VQSD
    from qiskit.quantum_info.states import Statevector
    from qiskit.aqua.components.initial_states import Custom
    from qiskit.aqua.components.optimizers import COBYLA
    from qiskit.aqua.operators import MatrixOperator
    from qiskit.aqua.algorithms.eigen_solvers import NumPyEigensolver
    from qiskit.aqua.components.variational_forms import RY
    from qiskit.quantum_info import partial_trace

    num_ancillae = 1
    state_vector = np.sqrt(6/10) * Statevector.from_label('+1+') \
        + np.sqrt(4/10) * Statevector.from_label('-0-')
    initial_state = Custom(state_vector.num_qubits,
                           state_vector=state_vector.data)
    vqsd_obj = VQSD(initial_state,
                    q=.25,
                    num_ancillae=num_ancillae,
                    quantum_instance=Aer.get_backend("qasm_simulator"),
                    optimizer=COBYLA(),
                    var_form=RY(initial_state._num_qubits - num_ancillae,
                                depth=2))
    result = vqsd_obj.run(shots=1000)

    print("=== VQSD ===")
    print(result.eigenvalue)
    print(result.eigenstate)

    print("== Exact ===")
    density_mat = state_vector.to_operator()
Ejemplo n.º 23
0
 def test_qubits_5_given_vector(self):
     self.custom = Custom(5, state_vector=[1.0] * 32)
     cct = self.custom.construct_circuit('vector')
     np.testing.assert_array_almost_equal(cct, [0.1767767] * 32)
Ejemplo n.º 24
0
    def setUp(self):
        super().setUp()
        os.environ.pop('QISKIT_AQUA_CIRCUIT_CACHE', None)
        # Number training data samples
        N = 5000
        # Load data samples from log-normal distribution with mean=1 and standard deviation=1
        mu = 1
        sigma = 1
        self._real_data = np.random.lognormal(mean=mu, sigma=sigma, size=N)
        # Set the data resolution
        # Set upper and lower data values as list of k min/max data values [[min_0,max_0],...,[min_k-1,max_k-1]]
        self._bounds = [0., 3.]
        # Set number of qubits per data dimension as list of k qubit values[#q_0,...,#q_k-1]
        num_qubits = [2]
        # Batch size
        batch_size = 100
        # Set number of training epochs
        num_epochs = 10
        self._params_torch = {'algorithm': {'name': 'QGAN',
                                            'num_qubits': num_qubits,
                                            'batch_size': batch_size,
                                            'num_epochs': num_epochs},
                              'problem': {'name': 'distribution_learning_loading', 'random_seed': 7},
                              'generative_network': {'name': 'QuantumGenerator',
                                                     'bounds': self._bounds,
                                                     'num_qubits': num_qubits,
                                                     'init_params': None,
                                                     'snapshot_dir': None
                                                     },
                              'discriminative_network': {'name': 'PytorchDiscriminator',
                                                         'n_features': len(num_qubits)}
                              }
        self._params_numpy = {'algorithm': {'name': 'QGAN',
                                            'num_qubits': num_qubits,
                                            'batch_size': batch_size,
                                            'num_epochs': num_epochs},
                              'problem': {'name': 'distribution_learning_loading', 'random_seed': 7},
                              'generative_network': {'name': 'QuantumGenerator',
                                                     'bounds': self._bounds,
                                                     'num_qubits': num_qubits,
                                                     'init_params': None,
                                                     'snapshot_dir': None
                                                     },
                              'discriminative_network': {'name': 'NumpyDiscriminator',
                                                         'n_features': len(num_qubits)}
                              }

        # Initialize qGAN
        self.qgan = QGAN(self._real_data, self._bounds, num_qubits, batch_size, num_epochs, snapshot_dir=None)
        self.qgan.seed = 7
        # Set quantum instance to run the quantum generator
        self.quantum_instance_statevector = QuantumInstance(backend=BasicAer.get_backend('statevector_simulator'),
                                                            circuit_caching=False, seed_simulator=2, seed_transpiler=2)
        self.quantum_instance_qasm = QuantumInstance(backend=BasicAer.get_backend('qasm_simulator'), shots=1000,
                                                     circuit_caching=False, seed_simulator=2, seed_transpiler=2)
        # Set entangler map
        entangler_map = [[0, 1]]

        # Set an initial state for the generator circuit
        init_dist = UniformDistribution(sum(num_qubits), low=self._bounds[0], high=self._bounds[1])
        q = QuantumRegister(sum(num_qubits), name='q')
        qc = QuantumCircuit(q)
        init_dist.build(qc, q)
        init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)
        # Set variational form
        var_form = RY(sum(num_qubits), depth=1, initial_state=init_distribution, entangler_map=entangler_map,
                      entanglement_gate='cz')
        # Set generator's initial parameters
        init_params = aqua_globals.random.rand(var_form._num_parameters) * 2 * 1e-2
        # Set generator circuit
        g_circuit = UnivariateVariationalDistribution(sum(num_qubits), var_form, init_params,
                                                      low=self._bounds[0],
                                                      high=self._bounds[1])
        # Set quantum generator
        self.qgan.set_generator(generator_circuit=g_circuit)
Ejemplo n.º 25
0
 def test_qubits_qubits_given_mistmatch(self):
     with self.assertRaises(ValueError):
         self.custom = Custom(5, state_vector=[1.0] * 23)
Ejemplo n.º 26
0
    def test_qpe(self, qubit_op, simulator, num_time_slices, n_ancillae,
                 use_circuit_library):
        """ QPE test """
        self.log.debug('Testing QPE')
        tmp_qubit_op = qubit_op.copy()
        exact_eigensolver = NumPyMinimumEigensolver(qubit_op)
        results = exact_eigensolver.run()

        ref_eigenval = results.eigenvalue
        ref_eigenvec = results.eigenstate
        self.log.debug('The exact eigenvalue is:       %s', ref_eigenval)
        self.log.debug('The corresponding eigenvector: %s', ref_eigenvec)

        state_in = Custom(qubit_op.num_qubits, state_vector=ref_eigenvec)
        if use_circuit_library:
            iqft = QFT(n_ancillae).inverse()
        else:
            # ignore deprecation warnings from QFTs
            warnings.filterwarnings(action="ignore",
                                    category=DeprecationWarning)
            iqft = Standard(n_ancillae)

        qpe = QPEMinimumEigensolver(qubit_op,
                                    state_in,
                                    iqft,
                                    num_time_slices,
                                    n_ancillae,
                                    expansion_mode='suzuki',
                                    expansion_order=2,
                                    shallow_circuit_concat=True)

        backend = BasicAer.get_backend(simulator)
        quantum_instance = QuantumInstance(backend, shots=100)

        # run qpe
        result = qpe.run(quantum_instance)

        # report result
        self.log.debug('top result str label:         %s',
                       result.top_measurement_label)
        self.log.debug('top result in decimal:        %s',
                       result.top_measurement_decimal)
        self.log.debug('stretch:                      %s', result.stretch)
        self.log.debug('translation:                  %s', result.translation)
        self.log.debug('final eigenvalue from QPE:    %s', result.eigenvalue)
        self.log.debug('reference eigenvalue:         %s', ref_eigenval)
        self.log.debug('ref eigenvalue (transformed): %s',
                       (ref_eigenval + result.translation) * result.stretch)
        self.log.debug(
            'reference binary str label:   %s',
            decimal_to_binary(
                (ref_eigenval.real + result.translation) * result.stretch,
                max_num_digits=n_ancillae + 3,
                fractional_part_only=True))

        np.testing.assert_approx_equal(result.eigenvalue.real,
                                       ref_eigenval.real,
                                       significant=2)
        self.assertEqual(tmp_qubit_op, qubit_op,
                         "Operator is modified after QPE.")

        if not use_circuit_library:
            warnings.filterwarnings(action="always",
                                    category=DeprecationWarning)
    def __init__(self, bounds, num_qubits, generator_circuit=None,
                 init_params=None, snapshot_dir=None):
        """
        Initialize the generator network.
        Args:
            bounds (numpy.ndarray): k min/max data values [[min_1,max_1],...,[min_k,max_k]],
                    given input data dim k
            num_qubits (list): k numbers of qubits to determine representation resolution,
            i.e. n qubits enable the representation of 2**n values [n_1,..., n_k]
            generator_circuit (Union): generator circuit
                UnivariateVariationalDistribution for univariate data/
                MultivariateVariationalDistribution for multivariate data, Quantum circuit
                    to implement the generator.
            init_params (numpy.ndarray): 1D numpy array or list, Initialization for
                                the generator's parameters.
            snapshot_dir (str): str or None, if not None save the optimizer's parameter after every
                            update step to the given directory
        Raises:
            AquaError: Set multivariate variational distribution to represent multivariate data
        """
        super().__init__()
        self._bounds = bounds
        self._num_qubits = num_qubits
        self.generator_circuit = generator_circuit
        if self.generator_circuit is None:
            entangler_map = []
            if np.sum(num_qubits) > 2:
                for i in range(int(np.sum(num_qubits))):
                    entangler_map.append([i, int(np.mod(i + 1, np.sum(num_qubits)))])
            else:
                if np.sum(num_qubits) > 1:
                    entangler_map.append([0, 1])

            if len(num_qubits) > 1:
                num_qubits = list(map(int, num_qubits))
                low = bounds[:, 0].tolist()
                high = bounds[:, 1].tolist()
                init_dist = MultivariateUniformDistribution(num_qubits, low=low, high=high)
                q = QuantumRegister(sum(num_qubits))
                qc = QuantumCircuit(q)
                init_dist.build(qc, q)
                init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)
                # Set variational form
                var_form = RY(sum(num_qubits), depth=1,
                              initial_state=init_distribution, entangler_map=entangler_map,
                              entanglement_gate='cz')
                if init_params is None:
                    init_params = aqua_globals.random.rand(var_form.num_parameters) * 2 * 1e-2
                # Set generator circuit
                self.generator_circuit = MultivariateVariationalDistribution(num_qubits, var_form,
                                                                             init_params,
                                                                             low=low, high=high)
            else:
                init_dist = UniformDistribution(sum(num_qubits), low=bounds[0], high=bounds[1])
                q = QuantumRegister(sum(num_qubits), name='q')
                qc = QuantumCircuit(q)
                init_dist.build(qc, q)
                init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)
                var_form = RY(sum(num_qubits), depth=1, initial_state=init_distribution,
                              entangler_map=entangler_map,
                              entanglement_gate='cz')
                if init_params is None:
                    init_params = aqua_globals.random.rand(var_form.num_parameters) * 2 * 1e-2
                # Set generator circuit
                self.generator_circuit = UnivariateVariationalDistribution(
                    int(np.sum(num_qubits)), var_form, init_params, low=bounds[0], high=bounds[1])

        if len(num_qubits) > 1:
            if isinstance(self.generator_circuit, MultivariateVariationalDistribution):
                pass
            else:
                raise AquaError('Set multivariate variational distribution '
                                'to represent multivariate data')
        else:
            if isinstance(self.generator_circuit, UnivariateVariationalDistribution):
                pass
            else:
                raise AquaError('Set univariate variational distribution '
                                'to represent univariate data')
        # Set optimizer for updating the generator network
        self._optimizer = ADAM(maxiter=1, tol=1e-6, lr=1e-3, beta_1=0.7,
                               beta_2=0.99, noise_factor=1e-6,
                               eps=1e-6, amsgrad=True, snapshot_dir=snapshot_dir)

        if np.ndim(self._bounds) == 1:
            bounds = np.reshape(self._bounds, (1, len(self._bounds)))
        else:
            bounds = self._bounds
        for j, prec in enumerate(self._num_qubits):
            # prepare data grid for dim j
            grid = np.linspace(bounds[j, 0], bounds[j, 1], (2 ** prec))
            if j == 0:
                if len(self._num_qubits) > 1:
                    self._data_grid = [grid]
                else:
                    self._data_grid = grid
                self._grid_elements = grid
            elif j == 1:
                self._data_grid.append(grid)
                temp = []
                for g_e in self._grid_elements:
                    for g in grid:
                        temp0 = [g_e]
                        temp0.append(g)
                        temp.append(temp0)
                self._grid_elements = temp
            else:
                self._data_grid.append(grid)
                temp = []
                for g_e in self._grid_elements:
                    for g in grid:
                        temp0 = deepcopy(g_e)
                        temp0.append(g)
                        temp.append(temp0)
                self._grid_elements = deepcopy(temp)
        self._data_grid = np.array(self._data_grid)

        self._shots = None
        self._discriminator = None
        self._ret = {}
Ejemplo n.º 28
0
 def test_qubits_2_zero_vector_wrong_cct_mode(self):
     self.custom = Custom(5, state='zero')
     with self.assertRaises(ValueError):
         cct = self.custom.construct_circuit('matrix')
For n=4 qubits the first term encodes the amplitude of the state |0000> the second term encodes |0001> and so one.

For n=4 i'll create the state = |s> = 1/sqrt(2) ( |0100> + |0010> ) and QMF should return
|0100> = 4 as the maximum value within the state.
'''

state = []
for i in range(2**n):
    if i == 4 or i == 2:
        state.append(complex(1 / math.sqrt(2), 0.0))
    else:
        state.append(complex(0.0, 0.0))

state = np.asarray(state)

quantum_state = Custom(n, state_vector=state)

index = int(sys.argv[1])
alg = QMF(initial_state=quantum_state,
          search_register=qstate,
          size=superpositions,
          max_index=index)

Backend = Aer.get_backend('qasm_simulator')
maximum, top_measurement = alg.run(backend=Backend, shots=1024)

#measured_val = result['result']
#maximum = result['top_measurement']

print("MAXIMUM SHOULD BE |0100> = 4\n")
print("MAXIMUM ACHIEVED - %d\n" % maximum)
Ejemplo n.º 30
0
def main(run_mode):
    # graph of city coordinates
    cities = np.array([[0, 0], [0, 1]])  # coordinates of the cities
    num_cities = len(cities)
    num_qubits = num_cities ** 2

    # algorithm properties
    p = 2  # number of time steps
    beta = np.random.uniform(0, np.pi * 2, p)
    gamma = np.random.uniform(0, np.pi * 2, p)

    # create matrix of distances between cities
    distance_mat = tsp.calc_distance(cities).w  # note that this method does integer distances

    # create mixing Hamiltonian. A city may or may not be visited in a timestep
    mixing_hamiltonian = reduce(lambda x, y: x + y,
                                [pauli_x(i, 1, num_qubits) for i in range(num_qubits)])

    # penalty_operators = create_weights_cost_operators(num_cities=num_cities, num_qubits=num_qubits,
    #                                                   dist_mat=distance_mat)
    penalty_operators = create_penalty_operators_for_bilocation(num_qubits=num_qubits, num_cities=num_cities,
                                                                distance_mat=distance_mat)
    penalty_operators += create_penalty_operators_for_repetition(num_qubits=num_qubits, num_cities=num_cities,
                                                                 distance_mat=distance_mat)

    print(penalty_operators)
    cost_hamiltonian = penalty_operators

    # circuit initial state vector. All states in equal superposition
    init_state_vect = [1 for i in range(2 ** num_qubits)]
    init_state = Custom(num_qubits, state_vector=init_state_vect)

    # initialize quantum circuit
    qr = QuantumRegister(num_qubits, name='q')
    init_circ = init_state.construct_circuit('circuit', qr)

    # find optimal beta and gamma
    evaluate = partial(neg_evaluate_circuit, qr=qr, p=p, m_H=mixing_hamiltonian, c_H=cost_hamiltonian,
                       init_circ=init_circ)
    print("Looking for optimal beta and gamma")
    # TODO: maybe we should use a different or faster method of finding the min? Super long even with two cities
    result = minimize(evaluate, np.concatenate([gamma, beta]), method='L-BFGS-B')
    # result = minimize(evaluate, np.concatenate([gamma, beta]))

    print(result)

    # now use the result of the gathered angles to find the answer
    circuit = create_circuit(qr, result['x'][:p], result['x'][p:], p, m_H=mixing_hamiltonian, c_H=cost_hamiltonian,
                             init_circ=init_circ)

    if run_mode == "IBM quantum":
        import secrets
        from qiskit import IBMQ
        from qiskit.providers.ibmq import least_busy

        provider = IBMQ.enable_account(secrets.IBM_TOKEN)
        large_enough_devices = provider.backends(filters=lambda x: x.configuration().n_qubits > 4 and
                                                                   not x.configuration().simulator)
        backend = least_busy(large_enough_devices)
        print("This will be running on the IBM device " + backend.name())

    else:
        print("Preparing to run on local simulator")
        backend = BasicAer.get_backend('statevector_simulator')

    job = execute(circuit, backend)
    state = np.asarray(job.result().get_statevector(circuit))
    print(list_to_easier_vis(np.absolute(state)))