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
@@ -1,43 +1,31 @@
1
- from abc import abstractmethod
2
- from typing import Any, Dict, List, Literal, Union
1
+ from typing import TYPE_CHECKING, Any, Literal, Union
3
2
 
4
3
  import pydantic
5
- from pydantic import Extra, Field
4
+ from pydantic import ConfigDict
6
5
  from sympy import IndexedBase, Symbol
7
- from typing_extensions import Annotated
8
6
 
9
- from classiq.interface.generator.expressions.enums.ladder_operator import (
10
- LadderOperator as LadderOperatorEnum,
11
- )
12
- from classiq.interface.generator.expressions.enums.pauli import Pauli as PauliEnum
7
+ from classiq.interface.ast_node import HashableASTNode
13
8
  from classiq.interface.generator.expressions.expression_types import RuntimeExpression
14
- from classiq.interface.helpers.hashable_pydantic_base_model import (
15
- HashablePydanticBaseModel,
16
- )
17
9
  from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
18
10
 
11
+ if TYPE_CHECKING:
12
+ from classiq.interface.generator.functions.concrete_types import (
13
+ ConcreteClassicalType,
14
+ )
15
+
16
+ CLASSICAL_ATTRIBUTES = {"len", "size", "is_signed", "fraction_digits"}
17
+
19
18
  NamedSymbol = Union[IndexedBase, Symbol]
20
19
 
21
20
 
22
- class ClassicalType(HashablePydanticBaseModel):
23
- def as_symbolic(self, name: str) -> Union[NamedSymbol, List[NamedSymbol]]:
21
+ class ClassicalType(HashableASTNode):
22
+ def as_symbolic(self, name: str) -> Union[NamedSymbol, list[NamedSymbol]]:
24
23
  return Symbol(name)
25
24
 
26
- @property
27
- @abstractmethod
28
- def default_value(self) -> Any:
29
- raise NotImplementedError(
30
- f"{self.__class__.__name__} type has no default value"
31
- )
25
+ model_config = ConfigDict(extra="forbid")
32
26
 
33
- @property
34
- def python_type(self) -> type:
35
- raise NotImplementedError(
36
- f"{self.__class__.__name__!r} has no Python SDK equivalent"
37
- )
38
-
39
- class Config:
40
- extra = Extra.forbid
27
+ def __str__(self) -> str:
28
+ return str(type(self).__name__)
41
29
 
42
30
 
43
31
  class Integer(ClassicalType):
@@ -46,18 +34,11 @@ class Integer(ClassicalType):
46
34
  def as_symbolic(self, name: str) -> Symbol:
47
35
  return Symbol(name, integer=True)
48
36
 
49
- @property
50
- def default_value(self) -> int:
51
- return 0
52
-
53
- @pydantic.root_validator(pre=True)
54
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
37
+ @pydantic.model_validator(mode="before")
38
+ @classmethod
39
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
55
40
  return values_with_discriminator(values, "kind", "int")
56
41
 
57
- @property
58
- def python_type(self) -> type:
59
- return int
60
-
61
42
 
62
43
  class Real(ClassicalType):
63
44
  kind: Literal["real"]
@@ -65,34 +46,20 @@ class Real(ClassicalType):
65
46
  def as_symbolic(self, name: str) -> Symbol:
66
47
  return Symbol(name, real=True)
67
48
 
68
- @property
69
- def default_value(self) -> float:
70
- return 0
71
-
72
- @pydantic.root_validator(pre=True)
73
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
49
+ @pydantic.model_validator(mode="before")
50
+ @classmethod
51
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
74
52
  return values_with_discriminator(values, "kind", "real")
75
53
 
76
- @property
77
- def python_type(self) -> type:
78
- return float
79
-
80
54
 
81
55
  class Bool(ClassicalType):
82
56
  kind: Literal["bool"]
83
57
 
84
- @property
85
- def default_value(self) -> bool:
86
- return False
87
-
88
- @pydantic.root_validator(pre=True)
89
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
58
+ @pydantic.model_validator(mode="before")
59
+ @classmethod
60
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
90
61
  return values_with_discriminator(values, "kind", "bool")
91
62
 
92
- @property
93
- def python_type(self) -> type:
94
- return bool
95
-
96
63
 
97
64
  class ClassicalList(ClassicalType):
98
65
  kind: Literal["list"]
@@ -101,68 +68,21 @@ class ClassicalList(ClassicalType):
101
68
  def as_symbolic(self, name: str) -> Symbol:
102
69
  return IndexedBase(name)
103
70
 
