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,12 +1,27 @@
1
1
  import datetime
2
- from typing import TYPE_CHECKING, List, Optional, Tuple
2
+ from typing import TYPE_CHECKING, Annotated, Optional
3
3
 
4
4
  import pydantic
5
5
 
6
- from classiq._internals.enum_utils import StrEnum
6
+ from classiq.interface.enum_utils import StrEnum
7
+
8
+ QueueTime = Annotated[
9
+ Optional[datetime.timedelta],
10
+ pydantic.PlainSerializer(
11
+ lambda _timedelta: (
12
+ _timedelta.total_seconds() if _timedelta is not None else None
13
+ ),
14
+ return_type=Optional[float],
15
+ ),
16
+ ]
7
17
 
8
18
 
9
19
  class Provider(StrEnum):
20
+ """
21
+ This class defines all Providers that Classiq supports.
22
+ This is mainly used in backend_preferences when specifying where do we want to execute the defined model.
23
+ """
24
+
10
25
  IBM_QUANTUM = "IBM Quantum"
11
26
  AZURE_QUANTUM = "Azure Quantum"
12
27
  AMAZON_BRAKET = "Amazon Braket"
@@ -15,10 +30,13 @@ class Provider(StrEnum):
15
30
  GOOGLE = "Google"
16
31
  ALICE_AND_BOB = "Alice & Bob"
17
32
  OQC = "OQC"
33
+ INTEL = "Intel"
34
+ AQT = "AQT"
35
+ IQCC = "IQCC"
18
36
 
19
37
  @property
20
- def id(self):
21
- return self.value.replace(" ", "-").lower()
38
+ def id(self) -> "ProviderIDEnum":
39
+ return self.value.replace(" ", "-").lower() # type: ignore[return-value]
22
40
 
23
41
 
24
42
  ProviderIDEnum = StrEnum("ProviderIDEnum", {p.id: p.id for p in Provider}) # type: ignore[misc]
@@ -48,14 +66,17 @@ class HardwareStatus(pydantic.BaseModel):
48
66
  default_factory=lambda: datetime.datetime.now(tz=datetime.UTC)
49
67
  )
50
68
  availability: AvailabilityStatus
51
- queue_time: Optional[datetime.timedelta]
52
- pending_jobs: Optional[int]
69
+ queue_time: QueueTime = pydantic.Field(
70
+ default=None,
71
+ description="The estimated queue time for the hardware in seconds.",
72
+ )
73
+ pending_jobs: Optional[int] = None
53
74
 
54
75
 
55
76
  if TYPE_CHECKING:
56
- ConnectivityMapEntry = Tuple[int, int]
77
+ ConnectivityMapEntry = tuple[int, int]
57
78
  else:
58
- ConnectivityMapEntry = List[int]
79
+ ConnectivityMapEntry = list[int]
59
80
 
60
81
 
61
82
  class HardwareInformation(pydantic.BaseModel):
@@ -65,8 +86,8 @@ class HardwareInformation(pydantic.BaseModel):
65
86
  display_name: str
66
87
  device_type: DeviceType
67
88
  number_of_qubits: int
68
- connectivity_map: Optional[List[ConnectivityMapEntry]]
69
- basis_gates: List[str]
89
+ connectivity_map: Optional[list[ConnectivityMapEntry]] = None
90
+ basis_gates: list[str]
70
91
  status: HardwareStatus
71
92
 
72
93
  def is_simulator(self) -> bool:
@@ -0,0 +1,8 @@
1
+ from typing import TYPE_CHECKING, Any, Optional
2
+
3
+
4
+ class classproperty(property): # noqa: N801
5
+ def __get__(self, owner_self: Any, owner_cls: Optional[type] = None) -> Any:
6
+ if TYPE_CHECKING:
7
+ assert self.fget is not None
8
+ return self.fget(owner_cls)
@@ -0,0 +1,3 @@
1
+ from typing import Any, Callable
2
+
3
+ CUSTOM_ENCODERS: dict[type, Callable[[Any], Any]] = {complex: str}
@@ -1,6 +1,7 @@
1
- from typing import TYPE_CHECKING, Any, List, Tuple
1
+ from typing import TYPE_CHECKING, Annotated, Any
2
2
 
