15#ifndef _QISKIT_AER_STATE_H_
16#define _QISKIT_AER_STATE_H_
20#ifdef INCLUDED_BY_FACTORY
22#include "controllers/state_controller.hpp"
30 virtual ~AerStateFake() =
default;
33 uint_t num_of_qubits_;
35 int seed_ = std::random_device()();
36 std::shared_ptr<QuantumState::Base> state_;
38 ExperimentResult last_result_;
59class QiskitAerState :
public AER::AerState
62 const std::shared_ptr<AER::QuantumState::Base> &get_state()
const
64 const AER::AerStateFake *fakeState = (AER::AerStateFake *)(
void *)
this;
65 return fakeState->state_;
71 AER::Vector<complex_t> move_to_vector()
override
74 const auto single = std::dynamic_pointer_cast<AER::Statevector::State<AER::QV::QubitVector<float>>>(get_state());
76 return AER::AerState::move_to_vector();
77 auto values = single->move_to_vector();
78 AER::Vector<complex_t> result(values.size(),
false);
79 for (
size_t i = 0; i < values.size(); ++i)
80 result[i] = values[i];
85 AER::cmatrix_t move_to_matrix()
override
88 const auto single = std::dynamic_pointer_cast<AER::DensityMatrix::State<AER::QV::DensityMatrix<float>>>(get_state());
90 return AER::AerState::move_to_matrix();
91 auto values = single->move_to_matrix();
92 AER::cmatrix_t result(values.GetRows(), values.GetColumns());
93 for (
size_t i = 0; i < values.GetRows() * values.GetColumns(); ++i)
94 result.data()[i] = values.data()[i];
99 double expval_pauli(
const reg_t &qubits,
const std::string &pauli)
101 if (qubits.empty() || pauli.empty())
104 const auto &state = get_state();
110 return state->expval_pauli(qubits, pauli);
113 AER::Vector<complex_t> statevector()
115 const auto &state = get_state();
121 AER::Operations::Op op;
122 op.type = AER::Operations::OpType::save_statevec;
123 op.name =
"save_statevector";
124 op.save_type = AER::Operations::DataSubType::single;
125 op.string_params.push_back(
"statevector");
126 for (uint_t qubit = 0; qubit < num_of_qubits(); ++qubit)
127 op.qubits.push_back(qubit);
129 AER::AerStateFake *fakeState = (AER::AerStateFake *)(
void *)
this;
130 fakeState->last_result_ = AER::ExperimentResult();
131 state->apply_op(op, fakeState->last_result_, fakeState->rng_);
134 static_cast<AER::DataMap<AER::SingleData, AER::Vector<complex_t>
>>(std::move(fakeState->last_result_.data)).value()[
"statevector"].value());
137 std::shared_ptr<AER::QuantumState::Base> clone_extended_stabilizer_state()
140 const auto extendedState = std::dynamic_pointer_cast<AER::ExtendedStabilizer::State>(get_state());
142 throw std::runtime_error(
"QiskitAerState: current state is not an extended stabilizer state");
143 return std::make_shared<AER::ExtendedStabilizer::State>(*extendedState);
146 void restore_extended_stabilizer_state(
const std::shared_ptr<AER::QuantumState::Base> &savedState)
148 const auto extendedState = std::dynamic_pointer_cast<AER::ExtendedStabilizer::State>(savedState);
150 throw std::runtime_error(
"QiskitAerState: saved state is not an extended stabilizer state");
152 AER::AerStateFake *fakeState = (AER::AerStateFake *)(
void *)
this;
153 fakeState->state_ = std::make_shared<AER::ExtendedStabilizer::State>(*extendedState);
154 fakeState->num_of_qubits_ = extendedState->qreg().get_n_qubits();
155 fakeState->initialized_ =
true;
156 fakeState->last_result_ = AER::ExperimentResult();
160 std::vector<bool> apply_measure_many(
const reg_t &qubits)
162 const auto &state = get_state();
168 AER::Operations::Op op;
169 op.type = AER::Operations::OpType::measure;
173 op.registers = qubits;
175 AER::AerStateFake *fakeState = (AER::AerStateFake *)(
void *)
this;
176 fakeState->last_result_ = AER::ExperimentResult();
177 state->apply_op(op, fakeState->last_result_, fakeState->rng_);
179 std::vector<bool> bitstring(qubits.size(),
false);
180 uint_t mem_size = state->creg().memory_size();
181 for (
size_t q = 0; q < qubits.size(); ++q)
183 const auto qubit = qubits[q];
184 if (state->creg().creg_memory()[mem_size - qubit - 1] ==
'1')
190 std::unordered_map<std::vector<bool>, uint_t> sample_counts_many(
const reg_t &qubits, uint_t shots)
192 const auto &state = get_state();
198 AER::AerStateFake *fakeState = (AER::AerStateFake *)(
void *)
this;
206 reg_t sorted_qubits = qubits;
207 std::vector<size_t> order(qubits.size());
208 std::iota(order.begin(), order.end(), 0);
209 std::sort(order.begin(), order.end(), [&qubits](
size_t a,
size_t b) { return qubits[a] < qubits[b]; });
210 for (
size_t i = 0; i < qubits.size(); ++i)
211 sorted_qubits[i] = qubits[order[i]];
213 std::vector<AER::SampleVector> samples = state->sample_measure(sorted_qubits, shots, fakeState->rng_);
214 std::unordered_map<std::vector<bool>, uint_t> ret;
216 std::vector<bool> bitstring(qubits.size());
217 for (
const auto &sample : samples)
219 for (
size_t i = 0; i < qubits.size(); ++i)
220 bitstring[order[i]] = sample[i] == 1;
Bounded online routing based on current physical bond dimensions.