classiq 0.38.0__py3-none-any.whl → 0.65.4__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 (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,128 +1,151 @@
1
- # This file was generated automatically - do not edit manually
1
+ from dataclasses import dataclass, fields, is_dataclass
2
2
 
3
- from typing import List
3
+ from classiq.interface.generator.types.struct_declaration import StructDeclaration
4
4
 
5
- from classiq.qmod.qmod_struct import struct
5
+ from classiq.qmod.builtins.enums import LadderOperator, Pauli
6
+ from classiq.qmod.cparam import CArray, CBool, CInt, CReal
7
+ from classiq.qmod.python_classical_type import PythonClassicalType
6
8
 
7
9
 
8
- @struct
10
+ @dataclass
9
11
  class PauliTerm:
10
- pauli: List[int]
11
- coefficient: float
12
+ """
13
+ A term in a Hamiltonian, represented as a product of Pauli operators.
12
14
 
15
+ Attributes:
16
+ pauli (CArray[Pauli]): The list of the chosen Pauli operators in the term, corresponds to a product of them.
17
+ coefficient (CReal): The coefficient of the term (floating number).
18
+ """
13
19
 
14
- @struct
15
- class MoleculeProblem:
16
- mapping: int
17
- z2_symmetries: bool
18
- molecule: "Molecule"
19
- freeze_core: bool
20
- remove_orbitals: List[int]
20
+ pauli: CArray[Pauli]
21
+ coefficient: CReal
21
22
 
22
23
 
23
- @struct
24
- class Molecule:
25
- atoms: List["ChemistryAtom"]
26
- spin: int
27
- charge: int
24
+ @dataclass
25
+ class Position:
26
+ x: CReal
27
+ y: CReal
28
+ z: CReal
28
29
 
29
30
 
30
- @struct
31
+ @dataclass
31
32
  class ChemistryAtom:
32
- element: int
33
- position: "Position"
33
+ element: CInt
34
+ position: Position
34
35
 
35
36
 
36
- @struct
37
- class Position:
38
- x: float
39
- y: float
40
- z: float
37
+ @dataclass
38
+ class Molecule:
39
+ atoms: CArray[ChemistryAtom]
40
+ spin: CInt
41
+ charge: CInt
41
42
 
42
43
 
43
- @struct
44
- class FockHamiltonianProblem:
45
- mapping: int
46
- z2_symmetries: bool
47
- terms: List["LadderTerm"]
48
- num_particles: List[int]
44
+ @dataclass
45
+ class MoleculeProblem:
46
+ mapping: CInt
47
+ z2_symmetries: CBool
48
+ molecule: Molecule
49
+ freeze_core: CBool
50
+ remove_orbitals: CArray[CInt]
49
51
 
50
52
 
51
- @struct
53
+ @dataclass
54
+ class LadderOp:
55
+ op: LadderOperator
56
+ index: CInt
57
+
58
+
59
+ @dataclass
52
60
  class LadderTerm:
53
- coefficient: float
54
- ops: List["LadderOp"]
61
+ coefficient: CReal
62
+ ops: CArray[LadderOp]
55
63
 
56
64
 
57
- @struct
58
- class LadderOp:
59
- op: int
60
- index: int
65
+ @dataclass
66
+ class FockHamiltonianProblem:
67
+ mapping: CInt
68
+ z2_symmetries: CBool
69
+ terms: CArray[LadderTerm]
70
+ num_particles: CArray[CInt]
61
71
 
62
72
 
63
- @struct
73
+ @dataclass
64
74
  class CombinatorialOptimizationSolution:
65
- probability: float
66
- cost: float
67
- solution: List[int]
68
- count: int
75
+ probability: CReal
76
+ cost: CReal
77
+ solution: CArray[CInt]
78
+ count: CInt
69
79
 
70
80
 
71
- @struct
81
+ @dataclass
72
82
  class GaussianModel:
73
- num_qubits: int
74
- normal_max_value: float
75
- default_probabilities: List[float]
76
- rhos: List[float]
77
- loss: List[int]
78
- min_loss: int
83
+ num_qubits: CInt
84
+ normal_max_value: CReal
85
+ default_probabilities: CArray[CReal]
86
+ rhos: CArray[CReal]
87
+ loss: CArray[CInt]
88
+ min_loss: CInt
79
89
 
80
90
 
81
- @struct
91
+ @dataclass
82
92
  class LogNormalModel:
83
- num_qubits: int
84
- mu: float
85
- sigma: float
93
+ num_qubits: CInt
94
+ mu: CReal
95
+ sigma: CReal
86
96
 
87
97
 
88
- @struct
98
+ @dataclass
89
99
  class FinanceFunction:
90
- f: int
91
- threshold: float
92
- larger: bool
93
- polynomial_degree: int
94
- use_chebyshev_polynomial_approximation: bool
95
- tail_probability: float
100
+ f: CInt
101
+ threshold: CReal
102
+ larger: CBool
103
+ polynomial_degree: CInt
104
+ use_chebyshev_polynomial_approximation: CBool
105
+ tail_probability: CReal
96
106
 
97
107
 
98
- @struct
108
+ @dataclass
99
109
  class QsvmResult:
100
- test_score: float
101
- predicted_labels: List[float]
110
+ test_score: CReal
111
+ predicted_labels: CArray[CReal]
102
112
 
103
113
 
104
- @struct
114
+ @dataclass
105
115
  class QSVMFeatureMapPauli:
106
- feature_dimension: int
107
- reps: int
108
- entanglement: int
109
- alpha: float
110
- paulis: List[List[int]]
116
+ feature_dimension: CInt
117
+ reps: CInt
118
+ entanglement: CInt
119
+ alpha: CReal
120
+ paulis: CArray[CArray[Pauli]]
121
+
122
+
123
+ BUILTIN_STRUCT_DECLARATIONS = {
124
+ struct_decl.__name__: StructDeclaration(
125
+ name=struct_decl.__name__,
126
+ variables={
127
+ field.name: PythonClassicalType().convert(field.type)
128
+ for field in fields(struct_decl)
129
+ },
130
+ )
131
+ for struct_decl in vars().values()
132
+ if is_dataclass(struct_decl)
133
+ }
111
134
 
112
135
 
113
136
  __all__ = [
114
- "PauliTerm",
115
- "MoleculeProblem",
116
- "Molecule",
117
137
  "ChemistryAtom",
118
- "Position",
119
- "FockHamiltonianProblem",
120
- "LadderTerm",
121
- "LadderOp",
122
138
  "CombinatorialOptimizationSolution",
139
+ "FinanceFunction",
140
+ "FockHamiltonianProblem",
123
141
  "GaussianModel",
142
+ "LadderOp",
143
+ "LadderTerm",
124
144
  "LogNormalModel",
125
- "FinanceFunction",
126
- "QsvmResult",
145
+ "Molecule",
146
+ "MoleculeProblem",
147
+ "PauliTerm",
148
+ "Position",
127
149
  "QSVMFeatureMapPauli",
150
+ "QsvmResult",
128
151
  ]
classiq/qmod/cfunc.py CHANGED
@@ -1,9 +1,9 @@
1
- from typing import Any, Callable, Dict, Optional, Union, overload
1
+ from typing import Any, Callable, Optional, Union, overload
2
2
 
3
3
  from classiq.qmod.classical_function import CFunc
4
4
 
5
5
 
6
- def get_caller_locals() -> Dict[str, Any]:
6
+ def get_caller_locals() -> dict[str, Any]:
7
7
  """Print the local variables in the caller's frame."""
8
8
  import inspect
9
9
 
@@ -1,10 +1,9 @@
1
1
  import ast
2
2
  import inspect
3
- import sys
4
3
  from textwrap import dedent
5
- from typing import Any, Callable, Dict
4
+ from typing import Any, Callable
6
5
 
7
- from classiq.exceptions import ClassiqValueError
6
+ from classiq.interface.exceptions import ClassiqValueError
8
7
 
9
8
 
10
9
  def _unparse_function_body(code: str, func: ast.FunctionDef) -> str:
@@ -17,16 +16,13 @@ def _unparse_function_body(code: str, func: ast.FunctionDef) -> str:
17
16
 
18
17
 
19
18
  class CFunc:
20
- def __init__(self, py_callable: Callable[[], None], caller_locals: Dict[str, Any]):
19
+ def __init__(self, py_callable: Callable[[], None], caller_locals: dict[str, Any]):
21
20
  code = dedent(inspect.getsource(py_callable))
22
21
  func = ast.parse(code).body[0]
23
22
  if not isinstance(func, ast.FunctionDef):
24
23
  raise ClassiqValueError("Use @cfunc to decorate a function")
25
24
  if len(func.args.args) > 0:
26
25
  raise ClassiqValueError("A @cfunc must receive no arguments")
27
- if sys.version_info >= (3, 9):
28
- self.code = "\n".join([ast.unparse(statement) for statement in func.body])
29
- else:
30
- self.code = _unparse_function_body(code, func)
26
+ self.code = "\n".join([ast.unparse(statement) for statement in func.body])
31
27
 
32
28
  self._caller_constants = caller_locals
classiq/qmod/cparam.py ADDED
@@ -0,0 +1,64 @@
1
+ import sys
2
+ from typing import ( # type: ignore[attr-defined]
3
+ TYPE_CHECKING,
4
+ Any,
5
+ Generic,
6
+ Union,
7
+ _GenericAlias,
8
+ )
9
+
10
+ from typing_extensions import ParamSpec
11
+
12
+ from classiq.qmod.symbolic_expr import Symbolic, SymbolicExpr
13
+
14
+ if TYPE_CHECKING:
15
+ from classiq.qmod.qmod_variable import QNum
16
+
17
+ SymbolicSuperclass = SymbolicExpr
18
+ else:
19
+ SymbolicSuperclass = Symbolic
20
+
21
+
22
+ class CParam(SymbolicSuperclass):
23
+ def __init__(self, expr: str) -> None:
24
+ super().__init__(expr, False)
25
+
26
+
27
+ class CInt(CParam):
28
+ pass
29
+
30
+
31
+ class CReal(CParam):
32
+ pass
33
+
34
+
35
+ class CBool(CParam):
36
+ pass
37
+
38
+
39
+ _P = ParamSpec("_P")
40
+
41
+
42
+ class ArrayBase(Generic[_P]):
43
+ # Support comma-separated generic args in older Python versions
44
+ if sys.version_info[0:2] < (3, 10):
45
+
46
+ def __class_getitem__(cls, args) -> _GenericAlias:
47
+ return _GenericAlias(cls, args)
48
+
49
+
50
+ class CArray(CParam, ArrayBase[_P]):
51
+ if TYPE_CHECKING:
52
+
53
+ @property
54
+ def len(self) -> int: ...
55
+
56
+ def __getitem__(self, idx: Union[int, CInt, slice, "QNum"]) -> Any: ...
57
+
58
+
59
+ Array = CArray
60
+
61
+
62
+ class CParamScalar(CParam, SymbolicExpr):
63
+ def __hash__(self) -> int:
64
+ return hash(str(self))
@@ -0,0 +1,56 @@
1
+ from typing import Optional, Union
2
+
3
+ from classiq.interface.exceptions import ClassiqError
4
+ from classiq.interface.executor.execution_preferences import ExecutionPreferences
5
+ from classiq.interface.generator.model.constraints import Constraints
6
+ from classiq.interface.generator.model.preferences.preferences import Preferences
7
+ from classiq.interface.model.model import MAIN_FUNCTION_NAME, SerializedModel
8
+
9
+ from classiq.qmod.classical_function import CFunc
10
+ from classiq.qmod.quantum_function import GenerativeQFunc, QFunc
11
+ from classiq.qmod.write_qmod import write_qmod
12
+
13
+
14
+ def create_model(
15
+ entry_point: Union[QFunc, GenerativeQFunc],
16
+ constraints: Optional[Constraints] = None,
17
+ execution_preferences: Optional[ExecutionPreferences] = None,
18
+ preferences: Optional[Preferences] = None,
19
+ classical_execution_function: Optional[CFunc] = None,
20
+ out_file: Optional[str] = None,
21
+ ) -> SerializedModel:
22
+ """
23
+ Create a serialized model from a given Qmod entry function and additional parameters.
24
+
25
+ Args:
26
+ entry_point: The entry point function for the model, which must be a QFunc named 'main'.
27
+ constraints: Constraints for the synthesis of the model. See Constraints (Optional).
28
+ execution_preferences: Preferences for the execution of the model. See ExecutionPreferences (Optional).
29
+ preferences: Preferences for the synthesis of the model. See Preferences (Optional).
30
+ classical_execution_function: A function for the classical execution logic, which must be a CFunc (Optional).
31
+ out_file: File path to write the Qmod model in native Qmod representation to (Optional).
32
+
33
+ Returns:
34
+ SerializedModel: A serialized model.
35
+
36
+ Raises:
37
+ ClassiqError: If the entry point function is not named 'main'.
38
+ """
39
+
40
+ if entry_point.func_decl.name != MAIN_FUNCTION_NAME:
41
+ raise ClassiqError(
42
+ f"The entry point function must be named 'main', got '{entry_point.func_decl.name}'"
43
+ )
44
+
45
+ model = entry_point.create_model(
46
+ constraints,
47
+ execution_preferences,
48
+ preferences,
49
+ classical_execution_function,
50
+ )
51
+ result = model.get_model()
52
+
53
+ if out_file is not None:
54
+ write_qmod(result, out_file)
55
+
56
+ return result
@@ -1,151 +1,193 @@
1
1
  import dataclasses
2
- import inspect
3
- from typing import Any, Callable, Dict, List, Optional, Type, get_args, get_origin
2
+ import sys
3
+ from collections.abc import Sequence
4
+ from enum import EnumMeta
5
+ from typing import (
6
+ Any,
7
+ Callable,
8
+ Literal,
9
+ Optional,
10
+ get_args,
11
+ get_origin,
12
+ overload,
13
+ )
4
14
 
5
15
  from typing_extensions import _AnnotatedAlias
6
16
 
7
- from classiq.interface.generator.functions.classical_type import (
8
- Bool,
9
- ClassicalArray,
10
- ClassicalList,
11
- ConcreteClassicalType,
12
- Integer,
13
- QStructBase,
14
- Real,
15
- Struct,
17
+ from classiq.interface.exceptions import ClassiqValueError
18
+ from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
19
+ from classiq.interface.generator.functions.port_declaration import (
20
+ PortDeclarationDirection,
16
21
  )
22
+ from classiq.interface.generator.types.enum_declaration import declaration_from_enum
23
+ from classiq.interface.generator.types.struct_declaration import StructDeclaration
17
24
  from classiq.interface.model.classical_parameter_declaration import (
18
- ClassicalParameterDeclaration,
25
+ AnonClassicalParameterDeclaration,
19
26
  )
20
- from classiq.interface.model.port_declaration import PortDeclaration
27
+ from classiq.interface.model.port_declaration import AnonPortDeclaration
21
28
  from classiq.interface.model.quantum_function_declaration import (
29
+ AnonPositionalArg,
30
+ AnonQuantumOperandDeclaration,
31
+ NamedParamsQuantumFunctionDeclaration,
22
32
  PositionalArg,
23
- QuantumFunctionDeclaration,
24
- QuantumOperandDeclaration,
25
33
  )
26
34
 
27
- from classiq import StructDeclaration
28
- from classiq.exceptions import ClassiqValueError
35
+ from classiq.qmod.builtins.enums import BUILTIN_ENUM_DECLARATIONS
36
+ from classiq.qmod.builtins.structs import BUILTIN_STRUCT_DECLARATIONS
29
37
  from classiq.qmod.model_state_container import ModelStateContainer
30
- from classiq.qmod.qmod_parameter import Array, QParam
31
- from classiq.qmod.qmod_variable import QVar, get_type_hint_expr
32
- from classiq.qmod.quantum_callable import QCallable, QCallableList
38
+ from classiq.qmod.python_classical_type import PythonClassicalType
39
+ from classiq.qmod.qmod_variable import QVar
40
+ from classiq.qmod.quantum_callable import QCallableList
33
41
  from classiq.qmod.utilities import unmangle_keyword, version_portable_get_args
34
42
 
35
- OPERAND_ARG_NAME = "arg{i}"
43
+ if sys.version_info[0:2] >= (3, 9):
44
+ from typing import Annotated
45
+
46
+
47
+ class _PythonClassicalType(PythonClassicalType):
48
+ def __init__(self, qmodule: Optional[ModelStateContainer]):
49
+ super().__init__()
50
+ self.qmodule = qmodule
51
+
52
+ def register_enum(self, py_type: EnumMeta) -> None:
53
+ if (
54
+ self.qmodule is None
55
+ or py_type.__name__ in BUILTIN_ENUM_DECLARATIONS
56
+ or py_type.__name__ in self.qmodule.enum_decls
57
+ ):
58
+ return
59
+
60
+ enum_decl = declaration_from_enum(py_type)
61
+ self.qmodule.enum_decls[py_type.__name__] = enum_decl
62
+
63
+ def register_struct(self, py_type: type) -> None:
64
+ if (
65
+ self.qmodule is None
66
+ or py_type.__name__ in BUILTIN_STRUCT_DECLARATIONS
67
+ or py_type.__name__ in self.qmodule.type_decls
68
+ ):
69
+ return
70
+
71
+ struct_decl = StructDeclaration(
72
+ name=py_type.__name__,
73
+ variables={
74
+ f.name: self.convert(f.type) for f in dataclasses.fields(py_type)
75
+ },
76
+ )
77
+ self.qmodule.type_decls[py_type.__name__] = struct_decl
36
78
 
37
79
 
38
80
  def python_type_to_qmod(
39
- py_type: type, *, qmodule: ModelStateContainer
81
+ py_type: type, *, qmodule: Optional[ModelStateContainer]
40
82
  ) -> Optional[ConcreteClassicalType]:
41
- if py_type == int:
42
- return Integer()
43
- elif py_type == float:
44
- return Real()
45
- elif py_type == bool:
46
- return Bool()
47
- elif get_origin(py_type) == list:
48
- return ClassicalList(
49
- element_type=python_type_to_qmod(get_args(py_type)[0], qmodule=qmodule)
50
- )
51
- elif get_origin(py_type) == Array:
52
- array_args = version_portable_get_args(py_type)
53
- if len(array_args) != 2:
54
- raise ClassiqValueError(
55
- "Array accepts two generic parameters in the form 'Array[<element-type>, <size>]'"
56
- )
57
- return ClassicalArray(
58
- element_type=python_type_to_qmod(array_args[0], qmodule=qmodule),
59
- size=get_type_hint_expr(array_args[1]),
60
- )
61
- elif inspect.isclass(py_type) and issubclass(py_type, QStructBase):
62
- _add_qmod_struct(py_type, qmodule=qmodule)
63
- return Struct(name=py_type.__name__)
64
- return None
65
-
66
-
67
- def _add_qmod_struct(
68
- py_type: Type[QStructBase], *, qmodule: ModelStateContainer
69
- ) -> None:
70
- if (
71
- py_type.__name__ in StructDeclaration.BUILTIN_STRUCT_DECLARATIONS
72
- or py_type.__name__ in qmodule.type_decls
73
- ):
74
- return
75
-
76
- qmodule.type_decls[py_type.__name__] = StructDeclaration(
77
- name=py_type.__name__,
78
- variables={
79
- f.name: python_type_to_qmod(f.type, qmodule=qmodule)
80
- for f in dataclasses.fields(py_type)
81
- },
82
- )
83
-
83
+ return _PythonClassicalType(qmodule).convert(py_type)
84
84
 
85
- def _extract_param_decl(
86
- name: str, py_type: Any, *, qmodule: ModelStateContainer
87
- ) -> ClassicalParameterDeclaration:
88
- if len(get_args(py_type)) != 1:
89
- raise ClassiqValueError("QParam takes exactly one generic argument")
90
- py_type = get_args(py_type)[0]
91
- return ClassicalParameterDeclaration(
92
- name=name, classical_type=python_type_to_qmod(py_type, qmodule=qmodule)
93
- )
94
85
 
95
-
96
- def _extract_port_decl(name: str, py_type: Any) -> PortDeclaration:
86
+ def _extract_port_decl(name: Optional[str], py_type: Any) -> AnonPortDeclaration:
97
87
  # FIXME: CAD-13409
98
- qtype: Type[QVar] = QVar.from_type_hint(py_type) # type:ignore[assignment]
88
+ qtype: type[QVar] = QVar.from_type_hint(py_type) # type:ignore[assignment]
99
89
  direction = qtype.port_direction(py_type)
100
90
  if isinstance(py_type, _AnnotatedAlias):
101
91
  py_type = py_type.__args__[0]
102
- return PortDeclaration(
103
- name=name,
92
+ param = AnonPortDeclaration(
93
+ name=None,
104
94
  direction=direction,
105
95
  quantum_type=qtype.to_qmod_quantum_type(py_type),
106
96
  )
97
+ if name is not None:
98
+ param = param.rename(name)
99
+ return param
107
100
 
108
101
 
109
102
  def _extract_operand_decl(
110
- name: str, py_type: Any, qmodule: ModelStateContainer
111
- ) -> QuantumOperandDeclaration:
112
- qc_args = version_portable_get_args(py_type)
113
- arg_dict = {
114
- OPERAND_ARG_NAME.format(i=i): arg_type for i, arg_type in enumerate(qc_args)
115
- }
116
- return QuantumOperandDeclaration(
103
+ name: Optional[str], py_type: Any, qmodule: Optional[ModelStateContainer]
104
+ ) -> AnonQuantumOperandDeclaration:
105
+ is_list = (get_origin(py_type) or py_type) is QCallableList
106
+ if get_origin(py_type) is list:
107
+ is_list = True
108
+ py_type = version_portable_get_args(py_type)[0]
109
+ type_args = version_portable_get_args(py_type)
110
+ if len(type_args) > 0 and isinstance(type_args[0], list): # Callable support
111
+ type_args = tuple(type_args[0])
112
+ param_decls = [_extract_operand_param(arg_type) for arg_type in type_args]
113
+ param = AnonQuantumOperandDeclaration(
117
114
  name=name,
118
- positional_arg_declarations=_extract_positional_args(arg_dict, qmodule=qmodule),
119
- is_list=(get_origin(py_type) or py_type) is QCallableList,
115
+ positional_arg_declarations=_extract_positional_args(
116
+ param_decls, qmodule=qmodule
117
+ ),
118
+ is_list=is_list,
119
+ )
120
+ if name is not None:
121
+ param = param.rename(name)
122
+ return param
123
+
124
+
125
+ def _extract_operand_param(py_type: Any) -> tuple[Optional[str], Any]:
126
+ if sys.version_info[0:2] < (3, 9) or get_origin(py_type) is not Annotated:
127
+ return None, py_type
128
+ args = get_args(py_type)
129
+ if len(args) == 2:
130
+ if isinstance(args[1], PortDeclarationDirection):
131
+ return None, py_type
132
+ elif isinstance(args[1], str):
133
+ return args[1], args[0]
134
+ elif get_origin(args[1]) is Literal:
135
+ return version_portable_get_args(args[1])[0], args[0]
136
+ elif len(args) == 3 and isinstance(args[1], PortDeclarationDirection):
137
+ if isinstance(args[2], str):
138
+ return args[2], Annotated[args[0], args[1]]
139
+ elif get_origin(args[2]) is Literal:
140
+ return version_portable_get_args(args[2])[0], Annotated[args[0], args[1]]
141
+ raise ClassiqValueError(
142
+ f"Operand parameter declaration must be of the form <param-type> or "
143
+ f"Annotated[<param-type>, <param-name>]. Got {py_type}"
120
144
  )
121
145
 
122
146
 
147
+ @overload
148
+ def _extract_positional_args(
149
+ args: Sequence[tuple[str, Any]], qmodule: Optional[ModelStateContainer]
150
+ ) -> Sequence[PositionalArg]:
151
+ pass
152
+
153
+
154
+ @overload
123
155
  def _extract_positional_args(
124
- args: Dict[str, Any], qmodule: ModelStateContainer
125
- ) -> List[PositionalArg]:
126
- result: List[PositionalArg] = []
127
- for name, py_type in args.items():
156
+ args: Sequence[tuple[Optional[str], Any]], qmodule: Optional[ModelStateContainer]
157
+ ) -> Sequence[AnonPositionalArg]:
158
+ pass
159
+
160
+
161
+ def _extract_positional_args(
162
+ args: Sequence[tuple[Optional[str], Any]], qmodule: Optional[ModelStateContainer]
163
+ ) -> Sequence[AnonPositionalArg]:
164
+ result: list[AnonPositionalArg] = []
165
+ for name, py_type in args:
128
166
  if name == "return":
129
167
  continue
130
168
  name = unmangle_keyword(name)
131
- if get_origin(py_type) is QParam:
132
- result.append(_extract_param_decl(name, py_type, qmodule=qmodule))
169
+ classical_type = python_type_to_qmod(py_type, qmodule=qmodule)
170
+ if classical_type is not None:
171
+ param = AnonClassicalParameterDeclaration(
172
+ name=None,
173
+ classical_type=classical_type,
174
+ )
175
+ if name is not None:
176
+ param = param.rename(name)
177
+ result.append(param)
133
178
  elif QVar.from_type_hint(py_type) is not None:
134
179
  result.append(_extract_port_decl(name, py_type))
135
180
  else:
136
- assert (get_origin(py_type) or py_type) is QCallable or (
137
- get_origin(py_type) or py_type
138
- ) is QCallableList
139
181
  result.append(_extract_operand_decl(name, py_type, qmodule=qmodule))
140
182
  return result
141
183
 
142
184
 
143
185
  def infer_func_decl(
144
- py_func: Callable, qmodule: ModelStateContainer
145
- ) -> QuantumFunctionDeclaration:
146
- return QuantumFunctionDeclaration(
186
+ py_func: Callable, qmodule: Optional[ModelStateContainer] = None
187
+ ) -> NamedParamsQuantumFunctionDeclaration:
188
+ return NamedParamsQuantumFunctionDeclaration(
147
189
  name=unmangle_keyword(py_func.__name__),
148
190
  positional_arg_declarations=_extract_positional_args(
149
- py_func.__annotations__, qmodule=qmodule
191
+ list(py_func.__annotations__.items()), qmodule=qmodule
150
192
  ),
151
193
  )