3
3
  import pydantic
4
+ from pydantic import Field, StrictStr, StringConstraints
4
5
 
5
6
  from classiq.interface.generator.arith.number_utils import MAXIMAL_MACHINE_PRECISION
6
7
  from classiq.interface.generator.parameters import ParameterComplexType
@@ -13,13 +14,9 @@ if TYPE_CHECKING:
13
14
  PydanticLargerThanOneInteger = int
14
15
  PydanticMachinePrecision = int
15
16
  else:
17
+ PydanticLargerThanOneInteger = Annotated[int, Field(gt=1)]
16
18
 
17
- class PydanticLargerThanOneInteger(pydantic.ConstrainedInt):
18
- gt = 1
19
-
20
- class PydanticMachinePrecision(pydantic.ConstrainedInt):
21
- gt = 0
22
- le = MAXIMAL_MACHINE_PRECISION
19
+ PydanticMachinePrecision = Annotated[int, Field(gt=0, le=MAXIMAL_MACHINE_PRECISION)]
23
20
 
24
21
 
25
22
  # Probability float types
@@ -28,93 +25,86 @@ if TYPE_CHECKING:
28
25
  PydanticNonOneProbabilityFloat = float
29
26
  PydanticNonZeroProbabilityFloat = float
30
27
  else:
28
+ PydanticProbabilityFloat = Annotated[float, Field(ge=0.0, le=1.0)]
31
29
 
32
- class PydanticProbabilityFloat(pydantic.ConstrainedFloat):
33
- ge = 0.0
34
- le = 1.0
35
-
36
- class PydanticNonOneProbabilityFloat(pydantic.ConstrainedFloat):
37
- ge = 0.0
38
- lt = 1.0
30
+ PydanticNonOneProbabilityFloat = Annotated[float, Field(ge=0.0, lt=1.0)]
39
31
 
40
- class PydanticNonZeroProbabilityFloat(pydantic.ConstrainedFloat):
41
- gt = 0.0
42
- le = 1.0
32
+ PydanticNonZeroProbabilityFloat = Annotated[float, Field(gt=0.0, le=1.0)]
43
33
 
44
34
 
45
35
  # CVAR parameter types
46
36
  if TYPE_CHECKING:
47
37
  PydanticAlphaParamCVAR = float
48
38
  else:
49
-
50
- class PydanticAlphaParamCVAR(pydantic.ConstrainedFloat):
51
- gt = 0.0
52
- le = 1.0
39
+ PydanticAlphaParamCVAR = Annotated[float, Field(gt=0.0, le=1.0)]
53
40
 
54
41
 
55
42
  # General string types
56
43
  if TYPE_CHECKING:
57
44
  PydanticNonEmptyString = str
58
45
  else:
59
- PydanticNonEmptyString = pydantic.constr(min_length=1)
46
+ PydanticNonEmptyString = Annotated[str, Field(min_length=1)]
60
47
 
61
48
  # Name string types
62
49
  if TYPE_CHECKING:
63
50
  PydanticFunctionNameStr = str
64
51
  else:
65
- PydanticFunctionNameStr = pydantic.constr(
66
- strict=True, regex="^([A-Za-z][A-Za-z0-9_]*)$"
67
- )
52
+ PydanticFunctionNameStr = Annotated[
53
+ str, Field(strict=True, pattern="^([A-Za-z][A-Za-z0-9_]*)$")
54
+ ]
68
55
 
69
56
  if TYPE_CHECKING:
70
57
  PydanticPauliMonomial = tuple
71
58
  else:
72
- PydanticPauliMonomial = pydantic.conlist(item_type=Any, min_items=2, max_items=2)
59
+ PydanticPauliMonomial = Annotated[list[Any], Field(min_length=2, max_length=2)]
73
60
 
74
61
  if TYPE_CHECKING:
75
62
  PydanticPauliMonomialStr = str
76
63
  else:
77
- PydanticPauliMonomialStr = pydantic.constr(
78
- strict=True, strip_whitespace=True, min_length=1, regex="^[IXYZ]+$"
79
- )
64
+ PydanticPauliMonomialStr = Annotated[
65
+ StrictStr,
66
+ StringConstraints(strip_whitespace=True, min_length=1, pattern="^[IXYZ]+$"),
67
+ ]
80
68
 
