| 100 | } |
| 101 | |
| 102 | void CPUComplexTensor::getSubTensor(size_t num, int value) |
| 103 | { |
| 104 | if (num > m_rank) |
| 105 | { |
| 106 | QCERR("getSubTensor error"); |
| 107 | throw std::runtime_error("getSubTensor error"); |
| 108 | } |
| 109 | |
| 110 | auto size = 1ull << m_rank; |
| 111 | auto sub = m_rank - num; |
| 112 | qsize_t step = 1ull << sub; |
| 113 | |
| 114 | m_rank = this->m_rank - 1; |
| 115 | auto new_size = 1ull << m_rank; |
| 116 | auto new_tensor = (qcomplex_data_t *)calloc(new_size, sizeof(qcomplex_data_t)); |
| 117 | if (nullptr == new_tensor) |
| 118 | { |
| 119 | QCERR("calloc_fail"); |
| 120 | throw calloc_fail(); |
| 121 | } |
| 122 | |
| 123 | int threads = get_num_threads(m_rank); |
| 124 | size_t j; |
| 125 | size_t k = 0; |
| 126 | #pragma omp parallel for num_threads(threads) private(j,k) |
| 127 | for (long long i = 0; i < size; i += step * 2) |
| 128 | { |
| 129 | k = i / (2 * step); |
| 130 | for (j = i; j < i + step; j++) |
| 131 | { |
| 132 | if (0 == value) |
| 133 | { |
| 134 | new_tensor[j - k * step] = m_tensor[j]; |
| 135 | } |
| 136 | else if (1 == value) |
| 137 | { |
| 138 | new_tensor[j - k * step] = m_tensor[j + step]; |
| 139 | } |
| 140 | else |
| 141 | { |
| 142 | throw std::runtime_error("error"); |
| 143 | } |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | free(m_tensor); |
| 148 | m_tensor = new_tensor; |
| 149 | } |
| 150 | |
| 151 | void CPUComplexTensor::dimDecrement(size_t num) |
| 152 | { |
no test coverage detected