squlearn 0.7.4__tar.gz → 0.7.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. {squlearn-0.7.4 → squlearn-0.7.6}/PKG-INFO +4 -4
  2. {squlearn-0.7.4 → squlearn-0.7.6}/docs/user_guide/quantum_neural_networks.rst +2 -2
  3. {squlearn-0.7.4 → squlearn-0.7.6}/examples/integration/mlflow.ipynb +14 -7
  4. squlearn-0.7.6/examples/qnn/example_adam.ipynb +303 -0
  5. squlearn-0.7.6/examples/qnn/example_minibatch.ipynb +304 -0
  6. squlearn-0.7.6/examples/qnn/example_qcnn_encoding_circuit.ipynb +670 -0
  7. squlearn-0.7.6/examples/qnn/regression_example.ipynb +377 -0
  8. squlearn-0.7.6/examples/qnn/regression_with_variance.ipynb +388 -0
  9. squlearn-0.7.6/examples/tutorials/quantum_bayesian_optimization.ipynb +528 -0
  10. {squlearn-0.7.4 → squlearn-0.7.6}/pyproject.toml +3 -3
  11. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/__init__.py +1 -1
  12. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/chebyshev_pqc.py +49 -6
  13. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/chebyshev_rx.py +53 -3
  14. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/chebyshev_tower.py +53 -3
  15. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/encoding_circuit_base.py +74 -46
  16. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/ml/qgpr.py +11 -0
  17. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/ml/qkrr.py +6 -0
  18. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_implemented/ising_hamiltonian.py +5 -4
  19. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/base_qnn.py +14 -0
  20. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/lowlevel_qnn_pennylane.py +26 -9
  21. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/qnnc.py +4 -0
  22. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/qnnr.py +3 -0
  23. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/executor.py +1 -0
  24. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/pennylane/pennylane_circuit.py +5 -2
  25. {squlearn-0.7.4 → squlearn-0.7.6}/tests/kernel/ml/test_qgpc.py +21 -2
  26. {squlearn-0.7.4 → squlearn-0.7.6}/tests/kernel/ml/test_qgpr.py +17 -0
  27. {squlearn-0.7.4 → squlearn-0.7.6}/tests/kernel/ml/test_qkrr.py +17 -0
  28. {squlearn-0.7.4 → squlearn-0.7.6}/tests/kernel/ml/test_qsvc.py +20 -1
  29. {squlearn-0.7.4 → squlearn-0.7.6}/tests/kernel/ml/test_qsvr.py +17 -0
  30. {squlearn-0.7.4 → squlearn-0.7.6}/tests/qnn/test_qnnc.py +14 -0
  31. {squlearn-0.7.4 → squlearn-0.7.6}/tests/qnn/test_qnnr.py +14 -0
  32. {squlearn-0.7.4 → squlearn-0.7.6}/tests/qnn/test_training.py +8 -8
  33. squlearn-0.7.4/examples/qnn/example_adam.ipynb +0 -311
  34. squlearn-0.7.4/examples/qnn/example_minibatch.ipynb +0 -312
  35. squlearn-0.7.4/examples/qnn/example_qcnn_encoding_circuit.ipynb +0 -662
  36. squlearn-0.7.4/examples/qnn/regression_example.ipynb +0 -385
  37. squlearn-0.7.4/examples/qnn/regression_with_variance.ipynb +0 -396
  38. squlearn-0.7.4/examples/tutorials/quantum_bayesian_optimization.ipynb +0 -533
  39. {squlearn-0.7.4 → squlearn-0.7.6}/.github/CODE_OF_CONDUCT.md +0 -0
  40. {squlearn-0.7.4 → squlearn-0.7.6}/.github/CONTRIBUTING.md +0 -0
  41. {squlearn-0.7.4 → squlearn-0.7.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  42. {squlearn-0.7.4 → squlearn-0.7.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  43. {squlearn-0.7.4 → squlearn-0.7.6}/.github/workflows/doc_checks.yml +0 -0
  44. {squlearn-0.7.4 → squlearn-0.7.6}/.github/workflows/format.yml +0 -0
  45. {squlearn-0.7.4 → squlearn-0.7.6}/.github/workflows/publish.yml +0 -0
  46. {squlearn-0.7.4 → squlearn-0.7.6}/.github/workflows/publish_docs.yml +0 -0
  47. {squlearn-0.7.4 → squlearn-0.7.6}/.github/workflows/tests.yaml +0 -0
  48. {squlearn-0.7.4 → squlearn-0.7.6}/.gitignore +0 -0
  49. {squlearn-0.7.4 → squlearn-0.7.6}/CITATION.cff +0 -0
  50. {squlearn-0.7.4 → squlearn-0.7.6}/LICENSE.txt +0 -0
  51. {squlearn-0.7.4 → squlearn-0.7.6}/README.md +0 -0
  52. {squlearn-0.7.4 → squlearn-0.7.6}/docs/Makefile +0 -0
  53. {squlearn-0.7.4 → squlearn-0.7.6}/docs/README.md +0 -0
  54. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_static/css/custom.css +0 -0
  55. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_static/favicon.png +0 -0
  56. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_static/logo.png +0 -0
  57. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_static/qnn/qnn.svg +0 -0
  58. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_static/schematic.png +0 -0
  59. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_static/util/executor.png +0 -0
  60. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_templates/class.rst +0 -0
  61. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_templates/class_with_call.rst +0 -0
  62. {squlearn-0.7.4 → squlearn-0.7.6}/docs/_templates/function.rst +0 -0
  63. {squlearn-0.7.4 → squlearn-0.7.6}/docs/conf.py +0 -0
  64. {squlearn-0.7.4 → squlearn-0.7.6}/docs/examples/example_kernel_digit_classification.nblink +0 -0
  65. {squlearn-0.7.4 → squlearn-0.7.6}/docs/examples/example_kernel_grid_search.nblink +0 -0
  66. {squlearn-0.7.4 → squlearn-0.7.6}/docs/examples/example_qnn_backend_mitigation.nblink +0 -0
  67. {squlearn-0.7.4 → squlearn-0.7.6}/docs/examples/example_quantum_bayesian_optimization.nblink +0 -0
  68. {squlearn-0.7.4 → squlearn-0.7.6}/docs/examples/examples_index.rst +0 -0
  69. {squlearn-0.7.4 → squlearn-0.7.6}/docs/index.rst +0 -0
  70. {squlearn-0.7.4 → squlearn-0.7.6}/docs/install/install.rst +0 -0
  71. {squlearn-0.7.4 → squlearn-0.7.6}/docs/make.bat +0 -0
  72. {squlearn-0.7.4 → squlearn-0.7.6}/docs/modules/classes.rst +0 -0
  73. {squlearn-0.7.4 → squlearn-0.7.6}/docs/qiskit_settings.conf +0 -0
  74. {squlearn-0.7.4 → squlearn-0.7.6}/docs/requirements.txt +0 -0
  75. {squlearn-0.7.4 → squlearn-0.7.6}/docs/spelling_wordlist.txt +0 -0
  76. {squlearn-0.7.4 → squlearn-0.7.6}/docs/user_guide/encoding_circuits.rst +0 -0
  77. {squlearn-0.7.4 → squlearn-0.7.6}/docs/user_guide/executor.rst +0 -0
  78. {squlearn-0.7.4 → squlearn-0.7.6}/docs/user_guide/kernel_methods.rst +0 -0
  79. {squlearn-0.7.4 → squlearn-0.7.6}/docs/user_guide/observables.rst +0 -0
  80. {squlearn-0.7.4 → squlearn-0.7.6}/docs/user_guide/user_guide_index.rst +0 -0
  81. {squlearn-0.7.4 → squlearn-0.7.6}/examples/encoding_circuits/layered_encoding_circuit.ipynb +0 -0
  82. {squlearn-0.7.4 → squlearn-0.7.6}/examples/encoding_circuits/pruning_example.ipynb +0 -0
  83. {squlearn-0.7.4 → squlearn-0.7.6}/examples/encoding_circuits/various_encoding_circuit.ipynb +0 -0
  84. {squlearn-0.7.4 → squlearn-0.7.6}/examples/executor/example_executor_qiskit.ipynb +0 -0
  85. {squlearn-0.7.4 → squlearn-0.7.6}/examples/kernel/example_fidelity_kernel.ipynb +0 -0
  86. {squlearn-0.7.4 → squlearn-0.7.6}/examples/kernel/example_projected_kernel.ipynb +0 -0
  87. {squlearn-0.7.4 → squlearn-0.7.6}/examples/kernel/example_regularization_mitigation.ipynb +0 -0
  88. {squlearn-0.7.4 → squlearn-0.7.6}/examples/kernel/qgpc_workflow.ipynb +0 -0
  89. {squlearn-0.7.4 → squlearn-0.7.6}/examples/kernel/qgpr_optimization_workflow.ipynb +0 -0
  90. {squlearn-0.7.4 → squlearn-0.7.6}/examples/kernel/qgpr_workflow.ipynb +0 -0
  91. {squlearn-0.7.4 → squlearn-0.7.6}/examples/qnn/classification_example.ipynb +0 -0
  92. {squlearn-0.7.4 → squlearn-0.7.6}/examples/tutorials/images/encoding_circuit.png +0 -0
  93. {squlearn-0.7.4 → squlearn-0.7.6}/examples/tutorials/images/pipeline.png +0 -0
  94. {squlearn-0.7.4 → squlearn-0.7.6}/examples/tutorials/images/projected_quantum_kernel.png +0 -0
  95. {squlearn-0.7.4 → squlearn-0.7.6}/examples/tutorials/images/quantum_bo.png +0 -0
  96. {squlearn-0.7.4 → squlearn-0.7.6}/examples/tutorials/kernel_digit_classification.ipynb +0 -0
  97. {squlearn-0.7.4 → squlearn-0.7.6}/examples/tutorials/kernel_grid_search.ipynb +0 -0
  98. {squlearn-0.7.4 → squlearn-0.7.6}/examples/tutorials/kernel_regression.ipynb +0 -0
  99. {squlearn-0.7.4 → squlearn-0.7.6}/examples/tutorials/qnn_backend_mitigation.ipynb +0 -0
  100. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/__init__.py +0 -0
  101. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/__init__.py +0 -0
  102. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/highdim_encoding_circuit.py +0 -0
  103. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/hubregtsen_encoding_circuit.py +0 -0
  104. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/multi_control_encoding_circuit.py +0 -0
  105. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/param_z_feature_map.py +0 -0
  106. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/qcnn_encoding_circuit.py +0 -0
  107. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/qiskit_encoding_circuit.py +0 -0
  108. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/circuit_library/yz_cx_encoding_circuit.py +0 -0
  109. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/encoding_circuit_derivatives.py +0 -0
  110. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/layered_encoding_circuit.py +0 -0
  111. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/pruned_encoding_circuit.py +0 -0
  112. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/encoding_circuit/transpiled_encoding_circuit.py +0 -0
  113. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/__init__.py +0 -0
  114. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/matrix/__init__.py +0 -0
  115. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/matrix/fidelity_kernel.py +0 -0
  116. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/matrix/fidelity_kernel_pennylane.py +0 -0
  117. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/matrix/kernel_matrix_base.py +0 -0
  118. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/matrix/kernel_util.py +0 -0
  119. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/matrix/projected_quantum_kernel.py +0 -0
  120. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/matrix/regularization.py +0 -0
  121. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/ml/__init__.py +0 -0
  122. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/ml/qgpc.py +0 -0
  123. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/ml/qsvc.py +0 -0
  124. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/ml/qsvr.py +0 -0
  125. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/optimization/__init__.py +0 -0
  126. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/optimization/kernel_loss_base.py +0 -0
  127. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/optimization/kernel_optimization_base.py +0 -0
  128. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/optimization/kernel_optimizer.py +0 -0
  129. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/optimization/negative_log_likelihood.py +0 -0
  130. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/kernel/optimization/target_alignment.py +0 -0
  131. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/__init__.py +0 -0
  132. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_base.py +0 -0
  133. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_derivatives.py +0 -0
  134. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_implemented/__init__.py +0 -0
  135. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_implemented/custom_observable.py +0 -0
  136. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_implemented/single_pauli.py +0 -0
  137. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_implemented/single_probability.py +0 -0
  138. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_implemented/summed_paulis.py +0 -0
  139. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/observables/observable_implemented/summed_probabilities.py +0 -0
  140. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/optimizers/__init__.py +0 -0
  141. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/optimizers/adam.py +0 -0
  142. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/optimizers/approximated_gradients.py +0 -0
  143. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/optimizers/optimizer_base.py +0 -0
  144. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/optimizers/optimizers_wrapper.py +0 -0
  145. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/optimizers/sglbo.py +0 -0
  146. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/__init__.py +0 -0
  147. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/barren_plateau_analysis.py +0 -0
  148. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/loss.py +0 -0
  149. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/lowlevel_qnn.py +0 -0
  150. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/lowlevel_qnn_base.py +0 -0
  151. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/lowlevel_qnn_qiskit.py +0 -0
  152. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/qnn/training.py +0 -0
  153. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/__init__.py +0 -0
  154. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/data_preprocessing.py +0 -0
  155. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/optree/__init__.py +0 -0
  156. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/optree/optree.py +0 -0
  157. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/optree/optree_derivative.py +0 -0
  158. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/optree/optree_evaluate.py +0 -0
  159. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/pennylane/__init__.py +0 -0
  160. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/pennylane/pennylane_gates.py +0 -0
  161. {squlearn-0.7.4 → squlearn-0.7.6}/src/squlearn/util/qfi.py +0 -0
  162. {squlearn-0.7.4 → squlearn-0.7.6}/tests/encoding_circuit/test_layered_encoding_circuit.py +0 -0
  163. {squlearn-0.7.4 → squlearn-0.7.6}/tests/optimizers/test_sglbo.py +0 -0
  164. {squlearn-0.7.4 → squlearn-0.7.6}/tests/qnn/test_base_qnn.py +0 -0
  165. {squlearn-0.7.4 → squlearn-0.7.6}/tests/util/optree/test_optree_derivative.py +0 -0
  166. {squlearn-0.7.4 → squlearn-0.7.6}/tests/util/optree/test_optree_evaluate.py +0 -0
  167. {squlearn-0.7.4 → squlearn-0.7.6}/tests/util/test_executor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: squlearn
3
- Version: 0.7.4
3
+ Version: 0.7.6
4
4
  Summary: A library for quantum machine learning following the scikit-learnstandard.
5
5
  Keywords: quantum,machine learning,qml
6
6
  Author-email: David Kreplin <david.kreplin@ipa.fraunhofer.de>, Moritz Willmann <moritz.willmann@ipa.fraunhofer.de>, Jan Schnabel <jan.schnabel@ipa.fraunhofer.de>, Frederic Rapp <frederic.rapp@ipa.fraunhofer.de>, Manuel Hagelüken <manuel.hagelueken@ipa.fraunhofer.de>, Marco Roth <marco.roth@ipa.fraunhofer.de>
@@ -11,15 +11,15 @@ Classifier: License :: OSI Approved :: Apache Software License
11
11
  Classifier: Programming Language :: Python
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Requires-Dist: dill>=0.3
14
- Requires-Dist: numpy>=1.17
15
- Requires-Dist: qiskit>=0.43.0
14
+ Requires-Dist: numpy>=1.17,<2.0
15
+ Requires-Dist: qiskit>=0.43.0,<1.1.0
16
16
  Requires-Dist: qiskit-aer>=0.12.0
17
17
  Requires-Dist: qiskit-algorithms>=0.3.0
18
18
  Requires-Dist: qiskit-ibm-runtime>=0.15.1
19
19
  Requires-Dist: qiskit-machine-learning>=0.6.1
20
20
  Requires-Dist: pennylane>=0.34.0
21
21
  Requires-Dist: scipy>=1.5
22
- Requires-Dist: scikit-learn>=1.0
22
+ Requires-Dist: scikit-learn>=1.0,<1.4.2
23
23
  Requires-Dist: bayesian-optimization>=1.4.3
24
24
  Requires-Dist: tqdm>=4.0
25
25
  Requires-Dist: black ; extra == "dev"
@@ -322,7 +322,7 @@ yields a high variance in the model output.
322
322
  -1.74881862, -0.64411871, 0.86344117, -0.91471452])
