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,7 +1,9 @@
1
- from typing import Any, Dict, List, Optional
1
+ from typing import Any, Optional
2
2
 
3
3
  import pydantic
4
+ from pydantic_core.core_schema import ValidationInfo
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
6
8
  from classiq.interface.generator.control_state import ControlState
7
9
  from classiq.interface.generator.function_params import FunctionParams
@@ -15,50 +17,57 @@ class Mcx(FunctionParams):
15
17
  multi-controlled x-gate
16
18
  """
17
19
 
18
- arguments: List[RegisterUserInput] = pydantic.Field(
20
+ arguments: list[RegisterUserInput] = pydantic.Field(
19
21
  default_factory=list, description="registers describing the state (ordered)"
20
22
  )
21
23
  num_ctrl_qubits: Optional[pydantic.PositiveInt] = pydantic.Field(
22
- description="number of control qubits"
24
+ description="number of control qubits",
25
+ default=None,
26
+ )
27
+ ctrl_state: str = pydantic.Field(
28
+ default="", description="control state string", validate_default=True
23
29
  )
24
- ctrl_state: str = pydantic.Field(default="", description="control state string")
25
30
 
26
- @pydantic.validator("arguments", always=True)
31
+ @pydantic.field_validator("arguments")
32
+ @classmethod
27
33
  def _validate_argument_names(
28
- cls, arguments: List[RegisterUserInput]
29
- ) -> List[RegisterUserInput]:
30
- register_name_list: List[Optional[str]] = [arg.name for arg in arguments]
34
+ cls, arguments: list[RegisterUserInput]
35
+ ) -> list[RegisterUserInput]:
36
+ register_name_list: list[Optional[str]] = [arg.name for arg in arguments]
31
37
  if None in register_name_list:
32
- raise ValueError("All registers must be named")
38
+ raise ClassiqValueError("All registers must be named")
33
39
  if len(set(register_name_list)) != len(register_name_list):
34
- raise ValueError("Registers must have distinct names")
40
+ raise ClassiqValueError("Registers must have distinct names")
35
41
  return arguments
36
42
 
37
- @pydantic.validator("num_ctrl_qubits", always=True)
38
- def _validate_sizes(cls, num_ctrl_qubits: int, values: Dict[str, Any]) -> int:
43
+ @pydantic.model_validator(mode="before")
44
+ @classmethod
45
+ def _validate_sizes(cls, values: dict[str, Any]) -> dict[str, Any]:
39
46
  arguments_size = sum(arg.size for arg in values.get("arguments", list()))
40
-
47
+ num_ctrl_qubits = values.get("num_ctrl_qubits")
41
48
  if not num_ctrl_qubits:
42
49
  num_ctrl_qubits = arguments_size - 1
43
50
 
44
51
  if num_ctrl_qubits < 1:
45
- raise ValueError("Must have control qubits")
52
+ raise ClassiqValueError("Must have control qubits")
46
53
 
47
54
  if arguments_size == 0:
48
55
  ctrl_register = RegisterUserInput(size=num_ctrl_qubits, name=CTRL)
49
56
  target_register = RegisterUserInput(size=1, name=TARGET_QUBIT)
50
57
  values["arguments"] = [ctrl_register, target_register]
51
58
  elif num_ctrl_qubits != arguments_size - 1:
52
- raise ValueError("Given sizes do not match")
53
- return num_ctrl_qubits
59
+ raise ClassiqValueError("Given sizes do not match")
60
+ values["num_ctrl_qubits"] = num_ctrl_qubits
61
+ return values
54
62
 
55
- @pydantic.validator("ctrl_state", always=True)
56
- def _validate_ctrl_state(cls, ctrl_state: str, values: Dict[str, Any]) -> str:
57
- num_ctrl_qubits = values.get("num_ctrl_qubits", -1)
63
+ @pydantic.field_validator("ctrl_state")
64
+ @classmethod
65
+ def _validate_ctrl_state(cls, ctrl_state: str, info: ValidationInfo) -> str:
66
+ num_ctrl_qubits = info.data.get("num_ctrl_qubits", -1)
58
67
  if not ctrl_state:
59
68
  return "1" * num_ctrl_qubits
60
69
  if len(ctrl_state) != num_ctrl_qubits:
61
- raise ValueError(
70
+ raise ClassiqValueError(
62
71
  "control state length should be equal to the number of control qubits"
63
72
  )
64
73
  ControlState.validate_control_string(ctrl_state)
@@ -1,20 +1,17 @@
1
- from typing import List
2
-
3
1
  from classiq.interface.generator.model.constraints import (
4
2
  Constraints,
5
3
  OptimizationParameter,
6
4
  TranspilerBasisGates,
7
5
  )
8
- from classiq.interface.generator.model.model import SynthesisModel
9
6
  from classiq.interface.generator.model.preferences import (
10
7
  CustomHardwareSettings,
11
8
  Preferences,
12
9
  )
13
10
 
14
- __all__: List[str] = [
11
+ __all__: list[str] = [
15
12
  "Constraints",
16
- "Preferences",
17
13
  "CustomHardwareSettings",
18
14
  "OptimizationParameter",
15
+ "Preferences",
19
16
  "TranspilerBasisGates",
20
17
  ]
@@ -1,13 +1,13 @@
1
1
  from collections import defaultdict
2
- from typing import Dict, Optional, Union
2
+ from typing import Optional, Union
3
3
 
4
4
  import pydantic
5
- from pydantic import BaseModel, Extra
5
+ from pydantic import BaseModel, ConfigDict
6
6
 
7
+ from classiq.interface.enum_utils import StrEnum
8
+ from classiq.interface.exceptions import ClassiqValueError
7
9
  from classiq.interface.generator.transpiler_basis_gates import TranspilerBasisGates
8
10
 
9
- from classiq._internals.enum_utils import StrEnum
10
-
11
11
  UNCONSTRAINED = -1
12
12
 
13
13
 
@@ -26,21 +26,40 @@ def optimization_parameter_type_from_string(param: str) -> OptimizationParameter
26
26
  return enum_(param) # type: ignore[return-value]
27
27
  except ValueError:
28
28
  pass
29
- raise ValueError(f"Invalid OptimizationParameterType {param}")
29
+ raise ClassiqValueError(f"Invalid OptimizationParameterType {param}")
30
30
 
31
31
 
32
- class Constraints(BaseModel, extra=Extra.forbid):
32
+ class Constraints(BaseModel):
33
33
  """
