classiq 0.38.0__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 (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.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.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.3.dist-info}/WHEEL +0 -0
@@ -1,18 +1,26 @@
1
+ from collections.abc import Collection
1
2
  from functools import reduce
2
- from typing import Any, Collection, Dict, List, Optional, Tuple, Union, cast
3
+ from typing import (
4
+ Any,
5
+ Optional,
6
+ Union,
7
+ cast,
8
+ )
3
9
 
4
10
  import numpy as np
5
11
  import pydantic
6
12
  import sympy
7
13
  from more_itertools import all_equal
14
+ from pydantic import ConfigDict
8
15
 
9
- from classiq.interface.generator.expressions.enums.pauli import Pauli
16
+ from classiq.interface.exceptions import ClassiqValueError
10
17
  from classiq.interface.generator.function_params import validate_expression_str
11
18
  from classiq.interface.generator.parameters import (
12
19
  ParameterComplexType,
13
20
  ParameterType,
14
21
  PydanticParameterComplexType,
15
22
  )
23
+ from classiq.interface.generator.types.builtin_enum_declarations import Pauli
16
24
  from classiq.interface.helpers.custom_pydantic_types import (
17
25
  PydanticPauliList,
18
26
  PydanticPauliMonomial,
@@ -23,8 +31,6 @@ from classiq.interface.helpers.hashable_pydantic_base_model import (
23
31
  )
24
32
  from classiq.interface.helpers.versioned_model import VersionedModel
25
33
 
26
- from classiq.exceptions import ClassiqValueError
27
-
28
34
 
29
35
  class PauliOperator(HashablePydanticBaseModel, VersionedModel):
30
36
  """
@@ -34,8 +40,8 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
34
40
  pauli_list: PydanticPauliList = pydantic.Field(
35
41
  description="A list of tuples each containing a pauli string comprised of I,X,Y,Z characters and a complex coefficient; for example [('IZ', 0.1), ('XY', 0.2)].",
36
42
  )
37
- is_hermitian: bool = pydantic.Field(default=False)
38
43
  has_complex_coefficients: bool = pydantic.Field(default=True)
44
+ is_hermitian: bool = pydantic.Field(default=False)
39
45
 
40
46
  def show(self) -> str:
41
47
  if self.is_hermitian:
@@ -47,16 +53,19 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
47
53
  f"+({summand[1]:+.3f}) * {summand[0]}" for summand in self.pauli_list
48
54
  )
49
55
 
50
- @pydantic.validator("pauli_list", each_item=True, pre=True)
56
+ @pydantic.field_validator("pauli_list", mode="before")
57
+ @classmethod
51
58
  def _validate_pauli_monomials(
52
- cls, monomial: Tuple[PydanticPauliMonomialStr, ParameterComplexType]
53
- ) -> Tuple[PydanticPauliMonomialStr, ParameterComplexType]:
54
- _PauliMonomialLengthValidator( # type: ignore[call-arg]
55
- monomial=monomial
56
- ) # Validate the length of the monomial.
57
- coeff = cls._validate_monomial_coefficient(monomial[1])
58
- parsed_monomial = _PauliMonomialParser(string=monomial[0], coeff=coeff) # type: ignore[call-arg]
59
- return (parsed_monomial.string, parsed_monomial.coeff)
59
+ cls, pauli_list: PydanticPauliList
60
+ ) -> PydanticPauliList:
61
+ validated_pauli_list = []
62
+ for monomial in pauli_list:
63
+ # Validate the length
64
+ _PauliMonomialLengthValidator(monomial=monomial) # type: ignore[call-arg]
65
+ coeff = cls._validate_monomial_coefficient(monomial[1])
66
+ parsed_monomial = _PauliMonomialParser(string=monomial[0], coeff=coeff)
67
+ validated_pauli_list.append((parsed_monomial.string, parsed_monomial.coeff))
68
+ return validated_pauli_list
60
69
 
61
70
  @staticmethod
62
71
  def _validate_monomial_coefficient(
@@ -68,16 +77,38 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
68
77
  coeff = str(coeff)
69
78
  return coeff
70
79
 
71
- @pydantic.validator("pauli_list")
80
+ @pydantic.field_validator("pauli_list", mode="after")
81
+ @classmethod
72
82
  def _validate_pauli_list(cls, pauli_list: PydanticPauliList) -> PydanticPauliList:
73
83
  if not all_equal(len(summand[0]) for summand in pauli_list):
74
84
  raise ClassiqValueError("Pauli strings have incompatible lengths.")
75
85
  return pauli_list
76
86
 
77
- @pydantic.root_validator
78
- def _validate_hermitianity(cls, values: Dict[str, Any]) -> Dict[str, Any]:
87
+ @staticmethod
88
+ def check_if_hermitian(pauli_list: PydanticPauliList) -> bool:
89
+ if all(isinstance(summand[1], (float, int, complex)) for summand in pauli_list):
90
+ if all(np.isclose(summand[1].imag, 0) for summand in pauli_list): # type: ignore[union-attr]
91
+ return True
92
+
93
+ for pauli_string, coeff in pauli_list:
94
+ reverse_string = pauli_string[::-1]
95
+ reverse_found = False
96
+ for other_string, other_coeff in pauli_list:
97
+ if other_string == reverse_string and np.isclose(
98
+ coeff, other_coeff.conjugate() # type: ignore[union-attr]
99
+ ):
100
+ reverse_found = True
101
+ break
102
+ if not reverse_found:
103
+ return False
104
+ return True
105
+ return False
106
+
107
+ @pydantic.model_validator(mode="before")
108
+ @classmethod
109
+ def _validate_hermitianity(cls, values: dict[str, Any]) -> dict[str, Any]:
79
110
  pauli_list = values.get("pauli_list", [])
80
- if all(isinstance(summand[1], complex) for summand in pauli_list):
111
+ if PauliOperator.check_if_hermitian(pauli_list):
81
112
  values["is_hermitian"] = all(
82
113
  np.isclose(complex(summand[1]).real, summand[1])
83
114
  for summand in pauli_list
@@ -85,7 +116,7 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
85
116
  if values.get("is_hermitian", False):
86
117
  values["has_complex_coefficients"] = False
87
118
  values["pauli_list"] = [
88
- (summand[0], complex(summand[1].real)) for summand in pauli_list
119
+ (summand[0], complex(summand[1]).real) for summand in pauli_list
89
120
  ]
90
121
  else:
91
122
  values["has_complex_coefficients"] = not all(
@@ -120,7 +151,7 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
120
151
  )
121
152
 
122
153
  @staticmethod
123
- def _is_sub_pauli_commutative(qubit_pauli_string: Union[List[str], str]) -> bool:
154
+ def _is_sub_pauli_commutative(qubit_pauli_string: Union[list[str], str]) -> bool:
124
155
  unique_paulis = set(qubit_pauli_string) - {"I"}
125
156
  return len(unique_paulis) <= 1
126
157
 
@@ -128,8 +159,12 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
128
159
  def num_qubits(self) -> int:
129
160
  return len(self.pauli_list[0][0])
130
161
 
162
+ @property
163
+ def all_coefficients_numeric(self) -> bool:
164
+ return all(isinstance(summand[1], complex) for summand in self.pauli_list)
165
+
131
166
  def to_matrix(self) -> np.ndarray:
132
- if not all(isinstance(summand[1], complex) for summand in self.pauli_list):
167
+ if not self.all_coefficients_numeric:
133
168
  raise ClassiqValueError(
134
169
  "Supporting only Hamiltonian with numeric coefficients."
135
170
  )
@@ -149,7 +184,7 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
149
184
  (self._extend_pauli_string(pauli_string, num_extra_qubits), coeff)
150
185
  for (pauli_string, coeff) in self.pauli_list
151
186
  ]
152
- return self.copy(update={"pauli_list": new_pauli_list}, deep=True)
187
+ return self.model_copy(update={"pauli_list": new_pauli_list}, deep=True)
153
188
 
154
189
  @staticmethod
155
190
  def _reorder_pauli_string(
@@ -199,13 +234,13 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
199
234
  (cls._reorder_pauli_string(pauli_string, order, new_num_qubits), coeff)
200
235
  for pauli_string, coeff in operator.pauli_list
201
236
  ]
202
- return cls(pauli_list=new_pauli_list)
237
+ return cls(pauli_list=new_pauli_list, is_hermitian=operator.is_hermitian)
203
238
 
204
239
  @classmethod
205
240
  def from_unzipped_lists(
206
241
  cls,
207
- operators: List[List[Pauli]],
208
- coefficients: Optional[List[complex]] = None,
242
+ operators: list[list["Pauli"]],
243
+ coefficients: Optional[list[complex]] = None,
209
244
  ) -> "PauliOperator":
210
245
  if coefficients is None:
211
246
  coefficients = [1] * len(operators)
@@ -222,208 +257,7 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
222
257
  ]
223
258
  )
224
259
 
225
- class Config:
226
- frozen = True
227
-
228
-
229
- class PauliOperatorV1(HashablePydanticBaseModel):
230
- """
231
- Specification of a Pauli sum operator.
232
- """
233
-
234
- pauli_list: PydanticPauliList = pydantic.Field(
235
- description="A list of tuples each containing a pauli string comprised of I,X,Y,Z characters and a complex coefficient; for example [('IZ', 0.1), ('XY', 0.2)].",
236
- )
237
- is_hermitian: bool = pydantic.Field(default=False)
238
- has_complex_coefficients: bool = pydantic.Field(default=True)
239
-
240
- def show(self) -> str:
241
- if self.is_hermitian:
242
- # If the operator is hermitian then the coefficients must be numeric
243
- return "\n".join(
244
- f"{summand[1].real:+.3f} * {summand[0]}" for summand in self.pauli_list # type: ignore[union-attr]
245
- )
246
- return "\n".join(
247
- f"+({summand[1]:+.3f}) * {summand[0]}" for summand in self.pauli_list
248
- )
249
-
250
- @pydantic.validator("pauli_list", each_item=True, pre=True)
251
- def _validate_pauli_monomials(
252
- cls, monomial: Tuple[PydanticPauliMonomialStr, ParameterComplexType]
253
- ) -> Tuple[PydanticPauliMonomialStr, ParameterComplexType]:
254
- _PauliMonomialLengthValidator( # type: ignore[call-arg]
255
- monomial=monomial
256
- ) # Validate the length of the monomial.
257
- coeff = cls._validate_monomial_coefficient(monomial[1])
258
- parsed_monomial = _PauliMonomialParser(string=monomial[0], coeff=coeff) # type: ignore[call-arg]
259
- return (parsed_monomial.string, parsed_monomial.coeff)
260
-
261
- @staticmethod
262
- def _validate_monomial_coefficient(
263
- coeff: Union[sympy.Expr, ParameterComplexType]
264
- ) -> ParameterComplexType:
265
- if isinstance(coeff, str):
266
- validate_expression_str(coeff)
267
- elif isinstance(coeff, sympy.Expr):
268
- coeff = str(coeff)
269
- return coeff
270
-
271
- @pydantic.validator("pauli_list")
272
- def _validate_pauli_list(cls, pauli_list: PydanticPauliList) -> PydanticPauliList:
273
- if not all_equal(len(summand[0]) for summand in pauli_list):
274
- raise ClassiqValueError("Pauli strings have incompatible lengths.")
275
- return pauli_list
276
-
277
- @pydantic.root_validator
278
- def _validate_hermitianity(cls, values: Dict[str, Any]) -> Dict[str, Any]:
279
- pauli_list = values.get("pauli_list", [])
280
- if all(isinstance(summand[1], complex) for summand in pauli_list):
281
- values["is_hermitian"] = all(
282
- np.isclose(complex(summand[1]).real, summand[1])
283
- for summand in pauli_list
284
- )
285
- if values.get("is_hermitian", False):
286
- values["has_complex_coefficients"] = False
287
- values["pauli_list"] = [
288
- (summand[0], complex(summand[1].real)) for summand in pauli_list
289
- ]
290
- else:
291
- values["has_complex_coefficients"] = not all(
292
- np.isclose(complex(summand[1]).real, summand[1])
293
- for summand in pauli_list
294
- if isinstance(summand[1], complex)
295
- )
296
- return values
297
-
298
- def __mul__(self, coefficient: complex) -> "PauliOperatorV1":
299
- multiplied_ising = [
300
- (monomial[0], self._multiply_monomial_coefficient(monomial[1], coefficient))
301
- for monomial in self.pauli_list
302
- ]
303
- return self.__class__(pauli_list=multiplied_ising)
304
-
305
- @staticmethod
306
- def _multiply_monomial_coefficient(
307
- monomial_coefficient: ParameterComplexType, coefficient: complex
308
- ) -> ParameterComplexType:
309
- if isinstance(monomial_coefficient, ParameterType):
310
- return str(sympy.sympify(monomial_coefficient) * coefficient)
311
- return monomial_coefficient * coefficient
312
-
313
- @property
314
- def is_commutative(self) -> bool:
315
- return all(
316
- self._is_sub_pauli_commutative(
317
- [summand[0][qubit_num] for summand in self.pauli_list]
318
- )
319
- for qubit_num in range(self.num_qubits)
320
- )
321
-
322
- @staticmethod
323
- def _is_sub_pauli_commutative(qubit_pauli_string: Union[List[str], str]) -> bool:
324
- unique_paulis = set(qubit_pauli_string) - {"I"}
325
- return len(unique_paulis) <= 1
326
-
327
- @property
328
- def num_qubits(self) -> int:
329
- return len(self.pauli_list[0][0])
330
-
331
- def to_matrix(self) -> np.ndarray:
332
- if not all(isinstance(summand[1], complex) for summand in self.pauli_list):
333
- raise ClassiqValueError(
334
- "Supporting only Hamiltonian with numeric coefficients."
335
- )
336
- return sum(
337
- cast(complex, summand[1]) * to_pauli_matrix(summand[0])
338
- for summand in self.pauli_list
339
- ) # type: ignore[return-value]
340
-
341
- @staticmethod
342
- def _extend_pauli_string(
343
- pauli_string: PydanticPauliMonomialStr, num_extra_qubits: int
344
- ) -> PydanticPauliMonomialStr:
345
- return "I" * num_extra_qubits + pauli_string
346
-
347
- def extend(self, num_extra_qubits: int) -> "PauliOperatorV1":
348
- new_pauli_list = [
349
- (self._extend_pauli_string(pauli_string, num_extra_qubits), coeff)
350
- for (pauli_string, coeff) in self.pauli_list
351
- ]
352
- return self.copy(update={"pauli_list": new_pauli_list}, deep=True)
353
-
354
- @staticmethod
355
- def _reorder_pauli_string(
356
- pauli_string: PydanticPauliMonomialStr,
357
- order: Collection[int],
358
- new_num_qubits: int,
359
- ) -> PydanticPauliMonomialStr:
360
- reversed_pauli_string = pauli_string[::-1]
361
- reversed_new_pauli_string = ["I"] * new_num_qubits
362
-
363
- for logical_pos, actual_pos in enumerate(order):
364
- reversed_new_pauli_string[actual_pos] = reversed_pauli_string[logical_pos]
365
-
366
- return "".join(reversed(reversed_new_pauli_string))
367
-
368
- @staticmethod
369
- def _validate_reorder(
370
- order: Collection[int],
371
- num_qubits: int,
372
- num_extra_qubits: int,
373
- ) -> None:
374
- if num_extra_qubits < 0:
375
- raise ClassiqValueError("Number of extra qubits cannot be negative")
376
-
377
- if len(order) != num_qubits:
378
- raise ClassiqValueError("The qubits order doesn't match the Pauli operator")
379
-
380
- if len(order) != len(set(order)):
381
- raise ClassiqValueError("The qubits order is not one-to-one")
382
-
383
- if not all(pos < num_qubits + num_extra_qubits for pos in order):
384
- raise ClassiqValueError(
385
- "The qubits order contains qubits which do no exist"
386
- )
387
-
388
- @classmethod
389
- def reorder(
390
- cls,
391
- operator: "PauliOperatorV1",
392
- order: Collection[int],
393
- num_extra_qubits: int = 0,
394
- ) -> "PauliOperatorV1":
395
- cls._validate_reorder(order, operator.num_qubits, num_extra_qubits)
396
-
397
- new_num_qubits = operator.num_qubits + num_extra_qubits
398
- new_pauli_list = [
399
- (cls._reorder_pauli_string(pauli_string, order, new_num_qubits), coeff)
400
- for pauli_string, coeff in operator.pauli_list
401
- ]
402
- return cls(pauli_list=new_pauli_list)
403
-
404
- @classmethod
405
- def from_unzipped_lists(
406
- cls,
407
- operators: List[List[Pauli]],
408
- coefficients: Optional[List[complex]] = None,
409
- ) -> "PauliOperatorV1":
410
- if coefficients is None:
411
- coefficients = [1] * len(operators)
412
-
413
- if len(operators) != len(coefficients):
414
- raise ClassiqValueError(
415
- f"The number of coefficients ({len(coefficients)}) must be equal to the number of pauli operators ({len(operators)})"
416
- )
417
-
418
- return cls(
419
- pauli_list=[
420
- (pauli_integers_to_str(op), coeff)
421
- for op, coeff in zip(operators, coefficients)
422
- ]
423
- )
424
-
425
- class Config:
426
- frozen = True
260
+ model_config = ConfigDict(frozen=True)
427
261
 
428
262
 
429
263
  # This class validates the length of a monomial.
@@ -432,8 +266,7 @@ class _PauliMonomialLengthValidator:
432
266
  monomial: PydanticPauliMonomial
433
267
 
434
268
 
435
- @pydantic.dataclasses.dataclass
436
- class _PauliMonomialParser:
269
+ class _PauliMonomialParser(pydantic.BaseModel):
437
270
  string: PydanticPauliMonomialStr
438
271
  coeff: PydanticParameterComplexType
439
272
 
@@ -466,9 +299,9 @@ def validate_operator_has_no_complex_coefficients(
466
299
  return pauli_operator
467
300
 
468
301
 
469
- def pauli_integers_to_str(paulis: List[Pauli]) -> str:
302
+ def pauli_integers_to_str(paulis: list[Pauli]) -> str:
470
303
  return "".join([Pauli(pauli).name for pauli in paulis])
471
304
 
472
305
 
473
306
  class PauliOperators(VersionedModel):
474
- operators: List[PauliOperator]
307
+ operators: list[PauliOperator]
@@ -1,4 +1,4 @@
1
- from classiq._internals.enum_utils import StrEnum
1
+ from classiq.interface.enum_utils import StrEnum
2
2
 
3
3
 
4
4
  class EncodingType(StrEnum):
@@ -1,10 +1,8 @@
1
- from typing import List
2
-
3
1
  import numpy as np
4
2
  import pyomo.core as pyo
5
3
 
6
4
 
7
- def ascending_sequence(coeffs: List[int], bound: int) -> pyo.ConcreteModel:
5
+ def ascending_sequence(coeffs: list[int], bound: int) -> pyo.ConcreteModel:
8
6
  model = pyo.ConcreteModel()
9
7
  model.x = pyo.Var(
10
8
  range(len(coeffs)), domain=pyo.NonNegativeIntegers, bounds=(0, bound)
@@ -1,16 +1,14 @@
1
- from typing import List, Tuple
2
-
3
1
  import numpy as np
4
2
  import pyomo.core as pyo
5
3
 
6
4
 
7
5
  def integer_portfolio_optimization(
8
- covariances: np.ndarray, returns: np.ndarray, upper_bounds: List[int]
6
+ covariances: np.ndarray, returns: np.ndarray, upper_bounds: list[int]
9
7
  ) -> pyo.ConcreteModel:
10
8
  model = pyo.ConcreteModel()
11
9
  num_assets = len(returns)
12
10
 
13
- def bounds(model: pyo.ConcreteModel, i: int) -> Tuple[int, int]:
11
+ def bounds(model: pyo.ConcreteModel, i: int) -> tuple[int, int]:
14
12
  return 0, upper_bounds[i]
15
13
 
16
14
  model.x = pyo.Var(range(num_assets), domain=pyo.NonNegativeIntegers, bounds=bounds)
@@ -1,13 +1,13 @@
1
- from typing import List, Optional
1
+ from typing import Optional
2
2
 
3
3
  import numpy as np
4
4
  import pyomo.core as pyo
5
5
 
6
6
 
7
7
  def knapsack(
8
- values: List[int],
8
+ values: list[int],
9
9
  upper_bound: int,
10
- weights: Optional[List[int]] = None,
10
+ weights: Optional[list[int]] = None,
11
11
  max_weight: Optional[int] = None,
12
12
  ) -> pyo.ConcreteModel:
13
13
  model = pyo.ConcreteModel()
@@ -1,12 +1,12 @@
1
1
  import math
2
- from typing import Dict, Tuple
3
2
 
4
3
  import networkx as nx
5
4
  import pyomo.core as pyo
5
+ import pyomo.core.expr.numeric_expr as pyo_expr
6
6
 
7
7
  Node = int
8
- Edge = Tuple[Node, Node]
9
- Pubo = Dict[Tuple[Edge, ...], float]
8
+ Edge = tuple[Node, Node]
9
+ Pubo = dict[tuple[Edge, ...], float]
10
10
 
11
11
 
12
12
  def build_mht_pyomo_model(
@@ -22,7 +22,9 @@ def build_mht_pyomo_model(
22
22
  if has_constraints:
23
23
 
24
24
  @model.Constraint(model.Nodes)
25
- def out_edges_rule(model: pyo.ConcreteModel, idx: int) -> pyo.ExpressionBase:
25
+ def out_edges_rule(
26
+ model: pyo.ConcreteModel, idx: int
27
+ ) -> pyo_expr.ExpressionBase:
26
28
  out_nodes = [
27
29
  node_id for node_id in model.Nodes if [idx, node_id] in model.Arcs
28
30
  ]
@@ -32,7 +34,9 @@ def build_mht_pyomo_model(
32
34
  return pyo.Constraint.Feasible
33
35
 
34
36
  @model.Constraint(model.Nodes)
35
- def in_edges_rule(model: pyo.ConcreteModel, idx: int) -> pyo.ExpressionBase:
37
+ def in_edges_rule(
38
+ model: pyo.ConcreteModel, idx: int
39
+ ) -> pyo_expr.ExpressionBase:
36
40
  in_nodes = [
37
41
  node_id for node_id in model.Nodes if [node_id, idx] in model.Arcs
38
42
  ]
@@ -41,7 +45,7 @@ def build_mht_pyomo_model(
41
45
  else:
42
46
  return pyo.Constraint.Feasible
43
47
 
44
- def obj_expression(model: pyo.ConcreteModel) -> pyo.ExpressionBase:
48
+ def obj_expression(model: pyo.ConcreteModel) -> pyo_expr.ExpressionBase:
45
49
  return sum(
46
50
  round(pubo_energy, _decimals)
47
51
  * math.prod(model.x[edge] for edge in pubo_edges)
@@ -1,9 +1,9 @@
1
- from typing import List, Tuple, Union
1
+ from typing import Union
2
2
 
3
3
  import numpy as np
4
4
  import pyomo.core as pyo
5
5
 
6
- BoundsList = List[Union[Tuple[int, int], int]]
6
+ BoundsList = list[Union[tuple[int, int], int]]
7
7
 
8
8
 
9
9
  def portfolio_optimization_binary(
@@ -1,11 +1,10 @@
1
1
  import itertools
2
- from typing import List
3
2
 
4
3
  import pyomo.core as pyo
5
4
  import pyomo.core.expr.numeric_expr as pyo_expr
6
5
 
7
6
 
8
- def set_cover(sub_sets: List[List[int]]) -> pyo.ConcreteModel:
7
+ def set_cover(sub_sets: list[list[int]]) -> pyo.ConcreteModel:
9
8
  entire_set = set(itertools.chain(*sub_sets))
10
9
  n = max(entire_set)
11
10
  num_sets = len(sub_sets)
@@ -1,11 +1,9 @@
1
- from typing import List
2
-
3
1
  import more_itertools
4
2
  import numpy as np
5
3
  import pydantic
6
4
  from pydantic import BaseModel
7
5
 
8
- from classiq.exceptions import ClassiqValueError
6
+ from classiq.interface.exceptions import ClassiqValueError
9
7
 
10
8
  _TOLERANCE_DECIMALS = 6
11
9
 
@@ -24,7 +22,7 @@ class MhtQaoaInput(BaseModel):
24
22
  reps: pydantic.PositiveInt = pydantic.Field(
25
23
  default=3, description="Number of QAOA layers."
26
24
  )
27
- plot_list: List[PlotData] = pydantic.Field(
25
+ plot_list: list[PlotData] = pydantic.Field(
28
26
  description="The list of (x,y,t) plots of the MHT problem."
29
27
  )
30
28
  misdetection_maximum_time_steps: pydantic.NonNegativeInt = pydantic.Field(
@@ -53,10 +51,11 @@ class MhtQaoaInput(BaseModel):
53
51
  def is_valid_cost(self, cost: float) -> bool:
54
52
  return True
55
53
 
56
- @pydantic.validator("plot_list")
54
+ @pydantic.field_validator("plot_list")
55
+ @classmethod
57
56
  def round_plot_list_times_and_validate(
58
- cls, plot_list: List[PlotData]
59
- ) -> List[PlotData]:
57
+ cls, plot_list: list[PlotData]
58
+ ) -> list[PlotData]:
60
59
  MhtQaoaInput._check_all_ids_are_distinct(plot_list)
61
60
  MhtQaoaInput._round_to_tolerance_decimals(plot_list)
62
61
 
@@ -74,11 +73,11 @@ class MhtQaoaInput(BaseModel):
74
73
  return plot_list
75
74
 
76
75
  @staticmethod
77
- def _round_to_tolerance_decimals(plot_list: List[PlotData]) -> None:
76
+ def _round_to_tolerance_decimals(plot_list: list[PlotData]) -> None:
78
77
  for plot in plot_list:
79
78
  plot.t = np.round(plot.t, decimals=_TOLERANCE_DECIMALS)
80
79
 
81
80
  @staticmethod
82
- def _check_all_ids_are_distinct(plot_list: List[PlotData]) -> None:
81
+ def _check_all_ids_are_distinct(plot_list: list[PlotData]) -> None:
83
82
  if not more_itertools.all_unique(plot.plot_id for plot in plot_list):
84
83
  raise ClassiqValueError("Plot IDs should be unique.")
@@ -1,4 +1,4 @@
1
- from typing import Any, Dict
1
+ from typing import Any
2
2
 
3
3
  import pydantic
4
4
  from pydantic import BaseModel
@@ -14,4 +14,4 @@ class MaxCutProblem(BaseModel):
14
14
  default_factory=CombinatorialOptimizer,
15
15
  description="preferences for the VQE execution",
16
16
  )
17
- serialized_graph: Dict[str, Any]
17
+ serialized_graph: dict[str, Any]
@@ -1,10 +1,8 @@
1
- from typing import List
2
-
3
1
  from classiq.interface.helpers.versioned_model import VersionedModel
4
2
 
5
3
 
6
4
  class AnglesResult(VersionedModel):
7
- initial_point: List[float]
5
+ initial_point: list[float]
8
6
 
9
7
 
10
8
  class PyomoObjectResult(VersionedModel):
@@ -1,4 +1,4 @@
1
- from classiq._internals.enum_utils import StrEnum
1
+ from classiq.interface.enum_utils import StrEnum
2
2
 
3
3
 
4
4
  class QSolver(StrEnum):