323
323
  param_op = np.array([-0.47157523, 5.10755673, 2.63075629])
324
324
  qnn_qasm = QNNRegressor(pqc, ising_op, qasm, SquaredLoss, SLSQP(), param, param_op, pretrained=True)
325
- x = np.arange(np.min(0.1), np.max(0.8), 0.005)
325
+ x = np.arange(np.min(0.1), np.max(0.8), 0.005).reshape(-1, 1)
326
326
  y = qnn_qasm.predict(x)
327
327
  plt.plot(x, np.log(x))
328
328
  plt.plot(x, y)
@@ -386,7 +386,7 @@ in the model, as depicted in `figure 3`_.
386
386
  -0.52783347, -1.55477309, -2.08338942, -0.29088459])
387
387
  param_op = np.array([-1.57350653, 0.87778247, -0.26884315])
388
388
  qnn_qasm = QNNRegressor(pqc, ising_op, qasm, SquaredLoss, SLSQP(), param, param_op, pretrained=True)
389
- x = np.arange(np.min(0.1), np.max(0.8), 0.005)
389
+ x = np.arange(np.min(0.1), np.max(0.8), 0.005).reshape(-1, 1)
390
390
  y = qnn_qasm.predict(x)
391
391
  plt.plot(x, np.log(x))
