classiq 0.38.0__py3-none-any.whl → 0.65.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,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,14 +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
- from classiq.exceptions import ClassiqValueError
11
-
12
11
  UNCONSTRAINED = -1
13
12
 
14
13
 
@@ -30,18 +29,37 @@ def optimization_parameter_type_from_string(param: str) -> OptimizationParameter
30
29
  raise ClassiqValueError(f"Invalid OptimizationParameterType {param}")
31
30
 
32
31
 
33
- class Constraints(BaseModel, extra=Extra.forbid):
32
+ class Constraints(BaseModel):
34
33
  """
35
- 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`
36
52
  """
37
53
 
54
+ model_config = ConfigDict(extra="forbid")
55
+
38
56
  max_width: Optional[pydantic.PositiveInt] = pydantic.Field(
39
57
  default=None,
40
58
  description="Maximum number of qubits in generated quantum circuit",
41
59
  )
42
60
  max_depth: Optional[pydantic.PositiveInt] = None
43
61
 
44
- max_gate_count: Dict[TranspilerBasisGates, pydantic.NonNegativeInt] = (
62
+ max_gate_count: dict[TranspilerBasisGates, pydantic.NonNegativeInt] = (
45
63
  pydantic.Field(default_factory=lambda: defaultdict(int))
46
64
  )
47
65
 
@@ -1,71 +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 ArithmeticIODict, 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
- )
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
25
11
  from classiq.interface.generator.types.struct_declaration import StructDeclaration
26
- from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
27
12
  from classiq.interface.helpers.validation_helpers import is_list_unique
28
13
  from classiq.interface.helpers.versioned_model import VersionedModel
29
-
30
- from classiq import ForeignFunctionDefinition as SynthesisForeignFunctionDefinition
31
- from classiq.exceptions import ClassiqValueError
32
- from classiq.quantum_register import QReg, QRegGenericAlias
33
-
34
- MAIN_FUNCTION_NAME = "main"
35
- CLASSICAL_ENTRY_FUNCTION_NAME = "cmain"
36
-
37
- DEFAULT_PORT_SIZE = 1
38
-
39
-
40
- SerializedModel = NewType("SerializedModel", str)
41
-
42
- # We need to define ConcreteFunctionData so pydantic will know
43
- # what class to use when deserializing from object (pydantic attempts to
44
- # parse as each of the classes in the Union, in order).
45
- ConcreteFunctionDefinition = Union[
46
- SynthesisForeignFunctionDefinition, SynthesisNativeFunctionDefinition
47
- ]
14
+ from classiq.interface.model.quantum_type import RegisterQuantumTypeDict
48
15
 
49
16
  TYPE_LIBRARY_DUPLICATED_TYPE_NAMES = (
50
17
  "Cannot have multiple struct types with the same name"
51
18
  )
52
19
 
53
20
 
54
- def _create_default_functions() -> List[ConcreteFunctionDefinition]:
55
- return [SynthesisNativeFunctionDefinition(name=MAIN_FUNCTION_NAME)]
56
-
57
-
58
21
  class ClassiqBaseModel(VersionedModel, ABC):
59
22
  """
60
23
  All the relevant data for evaluating execution in one place.
61
24
  """
62
25
 