81
- if TYPE_CHECKING:
82
- PydanticPauliList = List[Tuple[PydanticPauliMonomialStr, ParameterComplexType]]
83
- else:
84
- PydanticPauliList = pydantic.conlist(item_type=tuple, min_items=1)
69
+ PydanticPauliList = Annotated[
70
+ list[tuple[PydanticPauliMonomialStr, ParameterComplexType]], Field(min_length=1)
71
+ ]
85
72
 
86
73
  if TYPE_CHECKING:
87
- PydanticFloatTuple = Tuple[float, float]
74
+ PydanticFloatTuple = tuple[float, float]
88
75
  else:
89
- PydanticFloatTuple = pydantic.conlist(item_type=float, min_items=2, max_items=2)
76
+ PydanticFloatTuple = Annotated[list[float], Field(min_length=2, max_length=2)]
90
77
 
91
- if TYPE_CHECKING:
92
- PydanticNonNegIntTuple = Tuple[pydantic.NonNegativeInt, pydantic.NonNegativeInt]
93
- else:
94
- PydanticNonNegIntTuple = pydantic.conlist(
95
- item_type=pydantic.NonNegativeInt, min_items=2, max_items=2
96
- )
78
+ PydanticNonNegIntTuple = Annotated[
79
+ list[pydantic.NonNegativeInt], Field(min_length=2, max_length=2)
80
+ ]
97
81
 
98
82
  if TYPE_CHECKING:
99
83
  PydanticExpressionStr = str
100
84
  else:
101
- PydanticExpressionStr = pydantic.constr(
102
- strip_whitespace=True, min_length=1, max_length=MAX_EXPRESSION_SIZE
103
- )
85
+ PydanticExpressionStr = Annotated[
86
+ str,
87
+ StringConstraints(
88
+ strip_whitespace=True, min_length=1, max_length=MAX_EXPRESSION_SIZE
89
+ ),
90
+ ]
104
91
  if TYPE_CHECKING:
105
- AtomType = Tuple[str, List[float]]
92
+ AtomType = tuple[str, list[float]]
106
93
  else:
107
- AtomType = pydantic.conlist(item_type=Any, min_items=2, max_items=2)
94
+ AtomType = Annotated[list[Any], Field(min_length=2, max_length=2)]
108
95
 
109
96
 
110
97
  if TYPE_CHECKING:
111
98
  PydanticDataDogUuid = str
112
99
  else:
113
- PydanticDataDogUuid = pydantic.constr(
114
- regex=r"^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
115
- )
100
+ PydanticDataDogUuid = Annotated[
101
+ str,
102
+ Field(
103
+ pattern=r"^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
104
+ ),
105
+ ]
116
106
 
117
107
  if TYPE_CHECKING:
118
108
  PydanticDataDogGo = int
119
109
  else:
120
- PydanticDataDogGo = pydantic.conint(ge=0)
110
+ PydanticDataDogGo = Annotated[int, Field(ge=0)]
@@ -0,0 +1,26 @@
1
+ from typing import Any
2
+
3
+
4
+ class DotDict(dict):
5
+ def __getattr__(self, key: str) -> Any:
6
+ return super().get(key)
7
+
8
+ def __setattr__(self, key: str, value: Any) -> None:
9
+ super().__setitem__(key, value)
10
+
11
+ def __delattr__(self, key: str) -> None:
12
+ super().__delitem__(key)
13
+
14
+
15
+ class LenList(list):
16
+ @property
17
+ def len(self) -> int:
18
+ return len(self)
19
+
20
+
21
+ def get_sdk_compatible_python_object(obj: Any) -> Any:
22
+ if isinstance(obj, list):
23
+ return LenList([get_sdk_compatible_python_object(item) for item in obj])
24
+ if isinstance(obj, dict):
25
+ return DotDict({k: get_sdk_compatible_python_object(v) for k, v in obj.items()})
26
+ return obj
@@ -1,7 +1,8 @@
1
1
  import itertools
2
2
  import numbers