392
392
  plt.plot(x, y)
@@ -100,13 +100,20 @@
100
100
  "name": "stdout",
101
101
  "output_type": "stream",
102
102
  "text": [
103
- "fit: 55%|█████▌ | 55/100 [00:12<00:10, 4.38it/s]\n"
103
+ "fit: 55%|█████▌ | 55/100 [00:10<00:08, 5.01it/s]\n"
104
+ ]
105
+ },
106
+ {
107
+ "name": "stderr",
108
+ "output_type": "stream",
109
+ "text": [
110
+ "2024/08/07 07:56:16 WARNING mlflow.models.model: Input example should be provided to infer model signature if the model signature is not provided when logging the model.\n"
104
111
  ]
105
112
  }
106
113
  ],
107
114
  "source": [
108
- "x_space = np.arange(0.1, 0.9, 0.1)\n",
109
- "ref_values = np.log(x_space)\n",
115
+ "x_space = np.arange(0.1, 0.9, 0.1).reshape(-1, 1)\n",
116
+ "ref_values = np.log(x_space).ravel()\n",
110
117
  "\n",
111
118
  "with mlflow.start_run() as run:\n",
112
119
  " mlflow.log_params(reg.get_params())\n",
@@ -136,7 +143,7 @@
136
143
  "name": "stdout",
137
144
  "output_type": "stream",
138
145
  "text": [
139
- "{'batch_size': 'None', 'caching': 'True', 'callback': 'pbar', 'closed': 'False', 'encoding_circuit': '<squlearn.encoding_circuit.circuit_library.chebyshev_rx.ChebyshevRx object at 0x000002711B598EB0>', 'epochs': 'None', 'executor': '<squlearn.util.executor.Executor object at 0x000002711B599870>', 'I': 'S', 'loss': '<squlearn.qnn.loss.SquaredLoss object at 0x000002711B599600>', 'num_features': '1', 'num_layers': '2', 'num_qubits': '4', 'operator': \"SparsePauliOp(['IIII', 'IIIZ', 'IIZI', 'IZII', 'ZIII', 'IIZZ', 'IZIZ', 'IZZI', 'ZIIZ', 'ZIZI', 'ZZII'],\\n coeffs=[ParameterExpression(1.0*p[0]), ParameterExpression(1.0*p[1]),\\n ParameterExpression(1.0*p[1]), ParameterExpression(1.0*p[1]),\\n ParameterExpression(1.0*p[1]), ParameterExpression(1.0*p[2]),\\n ParameterExpression(1.0*p[2]), ParameterExpression(1.0*p[2]),\\n ParameterExpression(1.0*p[2]), ParameterExpression(1.0*p[2]),\\n ParameterExpression(1.0*p[2])])\", 'optimizer': '<squlearn.optimizers.optimizers_wrapper.SLSQP object at 0x000002711B599270>', 'opt_param_op': 'True', 'parameter_seed': '0', 'param_ini': '[ 0.01 1.34 2.67 4. -0.47969104 0.91667975\\n -0.39215112 2.46158236 0.01 1.34 2.67 4.\\n 0.42753659 2.67410254 -2.69525994 -2.59414312]', 'param_op_ini': '[1. 1. 1.]', 'pretrained': 'False', 'shot_control': 'None', 'shuffle': 'None', 'variance': 'None', 'X': 'N', 'Z': 'S', 'ZZ': 'S'}\n"
146
+ "{'alpha': '4.0', 'batch_size': 'None', 'caching': 'True', 'callback': 'pbar', 'closed': 'False', 'encoding_circuit': '<squlearn.encoding_circuit.circuit_library.chebyshev_rx.ChebyshevRx object at 0x0000015A4A2AD720>', 'epochs': 'None', 'executor': '<squlearn.util.executor.Executor object at 0x0000015AA02D77C0>', 'I': 'S', 'loss': '<squlearn.qnn.loss.SquaredLoss object at 0x0000015AA02D77F0>', 'nonlinearity': 'arccos', 'num_features': '1', 'num_layers': '2', 'num_qubits': '4', 'operator': \"SparsePauliOp(['IIII', 'IIIZ', 'IIZI', 'IZII', 'ZIII', 'IIZZ', 'IZIZ', 'IZZI', 'ZIIZ', 'ZIZI', 'ZZII'],\\n coeffs=[ParameterExpression(1.0*p[0]), ParameterExpression(1.0*p[1]),\\n ParameterExpression(1.0*p[1]), ParameterExpression(1.0*p[1]),\\n ParameterExpression(1.0*p[1]), ParameterExpression(1.0*p[2]),\\n ParameterExpression(1.0*p[2]), ParameterExpression(1.0*p[2]),\\n ParameterExpression(1.0*p[2]), ParameterExpression(1.0*p[2]),\\n ParameterExpression(1.0*p[2])])\", 'optimizer': '<squlearn.optimizers.optimizers_wrapper.SLSQP object at 0x0000015AA02D7B50>', 'opt_param_op': 'True', 'parameter_seed': '0', 'param_ini': '[ 0.01 1.34 2.67 4. -0.47969104 0.91667975\\n -0.39215112 2.46158236 0.01 1.34 2.67 4.\\n 0.42753659 2.67410254 -2.69525994 -2.59414312]', 'param_op_ini': '[1. 1. 1.]', 'pretrained': 'False', 'shot_control': 'None', 'shuffle': 'None', 'variance': 'None', 'X': 'N', 'Z': 'S', 'ZZ': 'S'}\n"
140
147
  ]
141
148
  }
