classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl

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 (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -0,0 +1,113 @@
1
+ from typing import Union
2
+
3
+ import numpy as np
4
+ from sympy import fwht
5
+
6
+ from classiq.qmod import ( # type:ignore[attr-defined]
7
+ Pauli,
8
+ PauliTerm,
9
+ )
10
+
11
+ ATOL = 1e-12
12
+ PAULI_MATRICES_DICT = {
13
+ Pauli.I: np.array([[1, 0], [0, 1]], dtype=np.complex128),
14
+ Pauli.Z: np.array([[1, 0], [0, -1]], dtype=np.complex128),
15
+ Pauli.X: np.array([[0, 1], [1, 0]], dtype=np.complex128),
16
+ Pauli.Y: np.array([[0, -1j], [1j, 0]], dtype=np.complex128),
17
+ }
18
+
19
+
20
+ def _get_pauli_string(set_index: int, term_index: int, num_qubits: int) -> list[Pauli]:
21
+ """
22
+ The basis of 4^N Pauli strings on N qubits can be partitioned to 2^N sets, each contains 2^N Pauli strings.
23
+ In the k-th set we have Pauli strings of the form s_1s_2...s_N, where s_j is in {I,Z} if k_j is 0,
24
+ and in {X,iY} if k_j=1. The function get_pauli_string returns the m-th Pauli string in the k-th set of Pauli strings
25
+ """
26
+
27
+ # returns the Pauli (I,Z) or (iY, X) appearing in the pauli_index position for a given set
28
+ def _get_paulis_for_set(set_index: int, pauli_index: int) -> tuple[Pauli, Pauli]:
29
+ if (set_index >> pauli_index) & 1:
30
+ return Pauli.Y, Pauli.X
31
+ else:
32
+ return Pauli.Z, Pauli.I
33
+
34
+ return [
35
+ (
36
+ _get_paulis_for_set(set_index, s)[0]
37
+ if (term_index >> s) & 1
38
+ else _get_paulis_for_set(set_index, s)[1]
39
+ )
40
+ for s in range(num_qubits)
41
+ ][::-1]
42
+
43
+
44
+ def _coefficents_for_set(mat: np.ndarray, set_index: int) -> list:
45
+ """
46
+ The 2^N coefficients in a 2^N x 2^N matrix that are decomposed to the elements
47
+ in the k-th set are the indices [i,j] such that i^j=k
48
+ The function coefficents_for_set returns the matrix entries that are decomposed to the same Pauli strigs set
49
+ """
50
+ return [mat[k, k ^ set_index] / len(mat) for k in range(len(mat))]
51
+
52
+
53
+ def _get_signed_coefficient(
54
+ c: complex, k: int, i: int, is_hermitian: bool
55
+ ) -> Union[complex, float]:
56
+ # correct from iY to Y
57
+ coef = complex((1j) ** ((i & k).bit_count()) * c)
58
+ if is_hermitian:
59
+ return coef.real
60
+ else:
61
+ return coef
62
+
63
+
64
+ def matrix_to_hamiltonian(
65
+ mat: np.ndarray, tol: float = ATOL, is_hermitian: bool = True
66
+ ) -> list[PauliTerm]:
67
+ """
68
+ The decomposition per set is done by the Walsh-Hadamard transform,
69
+ since the transformation between {e_0,e_3} ({e_1,e_2}) to {I,Z} ({X,iY}) is the Hadamard matrix.
70
+ """
71
+ mat.shape[0] != 0, "matrix is of size 0"
72
+ if is_hermitian:
73
+ assert np.allclose(
74
+ mat, np.conjugate(mat.T)
75
+ ), "Matrix is not hermitian, please pass is_hermitian=False"
76
+ assert mat.shape[0] == mat.shape[1], "Matrix is not square"
77
+ mat_dimension = mat.shape[0]
78
+ assert mat_dimension.bit_count() == 1, "Matrix dimension is not a power of 2"
79
+ num_qubits = (mat_dimension - 1).bit_length()
80
+ hamiltonian = []
81
+ for k in range(2**num_qubits):
82
+ coef = fwht(
83
+ _coefficents_for_set(mat, k)
84
+ ) # the transformation per set is given by the Walsh-Hadamard transform
85
+ hamiltonian += [
86
+ PauliTerm(
87
+ pauli=_get_pauli_string(k, i, num_qubits),
88
+ coefficient=_get_signed_coefficient(coef[i], k, i, is_hermitian),
89
+ )
90
+ for i in range(2**num_qubits)
91
+ if abs(coef[i]) > tol
92
+ ]
93
+ return hamiltonian
94
+
95
+
96
+ # convert a single puali string of length N to 2**N X 2**N matrix
97
+ def pauli_string_to_mat(seq: list[Pauli]) -> np.ndarray:
98
+ real_matrix = PAULI_MATRICES_DICT[seq[0]]
99
+ for p in seq[1:]:
100
+ real_matrix = np.kron(real_matrix, PAULI_MATRICES_DICT[p])
101
+ return real_matrix
102
+
103
+
104
+ # return matrix from hamiltonian
105
+ def hamiltonian_to_matrix(hamiltonian: list[PauliTerm]) -> np.ndarray:
106
+ matrix = np.zeros(
107
+ [2 ** len(hamiltonian[0].pauli), 2 ** len(hamiltonian[0].pauli)],
108
+ dtype=np.complex_,
109
+ )
110
+ for p in hamiltonian:
111
+ matrix += p.coefficient * pauli_string_to_mat(p.pauli)
112
+
113
+ return matrix
File without changes
@@ -0,0 +1,22 @@
1
+ from classiq.open_library.functions.amplitude_estimation import amplitude_estimation
2
+ from classiq.qmod.builtins.functions import Z
3
+ from classiq.qmod.qfunc import qfunc
4
+ from classiq.qmod.qmod_variable import QArray, QBit, QNum
5
+ from classiq.qmod.quantum_callable import QCallable
6
+
7
+
8
+ @qfunc
9
+ def qmci(
10
+ space_transform: QCallable[QArray[QBit], QBit],
11
+ phase: QNum,
12
+ packed_vars: QArray[QBit],
13
+ ) -> None:
14
+ amplitude_estimation(
15
+ lambda reg: Z(reg[reg.len - 1]),
16
+ lambda reg: space_transform(reg[0 : reg.len - 1], reg[reg.len - 1]),
17
+ phase,
18
+ packed_vars,
19
+ )
20
+
21
+
22
+ QMCI_LIBRARY = [func for func in qmci.create_model().functions if func.name != "main"]
@@ -1,7 +1,5 @@
1
1
  # This file will be called first whenever any file from within this directory is imported.
2
2
  # Thus, we'll test dependencies only here, once.
3
- from typing import List
4
-
5
3
  try:
6
4
  import torch
7
5
  except ImportError as exc:
@@ -10,8 +8,8 @@ except ImportError as exc:
10
8
  from ..qnn import datasets, types
11
9
  from ..qnn.qlayer import QLayer
12
10
 
13
- __all__ = ["datasets", "types", "QLayer"]
11
+ __all__ = ["QLayer", "datasets", "types"]
14
12
 
15
13
 
16
- def __dir__() -> List[str]:
14
+ def __dir__() -> list[str]:
17
15
  return __all__
@@ -1,21 +1,21 @@
1
1
  import itertools
2
- from collections.abc import Collection
3
- from typing import Iterable, List, Tuple, Union
2
+ from collections.abc import Collection, Iterable
3
+ from typing import Union
4
4
 
5
5
  from torch import Tensor
6
6
 
7
+ from classiq.interface.exceptions import ClassiqQNNError, ClassiqValueError
7
8
  from classiq.interface.generator.circuit_code.types_and_constants import QasmVersion
8
- from classiq.interface.generator.generated_circuit import GeneratedCircuit
9
9
  from classiq.interface.generator.model.preferences.preferences import QuantumFormat
10
+ from classiq.interface.generator.quantum_program import QuantumProgram
10
11
 
11
12
  from classiq.applications.qnn.types import Arguments, Circuit
12
- from classiq.exceptions import ClassiqQNNError, ClassiqValueError
13
13
 
14
14
  WEIGHT_INITIALS = ["weight_", "w_"]
15
15
  INPUT_INITIALS = ["input_", "i_"]
16
16
 
17
- Parameters = List[str]
18
- ParametersTuple = Tuple[Parameters, Parameters]
17
+ Parameters = list[str]
18
+ ParametersTuple = tuple[Parameters, Parameters]
19
19
 
20
20
 
21
21
  def _is_name_valid(name: str) -> bool:
@@ -46,7 +46,7 @@ def validate_circuit(circuit: Circuit) -> bool:
46
46
  return True
47
47
 
48
48
 
49
- def _extract_by_prefix(lst: Parameters, prefix: List[str]) -> Parameters:
49
+ def _extract_by_prefix(lst: Parameters, prefix: list[str]) -> Parameters:
50
50
  return [s for s in lst if any(s.startswith(p) for p in prefix)]
51
51
 
52
52
 
@@ -95,7 +95,7 @@ def _get_extracted_parameters(obj: CircuitOrExtractedParameters) -> ParametersTu
95
95
  # This `if` is for caching
96
96
  if isinstance(obj, tuple):
97
97
  weight_params, input_params = obj
98
- elif isinstance(obj, GeneratedCircuit):
98
+ elif isinstance(obj, QuantumProgram):
99
99
  weight_params, input_params = extract_parameters(obj)
100
100
  else:
101
101
  raise ClassiqValueError("Invalid object passed to `map_parameters`")
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from ..datasets import builtin_datasets
4
2
  from ..datasets.builtin_datasets import (
5
3
  DATALOADER_NOT,
@@ -15,21 +13,21 @@ from ..datasets.dataset_xor import DatasetXor
15
13
  from ..datasets.datasets_utils import state_to_label, state_to_weights
16
14
 
17
15
  __all__ = [
18
- "builtin_datasets",
19
- "DatasetNot",
20
- "DATASET_NOT",
21
16
  "DATALOADER_NOT",
22
- "DatasetXor",
23
- "DATASET_XOR",
17
+ "DATALOADER_SUBSET_PARITY",
24
18
  "DATALOADER_XOR",
25
- "DatasetSubsetParity",
19
+ "DATASET_NOT",
26
20
  "DATASET_SUBSET_PARITY",
27
- "DATALOADER_SUBSET_PARITY",
21
+ "DATASET_XOR",
22
+ "DatasetNot",
28
23
  "DatasetParity",
29
- "state_to_weights",
24
+ "DatasetSubsetParity",
25
+ "DatasetXor",
26
+ "builtin_datasets",
30
27
  "state_to_label",
28
+ "state_to_weights",
31
29
  ]
32
30
 
33
31
 
34
- def __dir__() -> List[str]:
32
+ def __dir__() -> list[str]:
35
33
  return __all__
@@ -1,11 +1,13 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import List, Literal, Optional, Sequence, Tuple, TypeVar, Union
2
+ from collections.abc import Sequence
3
+ from typing import Literal, Optional, TypeVar, Union
3
4
 
4
5
  from torch import Tensor, tensor
5
6
  from torch.utils.data import Dataset
6
7
 
8
+ from classiq.interface.exceptions import ClassiqIndexError, ClassiqValueError
9
+
7
10
  from classiq.applications.qnn.types import DataAndLabel, Transform
8
- from classiq.exceptions import ClassiqIndexError, ClassiqValueError
9
11
 
10
12
  T = TypeVar("T")
11
13
 
@@ -29,7 +31,7 @@ class MyDataset(Dataset, ABC):
29
31
  def _get_data_and_label(self, index: int) -> DataAndLabel:
30
32
  pass
31
33
 
32
- def __getitem__(self, index: int) -> Tuple[Tensor, Tensor]:
34
+ def __getitem__(self, index: int) -> tuple[Tensor, Tensor]:
33
35
  if index < 0 or index >= len(self):
34
36
  raise ClassiqIndexError(f"{self.__class__.__name__} out of range")
35
37
 
@@ -53,7 +55,7 @@ class MySubsetDataset(MyDataset, ABC):
53
55
  def __init__(
54
56
  self,
55
57
  n: int = 2,
56
- subset: Union[List[int], Literal["all"]] = "all",
58
+ subset: Union[list[int], Literal["all"]] = "all",
57
59
  transform: Optional[Transform] = None,
58
60
  target_transform: Optional[Transform] = None,
59
61
  ) -> None:
@@ -73,5 +75,5 @@ class MySubsetDataset(MyDataset, ABC):
73
75
  'Invalid subset - please enter a `list` of `int`, or the string "all"'
74
76
  )
75
77
 
76
- def _get_subset(self, coll: Sequence[T]) -> List[T]:
78
+ def _get_subset(self, coll: Sequence[T]) -> list[T]:
77
79
  return [coll[i] for i in self._subset]
@@ -1,10 +1,11 @@
1
+ from classiq.interface.exceptions import ClassiqIndexError
2
+
1
3
  from classiq.applications.qnn.datasets.dataset_base_classes import MyDataset
2
4
  from classiq.applications.qnn.datasets.datasets_utils import (
3
5
  all_bits_to_one,
4
6
  all_bits_to_zero,
5
7
  )
6
8
  from classiq.applications.qnn.types import DataAndLabel
7
- from classiq.exceptions import ClassiqIndexError
8
9
 
9
10
 
10
11
  class DatasetNot(MyDataset):
@@ -1,4 +1,4 @@
1
- from typing import List, Literal, Optional, Union
1
+ from typing import Literal, Optional, Union
2
2
 
3
3
  from classiq.applications.qnn.datasets.dataset_base_classes import MySubsetDataset
4
4
  from classiq.applications.qnn.types import DataAndLabel, Transform
@@ -8,7 +8,7 @@ class DatasetSubsetParity(MySubsetDataset):
8
8
  def __init__(
9
9
  self,
10
10
  n: int = 2,
11
- subset: Union[List[int], Literal["all"]] = "all",
11
+ subset: Union[list[int], Literal["all"]] = "all",
12
12
  add_readout_qubit: bool = True,
13
13
  transform: Optional[Transform] = None,
14
14
  target_transform: Optional[Transform] = None,
@@ -4,7 +4,7 @@ from typing import Any
4
4
 
5
5
  from torch import Tensor
6
6
 
7
- from classiq.interface.generator.generated_circuit import GeneratedCircuit
7
+ from classiq.interface.generator.quantum_program import QuantumProgram
8
8
 
9
9
  from classiq.applications.qnn.circuit_utils import extract_parameters, validate_circuit
10
10
  from classiq.applications.qnn.types import ExecuteFunction, PostProcessFunction
@@ -23,7 +23,7 @@ class QuantumGradient(abc.ABC):
23
23
  self._execute = execute
24
24
  self._post_process = post_process
25
25
 
26
- circuit = GeneratedCircuit.parse_raw(quantum_program)
26
+ circuit = QuantumProgram.model_validate_json(quantum_program)
27
27
  validate_circuit(circuit)
28
28
  self._quantum_program = quantum_program
29
29
  self._parameters_names = extract_parameters(circuit)
@@ -1,5 +1,6 @@
1
1
  import itertools
2
- from typing import Any, Iterable
2
+ from collections.abc import Iterable
3
+ from typing import Any
3
4
 
4
5
  import torch
5
6
  from torch import Tensor
@@ -1,11 +1,13 @@
1
1
  import functools
2
- from typing import Any, Callable, Optional, Tuple, Union
2
+ from typing import Any, Callable, Optional, Union
3
3
 
4
4
  import torch
5
5
  import torch.nn as nn
6
6
  from torch import Tensor
7
7
  from torch.nn.parameter import Parameter
8
8
 
9
+ from classiq.interface.exceptions import ClassiqQNNError, ClassiqTorchError
10
+
9
11
  from classiq.applications.qnn.circuit_utils import (
10
12
  extract_parameters,
11
13
  is_single_layer_circuit,
@@ -13,6 +15,7 @@ from classiq.applications.qnn.circuit_utils import (
13
15
  validate_circuit,
14
16
  )
15
17
  from classiq.applications.qnn.gradients.simple_quantum_gradient import (
18
+ EPSILON,
16
19
  SimpleQuantumGradient,
17
20
  )
18
21
  from classiq.applications.qnn.torch_utils import (
@@ -26,7 +29,6 @@ from classiq.applications.qnn.types import (
26
29
  MultipleArguments,
27
30
  PostProcessFunction,
28
31
  )
29
- from classiq.exceptions import ClassiqQNNError, ClassiqTorchError
30
32
  from classiq.synthesis import SerializedQuantumProgram
31
33
 
32
34
 
@@ -39,6 +41,7 @@ class QLayerFunction(torch.autograd.Function):
39
41
  quantum_program: SerializedQuantumProgram,
40
42
  execute: ExecuteFunction,
41
43
  post_process: PostProcessFunction,
44
+ epsilon: Optional[float] = EPSILON,
42
45
  ) -> Tensor:
43
46
  """
44
47
  This function receives:
@@ -51,7 +54,9 @@ class QLayerFunction(torch.autograd.Function):
51
54
  and returning a `Tensor`
52
55
 
53
56
  """
54
- circuit = Circuit.parse_raw(quantum_program)
57
+ if epsilon is None:
58
+ epsilon = EPSILON
59
+ circuit = Circuit.model_validate_json(quantum_program)
55
60
  validate_circuit(circuit)
56
61
 
57
62
  # save for backward
@@ -60,7 +65,7 @@ class QLayerFunction(torch.autograd.Function):
60
65
  ctx.execute = execute
61
66
  ctx.post_process = post_process
62
67
  ctx.quantum_gradient = SimpleQuantumGradient(
63
- quantum_program, execute, post_process
68
+ quantum_program, execute, post_process, epsilon
64
69
  )
65
70
 
66
71
  ctx.batch_size, ctx.num_in_features = inputs.shape
@@ -94,7 +99,7 @@ class QLayerFunction(torch.autograd.Function):
94
99
  @staticmethod
95
100
  def backward( # type: ignore[override]
96
101
  ctx: Any, grad_output: Tensor
97
- ) -> Tuple[Optional[Tensor], Optional[Tensor], None, None, None]:
102
+ ) -> tuple[Optional[Tensor], Optional[Tensor], None, None, None, None]:
98
103
  """
99
104
  grad_output: Tensor
100
105
  is of shape (ctx.batch_size, ctx.num_out_features)
@@ -103,6 +108,7 @@ class QLayerFunction(torch.autograd.Function):
103
108
 
104
109
  grad_weights = grad_inputs = None
105
110
  grad_circuit = grad_execute = grad_post_process = None
111
+ grad_epsilon = None
106
112
  is_single_layer = is_single_layer_circuit(weights)
107
113
 
108
114
  if ctx.needs_input_grad[1]:
@@ -118,7 +124,14 @@ class QLayerFunction(torch.autograd.Function):
118
124
  f"Grad required for unknown type: {ctx.needs_input_grad}"
119
125
  )
120
126
 
121
- return grad_inputs, grad_weights, grad_circuit, grad_execute, grad_post_process
127
+ return (
128
+ grad_inputs,
129
+ grad_weights,
130
+ grad_circuit,
131
+ grad_execute,
132
+ grad_post_process,
133
+ grad_epsilon,
134
+ )
122
135
 
123
136
 
124
137
  CalcNumOutFeatures = Callable[[SerializedQuantumProgram], int]
@@ -142,8 +155,9 @@ class QLayer(nn.Module):
142
155
  head_start: Union[float, Tensor, None] = None,
143
156
  # Experimental parameters:
144
157
  calc_num_out_features: CalcNumOutFeatures = calc_num_out_features_single_output,
158
+ epsilon: float = EPSILON,
145
159
  ) -> None:
146
- circuit = Circuit.parse_raw(quantum_program)
160
+ circuit = Circuit.model_validate_json(quantum_program)
147
161
  validate_circuit(circuit)
148
162
 
149
163
  super().__init__()
@@ -151,6 +165,7 @@ class QLayer(nn.Module):
151
165
  self._execute = execute
152
166
  self._post_process = post_process
153
167
  self._head_start = head_start
168
+ self._epsilon = epsilon
154
169
 
155
170
  self.quantum_program = quantum_program
156
171
 
@@ -161,7 +176,7 @@ class QLayer(nn.Module):
161
176
  self._initialize_parameters()
162
177
 
163
178
  def _initialize_parameters(self) -> None:
164
- shape: Tuple[int, ...] = (
179
+ shape: tuple[int, ...] = (
165
180
  (self.out_features, self.in_features)
166
181
  if self.out_features > 1
167
182
  else (self.in_features,)
@@ -181,6 +196,11 @@ class QLayer(nn.Module):
181
196
  self.weight = Parameter(value)
182
197
 
183
198
  def forward(self, x: Tensor) -> Tensor:
184
- return QLayerFunction.apply( # type: ignore[no-untyped-call]
185
- x, self.weight, self.quantum_program, self._execute, self._post_process
199
+ return QLayerFunction.apply(
200
+ x,
201
+ self.weight,
202
+ self.quantum_program,
203
+ self._execute,
204
+ self._post_process,
205
+ self._epsilon,
186
206
  )
@@ -1,11 +1,13 @@
1
1
  from collections.abc import Sized
2
2
  from functools import reduce
3
- from typing import Optional, Tuple
3
+ from typing import Optional
4
4
 
5
5
  import torch
6
6
  import torch.nn as nn
7
7
  from torch import Tensor
8
8
 
9
+ from classiq.interface.exceptions import ClassiqValueError
10
+
9
11
  from classiq.applications.qnn.circuit_utils import is_single_layer_circuit
10
12
  from classiq.applications.qnn.types import (
11
13
  ExecuteFuncitonOnlyArguments,
@@ -13,7 +15,6 @@ from classiq.applications.qnn.types import (
13
15
  Shape,
14
16
  TensorToArgumentsCallable,
15
17
  )
16
- from classiq.exceptions import ClassiqValueError
17
18
 
18
19
 
19
20
  def get_shape_second_dimension(shape: torch.Size) -> int:
@@ -97,7 +98,7 @@ def iter_inputs_weights(
97
98
  ) -> Tensor:
98
99
  if is_single_layer_circuit(weights):
99
100
  iter_weights = torch.reshape(weights, (1, weights.shape[0]))
100
- inputs_weights_shape: Tuple[int, ...] = (inputs.shape[0],)
101
+ inputs_weights_shape: tuple[int, ...] = (inputs.shape[0],)
101
102
  else:
102
103
  iter_weights = weights
103
104
  inputs_weights_shape = (inputs.shape[0], weights.shape[0])
@@ -1,17 +1,17 @@
1
- from typing import Callable, Dict, List, Tuple, Union
1
+ from typing import Callable, Union
2
2
 
3
3
  import torch
4
4
  from torch import Tensor
5
5
 
6
6
  from classiq.interface.executor.execution_result import ResultsCollection, SavedResult
7
7
 
8
- from classiq import GeneratedCircuit
8
+ from classiq import QuantumProgram
9
9
  from classiq.synthesis import SerializedQuantumProgram
10
10
 
11
- Arguments = Dict[str, float]
12
- MultipleArguments = Tuple[Arguments, ...]
11
+ Arguments = dict[str, float]
12
+ MultipleArguments = tuple[Arguments, ...]
13
13
 
14
- Circuit = GeneratedCircuit
14
+ Circuit = QuantumProgram
15
15
  ExecuteFunction = Callable[
16
16
  [SerializedQuantumProgram, MultipleArguments], ResultsCollection
17
17
  ]
@@ -19,10 +19,10 @@ ExecuteFuncitonOnlyArguments = Callable[[MultipleArguments], ResultsCollection]
19
19
  PostProcessFunction = Callable[[SavedResult], Tensor]
20
20
  TensorToArgumentsCallable = Callable[[Tensor, Tensor], MultipleArguments]
21
21
 
22
- Shape = Union[torch.Size, Tuple[int, ...]]
22
+ Shape = Union[torch.Size, tuple[int, ...]]
23
23
 
24
24
  GradientFunction = Callable[[Tensor, Tensor], Tensor]
25
25
  SimulateFunction = Callable[[Tensor, Tensor], Tensor]
26
26
 
27
- DataAndLabel = Tuple[List[int], Union[List[int], int]]
27
+ DataAndLabel = tuple[list[int], Union[list[int], int]]
28
28
  Transform = Callable[[Tensor], Tensor]
@@ -1,8 +1,10 @@
1
- from classiq.interface.generator.expressions.enums.qsvm_feature_map_entanglement import (
2
- QSVMFeatureMapEntanglement,
3
- )
1
+ from classiq.qmod.builtins.enums import QSVMFeatureMapEntanglement
4
2
 
5
3
  from ..qsvm import qsvm_data_generation
6
4
  from .qsvm import * # noqa: F403
5
+ from .qsvm_model_constructor import construct_qsvm_model
7
6
 
8
- __all__ = ["QSVMFeatureMapEntanglement"]
7
+ __all__ = [
8
+ "QSVMFeatureMapEntanglement",
9
+ "construct_qsvm_model",
10
+ ]
@@ -1,17 +1,11 @@
1
- from typing import Any, List, Union
2
-
3
- import numpy as np
4
-
5
- from classiq.interface.applications.qsvm import DataList, QSVMData, QSVMPreferences
6
-
7
- Data = Union[DataList, np.ndarray]
8
- Labels = Union[List[Any], np.ndarray]
1
+ from classiq.interface.applications.qsvm import Data, Labels, QSVMData
9
2
 
10
3
  __all__ = [
4
+ "Data",
5
+ "Labels",
11
6
  "QSVMData",
12
- "QSVMPreferences",
13
7
  ]
14
8
 
15
9
 
16
- def __dir__() -> List[str]:
10
+ def __dir__() -> list[str]:
17
11
  return __all__
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  from collections import defaultdict
3
- from typing import Dict, Optional, Tuple
3
+ from typing import Optional
4
4
 
5
5
  import numpy as np
6
6
 
@@ -15,7 +15,7 @@ def generate_data(
15
15
  range_max: float = 2 * np.pi,
16
16
  std: float = 0.5,
17
17
  sources: Optional[np.ndarray] = None,
18
- ) -> Dict[int, np.ndarray]:
18
+ ) -> dict[int, np.ndarray]:
19
19
  if sources is None:
20
20
  sources = np.random.uniform(
21
21
  range_min, range_max, (amount_of_sources, dimension)
@@ -24,11 +24,8 @@ def generate_data(
24
24
 
25
25
  results = {}
26
26
  for index, s in enumerate(sources):
27
- temp = []
28
- # for each dimension
29
- for point in s:
30
- # draw from a gaussian distribution
31
- temp.append(np.random.normal(point, std, amount))
27
+ # for each dimension draw from a gaussian distribution
28
+ temp = [np.random.normal(point, std, amount) for point in s]
32
29
  # combine the list of np.arrays
33
30
  results[index] = np.array(list(zip(*temp)))
34
31
 
@@ -39,7 +36,7 @@ def generate_data(
39
36
  return results
40
37
 
41
38
 
42
- def data_dict_to_data_and_labels(data_dict: dict) -> Tuple[np.ndarray, np.ndarray]:
39
+ def data_dict_to_data_and_labels(data_dict: dict) -> tuple[np.ndarray, np.ndarray]:
43
40
  data = []
44
41
  labels = []
45
42
  for k, v in data_dict.items():