diff --git a/src/framework/qobj.hpp b/src/framework/qobj.hpp index 8aedd5b216..e7c551cce0 100755 --- a/src/framework/qobj.hpp +++ b/src/framework/qobj.hpp @@ -97,45 +97,53 @@ Qobj::Qobj(const json_t &js) { std::vector param_table; JSON::get_value(param_table, "parameterizations", config); - // Validate parameterizations for number of circuis - if (!param_table.empty() && param_table.size() != num_circs) { + // Validate parameterizations for number of circuits + if (!param_table.empty() && param_table.size() < num_circs) { throw std::invalid_argument( - R"(Invalid parameterized qobj: "parameterizations" length does not match number of circuits.)"); + R"(Invalid parameterized qobj: "parameterizations" length is less than a number of circuits.)"); + } + if (param_table.size() % num_circs != 0) { + throw std::invalid_argument( + R"(Invalid parameterized qobj: "parameterizations" length must be divisible with a number of circuits.)"); } + const size_t num_exps = param_table.empty()? num_circs : param_table.size(); + const size_t num_repeats = param_table.empty()? 1 : param_table.size() / num_circs; // Load circuits - for (size_t i=0; i= num_instr) { - throw std::invalid_argument(R"(Invalid parameterized qobj: instruction position out of range)"); - } - auto &op = param_circuit.ops[instr_pos]; - if (param_pos >= op.params.size()) { - throw std::invalid_argument(R"(Invalid parameterized qobj: instruction param position out of range)"); - } - if (j >= params.second.size()) { - throw std::invalid_argument(R"(Invalid parameterized qobj: parameterization value out of range)"); + for (size_t j = 0; j < num_repeats; ++j) { + size_t param_idx = i * num_repeats + j; + if (param_table.empty() || param_table[param_idx].empty()) { + // Non parameterized circuit + circuits.push_back(circuit); + } else { + // Load different parameterizations of the initial circuit + const auto circ_params = param_table[param_idx]; + const size_t num_params = circ_params[0].second.size(); + const size_t num_instr = circuit.ops.size(); + for (size_t k=0; k= num_instr) { + throw std::invalid_argument(R"(Invalid parameterized qobj: instruction position out of range)"); + } + auto &op = param_circuit.ops[instr_pos]; + if (param_pos >= op.params.size()) { + throw std::invalid_argument(R"(Invalid parameterized qobj: instruction param position out of range)"); + } + if (k >= params.second.size()) { + throw std::invalid_argument(R"(Invalid parameterized qobj: parameterization value out of range)"); + } + // Update the param + op.params[param_pos] = params.second[k]; } - // Update the param - op.params[param_pos] = params.second[j]; + circuits.push_back(param_circuit); } - circuits.push_back(param_circuit); } } }