| 102 | |
| 103 | |
| 104 | def main(self): |
| 105 | gammas = np.linspace(0, 1,50) |
| 106 | betas = np.linspace(0, np.pi, 50) |
| 107 | expectation_dict, waveform_dict = self.optimize_params(gammas, betas) |
| 108 | expectation_vals = np.array(list(expectation_dict.values())) |
| 109 | expectation_params = list(expectation_dict.keys()) |
| 110 | waveform_vals = np.array(list(waveform_dict.values())) |
| 111 | optim_param = expectation_params[np.argmin(expectation_vals)] |
| 112 | optim_expectation = expectation_vals[np.argmin(expectation_vals)] |
| 113 | optim_waveform = waveform_vals[np.argmin(expectation_vals)] |
| 114 | print(f"Optimized parameters") |
| 115 | print(f"-----------------------------") |
| 116 | print(f" gamma,beta = {optim_param[0]}, {optim_param[1]}") |
| 117 | print(f" Expectation = {optim_expectation}") |
| 118 | print(f"-----------------------------") |
| 119 | optimal_waveform_prob = np.array([np.abs(x)**2 for x in optim_waveform]) |
| 120 | states = np.array([bin(i).replace('0b', "") for i in range(2 ** self.num_elems)]) |
| 121 | states = np.array([((self.num_elems - len(s)) * '0' + s) for s in states]) |
| 122 | sort_indices = np.argsort(-1 * np.array(optimal_waveform_prob)) |
| 123 | print(sort_indices) |
| 124 | optimal_waveform_prob = optimal_waveform_prob[sort_indices] |
| 125 | states = states[sort_indices] |
| 126 | print(f"State | Probability") |
| 127 | print(f"-----------------------------") |
| 128 | for i in range(len(states)): |
| 129 | print(f"{states[i]} | {np.round(optimal_waveform_prob[i],3)}") |
| 130 | print(f"-----------------------------") |
| 131 | |
| 132 | return expectation_dict |
| 133 | |
| 134 | |
| 135 | if __name__ == '__main__': |