63
- types: List[StructDeclaration] = pydantic.Field(
26
+ enums: list[EnumDeclaration] = pydantic.Field(
64
27
  default_factory=list,
65
- description="The user-defined custom function library.",
28
+ description="user-defined enums",
66
29
  )
67
30
 
68
- constants: List[Constant] = pydantic.Field(
31
+ types: list[StructDeclaration] = pydantic.Field(
32
+ default_factory=list,
33
+ description="user-defined structs",
34
+ )
35
+
36
+ qstructs: list[QStructDeclaration] = pydantic.Field(
37
+ default_factory=list,
38
+ description="user-defined quantum structs",
39
+ )
40
+
41
+ constants: list[Constant] = pydantic.Field(
69
42
  default_factory=list,
70
43
  )
71
44
 
@@ -77,8 +50,9 @@ class ClassiqBaseModel(VersionedModel, ABC):
77
50
  default_factory=ExecutionPreferences
78
51
  )
79
52
 
80
- @pydantic.validator("types")
81
- def types_validator(cls, types: List[StructDeclaration]) -> List[StructDeclaration]:
53
+ @pydantic.field_validator("types")
54
+ @classmethod
55
+ def types_validator(cls, types: list[StructDeclaration]) -> list[StructDeclaration]:
82
56
  if not is_list_unique([struct_type.name for struct_type in types]):
83
57
  raise ClassiqValueError(TYPE_LIBRARY_DUPLICATED_TYPE_NAMES)
84
58
 
@@ -90,147 +64,10 @@ class ExecutionModel(ClassiqBaseModel):
90
64
  description="Mapping between a measured register name and its arithmetic type",
91
65
  default_factory=dict,
92
66
  )
93
-
94
-
95
- class SynthesisModel(ClassiqBaseModel):
96
- """
97
- All the relevant data for generating quantum circuit in one place.
98
- """
99
-
100
- kind: Literal["synthesis"] = pydantic.Field(default="synthesis")
101
-
102
- # Must be validated before logic_flow
103
- functions: List[ConcreteFunctionDefinition] = pydantic.Field(
104
- default_factory=_create_default_functions,
105
- description="The quantum functions of the model.",
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,
106
73
  )
