classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,43 +1,36 @@
1
- from __future__ import annotations
2
-
3
- import abc
4
- from typing import Iterable, Optional
1
+ from collections.abc import Iterable
2
+ from typing import TYPE_CHECKING, Final, Optional
5
3
 
6
4
  import pydantic
5
+ from pydantic import ConfigDict
7
6
 
8
- from classiq.interface.generator.arith import number_utils
7
+ from classiq.interface.exceptions import ClassiqValueError
8
+ from classiq.interface.generator.arith import argument_utils, number_utils
9
9
  from classiq.interface.generator.arith.arithmetic_operations import (
10
+ MODULO_WITH_FRACTION_PLACES_ERROR_MSG,
10
11
  ArithmeticOperationParams,
11
12
  )
12
13
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
13
14
  from classiq.interface.generator.function_params import get_zero_input_name
14
15
 
15
- UNARY_ARG_NAME: str = "arg"
16
+ UNARY_ARG_NAME: Final[str] = "arg"
16
17
 
17
18
 
18
19
  class UnaryOpParams(ArithmeticOperationParams):
19
20
  arg: RegisterArithmeticInfo
20
21
  inplace: bool = False
21
22
 
22
- @abc.abstractmethod
23
- def _expected_result_size(self) -> pydantic.PositiveInt:
24
- pass
25
-
26
- def actual_result_size(self) -> int:
27
- return self.output_size or self._expected_result_size()
28
-
29
23
  def garbage_output_size(self) -> pydantic.NonNegativeInt:
30
- return int(self.is_inplaced()) * max(
31
- self.arg.size - self.actual_result_size(), 0
24
+ return int(self.is_inplaced()) * (
25
+ max(self.arg.integer_part_size - self.result_register.integer_part_size, 0)
26
+ + max(self.arg.fraction_places - self.result_register.fraction_places, 0)
32
27
  )
33
28
 
34
29
  def should_add_zero_inputs(self) -> bool:
35
- return not self.is_inplaced() or self.should_add_zero_input_for_extension()
30
+ return not self.is_inplaced() or self.zero_input_for_extension() > 0
36
31
 
37
- def should_add_zero_input_for_extension(
38
- self, output_size: Optional[int] = None
39
- ) -> bool:
40
- return (output_size or self.result_register.size) > self.arg.size
32
+ def zero_input_for_extension(self) -> pydantic.NonNegativeInt:
33
+ return max(0, self.result_register.size - self.arg.size)
41
34
 
42
35
  def _create_ios(self) -> None:
43
36
  self._inputs = {UNARY_ARG_NAME: self.arg}
@@ -49,8 +42,8 @@ class UnaryOpParams(ArithmeticOperationParams):
49
42
  zero_input_register = self.result_register
50
43
  self._zero_inputs = {zero_input_name: zero_input_register}
51
44
  return
52
- if self.should_add_zero_input_for_extension():
53
- output_extension_size = self.result_register.size - self.arg.size
45
+ if self.zero_input_for_extension() > 0:
46
+ output_extension_size = self.zero_input_for_extension()
54
47
  self._create_zero_input_registers({zero_input_name: output_extension_size})
55
48
  if self.garbage_output_size() > 0:
56
49
  self._outputs[self.garbage_output_name] = RegisterArithmeticInfo(
@@ -60,62 +53,80 @@ class UnaryOpParams(ArithmeticOperationParams):
60
53
  def is_inplaced(self) -> bool:
61
54
  return self.inplace
62
55
 
63
- def get_params_inplace_options(self) -> Iterable[UnaryOpParams]:
64
- params_kwargs = self.copy().__dict__
56
+ def get_params_inplace_options(self) -> Iterable["UnaryOpParams"]:
57
+ params_kwargs = self.model_copy().model_dump()
65
58
  params_kwargs["inplace"] = True
66
59
  yield self.__class__(**params_kwargs)
67
60
 
68
- class Config:
69
- arbitrary_types_allowed = True
61
+ model_config = ConfigDict(arbitrary_types_allowed=True)
70
62
 
71
63
 
72
64
  class BitwiseInvert(UnaryOpParams):
73
65
  output_name = "inverted"
74
66
 
75
- def _expected_result_size(self) -> pydantic.PositiveInt:
76
- return self.arg.size
77
-
78
67
  def _get_result_register(self) -> RegisterArithmeticInfo:
68
+ eff_arg = argument_utils.limit_fraction_places(self.arg, self.machine_precision)
69
+ if TYPE_CHECKING:
70
+ assert isinstance(eff_arg, RegisterArithmeticInfo)
79
71
  return RegisterArithmeticInfo(
80
- size=self.actual_result_size(),
81
- fraction_places=self.arg.fraction_places,
82
- is_signed=self.arg.is_signed and self._include_sign,
72
+ size=self.output_size or eff_arg.size,
73
+ fraction_places=eff_arg.fraction_places,
74
+ is_signed=eff_arg.is_signed and self._include_sign,
83
75
  )
84
76
 
85
77
 
86
78
  class Negation(UnaryOpParams):
79
+ bypass_bounds_validation: bool = pydantic.Field(
80
+ default=False
81
+ ) # True for efficient subtraction
87
82
  output_name = "negated"
88
83
 
89
- def _expected_result_size(self) -> pydantic.PositiveInt:
90
- if self.arg.size == 1:
84
+ @staticmethod
85
+ def _expected_result_size(arg: RegisterArithmeticInfo) -> pydantic.PositiveInt:
86
+ if arg.size == 1:
91
87
  return 1
92
- return self.arg.fraction_places + number_utils.bounds_to_integer_part_size(
93
- *(-bound for bound in self.arg.bounds)
88
+ return arg.fraction_places + number_utils.bounds_to_integer_part_size(
89
+ *(-bound for bound in arg.bounds)
94
90
  )
95
91
 
96
92
  def _get_result_register(self) -> RegisterArithmeticInfo:
97
- is_signed = max(self.arg.bounds) > 0 and self._include_sign
98
- bounds = (-max(self.arg.bounds), -min(self.arg.bounds))
93
+ eff_arg = self.arg.limit_fraction_places(self.machine_precision)
94
+ is_signed = max(eff_arg.bounds) > 0 and self._include_sign
95
+ bounds = (-max(eff_arg.bounds), -min(eff_arg.bounds))
96
+ if self.output_size and not self.bypass_bounds_validation:
97
+ if eff_arg.fraction_places:
98
+ raise ValueError(MODULO_WITH_FRACTION_PLACES_ERROR_MSG)
99
+ max_bounds = RegisterArithmeticInfo.get_maximal_bounds(
100
+ size=self.output_size, is_signed=False, fraction_places=0
101
+ )
102
+ bounds = number_utils.bounds_cut(bounds, max_bounds)
99
103
  return RegisterArithmeticInfo(
100
- size=self.actual_result_size(),
101
- fraction_places=self.arg.fraction_places,
104
+ size=self.output_size or self._expected_result_size(eff_arg),
105
+ fraction_places=eff_arg.fraction_places,
102
106
  is_signed=is_signed,
103
- bounds=bounds if (is_signed or min(bounds) >= 0) else None,
107
+ bypass_bounds_validation=self.bypass_bounds_validation,
108
+ bounds=bounds,
104
109
  )
105
110
 
111
+ def zero_input_for_extension(self) -> pydantic.NonNegativeInt:
112
+ eff_arg = self.arg.limit_fraction_places(self.machine_precision)
113
+ if (self.output_size or eff_arg.size) == 1:
114
+ return 0
115
+ return (
116
+ self.output_size or self._expected_result_size(self.arg)
117
+ ) - self.arg.size
118
+
106
119
 
107
120
  class Sign(UnaryOpParams):
108
121
  output_name = "sign"
109
122
 
110
- @pydantic.validator("output_size")
123
+ @pydantic.field_validator("output_size")
124
+ @classmethod
111
125
  def _validate_output_size(
112
126
  cls, output_size: Optional[pydantic.PositiveInt]
113
127
  ) -> pydantic.PositiveInt:
114
128
  if output_size is not None and output_size != 1:
115
- raise ValueError("Sign output size must be 1")
116
- return 1
117
-
118
- def _expected_result_size(self) -> pydantic.PositiveInt:
129
+ raise ClassiqValueError("Sign output size must be 1")
119
130
  return 1
120
131
 
121
132
  def _get_result_register(self) -> RegisterArithmeticInfo:
@@ -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 UncomputationMethods(StrEnum):
@@ -1,19 +1,12 @@
1
- from typing import Any, Iterable
1
+ from collections.abc import Iterable
2
+ from typing import Any
2
3
 
3
4
  from classiq.interface.generator.functions.classical_function_declaration import (
4
5
  ClassicalFunctionDeclaration,
5
6
  )
6
- from classiq.interface.generator.types.struct_declaration import StructDeclaration
7
- from classiq.interface.model.quantum_function_declaration import (
8
- QuantumFunctionDeclaration,
9
- )
10
7
 
11
8
 
12
9
  def populate_builtin_declarations(decls: Iterable[Any]) -> None:
13
10
  for decl in decls:
14
- if isinstance(decl, QuantumFunctionDeclaration):
15
- QuantumFunctionDeclaration.BUILTIN_FUNCTION_DECLARATIONS[decl.name] = decl
16
11
  if isinstance(decl, ClassicalFunctionDeclaration):
17
12
  ClassicalFunctionDeclaration.FOREIGN_FUNCTION_DECLARATIONS[decl.name] = decl
18
- if isinstance(decl, StructDeclaration):
19
- StructDeclaration.BUILTIN_STRUCT_DECLARATIONS[decl.name] = decl
@@ -4,6 +4,7 @@ from classiq.interface.chemistry.ground_state_problem import (
4
4
  CHEMISTRY_PROBLEMS_TYPE,
5
5
  GroundStateProblem,
6
6
  )
7
+ from classiq.interface.exceptions import ClassiqValueError
7
8
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
8
9
  from classiq.interface.generator.function_params import (
9
10
  DEFAULT_INPUT_NAME,
@@ -13,16 +14,15 @@ from classiq.interface.generator.function_params import (
13
14
 
14
15
 
15
16
  class ChemistryFunctionParams(FunctionParams):
16
- gs_problem: CHEMISTRY_PROBLEMS_TYPE = pydantic.Field(
17
- description="Ground state problem object describing the system."
18
- )
17
+ gs_problem: CHEMISTRY_PROBLEMS_TYPE
19
18
 
20
- @pydantic.validator("gs_problem")
19
+ @pydantic.field_validator("gs_problem")
20
+ @classmethod
21
21
  def validate_gs_problem_contains_num_qubits(
22
22
  cls, gs_problem: CHEMISTRY_PROBLEMS_TYPE
23
23
  ) -> CHEMISTRY_PROBLEMS_TYPE:
24
24
  if not gs_problem.num_qubits:
25
- raise ValueError(
25
+ raise ClassiqValueError(
26
26
  "Ground state problem doesn't contain num_qubits. "
27
27
  "Use update_problem method."
28
28
  )
@@ -1,7 +1,8 @@
1
- from typing import Dict, Optional
1
+ from typing import Optional
2
2
 
3
3
  import pydantic
4
4
 
5
+ from classiq.interface.exceptions import ClassiqMissingOutputFormatError
5
6
  from classiq.interface.executor.quantum_instruction_set import QuantumInstructionSet
6
7
  from classiq.interface.generator.circuit_code.types_and_constants import (
7
8
  INSTRUCTION_SET_TO_FORMAT,
@@ -12,17 +13,16 @@ from classiq.interface.generator.circuit_code.types_and_constants import (
12
13
  )
13
14
  from classiq.interface.generator.model.preferences.preferences import QuantumFormat
14
15
 
15
- from classiq.exceptions import ClassiqMissingOutputFormatError
16
-
17
16
 
18
17
  class CircuitCodeInterface(pydantic.BaseModel):
19
- outputs: Dict[QuantumFormat, Code]
18
+ outputs: dict[QuantumFormat, Code]
20
19
  qasm_version: QasmVersion
21
20
 
22
- @pydantic.validator("outputs")
21
+ @pydantic.field_validator("outputs")
22
+ @classmethod
23
23
  def reformat_long_string_output_formats(
24
- cls, outputs: Dict[QuantumFormat, str]
25
- ) -> Dict[QuantumFormat, LongStr]:
24
+ cls, outputs: dict[QuantumFormat, str]
25
+ ) -> dict[QuantumFormat, LongStr]:
26
26
  return {key: LongStr(value) for key, value in outputs.items()}
27
27
 
28
28
  @property
@@ -1,22 +1,19 @@
1
- from typing import Dict, Tuple
2
-
3
1
  from typing_extensions import TypeAlias
4
2
 
3
+ from classiq.interface.enum_utils import StrEnum
5
4
  from classiq.interface.executor.quantum_instruction_set import QuantumInstructionSet
6
5
  from classiq.interface.generator.model.preferences.preferences import QuantumFormat
7
6
  from classiq.interface.hardware import Provider
8
7
 
9
- from classiq._internals.enum_utils import StrEnum
10
-
11
8
  Code: TypeAlias = str
12
- CodeAndSyntax: TypeAlias = Tuple[Code, QuantumInstructionSet]
9
+ CodeAndSyntax: TypeAlias = tuple[Code, QuantumInstructionSet]
13
10
 
14
- INSTRUCTION_SET_TO_FORMAT: Dict[QuantumInstructionSet, QuantumFormat] = {
11
+ INSTRUCTION_SET_TO_FORMAT: dict[QuantumInstructionSet, QuantumFormat] = {
15
12
  QuantumInstructionSet.QASM: QuantumFormat.QASM,
16
13
  QuantumInstructionSet.QSHARP: QuantumFormat.QSHARP,
17
14
  QuantumInstructionSet.IONQ: QuantumFormat.IONQ,
18
15
  }
19
- VENDOR_TO_INSTRUCTION_SET: Dict[Provider, QuantumInstructionSet] = {
16
+ VENDOR_TO_INSTRUCTION_SET: dict[Provider, QuantumInstructionSet] = {
20
17
  Provider.CLASSIQ: QuantumInstructionSet.QASM,
21
18
  Provider.IONQ: QuantumInstructionSet.IONQ,
22
19
  Provider.AZURE_QUANTUM: QuantumInstructionSet.QSHARP,
@@ -2,13 +2,14 @@ import pydantic
2
2
 
3
3
  from classiq.interface.chemistry import operator
4
4
  from classiq.interface.chemistry.operator import PauliOperator
5
+ from classiq.interface.exceptions import ClassiqValueError
5
6
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
6
7
  from classiq.interface.generator.function_params import (
7
8
  DEFAULT_INPUT_NAME,
8
9
  DEFAULT_OUTPUT_NAME,
9
10
  FunctionParams,
11
+ FunctionParamsNumericParameter,
10
12
  )
11
- from classiq.interface.generator.parameters import ParameterFloatType
12
13
 
13
14
 
14
15
  class CommutingPauliExponentiation(FunctionParams):
@@ -19,20 +20,21 @@ class CommutingPauliExponentiation(FunctionParams):
19
20
  pauli_operator: PauliOperator = pydantic.Field(
20
21
  description="A weighted sum of Pauli strings."
21
22
  )
22
- evolution_coefficient: ParameterFloatType = pydantic.Field(
23
+ evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
23
24
  default=1.0,
24
25
  description="A global coefficient multiplying the operator.",
25
- is_exec_param=True,
26
26
  )
27
27
 
28
- @pydantic.validator("pauli_operator")
28
+ @pydantic.field_validator("pauli_operator")
29
+ @classmethod
29
30
  def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
30
31
  return operator.validate_operator_is_hermitian(pauli_operator)
31
32
 
32
- @pydantic.validator("pauli_operator")
33
+ @pydantic.field_validator("pauli_operator")
34
+ @classmethod
33
35
  def _validate_paulis_commute(cls, pauli_operator: PauliOperator) -> PauliOperator:
34
36
  if not pauli_operator.is_commutative:
35
- raise ValueError("Pauli strings are not commutative")
37
+ raise ClassiqValueError("Pauli strings are not commutative")
36
38
  return pauli_operator
37
39
 
38
40
  def _create_ios(self) -> None:
@@ -0,0 +1,8 @@
1
+ EXPANDED_KEYWORD = "expanded__"
2
+ CAPTURE_SUFFIX = "_captured__"
3
+ LAMBDA_KEYWORD = "lambda__"
4
+ INPLACE_ARITH_AUX_VAR_PREFIX = "result__temp__"
5
+
6
+
7
+ def generate_original_function_name(name: str) -> str:
8
+ return name.split(f"_{EXPANDED_KEYWORD}")[0]
@@ -1,30 +1,18 @@
1
- from typing import Any
1
+ from typing import Annotated, Union
2
2
 
3
- import pydantic.json
4
- from typing_extensions import Self
3
+ from pydantic import PlainSerializer, PlainValidator
4
+ from pydantic.json_schema import WithJsonSchema
5
5
 
6
6
 
7
- # Use this class as a type for complex data from the json, e.g., in the state_propagator function.
8
- class Complex(complex):
9
- @classmethod
10
- def __get_validators__(cls):
11
- yield cls.validate
7
+ def validate_complex(v: Union[complex, str]) -> complex:
8
+ if isinstance(v, str):
9
+ v = "".join(v.split())
10
+ return complex(v)
12
11
 
13
- @classmethod
14
- def __modify_schema__(cls, field_schema):
15
- field_schema.update(
16
- pattern=r"[+-]?\d+\.?\d* *[+-] *\d+\.?\d*j",
17
- )
18
12
 
19
- @classmethod
20
- def validate(cls, v: Any) -> Self:
21
- if isinstance(v, str):
22
- v = "".join(v.split())
23
-
24
- return cls(v)
25
-
26
-
27
- assert (
28
- complex not in pydantic.json.ENCODERS_BY_TYPE
29
- ), "Is complex type supported on newer version of pydantic?"
30
- pydantic.json.ENCODERS_BY_TYPE[complex] = str
13
+ Complex = Annotated[
14
+ complex,
15
+ PlainValidator(validate_complex),
16
+ PlainSerializer(lambda x: str(x)),
17
+ WithJsonSchema({"type": "string", "pattern": r"[+-]?\d+\.?\d* *[+-] *\d+\.?\d*j"}),
18
+ ]
@@ -1,10 +1,9 @@
1
- import pydantic
2
-
1
+ from classiq.interface.ast_node import ASTNode
3
2
  from classiq.interface.generator.expressions.expression import Expression
4
- from classiq.interface.generator.functions.classical_type import ConcreteClassicalType
3
+ from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
5
4
 
6
5
 
7
- class Constant(pydantic.BaseModel):
6
+ class Constant(ASTNode):
8
7
  name: str
9
8
  const_type: ConcreteClassicalType
10
9
  value: Expression
@@ -1,10 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict
3
+ from typing import Any
4
4
 
5
5
  import pydantic
6
- from pydantic import BaseModel
6
+ from pydantic import BaseModel, ConfigDict
7
7
 
8
+ from classiq.interface.exceptions import ClassiqValueError
8
9
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
9
10
 
10
11
  _DEFAULT_CONTROL_NAME: str = "ctrl"
@@ -17,45 +18,52 @@ class ControlState(BaseModel):
17
18
  default=_DEFAULT_NUM_CONTROL_QUBITS, description="Number of control qubits"
18
19
  )
19
20
  ctrl_state: str = pydantic.Field(
20
- default=_INVALID_CONTROL_STATE, description="Control state string"
21
+ default=_INVALID_CONTROL_STATE,
22
+ description="Control state string",
23
+ validate_default=True,
24
+ )
25
+ name: str = pydantic.Field(
26
+ default=_DEFAULT_CONTROL_NAME, description="Control name"
21
27
  )
22
- name: str = pydantic.Field(default=None, description="Control name")
23
28
 
24
- @pydantic.root_validator()
25
- def _validate_control(cls, values: Dict[str, Any]) -> Dict[str, Any]:
26
- num_ctrl_qubits: int = values.get(
27
- "num_ctrl_qubits", _DEFAULT_NUM_CONTROL_QUBITS
28
- )
29
- ctrl_state: str = values.get("ctrl_state", _INVALID_CONTROL_STATE)
29
+ @pydantic.model_validator(mode="before")
30
+ @classmethod
31
+ def _validate_control(cls, values: Any) -> dict[str, Any]:
32
+ if isinstance(values, dict):
33
+ num_ctrl_qubits: int = (
34
+ values.get("num_ctrl_qubits", _DEFAULT_NUM_CONTROL_QUBITS) or 0
35
+ )
30
36
 
31
- if ctrl_state == _INVALID_CONTROL_STATE:
32
- ctrl_state = "1" * num_ctrl_qubits
33
- values["ctrl_state"] = ctrl_state
37
+ ctrl_state: str = values.get("ctrl_state") or _INVALID_CONTROL_STATE
34
38
 
35
- cls.validate_control_string(ctrl_state)
39
+ if ctrl_state == _INVALID_CONTROL_STATE:
40
+ ctrl_state = "1" * num_ctrl_qubits
41
+ values["ctrl_state"] = ctrl_state
36
42
 
37
- if num_ctrl_qubits == _DEFAULT_NUM_CONTROL_QUBITS:
38
- num_ctrl_qubits = len(ctrl_state)
39
- values["num_ctrl_qubits"] = num_ctrl_qubits
43
+ cls.validate_control_string(ctrl_state)
40
44
 
41
- if len(ctrl_state) != num_ctrl_qubits:
42
- raise ValueError(
43
- "Control state length should be equal to the number of control qubits"
44
- )
45
+ if num_ctrl_qubits == _DEFAULT_NUM_CONTROL_QUBITS:
46
+ num_ctrl_qubits = len(ctrl_state)
47
+ values["num_ctrl_qubits"] = num_ctrl_qubits
45
48
 
46
- if values.get("name") is None:
47
- values["name"] = f"{_DEFAULT_CONTROL_NAME}_{ctrl_state}"
49
+ if len(ctrl_state) != num_ctrl_qubits:
50
+ raise ClassiqValueError(
51
+ "Control state length should be equal to the number of control qubits"
52
+ )
53
+
54
+ if "name" not in values or values["name"] is None:
55
+ values["name"] = f"{_DEFAULT_CONTROL_NAME}_{ctrl_state}"
48
56
 
49
57
  return values
50
58
 
51
59
  @staticmethod
52
60
  def validate_control_string(ctrl_state: str) -> None:
61
+ if not ctrl_state:
62
+ raise ClassiqValueError("Control state cannot be empty")
53
63
  if not set(ctrl_state) <= {"1", "0"}:
54
- raise ValueError(
64
+ raise ClassiqValueError(
55
65
  f"Control state can only be constructed from 0 and 1, received: {ctrl_state}"
56
66
  )
57
- if not ctrl_state:
58
- raise ValueError("Control state cannot be empty")
59
67
 
60
68
  def __str__(self) -> str:
61
69
  return self.ctrl_state
@@ -70,5 +78,4 @@ class ControlState(BaseModel):
70
78
  def rename(self, name: str) -> ControlState:
71
79
  return ControlState(ctrl_state=self.ctrl_state, name=name)
72
80
 
73
- class Config:
74
- frozen = True
81
+ model_config = ConfigDict(frozen=True)
@@ -0,0 +1,47 @@
1
+ from typing import Optional
2
+
3
+ import pydantic
4
+
5
+ from classiq.interface.generator.arith import argument_utils
6
+ from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
7
+ from classiq.interface.generator.function_params import FunctionParams
8
+
9
+
10
+ class Copy(FunctionParams):
11
+ source: argument_utils.RegisterOrConst
12
+ target: RegisterArithmeticInfo
13
+ output_size: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
14
+
15
+ @property
16
+ def source_size(self) -> int:
17
+ return argument_utils.size(self.source)
18
+
19
+ @property
20
+ def source_reg_size(self) -> int:
21
+ return (
22
+ self.source.size if isinstance(self.source, RegisterArithmeticInfo) else 0
23
+ )
24
+
25
+ @property
26
+ def source_fraction_places(self) -> int:
27
+ return argument_utils.fraction_places(self.source)
28
+
29
+ @property
30
+ def offset(self) -> int:
31
+ return self.target.fraction_places - self.source_fraction_places
32
+
33
+ @property
34
+ def source_name(self) -> str:
35
+ return "source"
36
+
37
+ @property
38
+ def target_name(self) -> str:
39
+ return "target"
40
+
41
+ def _create_ios(self) -> None:
42
+ self._inputs = {
43
+ self.target_name: self.target,
44
+ }
45
+ if isinstance(self.source, RegisterArithmeticInfo):
46
+ self._inputs[self.source_name] = self.source
47
+ self._outputs = {**self._inputs}
@@ -1,7 +1,6 @@
1
- from typing import Dict, Type
2
-
3
1
  import pydantic
4
2
 
3
+ from classiq.interface.enum_utils import StrEnum
5
4
  from classiq.interface.generator.ansatz_library import (
6
5
  EntanglingLayersArgs,
7
6
  HypercubeArgs,
@@ -11,8 +10,6 @@ from classiq.interface.generator.ansatz_library import (
11
10
  TwoLocalArgs,
12
11
  )
13
12
 
14
- from classiq._internals.enum_utils import StrEnum
15
-
16
13
 
17
14
  class CustomAnsatzType(StrEnum):
18
15
  TwoLocal = "TwoLocal"
@@ -23,7 +20,7 @@ class CustomAnsatzType(StrEnum):
23
20
  RandomTwoQubitGates = "RandomTwoQubitGates"
24
21
 
25
22
 
26
- CUSTOM_ANSATZ_ARGS_MAPPING: Dict[CustomAnsatzType, Type[pydantic.BaseModel]] = {
23
+ CUSTOM_ANSATZ_ARGS_MAPPING: dict[CustomAnsatzType, type[pydantic.BaseModel]] = {
27
24
  CustomAnsatzType.TwoLocal: TwoLocalArgs,
28
25
  CustomAnsatzType.SeparateU3: SeparateU3Args,
29
26
  CustomAnsatzType.Hypercube: HypercubeArgs,
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  import numpy as np
4
2
 
5
3
  # Taken and modified from quantum_tsp_tutorials repository of mstechly in github.
@@ -10,7 +8,7 @@ def _distance_between_points(point_1: np.ndarray, point_2: np.ndarray) -> float:
10
8
  return float(np.linalg.norm(point_1 - point_2))
11
9
 
12
10
 
13
- def get_distance_matrix(cities: np.ndarray) -> List[List[float]]:
11
+ def get_distance_matrix(cities: np.ndarray) -> list[list[float]]:
14
12
  number_of_cities = len(cities)
15
13
  matrix = np.zeros((number_of_cities, number_of_cities))
16
14
  for i in range(number_of_cities):
@@ -20,14 +18,14 @@ def get_distance_matrix(cities: np.ndarray) -> List[List[float]]:
20
18
  return matrix.tolist()
21
19
 
22
20
 
23
- def get_rand_euclidean_distance_matrix(num_points: int) -> List[List[float]]:
21
+ def get_rand_euclidean_distance_matrix(num_points: int) -> list[list[float]]:
24
22
  _points_array_dim = 2
25
23
  points = np.random.rand(num_points, _points_array_dim)
26
24
  distance_matrix = get_distance_matrix(points)
27
25
  return distance_matrix
28
26
 
29
27
 
30
- def get_rand_distance_matrix(num_points: int) -> List[List[float]]:
28
+ def get_rand_distance_matrix(num_points: int) -> list[list[float]]:
31
29
  distance_matrix = np.random.rand(num_points, num_points)
32
30
  distance_matrix *= 0.5
33
31
  distance_matrix += distance_matrix.T
@@ -1,4 +1,5 @@
1
- from typing import Iterable, List, Union
1
+ from collections.abc import Iterable
2
+ from typing import Union
2
3
 
3
4
  EXCITATIONS_TYPE = Union[str, int, Iterable[int], Iterable[str]]
4
- EXCITATIONS_TYPE_EXACT = List[int]
5
+ EXCITATIONS_TYPE_EXACT = list[int]
@@ -1,20 +1,38 @@
1
- SUPPORTED_BUILTIN_FUNCTIONS = {"len", "sum", "print"}
1
+ from classiq.interface.generator.functions.classical_type import CLASSICAL_ATTRIBUTES
2
2
 
3
- SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS = {
3
+ SUPPORTED_PYTHON_BUILTIN_FUNCTIONS = {"len", "sum", "print"}
4
+
5
+ SUPPORTED_CLASSIQ_BUILTIN_FUNCTIONS = {
6
+ "do_div",
7
+ "do_slice",
8
+ "do_subscript",
4
9
  "hypercube_entangler_graph",
5
10
  "grid_entangler_graph",
6
- "optimization_problem_to_hamiltonian",
7
- "compute_qaoa_initial_point",
8
- "get_optimization_solution",
11
+ "qft_const_adder_phase",
9
12
  "log_normal_finance_post_process",
10
13
  "gaussian_finance_post_process",
11
14
  "get_type",
12
15
  "struct_literal",
13
16
  "get_field",
14
- "fraction_digits",
15
- "is_signed",
16
17
  "molecule_problem_to_hamiltonian",
17
18
  "fock_hamiltonian_problem_to_hamiltonian",
18
19
  "molecule_ground_state_solution_post_process",
19
- *SUPPORTED_BUILTIN_FUNCTIONS,
20
20
  }
21
+
22
+ SUPPORTED_CLASSIQ_SYMPY_WRAPPERS = {
23
+ "BitwiseAnd",
24
+ "BitwiseXor",
25
+ "BitwiseNot",
26
+ "BitwiseOr",
27
+ "LogicalXor",
28
+ }
29
+
30
+ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS = {
31
+ *SUPPORTED_CLASSIQ_BUILTIN_FUNCTIONS,
32
+ *SUPPORTED_CLASSIQ_SYMPY_WRAPPERS,
33
+ *SUPPORTED_PYTHON_BUILTIN_FUNCTIONS,
34
+ }
35
+
36
+ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS_QMOD = (
37
+ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS - CLASSICAL_ATTRIBUTES
38
+ )