104
- @property
105
- def default_value(self) -> List:
106
- return []
107
-
108
- @pydantic.root_validator(pre=True)
109
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
71
+ @pydantic.model_validator(mode="before")
72
+ @classmethod
73
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
110
74
  return values_with_discriminator(values, "kind", "list")
111
75
 
112
- @property
113
- def python_type(self) -> type:
114
- return List[self.element_type.python_type] # type:ignore[name-defined]
115
-
116
-
117
- class Pauli(ClassicalType):
118
- kind: Literal["pauli"]
119
-
120
- @property
121
- def default_value(self) -> PauliEnum:
122
- return PauliEnum.I
123
-
124
- @pydantic.root_validator(pre=True)
125
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
126
- return values_with_discriminator(values, "kind", "pauli")
127
-
128
- @property
129
- def python_type(self) -> type:
130
- return int
131
-
132
76
 
133
77
  class StructMetaType(ClassicalType):
134
78
  kind: Literal["type_proxy"]
135
79
 
136
- @property
137
- def default_value(self) -> Any:
138
- return super().default_value
139
-
140
- @pydantic.root_validator(pre=True)
141
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
80
+ @pydantic.model_validator(mode="before")
81
+ @classmethod
82
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
142
83
  return values_with_discriminator(values, "kind", "type_proxy")
143
84
 
144
85
 
145
- class QStructBase: # marker for Qmod structs in the Python SDK
146
- pass
147
-
148
-
149
- class Struct(ClassicalType):
150
- kind: Literal["struct_instance"]
151
- name: str = pydantic.Field(description="The struct type of the instance")
152
-
153
- @property
154
- def default_value(self) -> Any:
155
- return super().default_value
156
-
157
- @pydantic.root_validator(pre=True)
158
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
159
- return values_with_discriminator(values, "kind", "struct_instance")
160
-
161
- @property
162
- def python_type(self) -> type:
163
- return type(self.name, (QStructBase,), dict())
164
-
165
-
166
86
  class ClassicalArray(ClassicalType):
167
87
  kind: Literal["array"]
168
88
  element_type: "ConcreteClassicalType"
@@ -171,92 +91,53 @@ class ClassicalArray(ClassicalType):
171
91
  def as_symbolic(self, name: str) -> list:
172
92
  return [self.element_type.as_symbolic(f"{name}_{i}") for i in range(self.size)]
173
93
 
174
- @property
175
- def default_value(self) -> Any:
176
- return super().default_value
177
-
178
- @pydantic.root_validator(pre=True)
179
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
94
+ @pydantic.model_validator(mode="before")
95
+ @classmethod
96
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
180
97
  return values_with_discriminator(values, "kind", "array")
181
98
 
182
99
 
183
100
  class OpaqueHandle(ClassicalType):
184
- @property
185
- def default_value(self) -> int:
186
- return 0
101
+ pass
187
102
 
188
103
 
189
104
  class VQEResult(OpaqueHandle):
190
105
  kind: Literal["vqe_result"]
191
106
 
192
- @pydantic.root_validator(pre=True)
193
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
107
+ @pydantic.model_validator(mode="before")
108
+ @classmethod
109
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
194
110
  return values_with_discriminator(values, "kind", "vqe_result")
195
111
 
196
112
 
197
113
  class Histogram(OpaqueHandle):
198
114
  kind: Literal["histogram"]
199
115
 
200
- @pydantic.root_validator(pre=True)
201
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
116
+ @pydantic.model_validator(mode="before")
117
+ @classmethod
118
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
202
119
  return values_with_discriminator(values, "kind", "histogram")
203
120
 
204
121
 
205
122
  class Estimation(OpaqueHandle):
206
123
  kind: Literal["estimation_result"]
207
124
 
208
- @pydantic.root_validator(pre=True)
209
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
125
+ @pydantic.model_validator(mode="before")
126
+ @classmethod
127
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
210
128
  return values_with_discriminator(values, "kind", "estimation_result")
211
129
 
212
130
 
213
131
  class IQAERes(OpaqueHandle):
214
132
  kind: Literal["iqae_result"]
215
133
 
216
- @pydantic.root_validator(pre=True)
217
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
134
+ @pydantic.model_validator(mode="before")
135
+ @classmethod
136
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
218
137
  return values_with_discriminator(values, "kind", "iqae_result")
219
138
 
220
139
 
