3 Created on Fri Jun 26 14:42:56 2020 4 Copyright 2020 Peter Rakyta, Ph.D. 6 Licensed under the Apache License, Version 2.0 (the "License"); 7 you may not use this file except in compliance with the License. 8 You may obtain a copy of the License at 10 http://www.apache.org/licenses/LICENSE-2.0 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 See the License for the specific language governing permissions and 16 limitations under the License. 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see http://www.gnu.org/licenses/. 21 @author: Peter Rakyta, Ph.D. 26 from squander
import N_Qubit_Decomposition_adaptive
35 from scipy.fft
import fft
40 from mpi4py
import MPI
42 except ModuleNotFoundError:
46 np.set_printoptions(linewidth=200)
53 cost_function_variant = 0
57 matrix_size = 1 << qbit_num
58 dim_over_2 = 1 << (qbit_num-1)
61 num_of_basis = 1 << 2*qbit_num
76 parameters = np.zeros(num_of_parameters)
79 num_of_adaptive_layers =
int(qbit_num*(qbit_num-1)/2 * levels)
83 for idx
in range(qbit_num):
84 parameters[idx*3] = np.random.rand(1)*2*np.pi
87 parameters[0:3*qbit_num] = np.random.rand(3*qbit_num)*np.pi
91 nontrivial_adaptive_layers = np.zeros( (num_of_adaptive_layers ))
93 for layer_idx
in range(num_of_adaptive_layers) :
95 nontrivial_adaptive_layer = random.randint(0,1)
96 nontrivial_adaptive_layers[layer_idx] = nontrivial_adaptive_layer
98 if (nontrivial_adaptive_layer) :
101 start_idx = qbit_num*3 + layer_idx*7
104 parameters[start_idx] = np.random.rand(1)*2*np.pi
105 parameters[start_idx+1] = np.random.rand(1)*2*np.pi
106 parameters[start_idx+4] = np.random.rand(1)*2*np.pi
108 end_idx = start_idx + 7
109 parameters[start_idx:end_idx] = np.random.rand(7)*2*np.pi
114 return parameters, nontrivial_adaptive_layers
119 """This is a test class of the python iterface to test the trace offset, and the optimized problem""" 131 cDecompose_createUmtx = N_Qubit_Decomposition_adaptive( np.eye(matrix_size, dtype=np.complex128), level_limit_max=5, level_limit_min=0, accelerator_num=0 )
135 for idx
in range(levels):
136 cDecompose_createUmtx.add_Adaptive_Layers()
138 cDecompose_createUmtx.add_Finalyzing_Layer_To_Gate_Structure()
142 num_of_parameters = cDecompose_createUmtx.get_Parameter_Num()
150 Umtx = cDecompose_createUmtx.get_Matrix( parameters )
155 Umtx = Umtx[trace_offset:240, :]
165 cDecompose_CPU = N_Qubit_Decomposition_adaptive( Umtx.conj().T, level_limit_max=5, level_limit_min=0, accelerator_num=0 )
168 cDecompose_CPU.set_Trace_Offset( trace_offset )
171 for idx
in range(levels):
172 cDecompose_CPU.add_Adaptive_Layers()
174 cDecompose_CPU.add_Finalyzing_Layer_To_Gate_Structure()
177 cDecompose_CPU.set_Cost_Function_Variant(cost_function_variant)
180 f0_CPU, grad_CPU = cDecompose_CPU.Optimization_Problem_Combined( parameters )
182 assert( np.abs( f0_CPU ) < 1e-8 )
189 cDecompose = N_Qubit_Decomposition_adaptive( np.eye(matrix_size, dtype=np.complex128), level_limit_max=5, level_limit_min=0, accelerator_num=0 )
193 for idx
in range(levels):
194 cDecompose.add_Adaptive_Layers()
196 cDecompose.add_Finalyzing_Layer_To_Gate_Structure()
200 num_of_parameters = cDecompose.get_Parameter_Num()
208 Umtx = cDecompose.get_Matrix( parameters )
209 mat, mat_deriv = cDecompose.Optimization_Problem_Combined_Unitary(parameters)
210 assert np.allclose(Umtx, mat)
212 cost = cDecompose.Optimization_Problem(parameters)
213 assert np.allclose(np.array([cost, cost, cost]), cDecompose.Optimization_Problem_Batch(np.vstack([parameters, parameters, parameters])))
214 grad = cDecompose.Optimization_Problem_Grad(parameters)
215 f0_CPU, grad_CPU = cDecompose.Optimization_Problem_Combined( parameters )
216 assert np.allclose(grad, grad_CPU)
217 assert np.isclose(f0_CPU, cost)
def test_grad_batch_unitary_funcs(self)
def test_N_Qubit_Decomposition_creation(self)
def create_randomized_parameters(num_of_parameters, real=False)
Call to construct random parameter, with limited number of non-trivial adaptive layers.