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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,30 +1,32 @@
1
- from typing import Any, Dict, Literal, Optional, Union
1
+ from typing import TYPE_CHECKING, Any, Literal, Optional
2
2
 
3
3
  import pydantic
4
- from pydantic import Extra, Field
5
- from typing_extensions import Annotated
4
+ from pydantic import BaseModel, ConfigDict, Field
5
+ from typing_extensions import Self
6
6
 
7
+ from classiq.interface.ast_node import HashableASTNode
8
+ from classiq.interface.exceptions import ClassiqValueError
7
9
  from classiq.interface.generator.arith.register_user_input import (
8
10
  RegisterArithmeticInfo,
9
11
  RegisterUserInput,
10
12
  )
11
13
  from classiq.interface.generator.expressions.expression import Expression
14
+ from classiq.interface.generator.expressions.qmod_qarray_proxy import QmodQArrayProxy
12
15
  from classiq.interface.generator.expressions.qmod_qscalar_proxy import (
16
+ QmodQBitProxy,
13
17
  QmodQNumProxy,
14
18
  QmodQScalarProxy,
15
19
  )
16
20
  from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
17
- from classiq.interface.helpers.hashable_pydantic_base_model import (
18
- HashablePydanticBaseModel,
19
- )
20
21
  from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
22
+ from classiq.interface.model.handle_binding import HandleBinding
21
23
 
22
- from classiq.exceptions import ClassiqValueError
24
+ if TYPE_CHECKING:
25
+ from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
23
26
 
24
27
 
25
- class QuantumType(HashablePydanticBaseModel):
26
- class Config:
27
- extra = Extra.forbid
28
+ class QuantumType(HashableASTNode):
29
+ model_config = ConfigDict(extra="forbid")
28
30
 
29
31
  _size_in_bits: Optional[int] = pydantic.PrivateAttr(default=None)
30
32
 
@@ -46,13 +48,29 @@ class QuantumType(HashablePydanticBaseModel):
46
48
  def set_size_in_bits(self, val: int) -> None:
47
49
  self._size_in_bits = val
48
50
 
49
- def get_proxy(self, name: str) -> QmodSizedProxy:
50
- return QmodSizedProxy(size=self.size_in_bits)
51
+ def get_proxy(self, handle: "HandleBinding") -> QmodSizedProxy:
52
+ return QmodSizedProxy(handle=handle, size=self.size_in_bits)
53
+
54
+ @property
55
+ def qmod_type_name(self) -> str:
56
+ raise NotImplementedError
57
+
58
+ @property
59
+ def type_name(self) -> str:
60
+ raise NotImplementedError
61
+
62
+ @property
63
+ def is_instantiated(self) -> bool:
64
+ raise NotImplementedError
65
+
66
+ @property
67
+ def is_evaluated(self) -> bool:
68
+ raise NotImplementedError
51
69
 
52
70
 
53
71
  class QuantumScalar(QuantumType):
54
- def get_proxy(self, name: str) -> QmodQScalarProxy:
55
- return QmodQScalarProxy(name, size=self.size_in_bits)
72
+ def get_proxy(self, handle: "HandleBinding") -> QmodQScalarProxy:
73
+ return QmodQScalarProxy(handle, size=self.size_in_bits)
56
74
 
57
75
 
58
76
  class QuantumBit(QuantumScalar):
@@ -62,47 +80,120 @@ class QuantumBit(QuantumScalar):
62
80
  super().__init__(**kwargs)
63
81
  self._size_in_bits = 1
64
82
 
65
- @pydantic.root_validator(pre=True)
66
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
83
+ @pydantic.model_validator(mode="before")
84
+ @classmethod
85
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
67
86
  return values_with_discriminator(values, "kind", "qbit")
68
87
 
88
+ @property
89
+ def qmod_type_name(self) -> str:
90
+ return "QBit"
91
+
92
+ def get_proxy(self, handle: "HandleBinding") -> QmodQBitProxy:
93
+ return QmodQBitProxy(handle)
94
+
95
+ @property
96
+ def type_name(self) -> str:
97
+ return "Quantum bit"
98
+
99
+ @property
100
+ def is_instantiated(self) -> bool:
101
+ return True
69
102
 
70
- class QuantumArray(QuantumType):
71
- length: Optional[Expression]
103
+ @property
104
+ def is_evaluated(self) -> bool:
105
+ return True
72
106
 