221
- class LadderOperator(ClassicalType):
222
- kind: Literal["ladder_operator"]
223
-
224
- @property
225
- def default_value(self) -> LadderOperatorEnum:
226
- return LadderOperatorEnum.PLUS
227
-
228
- @pydantic.root_validator(pre=True)
229
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
230
- return values_with_discriminator(values, "kind", "ladder_operator")
231
-
232
- @property
233
- def python_type(self) -> type:
234
- return int
235
-
236
-
237
- ConcreteClassicalType = Annotated[
238
- Union[
239
- Integer,
240
- Real,
241
- Bool,
242
- ClassicalList,
243
- Pauli,
244
- StructMetaType,
245
- Struct,
246
- ClassicalArray,
247
- VQEResult,
248
- Histogram,
249
- Estimation,
250
- LadderOperator,
251
- IQAERes,
252
- ],
253
- Field(discriminator="kind"),
254
- ]
255
- ClassicalList.update_forward_refs()
256
- ClassicalArray.update_forward_refs()
257
-
258
-
259
- def as_symbolic(symbols: Dict[str, ClassicalType]) -> Dict[str, RuntimeExpression]:
140
+ def as_symbolic(symbols: dict[str, ClassicalType]) -> dict[str, RuntimeExpression]:
260
141
  return {
261
142
  param_name: param_type.as_symbolic(param_name)
262
143
  for param_name, param_type in symbols.items()
@@ -0,0 +1,55 @@
1
+ from typing import Annotated, Union
2
+
3
+ from pydantic import Field
4
+
5
+ from classiq.interface.generator.functions.classical_type import (
6
+ Bool,
7
+ ClassicalArray,
8
+ ClassicalList,
9
+ Estimation,
10
+ Histogram,
11
+ Integer,
12
+ IQAERes,
13
+ Real,
14
+ StructMetaType,
15
+ VQEResult,
16
+ )
17
+ from classiq.interface.generator.functions.type_name import Enum, TypeName
18
+ from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
19
+ from classiq.interface.model.quantum_type import (
20
+ QuantumBit,
21
+ QuantumBitvector,
22
+ QuantumNumeric,
23
+ RegisterQuantumType,
24
+ )
25
+
26
+ ConcreteClassicalType = Annotated[
27
+ Union[
28
+ Integer,
29
+ Real,
30
+ Bool,
31
+ ClassicalList,
32
+ StructMetaType,
33
+ TypeName,
34
+ ClassicalArray,
35
+ VQEResult,
36
+ Histogram,
37
+ Estimation,
38
+ IQAERes,
39
+ ],
40
+ Field(discriminator="kind"),
41
+ ]
42
+ ClassicalList.model_rebuild()
43
+ ClassicalArray.model_rebuild()
44
+
45
+ NativePythonClassicalTypes = (int, float, bool, list)
46
+ PythonClassicalPydanticTypes = (Enum,)
47
+
48
+ ConcreteQuantumType = Annotated[
49
+ Union[QuantumBit, QuantumBitvector, QuantumNumeric, TypeName],
50
+ Field(discriminator="kind", default_factory=QuantumBitvector),
51
+ ]
52
+ QuantumBitvector.model_rebuild()
53
+ TypeName.model_rebuild()
54
+ QStructDeclaration.model_rebuild()
55
+ RegisterQuantumType.model_rebuild()
@@ -1,26 +1,25 @@
1
1
  import abc
2
- from typing import Dict
2
+ from collections.abc import Sequence
3
3
 
4
- import pydantic
5
- from pydantic.main import BaseModel
4
+ from pydantic import ConfigDict
6
5
 
7
- from classiq.interface.generator.functions.classical_type import ConcreteClassicalType
6
+ from classiq.interface.model.classical_parameter_declaration import (
7
+ AnonClassicalParameterDeclaration,
8
+ )
9
+ from classiq.interface.model.parameter import Parameter
8
10
 
9
11
 
10
- class FunctionDeclaration(BaseModel, abc.ABC):
12
+ class FunctionDeclaration(Parameter, abc.ABC):
11
13
  """
12
14
  Facilitates the creation of a common function interface object.
13
15
  """
14
16
 
15
- name: str = pydantic.Field(description="The name of the function")
17
+ @property
18
+ @abc.abstractmethod
19
+ def param_decls(self) -> Sequence["AnonClassicalParameterDeclaration"]:
20
+ pass
16
21
 
17
- param_decls: Dict[str, ConcreteClassicalType] = pydantic.Field(
18
- description="The expected interface of the functions parameters",
19
- default_factory=dict,
20
- )
22
+ model_config = ConfigDict(extra="forbid")
21
23
 
22
- class Config:
23
- extra = pydantic.Extra.forbid
24
24
 
25
-
26
- FunctionDeclaration.update_forward_refs()
25
+ FunctionDeclaration.model_rebuild()
@@ -1,12 +1,8 @@
1
1
  from typing import Any
2
2
 
3
- import pydantic
4
- from pydantic import BaseModel
5
-
3
+ from classiq.interface.enum_utils import StrEnum
6
4
  from classiq.interface.generator.function_params import PortDirection
7
5
 
8
- from classiq._internals.enum_utils import StrEnum
9
-
10
6
 
11
7
  class PortDeclarationDirection(StrEnum):
12
8
  Input = "input"
@@ -39,11 +35,3 @@ class PortDeclarationDirection(StrEnum):
39
35
  cls, port_direction: PortDirection
40
36
  ) -> "PortDeclarationDirection":
