MCPcopy Create free account
hub / github.com/OriginQ/QPanda-2 / getSubTensor

Method getSubTensor

Core/VirtualQuantumProcessor/SingleAmplitude/Tensor.cpp:102–149  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

100}
101
102void 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
151void CPUComplexTensor::dimDecrement(size_t num)
152{

Callers 1

dimDecrementbyValueMethod · 0.80

Calls 2

calloc_failClass · 0.85
get_num_threadsFunction · 0.85

Tested by

no test coverage detected