3
+ from collections.abc import Iterator
3
4
  from enum import EnumMeta
4
- from typing import Any, Iterator, Tuple
5
+ from typing import Any
5
6
 
6
7
 
7
8
  def immutable_version(value: Any) -> Any:
@@ -29,5 +30,5 @@ class HashableMixin:
29
30
  for val in self._values_to_hash():
30
31
  yield immutable_version(val)
31
32
 
32
- def _value_tuple(self) -> Tuple[Any, ...]:
33
+ def _value_tuple(self) -> tuple[Any, ...]:
33
34
  return tuple(itertools.chain((str(type(self))), self._immutable_fields()))
@@ -1,4 +1,5 @@
1
- from typing import Any, Collection, Iterator
1
+ from collections.abc import Collection, Iterator
2
+ from typing import Any
2
3
 
3
4
  import pydantic
4
5
 
@@ -1,16 +1,12 @@
1
- from typing import Any, Dict, Protocol, Sequence, TypeVar
2
-
3
- import pydantic
4
-
5
-
6
- def get_discriminator_field(default: str, **kwargs: Any) -> Any:
7
- return pydantic.Field(default_factory=lambda: default, **kwargs)
1
+ from collections.abc import Sequence
2
+ from typing import Any, Protocol, TypeVar
8
3
 
9
4
 
10
5
  def values_with_discriminator(
11
- values: Dict[str, Any], discriminator: str, discriminator_value: Any
12
- ) -> Dict[str, Any]:
13
- values.setdefault(discriminator, discriminator_value)
6
+ values: Any, discriminator: str, discriminator_value: Any
7
+ ) -> dict[str, Any]:
8
+ if isinstance(values, dict):
9
+ values.setdefault(discriminator, discriminator_value)
14
10
  return values
15
11
 
16
12
 
@@ -21,5 +17,5 @@ class Nameable(Protocol):
21
17
  NameableType = TypeVar("NameableType", bound=Nameable)
22
18
 
23
19
 
24
- def nameables_to_dict(nameables: Sequence[NameableType]) -> Dict[str, NameableType]:
20
+ def nameables_to_dict(nameables: Sequence[NameableType]) -> dict[str, NameableType]:
25
21
  return {value.name: value for value in nameables}
@@ -1,34 +1,17 @@
1
- from typing import Hashable, List, Mapping, Optional
1
+ from collections.abc import Hashable, Mapping
2
2
 
3
+ from classiq.interface.exceptions import ClassiqValueError
3
4
  from classiq.interface.helpers.pydantic_model_helpers import Nameable
4
5
 
5
- from classiq.exceptions import ClassiqValueError
6
6
 
7
-
8
- def is_list_unique(lst: List[Hashable]) -> bool:
7
+ def is_list_unique(lst: list[Hashable]) -> bool:
9
8
  return len(set(lst)) == len(lst)
10
9
 
11
10
 
12
11
  def validate_nameables_mapping(
13
12
  nameables_dict: Mapping[str, Nameable], declaration_type: str
14
13
  ) -> None:
15
- if not all([name == nameable.name for (name, nameable) in nameables_dict.items()]):
14
+ if not all(name == nameable.name for (name, nameable) in nameables_dict.items()):
16
15
  raise ClassiqValueError(
17
16
  f"{declaration_type} declaration names should match the keys of their names."
18
17
  )
19
-
20
-
21
- def validate_nameables_no_overlap(
22
- left_nameables_dict: Optional[Mapping[str, Nameable]],
23
- right_nameables_dict: Optional[Mapping[str, Nameable]],
24
- left_declaration_type: str,
25
- right_declaration_type: str,
26
- ) -> Optional[str]:
27
- if left_nameables_dict is None or right_nameables_dict is None:
28
- return None
29
-
30
- matched_names = left_nameables_dict.keys() & right_nameables_dict.keys()
31
- if matched_names:
32
- return f"{left_declaration_type} declaration names overlap with {right_declaration_type} declaration names: {matched_names}"
33
-
34
- return None
@@ -3,5 +3,5 @@ import pydantic
3
3
  from classiq.interface._version import VERSION
4
4
 
5
5
 
