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,10 +1,10 @@
1
- from typing import TYPE_CHECKING, FrozenSet, Optional
1
+ from typing import TYPE_CHECKING, Optional
2
2
 
3
3
  from typing_extensions import TypeAlias
4
4
 
5
- from classiq._internals.enum_utils import StrEnum
5
+ from classiq.interface.enum_utils import StrEnum
6
6
 
7
- BasisGates: TypeAlias = FrozenSet[str]
7
+ BasisGates: TypeAlias = frozenset[str]
8
8
 
9
9
  SINGLE_QUBIT_GATES: BasisGates = frozenset(
10
10
  (
@@ -86,6 +86,10 @@ class LowerValsEnum(StrEnum):
86
86
  if TYPE_CHECKING:
87
87
  # A subset of the gates for better type checking
88
88
  class TranspilerBasisGates(StrEnum):
89
+ """
90
+ A subset of the gates used in the transpiler.
91
+ """
92
+
89
93
  X = "x"
90
94
  CX = "cx"
91
95
  CZ = "cz"
@@ -0,0 +1,178 @@
1
+ # This file was generated automatically - do not edit manually
2
+
3
+
4
+ from enum import IntEnum
5
+
6
+
7
+ class Element(IntEnum):
8
+ H = 0
9
+ He = 1
10
+ Li = 2
11
+ Be = 3
12
+ B = 4
13
+ C = 5
14
+ N = 6
15
+ O = 7 # noqa: E741
16
+ F = 8
17
+ Ne = 9
18
+ Na = 10
19
+ Mg = 11
20
+ Al = 12
21
+ Si = 13
22
+ P = 14
23
+ S = 15
24
+ Cl = 16
25
+ Ar = 17
26
+ K = 18
27
+ Ca = 19
28
+ Sc = 20
29
+ Ti = 21
30
+ V = 22
31
+ Cr = 23
32
+ Mn = 24
33
+ Fe = 25
34
+ Co = 26
35
+ Ni = 27
36
+ Cu = 28
37
+ Zn = 29
38
+ Ga = 30
39
+ Ge = 31
40
+ As = 32
41
+ Se = 33
42
+ Br = 34
43
+ Kr = 35
44
+ Rb = 36
45
+ Sr = 37
46
+ Y = 38
47
+ Zr = 39
48
+ Nb = 40
49
+ Mo = 41
50
+ Tc = 42
51
+ Ru = 43
52
+ Rh = 44
53
+ Pd = 45
54
+ Ag = 46
55
+ Cd = 47
56
+ In = 48
57
+ Sn = 49
58
+ Sb = 50
59
+ Te = 51
60
+ I = 52 # noqa: E741
61
+ Xe = 53
62
+ Cs = 54
63
+ Ba = 55
64
+ La = 56
65
+ Ce = 57
66
+ Pr = 58
67
+ Nd = 59
68
+ Pm = 60
69
+ Sm = 61
70
+ Eu = 62
71
+ Gd = 63
72
+ Tb = 64
73
+ Dy = 65
74
+ Ho = 66
75
+ Er = 67
76
+ Tm = 68
77
+ Yb = 69
78
+ Lu = 70
79
+ Hf = 71
80
+ Ta = 72
81
+ W = 73
82
+ Re = 74
83
+ Os = 75
84
+ Ir = 76
85
+ Pt = 77
86
+ Au = 78
87
+ Hg = 79
88
+ Tl = 80
89
+ Pb = 81
90
+ Bi = 82
91
+ Po = 83
92
+ At = 84
93
+ Rn = 85
94
+ Fr = 86
95
+ Ra = 87
96
+ Ac = 88
97
+ Th = 89
98
+ Pa = 90
99
+ U = 91
100
+ Np = 92
101
+ Pu = 93
102
+ Am = 94
103
+ Cm = 95
104
+ Bk = 96
105
+ Cf = 97
106
+ Es = 98
107
+ Fm = 99
108
+ Md = 100
109
+ No = 101
110
+ Lr = 102
111
+ Rf = 103
112
+ Db = 104
113
+ Sg = 105
114
+ Bh = 106
115
+ Hs = 107
116
+ Mt = 108
117
+ Ds = 109
118
+ Rg = 110
119
+ Cn = 111
120
+ Nh = 112
121
+ Fl = 113
122
+ Mc = 114
123
+ Lv = 115
124
+ Ts = 116
125
+ Og = 117
126
+
127
+
128
+ class FermionMapping(IntEnum):
129
+ JORDAN_WIGNER = 0
130
+ PARITY = 1
131
+ BRAVYI_KITAEV = 2
132
+ FAST_BRAVYI_KITAEV = 3
133
+
134
+
135
+ class FinanceFunctionType(IntEnum):
136
+ VAR = 0
137
+ SHORTFALL = 1
138
+ X_SQUARE = 2
139
+ EUROPEAN_CALL_OPTION = 3
140
+
141
+
142
+ class LadderOperator(IntEnum):
143
+ PLUS = 0
144
+ MINUS = 1
145
+
146
+
147
+ class Optimizer(IntEnum):
148
+ COBYLA = 1
149
+ SPSA = 2
150
+ L_BFGS_B = 3
151
+ NELDER_MEAD = 4
152
+ ADAM = 5
153
+
154
+
155
+ class Pauli(IntEnum):
156
+ I = 0 # noqa: E741
157
+ X = 1
158
+ Y = 2
159
+ Z = 3
160
+
161
+
162
+ class QSVMFeatureMapEntanglement(IntEnum):
163
+ FULL = 0
164
+ LINEAR = 1
165
+ CIRCULAR = 2
166
+ SCA = 3
167
+ PAIRWISE = 4
168
+
169
+
170
+ __all__ = [
171
+ "Element",
172
+ "FermionMapping",
173
+ "FinanceFunctionType",
174
+ "LadderOperator",
175
+ "Optimizer",
176
+ "Pauli",
177
+ "QSVMFeatureMapEntanglement",
178
+ ]
@@ -0,0 +1,6 @@
1
+ from pydantic import BaseModel, Field, NonNegativeInt
2
+
3
+
4
+ class CompilationMetadata(BaseModel):
5
+ should_synthesize_separately: bool = Field(default=False)
6
+ occurrences_number: NonNegativeInt = Field(default=1)
@@ -0,0 +1,54 @@
1
+ from collections import Counter
2
+ from enum import Enum, EnumMeta, IntEnum
3
+
4
+ import pydantic
5
+
6
+ from classiq.interface.ast_node import HashableASTNode
7
+ from classiq.interface.exceptions import ClassiqValueError
8
+
9
+
10
+ class EnumDeclaration(HashableASTNode):
11
+ name: str
12
+
13
+ members: dict[str, int] = pydantic.Field(
14
+ default_factory=dict,
15
+ description="Dictionary of member names and their values",
16
+ )
17
+
18
+ @pydantic.field_validator("members")
19
+ @classmethod
20
+ def _validate_members(cls, members: dict[str, int]) -> dict[str, int]:
21
+ underscore_members = [
22
+ member for member in members.keys() if member.startswith("_")
23
+ ]
24
+ if len(underscore_members) > 0:
25
+ raise ClassiqValueError(
26
+ f"Enum member names must not start with an underscore. The offending "
27
+ f"members: {underscore_members}"
28
+ )
29
+
30
+ counter = Counter(members.values())
31
+ repeating_members = [
32
+ member for member, value in members.items() if counter[value] > 1
33
+ ]
34
+ if len(repeating_members) > 0:
35
+ raise ClassiqValueError(
36
+ f"Cannot assign the same value to more than one enum member. The "
37
+ f"offending members: {repeating_members}"
38
+ )
39
+
40
+ return members
41
+
42
+ def create_enum(self) -> IntEnum:
43
+ return IntEnum(self.name, self.members)
44
+
45
+
46
+ def declaration_from_enum(enum_type: EnumMeta) -> EnumDeclaration:
47
+ members: list[Enum] = list(enum_type)
48
+ return EnumDeclaration(
49
+ name=enum_type.__name__,
50
+ members={
51
+ member.name: member.value
52
+ for member in sorted(members, key=lambda member: member.value)
53
+ },
54
+ )
@@ -0,0 +1,18 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING
3
+
4
+ import pydantic
5
+
6
+ from classiq.interface.ast_node import HashableASTNode
7
+
8
+ if TYPE_CHECKING:
9
+ from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
10
+
11
+
12
+ class QStructDeclaration(HashableASTNode):
13
+ name: str
14
+
15
+ fields: Mapping[str, "ConcreteQuantumType"] = pydantic.Field(
16
+ default_factory=dict,
17
+ description="Dictionary of field names and their quantum types",
18
+ )
@@ -1,25 +1,26 @@
1
- from typing import Any, ClassVar, Dict, Mapping
1
+ from collections.abc import Mapping
2
+ from typing import Any
2
3
 
3
4
  import pydantic
4
5
 
5
- from classiq.interface.generator.functions.classical_type import ConcreteClassicalType
6
- from classiq.interface.helpers.hashable_pydantic_base_model import (
7
- HashablePydanticBaseModel,
8
- )
6
+ from classiq.interface.ast_node import HashableASTNode
7
+ from classiq.interface.exceptions import ClassiqValueError
8
+ from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
9
9
 
10
- from classiq.exceptions import ClassiqValueError
11
10
 
12
-
13
- class StructDeclaration(HashablePydanticBaseModel):
11
+ class StructDeclaration(HashableASTNode):
14
12
  name: str
15
13
 
16
- variables: Dict[str, ConcreteClassicalType] = pydantic.Field(
14
+ variables: dict[str, ConcreteClassicalType] = pydantic.Field(
17
15
  default_factory=dict,
18
- description="Dictionary of variable names and their classical type",
16
+ description="Dictionary of variable names and their classical types",
19
17
  )
20
18
 
21
- BUILTIN_STRUCT_DECLARATIONS: ClassVar[Dict[str, "StructDeclaration"]] = {}
22
-
23
19
  def validate_fields(self, fields: Mapping[str, Any]) -> None:
24
- if set(self.variables.keys()) != {field for field in fields.keys()}:
25
- raise ClassiqValueError(f"Invalid fields for {self.name} instance")
20
+ expected_field_names = list(self.variables.keys())
21
+ received_field_names = list(fields.keys())
22
+ if set(expected_field_names) != set(received_field_names):
23
+ raise ClassiqValueError(
24
+ f"Invalid fields for {self.name} instance. Expected fields "
25
+ f"{expected_field_names}, got {received_field_names}"
26
+ )
@@ -1,7 +1,9 @@
1
- from typing import Iterable, Optional
1
+ from collections.abc import Iterable
2
+ from typing import Optional
2
3
 
3
4
  import pydantic
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.generator.chemistry_function_params import (
6
8
  ChemistryFunctionParams,
7
9
  )
@@ -40,11 +42,12 @@ class UCC(ChemistryFunctionParams):
40
42
  description="Prefix for the generated parameters",
41
43
  )
42
44
 
43
- @pydantic.validator("excitations")
45
+ @pydantic.field_validator("excitations")
46
+ @classmethod
44
47
  def _validate_excitations(cls, excitations: EXCITATIONS_TYPE) -> EXCITATIONS_TYPE:
45
48
  if isinstance(excitations, int):
46
49
  if excitations not in _EXCITATIONS_DICT.values():
47
- raise ValueError(
50
+ raise ClassiqValueError(
48
51
  f"possible values of excitations are {list(_EXCITATIONS_DICT.values())}"
49
52
  )
50
53
  excitations = [excitations]
@@ -53,19 +56,19 @@ class UCC(ChemistryFunctionParams):
53
56
  excitations = list(excitations) # type: ignore[assignment]
54
57
  if all(isinstance(idx, int) for idx in excitations):
55
58
  if any(idx not in _EXCITATIONS_DICT.values() for idx in excitations):
56
- raise ValueError(
59
+ raise ClassiqValueError(
57
60
  f"possible values of excitations are {list(_EXCITATIONS_DICT.values())}"
58
61
  )
59
62
 
60
63
  elif all(isinstance(idx, str) for idx in excitations):
61
64
  if any(idx not in _EXCITATIONS_DICT.keys() for idx in excitations):
62
- raise ValueError(
65
+ raise ClassiqValueError(
63
66
  f"possible values of excitations are {list(_EXCITATIONS_DICT.keys())}"
64
67
  )
65
68
  excitations = sorted(_EXCITATIONS_DICT[idx] for idx in excitations) # type: ignore[index]
66
69
 
67
70
  else:
68
- raise ValueError(
71
+ raise ClassiqValueError(
69
72
  "excitations must be of the same type (all str or all int)"
70
73
  )
71
74
  return excitations
@@ -1,13 +1,14 @@
1
- from typing import List, Union
1
+ from typing import Union
2
2
 
3
3
  import numpy as np
4
4
  import pydantic
5
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
6
7
  from classiq.interface.generator import complex_type, function_params
7
8
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
8
9
 
9
10
  DataNumber = Union[complex_type.Complex, float, int]
10
- DataArray = List[List[DataNumber]]
11
+ DataArray = list[list[DataNumber]]
11
12
 
12
13
  UNITARY_GATE_INPUT: str = "TARGET"
13
14
  UNITARY_GATE_OUTPUT: str = "TARGET"
@@ -24,15 +25,18 @@ class UnitaryGate(function_params.FunctionParams):
24
25
  )
25
26
 
26
27
  # TODO - decide if to include assertion on the unitarity of the matrix. It is already done in Qiskit and could be computationally expensive
27
- @pydantic.validator("data")
28
+ @pydantic.field_validator("data")
29
+ @classmethod
28
30
  def validate_data(cls, data: DataArray) -> DataArray:
29
31
  data_np = np.array(data, dtype=object)
30
32
  if data_np.ndim != 2:
31
- raise ValueError("Data must me two dimensional")
33
+ raise ClassiqValueError("Data must me two dimensional")
32
34
  if data_np.shape[0] != data_np.shape[1]:
33
- raise ValueError("Matrix must be square")
35
+ raise ClassiqValueError("Matrix must be square")
34
36
  if not np.mod(np.log2(data_np.shape[0]), 1) == 0:
35
- raise ValueError("Matrix dimensions must be an integer exponent of 2")
37
+ raise ClassiqValueError(
38
+ "Matrix dimensions must be an integer exponent of 2"
39
+ )
36
40
  return data
37
41
 
38
42
  @property
@@ -1,6 +1,7 @@
1
- from typing import Mapping
1
+ from collections.abc import Mapping
2
2
 
3
3
  import pydantic
4
+ from pydantic import ConfigDict
4
5
 
5
6
  from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
6
7
  from classiq.interface.generator.function_params import ArithmeticIODict, FunctionParams
@@ -11,6 +12,8 @@ class CustomFunction(FunctionParams):
11
12
  A user-defined custom function parameters object.
12
13
  """
13
14
 
15
+ model_config = ConfigDict(frozen=True, extra="forbid")
16
+
14
17
  _name: str = pydantic.PrivateAttr(default="")
15
18
 
16
19
  input_decls: ArithmeticIODict = pydantic.Field(
@@ -1,10 +1,12 @@
1
1
  from collections import Counter, defaultdict
2
+ from collections.abc import Collection, Iterable, Mapping
2
3
  from dataclasses import dataclass
3
4
  from itertools import chain
4
- from typing import Collection, Iterable, List, Mapping, Optional, TypeVar
5
+ from typing import Optional, TypeVar
5
6
 
6
7
  import networkx as nx
7
8
 
9
+ from classiq.interface.exceptions import ClassiqValueError
8
10
  from classiq.interface.generator.quantum_function_call import (
9
11
  SynthesisQuantumFunctionCall,
10
12
  WireName,
@@ -40,7 +42,7 @@ def _parse_call_inputs(
40
42
  wire = wires[wire_name]
41
43
 
42
44
  if wire.end:
43
- raise ValueError(
45
+ raise ClassiqValueError(
44
46
  IO_MULTI_USE_ERROR_MSG
45
47
  + f". The name {wire_name} is used multiple times."
46
48
  )
@@ -62,7 +64,7 @@ def _parse_call_outputs(
62
64
  wire = wires[wire_name]
63
65
 
64
66
  if wire.start:
65
- raise ValueError(
67
+ raise ClassiqValueError(
66
68
  IO_MULTI_USE_ERROR_MSG
67
69
  + f". The name {wire_name} is used multiple times."
68
70
  )
@@ -148,10 +150,10 @@ def validate_legal_wiring(
148
150
  if unconnected_wires:
149
151
  error_messages.append(f"{UNCONNECTED_WIRES_ERROR_MSG}: {unconnected_wires}")
150
152
 
151
- raise ValueError(_join_errors(error_messages))
153
+ raise ClassiqValueError(_join_errors(error_messages))
152
154
 
153
155
 
154
- def _join_errors(error_messages: List[str]) -> str:
156
+ def _join_errors(error_messages: list[str]) -> str:
155
157
  if not error_messages:
156
158
  error_messages.append(f"{UNKNOWN_ERROR_MSG}")
157
159
 
@@ -161,7 +163,7 @@ def _join_errors(error_messages: List[str]) -> str:
161
163
  T = TypeVar("T")
162
164
 
163
165
 
164
- def _recurring_names(name_list: List[T]) -> Iterable[T]:
166
+ def _recurring_names(name_list: list[T]) -> Iterable[T]:
165
167
  name_counter = Counter(name_list)
166
168
  return (name for name, appearances in name_counter.items() if appearances > 1)
167
169
 
@@ -180,17 +182,17 @@ def validate_acyclic_logic_flow(
180
182
 
181
183
  if not nx.algorithms.is_directed_acyclic_graph(graph):
182
184
  cycles = list(nx.algorithms.simple_cycles(graph))
183
- raise ValueError(CYCLE_ERROR_MSG + ". Cycles are: " + str(cycles))
185
+ raise ClassiqValueError(CYCLE_ERROR_MSG + ". Cycles are: " + str(cycles))
184
186
 
185
187
  return graph
186
188
 
187
189
 
188
190
  def validate_acyclicity_and_topologically_sort_logic_flow(
189
- body: List[SynthesisQuantumFunctionCall],
191
+ body: list[SynthesisQuantumFunctionCall],
190
192
  *,
191
193
  flow_input_names: Collection[str],
192
194
  flow_output_names: Collection[str],
193
- ) -> List[SynthesisQuantumFunctionCall]:
195
+ ) -> list[SynthesisQuantumFunctionCall]:
194
196
  graph = validate_acyclic_logic_flow(
195
197
  body=body,
196
198
  flow_input_names=flow_input_names,
@@ -1,14 +1,16 @@
1
- from typing import Iterable, List, Sequence, Sized, Tuple, TypeVar
1
+ from collections.abc import Iterable, Sequence, Sized
2
+ from typing import TypeVar
2
3
 
3
4
  import numpy as np
4
5
 
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityFloat
6
8
 
7
9
  NOT_SUM_TO_ONE_ERROR = "Probabilities do not sum to 1"
8
10
 
9
11
  SUM_TO_ONE_SENSITIVITY = 8
10
12
 
11
- Amplitude = TypeVar("Amplitude", Tuple[float, ...], List[complex])
13
+ Amplitude = TypeVar("Amplitude", tuple[float, ...], list[complex])
12
14
 
13
15
 
14
16
  def _is_power_of_two(vector: Sized) -> bool:
@@ -26,9 +28,9 @@ def is_probabilities_sum_to_one(pro: Iterable[PydanticProbabilityFloat]) -> bool
26
28
 
27
29
  def validate_amplitudes(amp: Amplitude) -> Amplitude:
28
30
  if not is_amplitudes_sum_to_one(amp):
29
- raise ValueError("Amplitudes do not sum to 1")
31
+ raise ClassiqValueError("Amplitudes do not sum to 1")
30
32
  if not _is_power_of_two(amp):
31
- raise ValueError("Amplitudes length must be power of 2")
33
+ raise ClassiqValueError("Amplitudes length must be power of 2")
32
34
  return amp
33
35
 
34
36
 
@@ -36,7 +38,7 @@ def validate_probabilities(
36
38
  cls: type, pmf: Sequence[PydanticProbabilityFloat]
37
39
  ) -> Sequence[PydanticProbabilityFloat]:
38
40
  if not is_probabilities_sum_to_one(pmf):
39
- raise ValueError(NOT_SUM_TO_ONE_ERROR)
41
+ raise ClassiqValueError(NOT_SUM_TO_ONE_ERROR)
40
42
  if not _is_power_of_two(pmf):
41
- raise ValueError("Probabilities length must be power of 2")
43
+ raise ClassiqValueError("Probabilities length must be power of 2")
42
44
  return pmf
@@ -1,14 +1,10 @@
1
- from collections import abc
1
+ from collections import abc, defaultdict
2
+ from collections.abc import Collection, Mapping, Sequence
2
3
  from typing import (
3
4
  TYPE_CHECKING,
4
5
  Any,
5
- Collection,
6
- Dict,
7
- List,
8
- Mapping,
6
+ Callable,
9
7
  Optional,
10
- Sequence,
11
- Tuple,
12
8
  TypeVar,
13
9
  Union,
14
10
  )
@@ -21,7 +17,7 @@ NodeType = Union[
21
17
  BaseModel,
22
18
  int,
23
19
  bool,
24
- Tuple["NodeType", ...],
20
+ tuple["NodeType", ...],
25
21
  Mapping[Key, "NodeType"],
26
22
  Sequence["NodeType"],
27
23
  ]
@@ -47,19 +43,19 @@ class Visitor:
47
43
 
48
44
  return node
49
45
 
50
- def visit_list(self, node: List[NodeType]) -> Optional[RetType]:
46
+ def visit_list(self, node: list[NodeType]) -> Optional[RetType]:
51
47
  for elem in node:
52
48
  self.visit(elem)
53
49
 
54
50
  return None
55
51
 
56
- def visit_dict(self, node: Dict[Key, NodeType]) -> Optional[RetType]:
52
+ def visit_dict(self, node: dict[Key, NodeType]) -> Optional[RetType]:
57
53
  for value in node.values():
58
54
  self.visit(value)
59
55
 
60
56
  return None
61
57
 
62
- def visit_tuple(self, node: Tuple[NodeType, ...]) -> Optional[Tuple[RetType, ...]]:
58
+ def visit_tuple(self, node: tuple[NodeType, ...]) -> Optional[tuple[RetType, ...]]:
63
59
  for value in node:
64
60
  self.visit(value)
65
61
 
@@ -83,13 +79,24 @@ class Transformer(Visitor):
83
79
 
84
80
  def visit(self, node: NodeType) -> Any: ...
85
81
 
86
- def visit_list(self, node: List[NodeType]) -> List[RetType]:
82
+ def visit_list(self, node: list[NodeType]) -> list[RetType]:
87
83
  return [self.visit(elem) for elem in node]
88
84
 
89
- def visit_dict(self, node: Dict[Key, NodeType]) -> Dict[Key, RetType]:
85
+ def visit_dict(self, node: dict[Key, NodeType]) -> dict[Key, RetType]:
90
86
  return {key: self.visit(value) for key, value in node.items()}
91
87
 
92
- def visit_tuple(self, node: Tuple[NodeType, ...]) -> Tuple[RetType, ...]:
88
+ def visit_defaultdict(
89
+ self, node: defaultdict[Key, NodeType]
90
+ ) -> defaultdict[Key, RetType]:
91
+ new_default_factory: Callable[[], RetType] | None = None
92
+ if (default_factory := node.default_factory) is not None:
93
+
94
+ def new_default_factory() -> RetType:
95
+ return self.visit(default_factory()) # type: ignore[misc]
96
+
97
+ return defaultdict(new_default_factory, self.visit_dict(node))
98
+
99
+ def visit_tuple(self, node: tuple[NodeType, ...]) -> tuple[RetType, ...]:
93
100
  return tuple(self.visit(value) for value in node)
94
101
 
95
102
  def visit_BaseModel(
@@ -97,12 +104,12 @@ class Transformer(Visitor):
97
104
  ) -> RetType:
98
105
  fields_to_skip = fields_to_skip or set()
99
106
 
100
- result: Dict[str, Any] = dict()
107
+ result: dict[str, Any] = dict()
101
108
  for name, value in node:
102
109
  if name not in fields_to_skip:
103
110
  result[name] = self.visit(value)
104
111
 
105
- return node.copy(update=result)
112
+ return node.model_copy(update=result)
106
113
 
107
114
  def visit_int(self, n: int) -> int:
108
115
  return n