73
107
 
74
- class QuantumBitvector(QuantumArray):
108
+ class QuantumBitvector(QuantumType):
109
+ element_type: "ConcreteQuantumType" = Field(
110
+ discriminator="kind", default_factory=QuantumBit
111
+ )
75
112
  kind: Literal["qvec"]
113
+ length: Optional[Expression] = Field(default=None)
76
114
 
77
- @pydantic.root_validator(pre=True)
78
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
115
+ @pydantic.model_validator(mode="before")
116
+ @classmethod
117
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
79
118
  return values_with_discriminator(values, "kind", "qvec")
80
119
 
81
120
  def _update_size_in_bits_from_declaration(self) -> None:
82
- if self.length is not None and self.length.is_evaluated():
83
- self._size_in_bits = self.length.to_int_value()
121
+ self.element_type._update_size_in_bits_from_declaration()
122
+ if self.element_type.has_size_in_bits and self.has_length:
123
+ assert self.length is not None
124
+ self._size_in_bits = (
125
+ self.element_type.size_in_bits * self.length.to_int_value()
126
+ )
127
+
128
+ @property
129
+ def has_length(self) -> bool:
130
+ return self.length is not None and self.length.is_evaluated()
131
+
132
+ @property
133
+ def length_value(self) -> int:
134
+ if not self.has_length:
135
+ raise ClassiqValueError(
136
+ "Tried to access unevaluated length of quantum array"
137
+ )
138
+ assert self.length is not None
139
+ return self.length.to_int_value()
140
+
141
+ def get_proxy(self, handle: "HandleBinding") -> QmodQArrayProxy:
142
+ element_size = self.element_type.size_in_bits
143
+ assert self.size_in_bits % element_size == 0
144
+ return QmodQArrayProxy(
145
+ handle,
146
+ self.element_type,
147
+ element_size,
148
+ self.size_in_bits // element_size,
149
+ )
150
+
151
+ @property
152
+ def qmod_type_name(self) -> str:
153
+ element_type = [self.element_type.qmod_type_name]
154
+ length = [self.length.expr] if self.length is not None else []
155
+ return f"QArray[{', '.join(element_type + length)}]"
156
+
157
+ @property
158
+ def type_name(self) -> str:
159
+ return "Quantum array"
160
+
161
+ @property
162
+ def is_instantiated(self) -> bool:
163
+ return self.length is not None and self.element_type.is_instantiated
164
+
165
+ @property
166
+ def is_evaluated(self) -> bool:
167
+ return (
168
+ self.length is not None
169
+ and self.length.is_evaluated()
170
+ and self.element_type.is_evaluated
171
+ )
84
172
 
85
173
 
86
174
  class QuantumNumeric(QuantumScalar):
87
175
  kind: Literal["qnum"]
88
176
 
89
- size: Optional[Expression] = pydantic.Field()
90
- is_signed: Optional[Expression] = pydantic.Field()
91
- fraction_digits: Optional[Expression] = pydantic.Field()
177
+ size: Optional[Expression] = pydantic.Field(default=None)
178
+ is_signed: Optional[Expression] = pydantic.Field(default=None)
179
+ fraction_digits: Optional[Expression] = pydantic.Field(default=None)
92
180
 
93
- @pydantic.root_validator(pre=True)
94
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
181
+ @pydantic.model_validator(mode="before")
182
+ @classmethod
183
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
95
184
  return values_with_discriminator(values, "kind", "qnum")
96
185
 
97
- @pydantic.root_validator
98
- def _validate_fields(cls, values: Dict[str, Any]) -> Dict[str, Any]:
99
- has_sign = values["is_signed"] is not None
100
- has_fraction_digits = values["fraction_digits"] is not None
101
- if has_sign and not has_fraction_digits or not has_sign and has_fraction_digits:
186
+ @pydantic.model_validator(mode="after")
187
+ def _validate_fields(self) -> Self:
188
+ has_sign = self.is_signed is not None
189
+ has_fraction_digits = self.fraction_digits is not None
190
+ if (has_sign and not has_fraction_digits) or (
191
+ not has_sign and has_fraction_digits
192
+ ):
102
193
  raise ClassiqValueError(
103
194
  "Assign neither or both of is_signed and fraction_digits"
104
195
  )
105
- return values
196
+ return self
106
197
 
107
198
  @property