142
149
  ],
@@ -161,7 +168,7 @@
161
168
  "name": "stdout",
162
169
  "output_type": "stream",
163
170
  "text": [
164
- "{'accuracy': 0.9999759983564921}\n"
171
+ "{'accuracy': 0.9999759983564892}\n"
165
172
  ]
166
173
  }
167
174
  ],
@@ -185,7 +192,7 @@
185
192
  "name": "stdout",
186
193
  "output_type": "stream",
187
194
  "text": [
188
- "['model/MLmodel', 'model/conda.yaml', 'model/metadata', 'model/model.pkl', 'model/python_env.yaml', 'model/requirements.txt']\n"
195
+ "['model/MLmodel', 'model/conda.yaml', 'model/model.pkl', 'model/python_env.yaml', 'model/requirements.txt']\n"
189
196
  ]
190
197
  }
191
198
  ],
@@ -246,7 +253,7 @@
246
253
  "name": "python",
247
254
  "nbconvert_exporter": "python",
248
255
  "pygments_lexer": "ipython3",
249
- "version": "3.10.2"
256
+ "version": "3.10.10"
250
257
  },
251
258
  "orig_nbformat": 4
252
259
  },
@@ -0,0 +1,303 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Example: Regression with `Adam`\n",
8
+ "\n",
9
+ "In this notebook we demonstrate how to use the `Adam` optimizer to train an instance of the `QNNRegressor` to fit a logarithm.\n",
10
+ "\n",
11
+ "## Imports"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "code",
16
+ "execution_count": 1,
17
+ "metadata": {},
18
+ "outputs": [],
19
+ "source": [
20
+ "import numpy as np\n",
21
+ "import matplotlib.pyplot as plt\n",
22
+ "\n",
23
+ "from squlearn import Executor\n",
24
+ "from squlearn.encoding_circuit import ChebyshevPQC\n",
25
+ "from squlearn.observables import SummedPaulis\n",
26
+ "from squlearn.qnn import QNNRegressor, SquaredLoss, get_variance_fac, ShotsFromRSTD\n",
27
+ "from squlearn.optimizers import Adam"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "markdown",
32
+ "metadata": {},
33
+ "source": [
34
+ "We will use the Pennylane quantum framework for executing the circuits, we set the number of shots to consider a noisy simulator."
35
+ ]
36
+ },
37
+ {
38
+ "cell_type": "code",
39
+ "execution_count": 2,
40
+ "metadata": {},
41
+ "outputs": [],
42
+ "source": [
43
+ "executor = Executor(\"pennylane\", shots=5000)"
44
+ ]
45
+ },
46
+ {
47
+ "attachments": {},
48
+ "cell_type": "markdown",
49
+ "metadata": {},
50
+ "source": [
51
+ "## `QNNRegressor` Setup\n",
52
+ "\n",
53
+ "We start by defining a parameterized quantum circuit (PQC)"
54
+ ]
55
+ },
56
+ {
57
+ "cell_type": "code",
58
+ "execution_count": 3,
59
+ "metadata": {},
60
+ "outputs": [
61
+ {
62
+ "data": {
63
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABHYAAAEvCAYAAAAgiEYYAAAAP3RFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMS5wb3N0MSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8kixA/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB3rUlEQVR4nO3deXxM9/oH8M8sWSVEJBLELiF2tYYqQmoPdUtbVPXeVvXStJqiy691aal9b9FVlSrSIKgtKBEhiCUiIhIJiURWJLLO8vsjOhVZzMTMnDkzn/fr5dVmzjkzz/kuz8w8cxaJWq1Wg4iIiIiIiIiIREcqdABERERERERERFQzLOwQEREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiRQLO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJFAs7REREREREREQixcIOEREREREREZFIsbBDRERERERERCRSLOwQEREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiRQLO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJFAs7REREREREREQixcIOEREREREREZFIsbBDRERERERERCRSLOwQEREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiRQLO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJFAs7REREREREREQixcIOEREREREREZFIsbBDRERERERERCRScqEDoMqp1WooCouFDkNrcjsbSCQSo7yW2NrGnBizn6k8jnvTxDlBZDzMg6aJeZDIcMSY95gThMHCjolSFBZjS8uJQoehtQkJm2Flb2uU1xJb25gTY/Yzlcdxb5o4J4iMh3nQNDEPEhmOGPMec4IweCoWEREREREREZFIsbBDRERERERERCRSLOwQEREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiZRc6ABIf9x92mFI8Nxyj5U+LMSD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Ns5LK4JwaYV2t+ZrM2kwor/ZpdW6pkjb/i+5l4+/3l5mhIiIjEMf+f/UR+tx6qNn+wCTc+Umdg/4sNJlqlIFzn35K859+Wu5x9UqFc7N21TpLXsPvPRFpc+VEhqFzoHjYN/AGQVpOfjT/7N/XqdEgb2DZ1cbZ/yWUMRvCX3a7gAo+yX7yre7tVpXKProf328LxIJSR/zICcmqdznrJpgHjQ+bfu+uve5y6uCWcQRMX2MAaDs9KvEoBP6DM1oeCqWBSjMyMWQ4HmaWyhWp5l/bwzc9HG5i7GZAzG3gaKgCGfnbIRDk6ffcvFZ9lNmY4X0iBiknbj8rCGbHF3apX5Pb/gfXoLCjFyoVbxOFYmbLmO/OiY3L9RqRMzaoNWtaIuyH6Dv2gB4jh/41HUr28+Cu7mI33r0mUMWgr7639TeF4l0wTxouXlQX33v2NQN/oeXQCKXQVWq0FN0ZAxmO/8rIVHzCrsmqbSgCFtaThQ6DK1NSNgMK3tbo7yW2NrGnLCfq2fM9hGr7c9NQUFaDuwbOGNc1HdChyMaYpwPlsKQ815s/c4cqB3mwZoR23ywFIae92Lrd7HkQbHkIbH1PyDcGOARO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJFG93bqLkdjaYkLBZ6DC0JrezMeprialtzAn7uXrGbB+yLGKcD5bCkPNebP3OHEiGJLb5YCkMPe/F1u/Mg/oltv4HhBsDLOyYKIlEIoorqguBbWMZ2M9E/+B8sEzsd6J/cD5YJva7ZWP/a4+nYhERERERERERiRQLO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJFAs7REREREREREQixcIOEREREREREZFIsbBDRERERERERCRSLOwQEREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiRQLO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJlFzoAKhyarUaisJiocPQmtzOBhKJxCivJba2MSfG7GcSlqHmmVql1vy3tKBIr89tzuOTec80mfOYI+ZBU8M8aJrMecyZAkvPQ2Kc90LNCYlarVYb/VXpqUoLirCl5UShw9Da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iFkXgph1ITV+rbQTlxHc571Kl5XmF+JU4LoKjysKihD+YcXb5BWk5WDfiE8rfa4bvx/DsD3zIV+6HaX5hdj5fIBmWXFuPoJ9plcb56UVQbi0QrtbpLaZNBjR3+zSal0iQPs59yDhDnZ0fafK5bqMU6pIH/1wafkOzd2oaop5kSyRvvLgneOX8EfPafoMzaLo63Nw/JZQnYvaj8u5chO7B3xY6TJVqQLnvvwV5778tdzjapUK5+ZtqvTW5Qde+qLS50oJjULnwHGwb+CMgrQc/On/2T+vU6LA3sGzq41Tl/1sPelFXPl2t1brkjD0/T0wPyUTv7V5Qx+hGYW+9v9Bwh1s8Xxdn6EZDU/FsgCFGbkYEjxPcwvF6tTv6Q3/w0tQmJELterZrtFgSnRpg2b+vTFw08flLkgnJEVBEc7O2QiHJvWfuu6z7KfMxgrpETFIO3H5WUMm0mksVsfU5qPYmGs/MC+SGOhr/pnrZzNjMdt+UKsRMWsDHBo/PQ8WZT9A37UB8Bw/8KnrVrafBXdzRXlqCulv/Ds2dYP/4SWQyGVQlSr0FJ3hWdL+S9TPeoVFMojSgiJsaTlR6DC0NiFhM6zsbY3yWmJrG3NizH42lO3PTUFBWg7sGzhjXNR3QodjssQ4z8xhfFZFjP1hCcQ65pgHtSPGeSfWMakNMfaHJRDjmBNTDhTjuNfnmLD0/dcFj9ghIiIiIiIiIhIpFnaIiIiIiIiIiESKhR0iIiIiIiIiIpHiXbFMlNzOBhMSNgsdhtbkdjZGfS0xtY05MWY/k7DEOM/MeXyKsT8sgTmPORLnvDPnMSnG/rAE5jzmTIEYx70+x4Sl779OryvIq9JTSSQS0V2IzFjYNkSGx3lmWtgfRMbHeWda2B9kiSx93Fv6/uuCp2IREREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiRQLO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJFAs7REREREREREQixcIOEREREREREZFIsbBDRERERERERCRSLOwQEREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiZRc6ACocmq1GorCYqHD0JrczgYSicQoryW2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dgwN+UrzenG/Hq5ynxw8XCGRSkV7C0Nt+9+xqRv6bfgQaqUSKoUKkXM2inafAe33u3bLhhi8fQ7kdtaQ2Vpj7PkNuLw6GHG/6Occcs4JImHoIwdknovDrYNn4X94CdRKFe7FpdTo2jNC0bYNusx6FbUauaDtW8PQ9q1hAICrP/yJG9uOQWZnjTEn10BmI4eVoz3Gnt+AhD+OI2rBb1rHwTxIZHz6mP8Nnm8P7/8Mg1qpgkQuQ1pYNC6vCDLmbjwTfbTBtZ8PwMnTA/5HlkJVqkRh5j1EzBLP+4ClY2HHjMSsD8GFxb8/db1Ly3fg0vIdRojI+LRtAwC4c/wS/ug5rcavlXPlJnYP+LDSZapSBc59+SvOfflrucfVKhXOzduEc/M2VdjmwEtfVPpcKaFR6Bw4DvYNnFGQloM//T/753VKFNg7eHa1ccZvCdW6cNd60ou48u1urdY1Rdr2f05MEnY+H2CEiIxD2/1+kHAHO7q+89T10iNianRbT84JImHoKwfErAtBzLoQfYZmNNq2wamP1uPUR+srXaYsLNEqR1aHeZDI+PQx/69vDsX1zeL9oVsfbaAqUVS5jEwfT8WyAIUZuRgSPE9zG83qNPPvjYGbPi53QT5zoEsb1O/pDf/DS1CYkQu1ygRuc6hWI2LWBjg0rv/UVYuyH6Dv2gB4jh/41HUr28+Cu7mIr+YOYWIl6v5/Brrsd3VMrk04J4i0oq8cIObPBsyDzINkucx2/utAX23g2NQN/oeXQCKXQVWq0FN0pE8SdU2usEcGV1pQhC0tJwodhtYmJGyGlb2tUV5LbG1jTtjP1TNk+4ixPSyBMecEWR6xzXtDzwextYelYB4kQxLbvNf3fBDb/gPMCULhETtERERERERERCLFwg4RERERERERkUixsENEREREREREJFK8xo6JUqvVUBQWCx2G1uR2NpBIJEZ5LbG1jTlhP1fPkO0jxvawBMacE2R5xDbvDT0fxNYeloJ5kAxJbPNe3/NBbPsPMCcIhYUdIiIiIiIiIiKR4qlYREREREREREQixcIOEREREREREZFIsbBDRERERERERCRSLOwQEREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiRQLO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJFAs7REREREREREQixcIOEREREREREZFIsbBDRERERERERCRSLOwQEREREREREYkUCztERERERERERCLFwg4RERERERERkUixsENEREREREREJFIs7BARERERERERiRQLO0REREREREREIsXCDhERERERERGRSLGwQ0REREREREQkUizsEBERERERERGJFAs7REREREREREQi9f9CKf/RWHceRgAAAABJRU5ErkJggg==",
64
+ "text/plain": [
65
+ "<Figure size 1458.05x367.889 with 1 Axes>"
66
+ ]
67
+ },
68
+ "execution_count": 3,
69
+ "metadata": {},
70
+ "output_type": "execute_result"
71
+ }
72
+ ],
73
+ "source": [
74
+ "nqubits = 4\n",
75
+ "number_of_layers = 3\n",
76
+ "\n",
77
+ "pqc = ChebyshevPQC(nqubits, 1, num_layers=number_of_layers, closed=False)\n",
78
+ "pqc.draw(\"mpl\")"
79
+ ]
80
+ },
81
+ {
82
+ "attachments": {},
83
+ "cell_type": "markdown",
84
+ "metadata": {},
85
+ "source": [
86
+ "We also need an observable"
87
+ ]
88
+ },
89
+ {
90
+ "cell_type": "code",
91
+ "execution_count": 4,
92
+ "metadata": {},
93
+ "outputs": [
94
+ {
95
+ "name": "stdout",
96
+ "output_type": "stream",
97
+ "text": [
98
+ "SparsePauliOp(['IIII', 'IIIZ', 'IIZI', 'IZII', 'ZIII'],\n",
99
+ " coeffs=[ParameterExpression(1.0*p[0]), ParameterExpression(1.0*p[1]),\n",
100
+ " ParameterExpression(1.0*p[2]), ParameterExpression(1.0*p[3]),\n",
101
+ " ParameterExpression(1.0*p[4])])\n"
102
+ ]
103
+ }
104
+ ],
105
+ "source": [
106
+ "cost_op = SummedPaulis(nqubits)\n",
107
+ "print(cost_op)"
108
+ ]
109
+ },
110
+ {
111
+ "attachments": {},
112
+ "cell_type": "markdown",
113
+ "metadata": {},
114
+ "source": [
115
+ "Now we can create the `QNNRegressor` with the PQC and cost operator. We also specify `SquaredLoss` and `Adam` as the loss function and optimizer respectively. Finally we specify random initial parameters for both, the PQC and cost operator. For the `Adam` optimizer, we specify a maximum number of allowed iterations and a learning rate."
116
+ ]
117
+ },
118
+ {
119
+ "cell_type": "code",
120
+ "execution_count": 5,
121
+ "metadata": {},
122
+ "outputs": [],
123
+ "source": [
124
+ "np.random.seed(13)\n",
125
+ "param_ini = np.array(\n",
126
+ " [\n",
127
+ " 3.14604095,\n",
128
+ " 2.44401647,\n",
129
+ " 2.08568867,\n",
130
+ " 3.93000282,\n",
131
+ " 3.46433425,\n",
132
+ " 3.29501838,\n",
133
+ " 2.26917234,\n",
134
+ " 1.90319897,\n",
135
+ " 2.31709343,\n",
136
+ " 3.23543548,\n",
137
+ " 0.18238276,\n",
138
+ " 1.90898352,\n",
139
+ " 0.00505997,\n",
140
+ " 3.19126208,\n",
141
+ " 1.17116225,\n",
142
+ " 2.67742273,\n",
143
+ " 1.56371175,\n",
144
+ " 2.30711326,\n",
145
+ " -1.38159894,\n",
146
+ " 2.24204365,\n",
147
+ " 4.51009492,\n",
148
+ " 1.12076568,\n",
149
+ " 1.05454309,\n",
150
+ " 4.0379626,\n",
151
+ " 2.35969077,\n",
152
+ " 0.1948755,\n",
153
+ " 1.00621795,\n",
154
+ " 2.22118908,\n",
155
+ " -0.07067928,\n",
156
+ " ]\n",
157
+ ")\n",
158
+ "param_op_ini = np.array([-0.62431099, 0.41142941, 0.01879568, 0.20331442, 0.393217])\n",
159
+ "\n",
160
+ "ADAM = Adam({\"maxiter\": 10, \"lr\": 0.1})\n",
161
+ "\n",
162
+ "reg = QNNRegressor(\n",
163
+ " pqc,\n",
164
+ " cost_op,\n",
165
+ " executor,\n",
166
+ " SquaredLoss(),\n",
167
+ " ADAM,\n",
168
+ " param_ini,\n",
169
+ " param_op_ini,\n",
170
+ " variance=get_variance_fac(0.005, 0.5, 5),\n",
171
+ " shot_control=ShotsFromRSTD(0.1, 100, 5000),\n",
172
+ ")"
173
+ ]
174
+ },
175
+ {
176
+ "attachments": {},
177
+ "cell_type": "markdown",
178
+ "metadata": {},
179
+ "source": [
180
+ "## Training\n",
181
+ "\n",
182
+ "Now we are ready to train the model to fit the logarithm funciton"
183
+ ]
184
+ },
185
+ {
186
+ "cell_type": "code",
187
+ "execution_count": 6,
188
+ "metadata": {},
189
+ "outputs": [
190
+ {
191
+ "name": "stdout",
192
+ "output_type": "stream",
193
+ "text": [
194
+ "fit: 100%|██████████| 10/10 [02:14<00:00, 13.46s/it]\n"
195
+ ]
196
+ }
197
+ ],
198
+ "source": [
199
+ "X = np.arange(0.1, 0.9, 0.1).reshape(-1, 1)\n",
200
+ "y = np.log(X).ravel()\n",
201
+ "\n",
202
+ "reg.fit(X, y)"
203
+ ]
204
+ },
205
+ {
206
+ "cell_type": "markdown",
207
+ "metadata": {},
208
+ "source": [
209
+ "## Evaluation\n",
210
+ "\n",
211
+ "Let's check the trained parameters of the PQC and operator"
212
+ ]
213
+ },
214
+ {
215
+ "cell_type": "code",
216
+ "execution_count": 7,
217
+ "metadata": {},
218
+ "outputs": [
219
+ {
220
+ "name": "stdout",
221
+ "output_type": "stream",
222
+ "text": [
223
+ "Result PQC params: [ 2.90955832 2.30170253 2.0247377 4.16980874 3.43656545 3.4383008\n",
224
+ " 2.31918789 1.99864212 2.73981739 3.4692128 0.34716204 1.58882415\n",
225
+ " 0.05448895 3.15488285 1.57859848 2.15149318 1.65466943 2.42457674\n",
226
+ " -1.31041338 2.07518746 4.22876383 0.9121903 1.48947884 4.32495245\n",
227
+ " 1.88460275 0.2028893 1.06054964 2.3856939 -0.6295262 ]\n",
228
+ "Result operator params: [-0.71030803 0.360903 0.18318898 0.40880803 0.30524382]\n"
229
+ ]
230
+ }
231
+ ],
232
+ "source": [
233
+ "print(\"Result PQC params:\", reg.param)\n",
234
+ "print(\"Result operator params:\", reg.param_op)"
235
+ ]
236
+ },
237
+ {
238
+ "cell_type": "markdown",
239
+ "metadata": {},
240
+ "source": [
241
+ "Also let's plot the predicted function vs. the actual logarithm function"
242
+ ]
243
+ },
244
+ {
245
+ "cell_type": "code",
246
+ "execution_count": 8,
247
+ "metadata": {},
248
+ "outputs": [
249
+ {
250
+ "data": {
251
+ "text/plain": [
252
+ "[<matplotlib.lines.Line2D at 0x18e18ae54e0>]"
253
+ ]
254
+ },
255
+ "execution_count": 8,
256
+ "metadata": {},
257
+ "output_type": "execute_result"
258
+ },
259
+ {
260
+ "data": {
261
+ "image/png": "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uGV4qai5c+fSsWNHevXq5epSKtWqVat44YUXmDNnDr179yY+Pp777ruPZ599lieeeMJh4yi8nFa/fn08PDxIS0s7Z3taWhphYWEuqqpyVeQczJ49mxdffJGff/6ZTp06ObNMpyrvObBarbRo0QKALl26sHfvXmbNmuV24aWsnz8hIYGkpCRGjx5dus1utwPg6elJXFwczZs3d27RDuaI/xZ4eXnRtWtX4uPjnVGi05XnHISHh+Pl5YWHh0fptrZt25KamkpRURHe3t5OrdnRKvJ7kJuby6JFi3jmmWecWaLTleccPPHEE0yePJk777wTgI4dO5Kbm8u0adN47LHHsFodM1tFc15O8/b2pnv37qxYsaJ0m91uZ8WKFef8P6rqrLzn4OWXX+bZZ59l+fLl9OjRozJKdRpH/R7Y7XYKCwudUaJTlfXzt2nThl27dhEdHV36M2bMGK688kqio6OJjIyszPIdwhG/AzabjV27dhEeHu6sMp2qPOfg8ssvJz4+vjS8Auzbt4/w8HC3Cy5Qsd+DL774gsLCQiZNmuTsMp2qPOcgLy/vDwHlTKA1HLmUokOn/7q5RYsWGT4+Psa8efOMmJgYY9q0aUZwcHDpLY+TJ082Zs6cWbp/YWGhsX37dmP79u1GeHi48dBDDxnbt2839u/f76qPUGFlPQcvvvii4e3tbSxevPicWwSzs7Nd9REqrKzn4IUXXjB+/PFHIyEhwYiJiTFmz55teHp6Gu+9956rPkKFlPXz/6/qcLdRWc/B008/bfzwww9GQkKCsXXrVmPixImGr6+vsWfPHld9hAor6zk4dOiQERAQYNxzzz1GXFyc8e233xoNGjQwnnvuOVd9hAor778LV1xxhXHDDTdUdrlOUdZz8NRTTxkBAQHGp59+ahw4cMD48ccfjebNmxvXX3+9Q+tSePkfb7zxhtG4cWPD29vb6NWrl7Fhw4bS1wYMGGDceuutpc8TExMN4A8/AwYMqPzCHags56BJkybnPQdPPfVU5RfuQGU5B4899pjRokULw9fX16hTp47Rp08fY9GiRS6o2nHK8vn/V3UIL4ZRtnNw//33l+4bGhpqjBw50ti2bZsLqnassv4erFu3zujdu7fh4+NjREVFGc8//7xRUlJSyVU7VlnPQWxsrAEYP/74YyVX6jxlOQfFxcXGP//5T6N58+aGr6+vERkZadx9993GqVOnHFqTxTAceR1HRERExLk050VERETcisKLiIiIuBWFFxEREXErCi8iIiLiVhReRERExK0ovIiIiIhbUXgRERERt6LwIiIiIm5F4UVERETcisKLiIiIuBWFFxEREXErCi8iIiLiVv4fehV/8jb0gosAAAAASUVORK5CYII=",
262
+ "text/plain": [
263
+ "<Figure size 640x480 with 1 Axes>"
264
+ ]
265
+ },
266
+ "metadata": {},
267
+ "output_type": "display_data"
268
+ }
269
+ ],
270
+ "source": [
271
+ "x = np.arange(np.min(X), np.max(X), 0.005).reshape(-1, 1)\n",
272
+ "y = reg.predict(x)\n",
273
+ "plt.plot(x, np.log(x))\n",
274
+ "plt.plot(x, y)"
275
+ ]
276
+ }
277
+ ],
278
+ "metadata": {
279
+ "interpreter": {
280
+ "hash": "26de051ba29f2982a8de78e945f0abaf191376122a1563185a90213a26c5da77"
281
+ },
282
+ "kernelspec": {
283
+ "display_name": "Python 3.10.2 64-bit",
284
+ "language": "python",
285
+ "name": "python3"
286
+ },
287
+ "language_info": {
288
+ "codemirror_mode": {
289
+ "name": "ipython",
290
+ "version": 3
291
+ },
292
+ "file_extension": ".py",
293
+ "mimetype": "text/x-python",
294
+ "name": "python",
295
+ "nbconvert_exporter": "python",
296
+ "pygments_lexer": "ipython3",
297
+ "version": "3.10.10"
298
+ },
299
+ "orig_nbformat": 4
300
+ },
301
+ "nbformat": 4,
302
+ "nbformat_minor": 2
303
+ }