6
- class VersionedModel(pydantic.BaseModel, extra=pydantic.Extra.forbid):
6
+ class VersionedModel(pydantic.BaseModel):
7
7
  version: str = pydantic.Field(default=VERSION)
@@ -1,20 +1,21 @@
1
1
  from enum import IntEnum
2
- from typing import Dict, List, Optional, Union
2
+ from typing import Optional, Union
3
3
 
4
4
  import pydantic
5
5
 
6
6
  from classiq.interface.generator.generated_circuit_data import GeneratedFunction
7
7
  from classiq.interface.generator.hardware.hardware_data import SynthesisHardwareData
8
8
  from classiq.interface.helpers.versioned_model import VersionedModel
9
+ from classiq.interface.ide.visual_model import CircuitMetrics
9
10
 
10
- GateCount = Dict[str, int]
11
+ GateCount = dict[str, int]
11
12
  Depth = int
12
13
 
13
14
 
14
15
  class IDEDataQubit(pydantic.BaseModel):
15
16
  id: int
16
- numChildren: Optional[int]
17
- name: Optional[str]
17
+ numChildren: Optional[int] = None
18
+ name: Optional[str] = None
18
19
 
19
20
 
20
21
  class IDEQubitDef(pydantic.BaseModel):
@@ -51,17 +52,17 @@ class ConditionalRender(IntEnum):
51
52
  class IDEDataOperation(pydantic.BaseModel):
52
53
  gate: str
53
54
  displayName: str
54
- children: List["IDEDataOperation"]
55
+ children: list["IDEDataOperation"]
55
56
  depth: Depth
56
57
  width: int
57
58
  gate_count: GateCount
58
59
  _qubits: list = pydantic.PrivateAttr() # list[Qubit]
59
60
 
60
61
  displayArgs: str = ""