34
- Input constraints for the generated quantum circuit.
34
+ Constraints for the quantum circuit synthesis engine.
35
+
36
+ This class is used to specify constraints such as maximum width, depth,
37
+ gate count, and optimization parameters for the synthesis engine,
38
+ guiding the generation of quantum circuits that satisfy these constraints.
39
+
40
+ Attributes:
41
+ max_width (int):
42
+ Maximum number of qubits allowed in the generated quantum circuit.
43
+ Defaults to `None`.
44
+ max_depth (int):
45
+ Maximum depth of the generated quantum circuit. Defaults to `None`.
46
+ max_gate_count (Dict[TranspilerBasisGates, int]):
47
+ A dictionary specifying the maximum allowed count for each type of gate
48
+ in the quantum circuit. Defaults to an empty dictionary.
49
+ optimization_parameter (OptimizationParameterType):
50
+ Determines if and how the synthesis engine should optimize
51
+ the solution. Defaults to `NO_OPTIMIZATION`. See `OptimizationParameterType`
35
52
  """
36
53
 
54
+ model_config = ConfigDict(extra="forbid")
55
+
37
56
  max_width: Optional[pydantic.PositiveInt] = pydantic.Field(
38
57
  default=None,
39
58
  description="Maximum number of qubits in generated quantum circuit",
40
59
  )
41
60
  max_depth: Optional[pydantic.PositiveInt] = None
42
61
 
43
- max_gate_count: Dict[TranspilerBasisGates, pydantic.NonNegativeInt] = (
62
+ max_gate_count: dict[TranspilerBasisGates, pydantic.NonNegativeInt] = (
44
63
  pydantic.Field(default_factory=lambda: defaultdict(int))
45
64
  )
46
65
 
@@ -1,81 +1,44 @@
1
1
  from abc import ABC
2
- from typing import Any, Dict, List, Literal, Mapping, NewType, Optional, Union
3
2
 
4
3
  import pydantic
5
4
 
5
+ from classiq.interface.exceptions import ClassiqValueError
6
6
  from classiq.interface.executor.execution_preferences import ExecutionPreferences
7
7
  from classiq.interface.generator.constant import Constant
8
- from classiq.interface.generator.function_params import IOName
9
- from classiq.interface.generator.functions import (
10
- SynthesisNativeFunctionDefinition,
11
- SynthesisPortDeclaration,
12
- SynthesisQuantumFunctionDeclaration,
13
- )
14
- from classiq.interface.generator.functions.port_declaration import (
15
- PortDeclarationDirection,
16
- )
17
- from classiq.interface.generator.model.constraints import Constraints
18
- from classiq.interface.generator.model.preferences.preferences import Preferences
19
- from classiq.interface.generator.quantum_function_call import (
20
- SUFFIX_RANDOMIZER,
21
- SynthesisQuantumFunctionCall,
22
- WireDict,
23
- WireName,
24
- )
25
- from classiq.interface.generator.types.combinatorial_problem import (
26
- CombinatorialOptimizationStructDeclaration,
27
- )
8
+ from classiq.interface.generator.function_params import ArithmeticIODict
9
+ from classiq.interface.generator.types.enum_declaration import EnumDeclaration
10
+ from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
28
11
  from classiq.interface.generator.types.struct_declaration import StructDeclaration
29
- from classiq.interface.helpers.pydantic_model_helpers import (
30
- get_discriminator_field,
31
- nameables_to_dict,
32
- )
33
12
  from classiq.interface.helpers.validation_helpers import is_list_unique
34
13
  from classiq.interface.helpers.versioned_model import VersionedModel
35
-
36
- from classiq import ForeignFunctionDefinition as SynthesisForeignFunctionDefinition
37
- from classiq.exceptions import ClassiqValueError
38
- from classiq.quantum_register import QReg, QRegGenericAlias
39
-
40
- MAIN_FUNCTION_NAME = "main"
41
- CLASSICAL_ENTRY_FUNCTION_NAME = "cmain"
42
-
43
- DEFAULT_PORT_SIZE = 1
44
-
45
-
46
- SerializedModel = NewType("SerializedModel", str)
47
-
48
- ConcreteStructDeclaration = Union[
49
- CombinatorialOptimizationStructDeclaration, StructDeclaration
50
- ]
51
-
52
- # We need to define ConcreteFunctionData so pydantic will know
53
- # what class to use when deserializing from object (pydantic attempts to
54
- # parse as each of the classes in the Union, in order).
55
- ConcreteFunctionDefinition = Union[
56
- SynthesisForeignFunctionDefinition, SynthesisNativeFunctionDefinition
57
- ]
14
+ from classiq.interface.model.quantum_type import RegisterQuantumTypeDict
58
15
 
59
16
  TYPE_LIBRARY_DUPLICATED_TYPE_NAMES = (
60
17
  "Cannot have multiple struct types with the same name"
61
18
  )
62
19
 
63
20
 
64
- def _create_default_functions() -> List[ConcreteFunctionDefinition]:
65
- return [SynthesisNativeFunctionDefinition(name=MAIN_FUNCTION_NAME)]
66
-
67
-
68
21
  class ClassiqBaseModel(VersionedModel, ABC):
69
22
  """
70
23
  All the relevant data for evaluating execution in one place.
71
24
  """
72
25
 
73
- types: List[ConcreteStructDeclaration] = pydantic.Field(
26
+ enums: list[EnumDeclaration] = pydantic.Field(
27
+ default_factory=list,
28
+ description="user-defined enums",
29
+ )
30
+
31
+ types: list[StructDeclaration] = pydantic.Field(
74
32
  default_factory=list,
75
- description="The user-defined custom function library.",
33
+ description="user-defined structs",
76
34
  )
77
35
 
78
- constants: List[Constant] = pydantic.Field(
36
+ qstructs: list[QStructDeclaration] = pydantic.Field(
37
+ default_factory=list,
38
+ description="user-defined quantum structs",
39
+ )
40
+
41
+ constants: list[Constant] = pydantic.Field(
79
42
  default_factory=list,
80
43
  )
81
44
 
@@ -87,158 +50,24 @@ class ClassiqBaseModel(VersionedModel, ABC):
87
50
  default_factory=ExecutionPreferences
88
51
  )
89
52
 
90
- @pydantic.validator("types")
91
- def types_validator(
92
- cls, types: List[ConcreteStructDeclaration]
93
- ) -> List[ConcreteStructDeclaration]:
53
+ @pydantic.field_validator("types")
54
+ @classmethod
55
+ def types_validator(cls, types: list[StructDeclaration]) -> list[StructDeclaration]:
94
56
  if not is_list_unique([struct_type.name for struct_type in types]):
95
- raise ValueError(TYPE_LIBRARY_DUPLICATED_TYPE_NAMES)
57
+ raise ClassiqValueError(TYPE_LIBRARY_DUPLICATED_TYPE_NAMES)
96
58
 
97
59
  return types
98
60
 
99
61
 
100
62
  class ExecutionModel(ClassiqBaseModel):
101
- pass
102
-
103
-
104
- class SynthesisModel(ClassiqBaseModel):
105
- """
106
- All the relevant data for generating quantum circuit in one place.
107
- """
108
-
109
- kind: Literal["synthesis"] = get_discriminator_field("synthesis")
110
-
111
- # Must be validated before logic_flow
112
- functions: List[ConcreteFunctionDefinition] = pydantic.Field(
113
- default_factory=_create_default_functions,
114
- description="The quantum functions of the model.",
63
+ circuit_outputs: ArithmeticIODict = pydantic.Field(
64
+ description="Mapping between a measured register name and its arithmetic type",
65
+ default_factory=dict,
66
+ )
67
+ circuit_output_types: RegisterQuantumTypeDict = pydantic.Field(
68
+ description="Mapping between a measured register name and its qmod type",
69
+ default=dict(),
70
+ )
71
+ register_filter_bitstrings: dict[str, list[str]] = pydantic.Field(
72
+ default_factory=dict,
115
73
  )
116
-
117
- constraints: Constraints = pydantic.Field(default_factory=Constraints)
118
- preferences: Preferences = pydantic.Field(default_factory=Preferences)
119
-
120
- def __init__(
121
- self,
122
- *,
123
- body: Optional[List[SynthesisQuantumFunctionCall]] = None,
124
- inputs: Optional[WireDict] = None,
125
- outputs: Optional[WireDict] = None,
126
- **kwargs: Any,
127
- ) -> None:
128
- super().__init__(**kwargs)
129
- if body:
130
- self.main_func.body.extend(body)
131
- if inputs:
132
- self.set_inputs(
133
- {
134
- name: QRegGenericAlias(
135
- QReg(DEFAULT_PORT_SIZE), (DEFAULT_PORT_SIZE, 0)
136
- )
137
- for name in inputs.keys()
138
- },
139
- inputs,
140
- )
141
- if outputs:
142
- self.set_outputs(
143
- {name: QReg(DEFAULT_PORT_SIZE) for name in outputs.keys()}, outputs
144
- )
145
-
146
- @property
147
- def main_func(self) -> SynthesisNativeFunctionDefinition:
148
- return self.function_dict[MAIN_FUNCTION_NAME] # type:ignore[return-value]
149
-
150
- @property
151
- def body(self) -> List[SynthesisQuantumFunctionCall]:
152
- return self.main_func.body
153
-
154
- @property
155
- def inputs(self) -> WireDict:
156
- return self.main_func.input_ports_wiring
157
-
158
- def set_inputs(
159
- self,
160
- inputs: Mapping[IOName, QRegGenericAlias],
161
- input_wiring: Mapping[IOName, WireName],
162
- ) -> None:
163
- self._update_main_declarations(inputs, PortDeclarationDirection.Input)
164
- self.main_func.input_ports_wiring.update(input_wiring)
165
-
166
- @property
167
- def outputs(self) -> WireDict:
168
- return self.main_func.output_ports_wiring
169
-
170
- def set_outputs(
171
- self, outputs: Mapping[IOName, QReg], output_wiring: Mapping[IOName, WireName]
172
- ) -> None:
173
- self._update_main_declarations(outputs, PortDeclarationDirection.Output)
174
- self.main_func.output_ports_wiring.update(output_wiring)
175
-
176
- @pydantic.validator("preferences", always=True)
177
- def _seed_suffix_randomizer(cls, preferences: Preferences) -> Preferences:
178
- SUFFIX_RANDOMIZER.seed(preferences.random_seed)
179
- return preferences
180
-
181
- def _get_qualified_direction(
182
- self, port_name: str, direction: PortDeclarationDirection
183
- ) -> PortDeclarationDirection:
184
- if port_name in self.main_func.port_declarations:
185
- return PortDeclarationDirection.Inout
186
- return direction
187
-
188
- def _update_main_declarations(
189
- self,
190
- value: Union[Mapping[IOName, QReg], Mapping[IOName, QRegGenericAlias]],
191
- direction: PortDeclarationDirection,
192
- ) -> None:
193
- for port_name, register in value.items():
194
- if isinstance(register, QReg):
195
- size = len(register)
196
- is_signed = getattr(register, "is_signed", False) or False
197
- fraction_places = getattr(register, "fraction_places", 0) or 0
198
- else:
199
- size = register.size if register.size is not None else DEFAULT_PORT_SIZE
200
- is_signed = False
201
- fraction_places = (
202
- register.fraction_places
203
- if register.fraction_places is not None
204
- else 0
205
- )
206
-
207
- self.main_func.port_declarations[port_name] = SynthesisPortDeclaration(
208
- name=port_name,
209
- size=size,
210
- direction=self._get_qualified_direction(port_name, direction),
211
- is_signed=is_signed,
212
- fraction_places=fraction_places,
213
- )
214
-
215
- @property
216
- def function_dict(self) -> Dict[str, SynthesisQuantumFunctionDeclaration]:
217
- return nameables_to_dict(self.functions)
218
-
219
- @pydantic.validator("functions", each_item=True)
220
- def validate_static_correctness(
221
- cls, func_def: ConcreteFunctionDefinition
222
- ) -> ConcreteFunctionDefinition:
223
- if isinstance(func_def, SynthesisNativeFunctionDefinition):
224
- func_def.validate_body()
225
- return func_def
226
-
227
- @pydantic.validator("functions")
228
- def validate_main_function_exists(
229
- cls, func_defs: List[ConcreteFunctionDefinition]
230
- ) -> List[ConcreteFunctionDefinition]:
231
- if MAIN_FUNCTION_NAME not in {func.name for func in func_defs}:
232
- raise ClassiqValueError("The model must contain a `main` function")
233
- return func_defs
234
-
235
- def get_model(self) -> SerializedModel:
236
- return SerializedModel(self.json(exclude_defaults=True, indent=2))
237
-
238
- def classical_model(self) -> ExecutionModel:
239
- return ExecutionModel(
240
- types=self.types,
241
- constants=self.constants,
242
- classical_execution_code=self.classical_execution_code,
243
- execution_preferences=self.execution_preferences,
244
- )