def construct_circuit(self, circuit=None, register=None): """ Construct the circuit representing the desired state vector. Args: circuit (QuantumCircuit): The optional circuit to extend from. register (QuantumRegister): The optional register to construct the circuit with. Returns: QuantumCircuit. """ if register is None: register = QuantumRegister(self._num_qubits, name='q') else: if len(register) < self._num_qubits: raise AquaError('The provided register does not have enough qubits.') if circuit is None: circuit = QuantumCircuit(register) else: if not circuit.has_register(register): circuit.add_register(register) # TODO: add capability to start in the middle of the register temp = QuantumCircuit(register) temp.initialize(self._state_vector, [register[i] for i in range(self._num_qubits)]) temp = convert_to_basis_gates(temp) circuit += temp return circuit
def construct_circuit(self, circuit=None, register=None): """ Construct the circuit representing the desired state vector. Args: circuit (QuantumCircuit): The optional circuit to extend from. register (Union(QuantumRegister , list[Qubit])): The optional qubits to construct the circuit with. Returns: QuantumCircuit: quantum circuit Raises: AquaError: invalid input """ if register is None: register = QuantumRegister(self._num_qubits, name='q') # in case `register` is a list of Qubits if isinstance(register, list): # create empty circuit if necessary if circuit is None: circuit = QuantumCircuit() # loop over all register and add the required registers for q in register: if not isinstance(q, Qubit): raise AquaError( 'Unexpected element type {} in qubit list.'.format( type(q))) if not circuit.has_register(q.register): circuit.add_register(q.register) # construct state initialization circuit temp = QuantumCircuit(*circuit.qregs) # otherwise, if it is a QuantumRegister elif isinstance(register, QuantumRegister): if circuit is None: circuit = QuantumCircuit(register) else: if not circuit.has_register(register): circuit.add_register(register) temp = QuantumCircuit(register) else: raise AquaError('Unexpected register type {}.'.format( type(register))) if len(register) < self._num_qubits: raise AquaError( 'Insufficient register are provided for the intended state-vector.' ) temp.initialize(self._state_vector, [register[i] for i in range(self._num_qubits)]) temp = convert_to_basis_gates(temp) # remove the reset gates terra's unroller added temp.data = [g for g in temp.data if not g[0].name == 'reset'] circuit.compose(temp, inplace=True) return circuit
def __init__(self, num_qubits: int, state: str = 'zero', state_vector: Optional[Union[np.ndarray, StateFn]] = None, circuit: Optional[QuantumCircuit] = None) -> None: """ Args: num_qubits: Number of qubits, has a minimum value of 1. state: Use a predefined state of ('zero' | 'uniform' | 'random') state_vector: An optional vector of ``complex`` or ``float`` representing the state as a probability distribution which will be normalized to a total probability of 1 when initializing the qubits. The length of the vector must be :math:`2^q`, where :math:`q` is the *num_qubits* value. When provided takes precedence over *state*. circuit: A quantum circuit for the desired initial state. When provided takes precedence over both *state_vector* and *state*. Raises: AquaError: invalid input """ validate_min('num_qubits', num_qubits, 1) validate_in_set('state', state, {'zero', 'uniform', 'random'}) super().__init__() self._num_qubits = num_qubits self._state = state size = np.power(2, self._num_qubits) self._circuit = None if isinstance(state_vector, StateFn): state_vector = state_vector.to_matrix() # pylint: disable=comparison-with-callable if circuit is not None: if circuit.width() != num_qubits: logger.warning('The specified num_qubits and ' 'the provided custom circuit do not match.') self._circuit = convert_to_basis_gates(circuit) if state_vector is not None: self._state = None self._state_vector = None logger.warning( 'The provided state_vector is ignored in favor of ' 'the provided custom circuit.') else: if state_vector is None: if self._state == 'zero': self._state_vector = np.array([1.0] + [0.0] * (size - 1)) elif self._state == 'uniform': self._state_vector = np.array([1.0 / np.sqrt(size)] * size) elif self._state == 'random': self._state_vector = normalize_vector( aqua_globals.random.random(size)) else: raise AquaError('Unknown state {}'.format(self._state)) else: if len(state_vector) != np.power(2, self._num_qubits): raise AquaError( 'The state vector length {} is incompatible with ' 'the number of qubits {}'.format( len(state_vector), self._num_qubits)) self._state_vector = normalize_vector(state_vector) self._state = None
def __init__(self, num_qubits, state="zero", state_vector=None, circuit=None): """Constructor. Args: num_qubits (int): number of qubits state (str): `zero`, `uniform` or `random` state_vector (numpy.ndarray): customized vector circuit (QuantumCircuit): the actual custom circuit for the desired initial state Raises: AquaError: invalid input """ # pylint: disable=comparison-with-callable loc = locals().copy() # since state_vector is a numpy array of complex numbers which aren't json valid, # remove it from validation del loc['state_vector'] self.validate(loc) super().__init__() self._num_qubits = num_qubits self._state = state size = np.power(2, self._num_qubits) self._circuit = None if circuit is not None: if circuit.width() != num_qubits: logger.warning('The specified num_qubits and ' 'the provided custom circuit do not match.') self._circuit = convert_to_basis_gates(circuit) if state_vector is not None: self._state = None self._state_vector = None logger.warning( 'The provided state_vector is ignored in favor of ' 'the provided custom circuit.') else: if state_vector is None: if self._state == 'zero': self._state_vector = np.array([1.0] + [0.0] * (size - 1)) elif self._state == 'uniform': self._state_vector = np.array([1.0 / np.sqrt(size)] * size) elif self._state == 'random': self._state_vector = normalize_vector( aqua_globals.random.rand(size)) else: raise AquaError('Unknown state {}'.format(self._state)) else: if len(state_vector) != np.power(2, self._num_qubits): raise AquaError( 'The state vector length {} is incompatible with ' 'the number of qubits {}'.format( len(state_vector), self._num_qubits)) self._state_vector = normalize_vector(state_vector) self._state = None
def construct_circuit(self, circuit=None, register=None): """ Construct the circuit representing the desired state vector. Args: circuit (QuantumCircuit): The optional circuit to extend from. register (QuantumRegister): The optional register to construct the circuit with. Returns: QuantumCircuit. """ if register is None: register = QuantumRegister(self._num_qubits, name='q') # in case the register is a list of qubits if type(register) is list: # create empty circuit if necessary if circuit is None: circuit = QuantumCircuit() # loop over all qubits and add the required registers for q in register: if not circuit.has_register(q[0]): circuit.add_register(q[0]) # construct state initialization circuit temp = QuantumCircuit(*circuit.qregs) # otherwise, if it is a real register else: if len(register) < self._num_qubits: raise AquaError( 'The provided register does not have enough qubits.') if circuit is None: circuit = QuantumCircuit(register) else: if not circuit.has_register(register): circuit.add_register(register) # TODO: add capability to start in the middle of the register temp = QuantumCircuit(register) temp.initialize(self._state_vector, [register[i] for i in range(self._num_qubits)]) temp = convert_to_basis_gates(temp) # remove the reset gates terra's unroller added temp.data = [g for g in temp.data if not g[0].name == 'reset'] circuit += temp return circuit
def __init__(self, num_qubits: int, state: str = 'zero', state_vector: Optional[np.ndarray] = None, circuit: Optional[QuantumCircuit] = None) -> None: """Constructor. Args: num_qubits: number of qubits, has a min. value of 1. state: `zero`, `uniform` or `random` state_vector: customized vector circuit: the actual custom circuit for the desired initial state Raises: AquaError: invalid input """ validate_min('num_qubits', num_qubits, 1) validate_in_set('state', state, {'zero', 'uniform', 'random'}) super().__init__() self._num_qubits = num_qubits self._state = state size = np.power(2, self._num_qubits) self._circuit = None if circuit is not None: if circuit.width() != num_qubits: logger.warning('The specified num_qubits and ' 'the provided custom circuit do not match.') self._circuit = convert_to_basis_gates(circuit) if state_vector is not None: self._state = None self._state_vector = None logger.warning( 'The provided state_vector is ignored in favor of ' 'the provided custom circuit.') else: if state_vector is None: if self._state == 'zero': self._state_vector = np.array([1.0] + [0.0] * (size - 1)) elif self._state == 'uniform': self._state_vector = np.array([1.0 / np.sqrt(size)] * size) elif self._state == 'random': self._state_vector = normalize_vector( aqua_globals.random.rand(size)) else: raise AquaError('Unknown state {}'.format(self._state)) else: if len(state_vector) != np.power(2, self._num_qubits): raise AquaError( 'The state vector length {} is incompatible with ' 'the number of qubits {}'.format( len(state_vector), self._num_qubits)) self._state_vector = normalize_vector(state_vector) self._state = None