61
- targets: Union[List[IDEQubitDef], List[IDEClassicalBitDef]] = pydantic.Field(
62
+ targets: Union[list[IDEQubitDef], list[IDEClassicalBitDef]] = pydantic.Field(
62
63
  default_factory=list
63
64
  )
64
- controls: List[IDEQubitDef] = list()
65
+ controls: list[IDEQubitDef] = list()
65
66
  dataAttributes: DataAttributes = pydantic.Field(default_factory=DataAttributes)
66
67
  isControlled: bool = False
67
68
  isMeasurement: bool = False
@@ -75,13 +76,13 @@ class IDEDataOperation(pydantic.BaseModel):
75
76
 
76
77
 
77
78
  class IDEDataProperties(pydantic.BaseModel):
78
- color: Optional[str]
79
- rightLabel: Optional[str]
80
- leftLabel: Optional[str]
79
+ color: Optional[str] = None
80
+ rightLabel: Optional[str] = None
81
+ leftLabel: Optional[str] = None
81
82
 
82
83
 
83
84
  class RegisterData(pydantic.BaseModel):
84
- segmentIds: List[str]
85
+ segmentIds: list[str]
85
86
  properties: IDEDataProperties
86
87
  registerId: str
87
88
 
@@ -91,16 +92,11 @@ class InterfaceSegmentData(pydantic.BaseModel):
91
92
  properties: IDEDataProperties
92
93
 
93
94
 
94
- class CircuitMetrics(pydantic.BaseModel):
95
- depth: int
96
- count_ops: Dict[str, int]
97
-
98
-
99
95
  class IDEData(VersionedModel):
100
- qubits: List[IDEDataQubit]
101
- operations: List[IDEDataOperation]
102
- register_data: List[RegisterData]
103
- segment_data: List[InterfaceSegmentData]
96
+ qubits: list[IDEDataQubit]
97
+ operations: list[IDEDataOperation]
98
+ register_data: list[RegisterData]
99
+ segment_data: list[InterfaceSegmentData]
104
100
  circuit_metrics: Optional[CircuitMetrics]
105
101
  hardware_data: SynthesisHardwareData
106
102
  creation_time: str
@@ -0,0 +1,130 @@
1
+ from collections import Counter
2
+ from typing import Any, Optional
3
+
4
+ import pydantic
5
+ from pydantic import ConfigDict
6
+
7
+ from classiq.interface.enum_utils import StrEnum
8
+ from classiq.interface.generator.generated_circuit_data import (
9
+ OperationLevel,
10
+ OperationParameter,
11
+ )
12
+ from classiq.interface.generator.hardware.hardware_data import SynthesisHardwareData
13
+ from classiq.interface.helpers.versioned_model import VersionedModel
14
+
15
+
16
+ class OperationType(StrEnum):
17
+ REGULAR = "REGULAR"
18
+ ALLOCATE = "ALLOCATE"
19
+ FREE = "FREE"
20
+ BIND = "BIND"
21
+ ATOMIC = "ATOMIC"
22
+
23
+
24
+ class OperationData(pydantic.BaseModel):
25
+ approximated_depth: Optional[int] = None
26
+ width: int
27
+ gate_count: Counter[str] = pydantic.Field(default_factory=dict)
28
+
29
+
30
+ class CircuitMetrics(pydantic.BaseModel):
31
+ depth: int
32
+ count_ops: dict[str, int]
33
+
34
+
35
+ class ProgramData(pydantic.BaseModel):
36
+ hardware_data: SynthesisHardwareData
37
+ circuit_metrics: CircuitMetrics
38
+
39
+
40
+ class OperationLink(pydantic.BaseModel):
41
+ label: str
42
+ inner_label: Optional[str] = None
43
+ qubits: tuple[int, ...]
44
+ type: str
45
+ is_captured: bool = False
46
+
47
+ model_config = ConfigDict(frozen=True)
48
+
49
+ def __hash__(self) -> int:
50
+ return hash((type(self), self.label, self.qubits, self.type))
51
+
52
+ def __eq__(self, other: Any) -> bool:
53
+ if not isinstance(other, OperationLink):
54
+ return False
55
+ return hash(self) == hash(other)
56
+
57
+
58
+ class OperationLinks(pydantic.BaseModel):
59
+ inputs: list[OperationLink]
60
+ outputs: list[OperationLink]
61
+
62
+ @property
63
+ def input_width(self) -> int:
64
+ return sum(len(link.qubits) for link in self.inputs)
65
+
66
+ @property
67
+ def output_width(self) -> int:
68
+ return sum(len(link.qubits) for link in self.outputs)
69
+
70
+
71
+ class AtomicGate(StrEnum):
72
+ UNKNOWN = ""
73
+ H = "H"
74
+ X = "X"
75
+ Y = "Y"
76
+ Z = "Z"
77
+ I = "I" # noqa: E741
78
+ S = "S"
79
+ T = "T"
80
+ SDG = "SDG"
81
+ TDG = "TDG"
82
+ PHASE = "PHASE"
83
+ RX = "RX"
84
+ RY = "RY"
85
+ RZ = "RZ"
86
+ R = "R"
87
+ RXX = "RXX"
88
+ RYY = "RYY"
89
+ RZZ = "RZZ"
90
+ CH = "CH"
91
+ CX = "CX"
92
+ CY = "CY"
93
+ CZ = "CZ"
94
+ CRX = "CRX"
95
+ CRY = "CRY"
96
+ CRZ = "CRZ"
97
+ CPHASE = "CPHASE"
98
+ SWAP = "SWAP"
99
+ IDENTITY = "IDENTITY"
100
+ U = "U"
101
+
102
+ @property
103
+ def is_control_gate(self) -> bool:
104
+ return self.startswith("C")
105
+
106
+
107
+ class Operation(pydantic.BaseModel):
108
+ name: str
109
+ qasm_name: str = pydantic.Field(default="")
110
+ details: str = pydantic.Field(default="")
111
+ children: list["Operation"]
112
+ operation_data: Optional[OperationData] = None
113
+ operation_links: OperationLinks
114
+ control_qubits: tuple[int, ...] = pydantic.Field(default_factory=tuple)
115
+ auxiliary_qubits: tuple[int, ...]
116
+ target_qubits: tuple[int, ...]
117
+ parameters: list[OperationParameter] = pydantic.Field(default_factory=list)
118
+ operation_level: OperationLevel
119
+ operation_type: OperationType = pydantic.Field(
120
+ description="Identifies unique operations that are visualized differently"
121
+ )
122
+ gate: AtomicGate = pydantic.Field(
123
+ default=AtomicGate.UNKNOWN, description="Gate type"
124
+ )
125
+ is_daggered: bool = pydantic.Field(default=False)
126
+
127
+
128
+ class ProgramVisualModel(VersionedModel):
129
+ main_operation: Operation
130
+ program_data: ProgramData
@@ -0,0 +1 @@
1
+ INTERFACE_VERSION = "7"
classiq/interface/jobs.py CHANGED
@@ -1,14 +1,17 @@
1
- from typing import Any, Dict, Generic, TypeVar, Union
1
+ from typing import Any, Generic, Optional, TypeVar, Union
2
2
 
3
3
  import pydantic
4
4
  from pydantic import BaseModel
5
- from pydantic.generics import GenericModel
5
+ from typing_extensions import Self
6
6
 
7
- from classiq._internals.enum_utils import StrEnum
7
+ from classiq.interface.enum_utils import StrEnum
8
+ from classiq.interface.exceptions import ClassiqAPIError
9
+ from classiq.interface.helpers.custom_encoders import CUSTOM_ENCODERS
8
10
 
9
- JSONObject = Dict[str, Any]
11
+ JSONObject = dict[str, Any]
10
12
  T = TypeVar("T", bound=Union[pydantic.BaseModel, JSONObject])
11
13
  AUTH_HEADER = "Classiq-BE-Auth"
14
+ INVALID_RESPONSE_ERROR_MSG = "Invalid response from Classiq API"
12
15
 
13
16
 
14
17
  class JobID(BaseModel):
@@ -29,6 +32,32 @@ class JobStatus(StrEnum):
29
32
  return self in (self.COMPLETED, self.FAILED, self.CANCELLED)
30
33
 
31
34
 
32
- class JobDescription(GenericModel, Generic[T]):
35
+ """
36
+ A job can be in either of 3 states: ongoing, completed successfully or completed
37
+ unsuccessfully. Each job status belongs to one of the 3 states
38
+ For ongoing jobs, we expect both the failure_details and result to be None
39
+ For successful jobs, we expect failure_details to be None and result to be an instance of T
40
+ For unsuccessful jobs, we expect failure_details to be a string and result to be None
41
+ """
42
+
43
+
44
+ class JobDescription(BaseModel, Generic[T], json_encoders=CUSTOM_ENCODERS):
33
45
  status: JobStatus
34
- description: T
46
+ failure_details: Optional[str] = pydantic.Field(default=None)
47
+ result: Optional[T] = pydantic.Field(default=None)
48
+
49
+ @pydantic.model_validator(mode="after")
50
+ def validate_status_and_fields(self) -> Self:
51
+ if self.status is JobStatus.COMPLETED:
52
+ # Completed job must return result and not have an error
53
+ if self.result is None or self.failure_details is not None:
54
+ raise ClassiqAPIError(INVALID_RESPONSE_ERROR_MSG)
55
+ elif self.status in (JobStatus.FAILED, JobStatus.CANCELLED):
56
+ # Failed job must return error and not have result
57
+ if self.result is not None or self.failure_details is None:
58
+ raise ClassiqAPIError(INVALID_RESPONSE_ERROR_MSG)
59
+ elif self.result is not None or self.failure_details is not None:
60
+ # Pending job must have no result and no error
61
+ raise ClassiqAPIError(INVALID_RESPONSE_ERROR_MSG)
62
+
63
+ return self
@@ -0,0 +1,16 @@
1
+ from collections.abc import Mapping
2
+ from typing import Literal, Optional
3
+
4
+ from classiq.interface.generator.expressions.expression import Expression
5
+ from classiq.interface.model.handle_binding import ConcreteHandleBinding, HandleBinding
6
+ from classiq.interface.model.quantum_statement import QuantumOperation
7
+
8
+
9
+ class Allocate(QuantumOperation):
10
+ kind: Literal["Allocate"]
11
+ size: Optional[Expression] = None
12
+ target: ConcreteHandleBinding
13
+
14
+ @property
15
+ def wiring_outputs(self) -> Mapping[str, HandleBinding]:
16
+ return {"out": self.target}