| 577 | return; |
| 578 | } |
| 579 | void Encode::bid_amplitude_encode(const QVec &q, const std::vector<double>& data, const int split) { |
| 580 | |
| 581 | vector<double>data_temp(data); |
| 582 | |
| 583 | if (!_check_normalized(data_temp)) { |
| 584 | throw run_fail("Data is not normalized"); |
| 585 | } |
| 586 | |
| 587 | int n_qubits = std::ceil(std::log2(data_temp.size())); |
| 588 | int split_temp = split; |
| 589 | |
| 590 | if (split == 0) { |
| 591 | if (n_qubits & 1) { |
| 592 | split_temp = n_qubits / 2 + 1; |
| 593 | } |
| 594 | else { |
| 595 | split_temp = n_qubits / 2; |
| 596 | } |
| 597 | } |
| 598 | |
| 599 | int size = data_temp.size(); |
| 600 | int size_next = 1 << n_qubits; |
| 601 | |
| 602 | if ((split_temp + 1)*(size_next / (1 << split_temp)) - 1 > q.size()) { |
| 603 | throw run_fail("Bid_Amplitude_encode parameter error."); |
| 604 | } |
| 605 | |
| 606 | if (split_temp > std::ceil(std::log2(data_temp.size()))) { |
| 607 | throw run_fail("Bid_Amplitude_encode parameter error."); |
| 608 | } |
| 609 | |
| 610 | while (data_temp.size() < (1 << n_qubits)) |
| 611 | { |
| 612 | data_temp.push_back(0); |
| 613 | } |
| 614 | |
| 615 | StateNode* state_tree = _state_decomposition(n_qubits, data_temp); |
| 616 | |
| 617 | NodeAngleTree* angle_tree = _create_angles_tree(state_tree); |
| 618 | |
| 619 | _add_register(angle_tree, n_qubits - split_temp); |
| 620 | |
| 621 | _top_down_tree_walk(angle_tree, q, n_qubits - split_temp); |
| 622 | |
| 623 | _bottom_up_tree_walk(angle_tree, q, n_qubits - split_temp); |
| 624 | |
| 625 | _output(angle_tree, q); |
| 626 | |
| 627 | delete state_tree; |
| 628 | delete angle_tree; |
| 629 | |
| 630 | return; |
| 631 | } |
| 632 | void Encode::_output(NodeAngleTree* angle_tree, const QVec &q) { |
| 633 | if (angle_tree) { |
| 634 | if (angle_tree->left) { |