107
-
108
- constraints: Constraints = pydantic.Field(default_factory=Constraints)
109
- preferences: Preferences = pydantic.Field(default_factory=Preferences)
110
-
111
- def __init__(
112
- self,
113
- *,
114
- body: Optional[List[SynthesisQuantumFunctionCall]] = None,
115
- inputs: Optional[WireDict] = None,
116
- outputs: Optional[WireDict] = None,
117
- **kwargs: Any,
118
- ) -> None:
119
- super().__init__(**kwargs)
120
- if body:
121
- self.main_func.body.extend(body)
122
- if inputs:
123
- self.set_inputs(
124
- {
125
- name: QRegGenericAlias(
126
- QReg(DEFAULT_PORT_SIZE), (DEFAULT_PORT_SIZE, 0)
127
- )
128
- for name in inputs.keys()
129
- },
130
- inputs,
131
- )
132
- if outputs:
133
- self.set_outputs(
134
- {name: QReg(DEFAULT_PORT_SIZE) for name in outputs.keys()}, outputs
135
- )
136
-
137
- @property
138
- def main_func(self) -> SynthesisNativeFunctionDefinition:
139
- return self.function_dict[MAIN_FUNCTION_NAME] # type:ignore[return-value]
140
-
141
- @property
142
- def body(self) -> List[SynthesisQuantumFunctionCall]:
143
- return self.main_func.body
144
-
145
- @property
146
- def inputs(self) -> WireDict:
147
- return self.main_func.input_ports_wiring
148
-
149
- def set_inputs(
150
- self,
151
- inputs: Mapping[IOName, QRegGenericAlias],
152
- input_wiring: Mapping[IOName, WireName],
153
- ) -> None:
154
- self._update_main_declarations(inputs, PortDeclarationDirection.Input)
155
- self.main_func.input_ports_wiring.update(input_wiring)
156
-
157
- @property
158
- def outputs(self) -> WireDict:
159
- return self.main_func.output_ports_wiring
160
-
161
- def set_outputs(
162
- self, outputs: Mapping[IOName, QReg], output_wiring: Mapping[IOName, WireName]
163
- ) -> None:
164
- self._update_main_declarations(outputs, PortDeclarationDirection.Output)
165
- self.main_func.output_ports_wiring.update(output_wiring)
166
-
167
- @pydantic.validator("preferences", always=True)
168
- def _seed_suffix_randomizer(cls, preferences: Preferences) -> Preferences:
169
- SUFFIX_RANDOMIZER.seed(preferences.random_seed)
170
- return preferences
171
-
172
- def _get_qualified_direction(
173
- self, port_name: str, direction: PortDeclarationDirection
174
- ) -> PortDeclarationDirection:
175
- if port_name in self.main_func.port_declarations:
176
- return PortDeclarationDirection.Inout
177
- return direction
178
-
179
- def _update_main_declarations(
180
- self,
181
- value: Union[Mapping[IOName, QReg], Mapping[IOName, QRegGenericAlias]],
182
- direction: PortDeclarationDirection,
183
- ) -> None:
184
- for port_name, register in value.items():
185
- if isinstance(register, QReg):
186
- size = len(register)
187
- is_signed = getattr(register, "is_signed", False) or False
188
- fraction_places = getattr(register, "fraction_places", 0) or 0
189
- else:
190
- size = register.size if register.size is not None else DEFAULT_PORT_SIZE
191
- is_signed = False
192
- fraction_places = (
193
- register.fraction_places
194
- if register.fraction_places is not None
195
- else 0
196
- )
197
-
198
- self.main_func.port_declarations[port_name] = SynthesisPortDeclaration(
199
- name=port_name,
200
- size=size,
201
- direction=self._get_qualified_direction(port_name, direction),
202
- is_signed=is_signed,
203
- fraction_places=fraction_places,
204
- )
205
-
206
- @property
207
- def function_dict(self) -> Dict[str, SynthesisQuantumFunctionDeclaration]:
208
- return nameables_to_dict(self.functions)
209
-
210
- @pydantic.validator("functions", each_item=True)
211
- def validate_static_correctness(
212
- cls, func_def: ConcreteFunctionDefinition
213
- ) -> ConcreteFunctionDefinition:
214
- if isinstance(func_def, SynthesisNativeFunctionDefinition):
215
- func_def.validate_body()
216
- return func_def
217
-
218
- @pydantic.validator("functions")
219
- def validate_main_function_exists(
220
- cls, func_defs: List[ConcreteFunctionDefinition]
221
- ) -> List[ConcreteFunctionDefinition]:
222
- if MAIN_FUNCTION_NAME not in {func.name for func in func_defs}:
223
- raise ClassiqValueError("The model must contain a `main` function")
224
- return func_defs
225
-
226
- def get_model(self) -> SerializedModel:
227
- return SerializedModel(self.json(exclude_defaults=True, indent=2))
228
-
229
- def classical_model(self) -> ExecutionModel:
230
- return ExecutionModel(
231
- types=self.types,
232
- constants=self.constants,
233
- classical_execution_code=self.classical_execution_code,
234
- execution_preferences=self.execution_preferences,
235
- circuit_outputs=self.main_func.outputs,
236
- )
@@ -1,17 +1,24 @@
1
- from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
1
+ from collections.abc import Sequence
2
+ from enum import IntEnum
3
+ from typing import TYPE_CHECKING, Annotated, Any, Optional, Union
2
4
 
3
5
  import pydantic
4
- from typing_extensions import TypeAlias
6
+ from pydantic import Field
7
+ from pydantic_core.core_schema import ValidationInfo
8
+ from typing_extensions import Self, TypeAlias
5
9
 
6
10
  from classiq.interface.backend.backend_preferences import (
7
11
  BackendPreferences,
8
- validate_backend_service_provider,
9
12
  )
10
13
  from classiq.interface.backend.quantum_backend_providers import (
11
14
  AllBackendsNameByVendor,
12
15
  ProviderVendor,
13
16
  )