108
199
  def has_sign(self) -> bool:
@@ -126,19 +217,56 @@ class QuantumNumeric(QuantumScalar):
126
217
  if self.size is not None and self.size.is_evaluated():
127
218
  self._size_in_bits = self.size.to_int_value()
128
219
 
129
- def get_proxy(self, name: str) -> QmodQNumProxy:
220
+ def get_proxy(self, handle: "HandleBinding") -> QmodQNumProxy:
130
221
  return QmodQNumProxy(
131
- name,
222
+ handle,
132
223
  size=self.size_in_bits,
133
224
  fraction_digits=self.fraction_digits_value,
134
225
  is_signed=self.sign_value,
135
226
  )
136
227
 
228
+ @property
229
+ def qmod_type_name(self) -> str:
230
+ if (
231
+ self.size is not None
232
+ and self.is_signed is not None
233
+ and self.fraction_digits is not None
234
+ ):
235
+ return f"QNum[{self.size.expr}, {self.is_signed.expr}, {self.fraction_digits.expr}]"
236
+ return "QNum"
137
237
 
138
- ConcreteQuantumType = Annotated[
139
- Union[QuantumBit, QuantumBitvector, QuantumNumeric],
140
- Field(discriminator="kind", default_factory=QuantumBitvector),
141
- ]
238
+ @property
239
+ def type_name(self) -> str:
240
+ return "Quantum numeric"
241
+
242
+ @property
243
+ def is_instantiated(self) -> bool:
244
+ return self.size is not None
245
+
246
+ @property
247
+ def is_evaluated(self) -> bool:
248
+ if self.size is None or not self.size.is_evaluated():
249
+ return False
250
+ if self.is_signed is not None and not self.is_signed.is_evaluated():
251
+ return False
252
+ return not (
253
+ self.fraction_digits is not None and not self.fraction_digits.is_evaluated()
254
+ )
255
+
256
+
257
+ class RegisterQuantumType(BaseModel):
258
+ quantum_types: "ConcreteQuantumType"
259
+ size: int = Field(default=1)
260
+
261
+ @property
262
+ def qmod_type_name(self) -> str:
263
+ try:
264
+ return self.quantum_types.qmod_type_name.split("[")[0]
265
+ except AttributeError:
266
+ return "default"
267
+
268
+
269
+ RegisterQuantumTypeDict = dict[str, RegisterQuantumType]
142
270
 
143
271
 
144
272
  def register_info_to_quantum_type(reg_info: RegisterArithmeticInfo) -> QuantumNumeric:
@@ -165,3 +293,12 @@ def quantum_var_to_register(name: str, qtype: QuantumType) -> RegisterUserInput:
165
293
  is_signed=signed,
166
294
  fraction_places=fraction_places,
167
295
  )
296
+
297
+
298
+ def quantum_type_to_register_quantum_type(
299
+ qtype: QuantumType, size: int
300
+ ) -> RegisterQuantumType:
301
+ return RegisterQuantumType(
302
+ quantum_types=qtype,
303
+ size=size,
304
+ )
@@ -1,29 +1,7 @@
1
- from typing import Any, Mapping, Optional
1
+ from classiq.interface.ast_node import ASTNode
2
+ from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
2
3
 
3
- import pydantic
4
- from pydantic import BaseModel
5
4
 
6
- from classiq.interface.generator.expressions.expression import Expression
7
- from classiq.interface.model.quantum_type import (
8
- ConcreteQuantumType,
9
- QuantumBitvector,
10
- QuantumNumeric,
11
- )
12
-
13
-
14
- class QuantumVariableDeclaration(BaseModel):
5
+ class QuantumVariableDeclaration(ASTNode):
15
6
  name: str
16
7
  quantum_type: ConcreteQuantumType
17
- size: Optional[Expression] = pydantic.Field(default=None)
18
-
19
- @pydantic.validator("size")
20
- def _propagate_size_to_type(
21
- cls, size: Optional[Expression], values: Mapping[str, Any]
22
- ) -> Optional[Expression]:
23
- if size is not None:
24
- quantum_type = values.get("quantum_type")
25
- if isinstance(quantum_type, QuantumBitvector):
26
- quantum_type.length = size
27
- elif isinstance(quantum_type, QuantumNumeric):
28
- quantum_type.size = size
29
- return size
@@ -0,0 +1,15 @@
1
+ from typing import TYPE_CHECKING, Literal
2
+
3
+ from classiq.interface.generator.expressions.expression import Expression
4
+ from classiq.interface.model.quantum_statement import QuantumOperation
5
+
6
+ if TYPE_CHECKING:
7
+ from classiq.interface.model.statement_block import StatementBlock
8
+
9
+
10
+ class Repeat(QuantumOperation):
11
+ kind: Literal["Repeat"]
12
+
13
+ iter_var: str
14
+ count: Expression
15
+ body: "StatementBlock"
@@ -1,7 +1,16 @@
1
- from typing import List, Union
1
+ from typing import Annotated, Union
2
2
 
3
+ from pydantic import Field
4
+
5
+ from classiq.interface.model.allocate import Allocate
3
6
  from classiq.interface.model.bind_operation import BindOperation
7
+ from classiq.interface.model.classical_if import ClassicalIf
8
+ from classiq.interface.model.control import Control
4
9
  from classiq.interface.model.inplace_binary_operation import InplaceBinaryOperation
10
+ from classiq.interface.model.invert import Invert
11
+ from classiq.interface.model.native_function_definition import NativeFunctionDefinition
12
+ from classiq.interface.model.phase_operation import PhaseOperation
13
+ from classiq.interface.model.power import Power
5
14
  from classiq.interface.model.quantum_expressions.amplitude_loading_operation import (
6
15
  AmplitudeLoadingOperation,
7
16
  )
@@ -9,24 +18,41 @@ from classiq.interface.model.quantum_expressions.arithmetic_operation import (
9
18
  ArithmeticOperation,
10
19
  )
11
20
  from classiq.interface.model.quantum_function_call import QuantumFunctionCall
12
- from classiq.interface.model.quantum_if_operation import QuantumIfOperation
13
21
  from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
22
+ from classiq.interface.model.repeat import Repeat
14
23
  from classiq.interface.model.variable_declaration_statement import (
15
24
  VariableDeclarationStatement,
16
25
  )
17
- from classiq.interface.model.within_apply_operation import WithinApplyOperation
26
+ from classiq.interface.model.within_apply_operation import WithinApply
18
27
 
19
- ConcreteQuantumStatement = Union[
20
- QuantumFunctionCall,
21
- ArithmeticOperation,
22
- AmplitudeLoadingOperation,
23
- VariableDeclarationStatement,
24
- BindOperation,
25
- InplaceBinaryOperation,
26
- QuantumIfOperation,
27
- WithinApplyOperation,
28
+ ConcreteQuantumStatement = Annotated[
29
+ Union[
30
+ Allocate,
31
+ QuantumFunctionCall,
32
+ ArithmeticOperation,
33
+ AmplitudeLoadingOperation,
34
+ VariableDeclarationStatement,
35
+ BindOperation,
36
+ InplaceBinaryOperation,
37
+ Repeat,
38
+ Power,
39
+ Invert,
40
+ ClassicalIf,
41
+ Control,
42
+ WithinApply,
43
+ PhaseOperation,
44
+ ],
45
+ Field(..., discriminator="kind"),
28
46
  ]
29
47
 
30
- StatementBlock = List[ConcreteQuantumStatement]
48
+ StatementBlock = list[ConcreteQuantumStatement]
31
49
 
32
- QuantumLambdaFunction.update_forward_refs(StatementBlock=StatementBlock)
50
+ Control.model_rebuild()
51
+ QuantumLambdaFunction.model_rebuild()
52
+ Repeat.model_rebuild()
53
+ Power.model_rebuild()
54
+ Invert.model_rebuild()
55
+ WithinApply.model_rebuild()
56
+ ClassicalIf.model_rebuild()
57
+ NativeFunctionDefinition.model_rebuild()
58
+ PhaseOperation.model_rebuild()
@@ -1,27 +1,34 @@
1
1
  import dataclasses
2
+ from collections.abc import Mapping
2
3
  from enum import Enum
3
- from typing import List, Mapping, Optional, Set
4
+ from typing import Optional
4
5
 
6
+ from classiq.interface.exceptions import ClassiqError
5
7
  from classiq.interface.model.handle_binding import HandleBinding
6
8
 
7
- from classiq.exceptions import ClassiqError
8
-
9
9
 
10
10
  class HandleState(Enum):
11
11
  INITIALIZED = 0
12
12
  UNINITIALIZED = 1
13
13
  ERRORED = 2
14
14
 
15
+ def __invert__(self) -> "HandleState":
16
+ if self == HandleState.INITIALIZED:
17
+ return HandleState.UNINITIALIZED
18
+ if self == HandleState.UNINITIALIZED:
19
+ return HandleState.INITIALIZED
20
+ return self
21
+
15
22
 
16
23
  @dataclasses.dataclass
17
24
  class ValidationHandle:
18
25
  _state: HandleState
19
- errors: List[str] = dataclasses.field(default_factory=list)
26
+ errors: list[str] = dataclasses.field(default_factory=list)
20
27
 
21
28
  def __init__(
22
29
  self,
23
30
  initial_state: Optional[HandleState] = None,
24
- errors: Optional[List[str]] = None,
31
+ errors: Optional[list[str]] = None,
25
32
  ) -> None:
26
33
  if initial_state is None and not errors:
27
34
  raise ClassiqError("Missing initial state for ValidationHandle")
@@ -44,5 +51,5 @@ class ValidationHandle:
44
51
  self._state = HandleState.UNINITIALIZED
45
52
 
46
53
 
47
- def get_unique_handle_names(io_dict: Mapping[str, HandleBinding]) -> Set[str]:
54
+ def get_unique_handle_names(io_dict: Mapping[str, HandleBinding]) -> set[str]:
48
55
  return {handle_binding.name for handle_binding in io_dict.values()}
@@ -1,3 +1,5 @@
1
+ from typing import Literal
2
+
1
3
  from classiq.interface.model.quantum_statement import QuantumStatement
2
4
  from classiq.interface.model.quantum_variable_declaration import (
3
5
  QuantumVariableDeclaration,
@@ -5,4 +7,4 @@ from classiq.interface.model.quantum_variable_declaration import (
5
7
 
6
8
 
7
9
  class VariableDeclarationStatement(QuantumStatement, QuantumVariableDeclaration):
8
- pass
10
+ kind: Literal["VariableDeclarationStatement"]
@@ -1,11 +1,13 @@
1
- from typing import TYPE_CHECKING
1
+ from typing import TYPE_CHECKING, Literal
2
2
 
3
3
  from classiq.interface.model.quantum_statement import QuantumOperation
4
4
 
5
5
  if TYPE_CHECKING:
6
- from classiq.interface.model.quantum_lambda_function import QuantumOperand
6
+ from classiq.interface.model.statement_block import StatementBlock
7
7
 
8
8
 
9
- class WithinApplyOperation(QuantumOperation):
10
- compute: "QuantumOperand"
11
- action: "QuantumOperand"
9
+ class WithinApply(QuantumOperation):
10
+ kind: Literal["WithinApply"]
11
+
12
+ compute: "StatementBlock"
13
+ action: "StatementBlock"
@@ -1,15 +1,14 @@
1
- from datetime import datetime
2
- from typing import Any, Dict
1
+ from datetime import date
2
+ from typing import Any
3
3
 
4
- import pydantic
5
4
  from pydantic import BaseModel
6
5
 
7
6
 
8
7
  class DeprecationInfo(BaseModel):
9
- deprecation_date: datetime = pydantic.Field()
10
- removal_date: datetime = pydantic.Field()
8
+ deprecation_date: date
9
+ removal_date: date
11
10
 
12
11
 
13
12
  class GlobalVersions(BaseModel):
14
- deprecated: Dict[str, DeprecationInfo] = pydantic.Field()
15
- deployed: Dict[str, Any] = pydantic.Field()
13
+ deprecated: dict[str, DeprecationInfo]
14
+ deployed: dict[str, Any]
@@ -1,8 +1,11 @@
1
1
  ANALYZER_PREFIX = "/analyzer"
2
2
  CHEMISTRY_PREFIX = "/chemistry"
3
- LEGACY_EXECUTE_PREFIX = "/execute"
4
3
  EXECUTION_PREFIX = "/execution"
4
+ EXECUTION_SESSIONS_PREFIX = EXECUTION_PREFIX + "/sessions"
5
5
  CONVERSION_PREFIX = "/conversion"
6
+ PROVIDERS_PREFIX = "/providers"
7
+
8
+ IQCC_PREFIX = PROVIDERS_PREFIX + "/iqcc"
6
9
 
7
10
  EXECUTION_NON_VERSIONED_PREFIX = "/execution/v1"
8
11
  SYNTHESIS_NON_VERSIONED_PREFIX = "/synthesis/v1"
@@ -18,21 +21,20 @@ ANALYZER_HC_TABLE_GRAPH_FULL_PATH = ANALYZER_PREFIX + ANALYZER_HC_TABLE_GRAPH
18
21
 
19
22
  ANALYZER_HC_GRAPH_NEW = "/graphs/hardware_connectivity/new"
20
23
 
21
- ANALYZER_OPTIONAL_DEVICES = "/graphs/available_devices"
22
- ANALYZER_OPTIONAL_DEVICES_FULL_PATH = ANALYZER_PREFIX + ANALYZER_OPTIONAL_DEVICES
23
-
24
24
  TASKS_SUFFIX = "/tasks"
25
- QUANTUM_PROGRAM_SUFFIX = "/quantum_program"
26
- ESTIMATE_SUFFIX = "/estimate"
27
25
  RB = "/rb"
28
26
  ANALYZER_DATA_TASK = f"{TASKS_SUFFIX}/data"
29
27
  ANALYZER_QASM_TASK = f"{TASKS_SUFFIX}/qasm"
28
+ ANALYZER_GET_VISUAL_MODEL = "/get_visual_model"
29
+ ANALYZER_GET_IDE_DATA = "/get_ide_data"
30
30
  IDE_EVENT_TASK = f"{TASKS_SUFFIX}/event"
31
31
  DATA_DOG_EVENT_TASK = f"{TASKS_SUFFIX}/data_dog_event"
32
32
 
33
33
  ANALYZER_DATA_TASK_UPLOAD_FILE = f"{TASKS_SUFFIX}/data/file_upload"
34
34
  ANALYZER_DATA_FULL_PATH = f"{ANALYZER_PREFIX}{ANALYZER_DATA_TASK}"
35
35
  ANALYZER_QASM_FULL_PATH = f"{ANALYZER_PREFIX}{ANALYZER_QASM_TASK}"
36
+ ANALYZER_GET_VISUAL_MODEL_FULL_PATH = f"{ANALYZER_PREFIX}{ANALYZER_GET_VISUAL_MODEL}"
37
+ ANALYZER_GET_IDE_DATA_FULL_PATH = f"{ANALYZER_PREFIX}{ANALYZER_GET_IDE_DATA}"
36
38
  IDE_EVENT_TASK_FULL_PATH = f"{ANALYZER_PREFIX}{IDE_EVENT_TASK}"
37
39
  DATA_DOG_EVENT_TASK_FULL_PATH = f"{ANALYZER_PREFIX}{DATA_DOG_EVENT_TASK}"
38
40
 
@@ -40,9 +42,8 @@ IDE_QASM_TASK = f"{TASKS_SUFFIX}/generated_circuit_from_qasm"
40
42
  IDE_QASM_FULL_PATH = f"{ANALYZER_PREFIX}{IDE_QASM_TASK}"
41
43
  TASKS_GENERATE_SUFFIX = TASKS_SUFFIX + "/generate"
42
44
  TASKS_VISUALIZE_SUFFIX = TASKS_SUFFIX + "/visualize"
45
+ TASKS_VISUAL_MODEL_SUFFIX = TASKS_SUFFIX + "/visual_model"
43
46
  TASKS_SOLVE_SUFFIX = "/tasks/solve"
44
- MODEL_GENERATE_PREFIX = "/generate_model"
45
- CHEMISTRY_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/chemistry"
46
47
 
47
48
  CHEMISTRY_QMOD_PATH = "/generate_model/chemistry/qmod"
48
49
  GROVER_QMOD_PATH = "/generate_model/grover/qmod"
@@ -60,8 +61,6 @@ EXECUTION_JOBS_FULL_PATH = EXECUTION_PREFIX + EXECUTION_JOBS_SUFFIX
60
61
  EXECUTION_JOBS_NON_VERSIONED_FULL_PATH = (
61
62
  EXECUTION_NON_VERSIONED_PREFIX + EXECUTION_JOBS_SUFFIX
62
63
  )
63
- EXECUTE_QUANTUM_PROGRAM_FULL_PATH = LEGACY_EXECUTE_PREFIX + QUANTUM_PROGRAM_SUFFIX
64
- EXECUTE_ESTIMATE_FULL_PATH = LEGACY_EXECUTE_PREFIX + ESTIMATE_SUFFIX
65
64
 
66
65
  ANALYZER_FULL_PATH = ANALYZER_PREFIX + TASKS_SUFFIX
67
66
  ANALYZER_RB_FULL_PATH = ANALYZER_PREFIX + TASK_RB_SUFFIX
@@ -70,19 +69,16 @@ GENERATE_RESOURCE_ESTIMATOR_REPORT = "/resource_estimator_report"
70
69
  TASKS_SOLVE_EXACT_SUFFIX = "/tasks/solve_exact"
71
70
 
72
71
  GENERATE_HAMILTONIAN_SUFFIX = "/generate_hamiltonian"
73
- GENERATE_HAMILTONIAN_FULL_PATH = (
74
- SYNTHESIS_NON_VERSIONED_PREFIX + GENERATE_HAMILTONIAN_SUFFIX
75
- )
76
-
77
- FINANCE_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/finance"
78
-
79
- GROVER_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/grover"
80
-
81
- QMOD_PREFIX = ANALYZER_PREFIX + "/qmods"
82
- QMOD_METADATA_PATH = QMOD_PREFIX + "/metadata"
83
- QMOD_FILE_PATH = QMOD_PREFIX + "/file"
72
+ GENERATE_HAMILTONIAN_FULL_PATH = CHEMISTRY_PREFIX + GENERATE_HAMILTONIAN_SUFFIX
84
73
 
85
74
  CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_SUFFIX = "/execution_input"
86
75
  CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_FULL = (
87
76
  CONVERSION_PREFIX + CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_SUFFIX
88
77
  )
78
+
79
+ STATIC_SEMANTICS_VALIDATION_PATH = "/validate_static_semantics"
80
+
81
+ IQCC_INIT_AUTH_SUFFIX = "/init_auth"
82
+ IQCC_INIT_AUTH_FULL_PATH = IQCC_PREFIX + IQCC_INIT_AUTH_SUFFIX
83
+ IQCC_PROBE_AUTH_SUFFIX = "/probe_auth"
84
+ IQCC_PROBE_AUTH_FULL_PATH = IQCC_PREFIX + IQCC_PROBE_AUTH_SUFFIX
@@ -0,0 +1,59 @@
1
+ import os
2
+ import re
3
+ from pathlib import Path
4
+ from typing import Optional
5
+
6
+ import pydantic
7
+
8
+ from classiq.interface.helpers.hashable_pydantic_base_model import (
9
+ HashablePydanticBaseModel,
10
+ )
11
+
12
+
13
+ def _identify_ipynb_cell(file_name: str) -> bool:
14
+ file_path = Path(file_name)
15
+ base_file = file_path.name
16
+ if re.fullmatch(r"\d*\.py", base_file) is None:
17
+ return False
18
+ parent_folder = file_path.parent
19
+ return re.fullmatch(r"ipykernel_\d*", parent_folder.name) is not None
20
+
21
+
22
+ def _prepare_file_string(file_name: str) -> str:
23
+ if _identify_ipynb_cell(file_name):
24
+ return "ipynb cell "
25
+ return f"file {os.path.basename(file_name)} "
26
+
27
+
28
+ class SourceReference(HashablePydanticBaseModel):
29
+ start_line: int
30
+ start_column: int
31
+ end_line: int
32
+ end_column: int
33
+ file_name: Optional[str] = pydantic.Field(default=None)
34
+
35
+ def __str__(self) -> str:
36
+ file_string = _prepare_file_string(self.file_name) if self.file_name else ""
37
+ start_character_string = (
38
+ f" character {self.start_column + 1}" if self.start_column > 0 else ""
39
+ )
40
+ return f"{file_string}line {self.start_line + 1}{start_character_string}"
41
+
42
+
43
+ class SourceReferencedError(pydantic.BaseModel):
44
+ error: str
45
+ source_ref: Optional[SourceReference] = None
46
+ function: Optional[str] = None
47
+
48
+ def __str__(self) -> str:
49
+ source_referenced_error = (
50
+ f"{self.error}\n\t\tat {self.source_ref}"
51
+ if self.source_ref is not None
52
+ else self.error
53
+ )
54
+ function_scoped_error = (
55
+ f"{source_referenced_error} in function {self.function}"
56
+ if self.function is not None
57
+ else source_referenced_error
58
+ )
59
+ return function_scoped_error