41
37
  return cls(port_direction.value)
42
-
43
-
44
- class SynthesisPortDeclaration(BaseModel):
45
- name: str
46
- size: int
47
- direction: PortDeclarationDirection
48
- is_signed: bool = pydantic.Field(default=False)
49
- fraction_places: int = pydantic.Field(default=0)
@@ -1,3 +1,4 @@
1
- from typing import Any, Mapping
1
+ from collections.abc import Mapping
2
+ from typing import Any
2
3
 
3
4
  QmodPyStruct = Mapping[str, Any]
@@ -0,0 +1,90 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any, Literal, Optional
3
+
4
+ import pydantic
5
+
6
+ from classiq.interface.exceptions import ClassiqInternalError
7
+ from classiq.interface.generator.expressions.qmod_qstruct_proxy import QmodQStructProxy
8
+ from classiq.interface.generator.functions.classical_type import (
9
+ ClassicalType,
10
+ )
11
+ from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
12
+ from classiq.interface.model.handle_binding import HandleBinding
13
+ from classiq.interface.model.quantum_type import (
14
+ QuantumType,
15
+ )
16
+
17
+ if TYPE_CHECKING:
18
+ from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
19
+
20
+
21
+ class TypeName(ClassicalType, QuantumType):
22
+ kind: Literal["struct_instance"]
23
+ name: str = pydantic.Field(description="The type name of the instance")
24
+ _assigned_fields: Optional[Mapping[str, "ConcreteQuantumType"]] = (
25
+ pydantic.PrivateAttr(default=None)
26
+ )
27
+
28
+ @pydantic.model_validator(mode="before")
29
+ @classmethod
30
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
31
+ return values_with_discriminator(values, "kind", "struct_instance")
32
+
33
+ def _update_size_in_bits_from_declaration(self) -> None:
34
+ fields_types = list(self.fields.values())
35
+ for field_type in fields_types:
36
+ field_type._update_size_in_bits_from_declaration()
37
+ if all(field_type.has_size_in_bits for field_type in fields_types):
38
+ self._size_in_bits = sum(
39
+ field_type.size_in_bits for field_type in fields_types
40
+ )
41
+
42
+ def get_proxy(self, handle: "HandleBinding") -> "QmodQStructProxy":
43
+ from classiq.interface.generator.expressions.qmod_qstruct_proxy import (
44
+ QmodQStructProxy,
45
+ )
46
+
47
+ return QmodQStructProxy(
48
+ handle=handle, struct_name=self.name, fields=self.fields
49
+ )
50
+
51
+ @property
52
+ def qmod_type_name(self) -> str:
53
+ return self.name
54
+
55
+ @property
56
+ def type_name(self) -> str:
57
+ return self.name
58
+
59
+ @property
60
+ def fields(self) -> Mapping[str, "ConcreteQuantumType"]:
61
+ if self._assigned_fields is None:
62
+ raise ClassiqInternalError("Fields not set")
63
+ return self._assigned_fields
64
+
65
+ @property
66
+ def has_fields(self) -> bool:
67
+ return self._assigned_fields is not None
68
+
69
+ def set_fields(self, fields: Mapping[str, "ConcreteQuantumType"]) -> None:
70
+ self._assigned_fields = fields
71
+
72
+ @property
73
+ def is_instantiated(self) -> bool:
74
+ return self.has_fields and all(
75
+ field_type.is_instantiated for field_type in self.fields.values()
76
+ )
77
+
78
+ @property
79
+ def is_evaluated(self) -> bool:
80
+ return self.has_fields and all(
81
+ field_type.is_evaluated for field_type in self.fields.values()
82
+ )
83
+
84
+
85
+ class Enum(TypeName):
86
+ pass
87
+
88
+
89
+ class Struct(TypeName):
90
+ pass