14
- from classiq.interface.generator.arith.number_utils import MAXIMAL_MACHINE_PRECISION
17
+ from classiq.interface.enum_utils import StrEnum
18
+ from classiq.interface.exceptions import ClassiqValueError
19
+ from classiq.interface.generator.arith.machine_precision import (
20
+ DEFAULT_MACHINE_PRECISION,
21
+ )
15
22
  from classiq.interface.generator.hardware.hardware_data import (
16
23
  BACKEND_VALIDATION_ERROR_MESSAGE,
17
24
  CustomHardwareSettings,
@@ -20,20 +27,17 @@ from classiq.interface.generator.model.preferences.randomness import create_rand
20
27
  from classiq.interface.hardware import Provider
21
28
  from classiq.interface.helpers.custom_pydantic_types import PydanticMachinePrecision
22
29
 
23
- from classiq._internals.enum_utils import StrEnum
24
- from classiq.exceptions import ClassiqValueError
25
-
26
30
  if TYPE_CHECKING:
27
31
  VisualizationLevel: TypeAlias = Optional[int]
28
32
  else:
29
- VisualizationLevel: TypeAlias = Optional[pydantic.conint(ge=-1)]
33
+ VisualizationLevel: TypeAlias = Optional[Annotated[int, Field(ge=-1)]]
30
34
 
31
35
  if TYPE_CHECKING:
32
36
  PydanticBackendName = str
33
37
  else:
34
- PydanticBackendName = pydantic.constr(
35
- strict=True, min_length=1, regex="^([.A-Za-z0-9_-]*)$"
36
- )
38
+ PydanticBackendName = Annotated[
39
+ str, Field(strict=True, min_length=1, pattern="^([.A-Za-z0-9_-]*)$")
40
+ ]
37
41
 
38
42
 
39
43
  class QuantumFormat(StrEnum):
@@ -45,7 +49,7 @@ class QuantumFormat(StrEnum):
45
49
  QASM_CIRQ_COMPATIBLE = "qasm_cirq_compatible"
46
50
 
47
51
 
48
- _SERVICE_PROVIDER_TO_FORMAT: Dict[Provider, QuantumFormat] = {
52
+ _SERVICE_PROVIDER_TO_FORMAT: dict[Provider, QuantumFormat] = {
49
53
  Provider.CLASSIQ: QuantumFormat.QASM,
50
54
  Provider.IONQ: QuantumFormat.IONQ,
51
55
  Provider.AZURE_QUANTUM: QuantumFormat.QSHARP,
@@ -54,11 +58,18 @@ _SERVICE_PROVIDER_TO_FORMAT: Dict[Provider, QuantumFormat] = {
54
58
  }
55
59
 
56
60
  if TYPE_CHECKING:
57
- PydanticConstrainedQuantumFormatList = List[QuantumFormat]
61
+ PydanticConstrainedQuantumFormatList = list[QuantumFormat]
58
62
  else:
59
- PydanticConstrainedQuantumFormatList = pydantic.conlist(
60
- QuantumFormat, min_items=1, max_items=len(QuantumFormat)
61
- )
63
+ PydanticConstrainedQuantumFormatList = Annotated[
64
+ list[QuantumFormat], Field(min_length=1, max_length=len(QuantumFormat))
65
+ ]
66
+
67
+
68
+ class OptimizationLevel(IntEnum):
69
+ NONE = 0
70
+ LIGHT = 1
71
+ MEDIUM = 2
72
+ HIGH = 3
62
73
 
63
74
 
64
75
  class TranspilationOption(StrEnum):
@@ -74,11 +85,60 @@ class TranspilationOption(StrEnum):
74
85
  return self != TranspilationOption.NONE
75
86
 
76
87
 
77
- class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
88
+ class Preferences(pydantic.BaseModel, extra="forbid"):
89
+ """
90
+ Preferences for synthesizing a quantum circuit.
91
+
92
+ Attributes:
93
+ machine_precision (int): Specifies the precision used for quantum operations.
94
+ Defaults to `DEFAULT_MACHINE_PRECISION`.
95
+ backend_service_provider (str): The provider company or cloud service for the
96
+ requested backend. Defaults to `None`.
97
+ backend_name (str): The name of the requested backend or target. Defaults to `None`.
98
+ custom_hardware_settings (CustomHardwareSettings): Defines custom hardware
99
+ settings for optimization. This field is ignored if backend preferences are
100
+ specified.
101
+ debug_mode (bool): If `True`, debug information is added to the
102
+ synthesized result, potentially slowing down the synthesis. Useful for
103
+ executing interactive algorithms. Defaults to `True`.
104
+ output_format (List[QuantumFormat]): Lists the output format(s)
105
+ for the quantum circuit. Defaults to `[QuantumFormat.QASM]`.
106
+ `QuantumFormat` Options:
107
+ - QASM = "qasm"
108
+ - QSHARP = "qsharp"
109
+ - QIR = "qir"
110
+ - IONQ = "ionq"
111
+ - CIRQ_JSON = "cirq_json"
112
+ - QASM_CIRQ_COMPATIBLE = "qasm_cirq_compatible"
113
+ pretty_qasm (bool): If `True`, formats OpenQASM 2 outputs with line breaks
114
+ inside gate declarations, improving readability. Defaults to `True`.
115
+ qasm3 (Optional[bool]): If `True`, outputs OpenQASM 3.0 in addition to 2.0,
116
+ applicable to relevant attributes in `GeneratedCircuit`. Defaults to `None`.
117
+ transpilation_option (TranspilationOption): Sets the transpilation option to
118
+ optimize the circuit. Defaults to `AUTO_OPTIMIZE`. See `TranspilationOption`
119
+ solovay_kitaev_max_iterations (Optional[int]): Specifies the
120
+ maximum number of iterations for the Solovay-Kitaev algorithm, if used.
121
+ Defaults to `None`.
122
+ timeout_seconds (int): Timeout setting for circuit synthesis
123
+ in seconds. Defaults to `300`.
124
+ optimization_timeout_seconds (Optional[int]): Specifies the
125
+ timeout for optimization in seconds, or `None` for no optimization timeout.
126
+ This will still adhere to the overall synthesis timeout. Defaults to `None`.
127
+ random_seed (int): Random seed for circuit synthesis.
128
+
129
+ Raises:
130
+ ClassiqValueError:
131
+ - If the optimization timeout is greater than or equal to the synthesis timeout.
132
+ - If the `output_format` contains duplicate entries.
133
+ - If `backend_name` is provided without `backend_service_provider` or vice versa.
134
+ ValueError:
135
+ - If `backend_service_provider` is not valid.
136
+ """
137
+
78
138
  _backend_preferences: Optional[BackendPreferences] = pydantic.PrivateAttr(
79
139
  default=None
80
140
  )
81
- machine_precision: PydanticMachinePrecision = MAXIMAL_MACHINE_PRECISION
141
+ machine_precision: PydanticMachinePrecision = DEFAULT_MACHINE_PRECISION
82
142
 
83
143
  backend_service_provider: Optional[Union[Provider, ProviderVendor, str]] = (
84
144
  pydantic.Field(
@@ -102,6 +162,15 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
102
162
  "Setting this option to False can potentially speed up the synthesis, and is "
103
163
  "recommended for executing iterative algorithms.",
104
164
  )
165
+ synthesize_all_separately: bool = pydantic.Field(
166
+ default=False,
167
+ description="If true, a heuristic is used to determine if a function should be synthesized separately",
168
+ deprecated=True,
169
+ )
170
+ optimization_level: OptimizationLevel = pydantic.Field(
171
+ default=OptimizationLevel.HIGH,
172
+ description="The optimization level used during synthesis; determines the trade-off between synthesis speed and the quality of the results",
173
+ )
105
174
  output_format: PydanticConstrainedQuantumFormatList = pydantic.Field(
106
175
  default=[QuantumFormat.QASM],
107
176
  description="The quantum circuit output format(s). ",
@@ -125,6 +194,11 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
125
194
  "transpiled circuit and its depth",
126
195
  )
127
196
 
197
+ solovay_kitaev_max_iterations: Optional[pydantic.PositiveInt] = pydantic.Field(
198
+ None,
199
+ description="Maximum iterations for the Solovay-Kitaev algorithm (if applied).",
200
+ )
201
+
128
202
  timeout_seconds: pydantic.PositiveInt = pydantic.Field(
129
203
  default=300, description="Generation timeout in seconds"
130
204
  )
@@ -134,27 +208,19 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
134
208
  description="Optimization timeout in seconds, or None for no "
135
209
  "optimization timeout (will still timeout when the generation timeout is over)",
136
210
  )
137
-
138
211
  random_seed: int = pydantic.Field(
139
212
  default_factory=create_random_seed,
140
213
  description="The random seed used for the generation",
141
214
  )
142
215
 
143
- @pydantic.validator("backend_service_provider", pre=True)
144
- def validate_backend_service_provider(
145
- cls, backend_service_provider: Any
146
- ) -> Optional[Provider]:
147
- if backend_service_provider is None:
148
- return None
149
- return validate_backend_service_provider(backend_service_provider)
150
-
151
- @pydantic.validator("optimization_timeout_seconds")
216
+ @pydantic.field_validator("optimization_timeout_seconds", mode="before")
217
+ @classmethod
152
218
  def optimization_timeout_less_than_generation_timeout(
153
219
  cls,
154
220
  optimization_timeout_seconds: Optional[pydantic.PositiveInt],
155
- values: Dict[str, Any],
221
+ info: ValidationInfo,
156
222
  ) -> Optional[pydantic.PositiveInt]:
157
- generation_timeout_seconds = values.get("timeout_seconds")
223
+ generation_timeout_seconds = info.data.get("timeout_seconds")
158
224
  if generation_timeout_seconds is None or optimization_timeout_seconds is None:
159
225
  return optimization_timeout_seconds
160
226
  if optimization_timeout_seconds >= generation_timeout_seconds:
@@ -165,16 +231,20 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
165
231
  )
166
232
  return optimization_timeout_seconds
167
233
 
168
- @pydantic.validator("output_format", pre=True)
169
- def make_output_format_list(cls, output_format: Any) -> List:
170
- if not pydantic.utils.sequence_like(output_format):
234
+ @pydantic.field_validator("output_format", mode="before")
235
+ @classmethod
236
+ def make_output_format_list(cls, output_format: Any) -> list:
237
+ if not isinstance(output_format, Sequence) or isinstance(output_format, str):
171
238
  output_format = [output_format]
172
239
 
173
240
  return output_format
174
241
 
175
- @pydantic.validator("output_format", always=True)
242
+ @pydantic.field_validator("output_format", mode="before")
243
+ @classmethod
176
244
  def validate_output_format(
177
- cls, output_format: PydanticConstrainedQuantumFormatList, values: Dict[str, Any]
245
+ cls,
246
+ output_format: PydanticConstrainedQuantumFormatList,
247
+ info: ValidationInfo,
178
248
  ) -> PydanticConstrainedQuantumFormatList:
179
249
  if len(output_format) != len(set(output_format)):
180
250
  raise ClassiqValueError(
@@ -182,7 +252,7 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
182
252
  "has at least one format that appears twice or more"
183
253
  )
184
254
 
185
- service_provider = values.get("backend_service_provider")
255
+ service_provider = info.data.get("backend_service_provider")
186
256
  if service_provider is None:
187
257
  return output_format
188
258
 
@@ -192,16 +262,20 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
192
262
 
193
263
  return output_format
194
264
 
195
- @pydantic.root_validator()
196
- def validate_backend(cls, values: Dict[str, Any]) -> Dict[str, Any]:
197
- backend_name = values.get("backend_name")
198
- backend_service_provider = values.get("backend_service_provider")
265
+ @pydantic.model_validator(mode="after")
266
+ def validate_backend(self) -> Self:
267
+ backend_name = self.backend_name
268
+ backend_service_provider = self.backend_service_provider
199
269
  if (backend_name is None) != (backend_service_provider is None):
200
270
  raise ClassiqValueError(BACKEND_VALIDATION_ERROR_MESSAGE)
201
- return values
271
+ return self
202
272
 
203
273
  @property
204
274
  def backend_preferences(self) -> Optional[BackendPreferences]:
275
+ """
276
+ Returns the backend preferences. If the backend preferences are not provided, the function sets the backend preferences according to backend name and provider.
277
+
278
+ """
205
279
  if self.backend_name is None or self.backend_service_provider is None:
206
280
  return None
207
281
  if self._backend_preferences is None: