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,24 +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
4
+ from pydantic import BaseModel, ConfigDict, Field
5
+ from typing_extensions import Self
5
6
 
7
+ from classiq.interface.ast_node import HashableASTNode
8
+ from classiq.interface.exceptions import ClassiqValueError
6
9
  from classiq.interface.generator.arith.register_user_input import (
7
10
  RegisterArithmeticInfo,
8
11
  RegisterUserInput,
9
12
  )
10
13
  from classiq.interface.generator.expressions.expression import Expression
11
- from classiq.interface.helpers.hashable_pydantic_base_model import (
12
- HashablePydanticBaseModel,
14
+ from classiq.interface.generator.expressions.qmod_qarray_proxy import QmodQArrayProxy
15
+ from classiq.interface.generator.expressions.qmod_qscalar_proxy import (
16
+ QmodQBitProxy,
17
+ QmodQNumProxy,
18
+ QmodQScalarProxy,
13
19
  )
20
+ from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
14
21
  from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
22
+ from classiq.interface.model.handle_binding import HandleBinding
15
23
 
16
- from classiq.exceptions import ClassiqValueError
24
+ if TYPE_CHECKING:
25
+ from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
17
26
 
18
27
 
19
- class QuantumType(HashablePydanticBaseModel):
20
- class Config:
21
- extra = Extra.forbid
28
+ class QuantumType(HashableASTNode):
29
+ model_config = ConfigDict(extra="forbid")
22
30
 
23
31
  _size_in_bits: Optional[int] = pydantic.PrivateAttr(default=None)
24
32
 
@@ -40,112 +48,232 @@ class QuantumType(HashablePydanticBaseModel):
40
48
  def set_size_in_bits(self, val: int) -> None:
41
49
  self._size_in_bits = val
42
50
 
51
+ def get_proxy(self, handle: "HandleBinding") -> QmodSizedProxy:
52
+ return QmodSizedProxy(handle=handle, size=self.size_in_bits)
43
53
 
44
- class QuantumBit(QuantumType):
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
69
+
70
+
71
+ class QuantumScalar(QuantumType):
72
+ def get_proxy(self, handle: "HandleBinding") -> QmodQScalarProxy:
73
+ return QmodQScalarProxy(handle, size=self.size_in_bits)
74
+
75
+
76
+ class QuantumBit(QuantumScalar):
45
77
  kind: Literal["qbit"]
46
78
 
47
79
  def __init__(self, **kwargs: Any) -> None:
48
80
  super().__init__(**kwargs)
49
81
  self._size_in_bits = 1
50
82
 
51
- @pydantic.root_validator(pre=True)
52
- 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]:
53
86
  return values_with_discriminator(values, "kind", "qbit")
54
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
55
102
 
56
- class QuantumArray(QuantumType):
57
- length: Optional[Expression]
103
+ @property
104
+ def is_evaluated(self) -> bool:
105
+ return True
58
106
 
59
107
 
60
- class QuantumBitvector(QuantumArray):
108
+ class QuantumBitvector(QuantumType):
109
+ element_type: "ConcreteQuantumType" = Field(
110
+ discriminator="kind", default_factory=QuantumBit
111
+ )
61
112
  kind: Literal["qvec"]
113
+ length: Optional[Expression] = Field(default=None)
62
114
 
63
- @pydantic.root_validator(pre=True)
64
- 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]:
65
118
  return values_with_discriminator(values, "kind", "qvec")
66
119
 
67
120
  def _update_size_in_bits_from_declaration(self) -> None:
68
- if self.length is not None and self.length.is_evaluated():
69
- 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
+ )
70
127
 
128
+ @property
129
+ def has_length(self) -> bool:
130
+ return self.length is not None and self.length.is_evaluated()
71
131
 
72
- class QuantumNumeric(QuantumType):
73
- size: Optional[Expression] = pydantic.Field()
74
- kind: str = pydantic.Field()
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
+ )
75
150
 
76
- @pydantic.root_validator(pre=True)
77
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
78
- return values_with_discriminator(values, "kind", "qnum")
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)}]"
79
156
 
80
- _is_signed: bool = pydantic.PrivateAttr(default=False)
157
+ @property
158
+ def type_name(self) -> str:
159
+ return "Quantum array"
81
160
 
82
- _fraction_digits: int = pydantic.PrivateAttr(default=0)
161
+ @property
162
+ def is_instantiated(self) -> bool:
163
+ return self.length is not None and self.element_type.is_instantiated
83
164
 
84
165
  @property
85
- def size_in_bits_expr(self) -> Optional[Expression]:
86
- return self.size
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
+ )
172
+
173
+
174
+ class QuantumNumeric(QuantumScalar):
175
+ kind: Literal["qnum"]
176
+
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)
180
+
181
+ @pydantic.model_validator(mode="before")
182
+ @classmethod
183
+ def _set_kind(cls, values: Any) -> dict[str, Any]:
184
+ return values_with_discriminator(values, "kind", "qnum")
185
+
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
+ ):
193
+ raise ClassiqValueError(
194
+ "Assign neither or both of is_signed and fraction_digits"
195
+ )
196
+ return self
87
197
 
88
198
  @property
89
- def is_signed(self) -> bool:
90
- return self._is_signed
199
+ def has_sign(self) -> bool:
200
+ return self.is_signed is not None
91
201
 
92
- def set_signed(self, val: bool) -> None:
93
- self._is_signed = val
202
+ @property
203
+ def sign_value(self) -> bool:
204
+ return False if self.is_signed is None else self.is_signed.to_bool_value()
94
205
 
95
206
  @property
96
- def fraction_digits(self) -> int:
97
- return self._fraction_digits
207
+ def has_fraction_digits(self) -> bool:
208
+ return self.fraction_digits is not None
98
209
 
99
- def set_fraction_digits(self, val: int) -> None:
100
- self._fraction_digits = val
210
+ @property
211
+ def fraction_digits_value(self) -> int:
212
+ return (
213
+ 0 if self.fraction_digits is None else self.fraction_digits.to_int_value()
214
+ )
101
215
 
102
216
  def _update_size_in_bits_from_declaration(self) -> None:
103
217
  if self.size is not None and self.size.is_evaluated():
104
218
  self._size_in_bits = self.size.to_int_value()
105
219
 
220
+ def get_proxy(self, handle: "HandleBinding") -> QmodQNumProxy:
221
+ return QmodQNumProxy(
222
+ handle,
223
+ size=self.size_in_bits,
224
+ fraction_digits=self.fraction_digits_value,
225
+ is_signed=self.sign_value,
226
+ )
106
227
 
107
- class QuantumInteger(QuantumNumeric):
108
- kind: Literal["qint"]
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"
109
237
 
110
- @pydantic.root_validator(pre=True)
111
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
112
- return values_with_discriminator(values, "kind", "qint")
238
+ @property
239
+ def type_name(self) -> str:
240
+ return "Quantum numeric"
113
241
 
242
+ @property
243
+ def is_instantiated(self) -> bool:
244
+ return self.size is not None
114
245
 
115
- class QuantumFixedReal(QuantumNumeric):
116
- fraction_places: Expression = pydantic.Field()
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
+ )
117
255
 
118
- kind: Literal["qfixed"]
119
256
 
120
- @pydantic.root_validator(pre=True)
121
- def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
122
- return values_with_discriminator(values, "kind", "qfixed")
257
+ class RegisterQuantumType(BaseModel):
258
+ quantum_types: "ConcreteQuantumType"
259
+ size: int = Field(default=1)
123
260
 
124
261
  @property
125
- def fraction_digits(self) -> int:
126
- return self.fraction_places.to_int_value()
127
-
128
- def set_fraction_digits(self, val: int) -> None:
129
- if val != self.fraction_places.to_int_value():
130
- raise ClassiqValueError(
131
- "Cannot assign value of fixed-point number with incompatible fraction digits"
132
- )
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"
133
267
 
134
268
 
135
- ConcreteQuantumType = Union[
136
- QuantumBit,
137
- QuantumBitvector,
138
- QuantumNumeric,
139
- QuantumInteger,
140
- QuantumFixedReal,
141
- ]
269
+ RegisterQuantumTypeDict = dict[str, RegisterQuantumType]
142
270
 
143
271
 
144
272
  def register_info_to_quantum_type(reg_info: RegisterArithmeticInfo) -> QuantumNumeric:
145
273
  result = QuantumNumeric()
146
274
  result.set_size_in_bits(reg_info.size)
147
- result.set_signed(reg_info.is_signed)
148
- result.set_fraction_digits(reg_info.fraction_places)
275
+ result.is_signed = Expression(expr=str(reg_info.is_signed))
276
+ result.fraction_digits = Expression(expr=str(reg_info.fraction_places))
149
277
  return result
150
278
 
151
279
 
@@ -153,10 +281,11 @@ UNRESOLVED_SIZE = 1000
153
281
 
154
282
 
155
283
  def quantum_var_to_register(name: str, qtype: QuantumType) -> RegisterUserInput:
156
- signed = qtype.is_signed if isinstance(qtype, QuantumNumeric) else False
157
- if isinstance(qtype, (QuantumFixedReal, QuantumNumeric)):
158
- fraction_places = qtype.fraction_digits
284
+ if isinstance(qtype, QuantumNumeric):
285
+ signed = qtype.sign_value
286
+ fraction_places = qtype.fraction_digits_value
159
287
  else:
288
+ signed = False
160
289
  fraction_places = 0
161
290
  return RegisterUserInput(
162
291
  name=name,
@@ -164,3 +293,12 @@ def quantum_var_to_register(name: str, qtype: QuantumType) -> RegisterUserInput:
164
293
  is_signed=signed,
165
294
  fraction_places=fraction_places,
166
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
- quantum_type: ConcreteQuantumType = pydantic.Field(default_factory=QuantumBitvector)
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
7
+ quantum_type: ConcreteQuantumType
@@ -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"
@@ -0,0 +1,58 @@
1
+ from typing import Annotated, Union
2
+
3
+ from pydantic import Field
4
+
5
+ from classiq.interface.model.allocate import Allocate
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
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
14
+ from classiq.interface.model.quantum_expressions.amplitude_loading_operation import (
15
+ AmplitudeLoadingOperation,
16
+ )
17
+ from classiq.interface.model.quantum_expressions.arithmetic_operation import (
18
+ ArithmeticOperation,
19
+ )
20
+ from classiq.interface.model.quantum_function_call import QuantumFunctionCall
21
+ from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
22
+ from classiq.interface.model.repeat import Repeat
23
+ from classiq.interface.model.variable_declaration_statement import (
24
+ VariableDeclarationStatement,
25
+ )
26
+ from classiq.interface.model.within_apply_operation import WithinApply
27
+
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"),
46
+ ]
47
+
48
+ StatementBlock = list[ConcreteQuantumStatement]
49
+
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"]
@@ -0,0 +1,13 @@
1
+ from typing import TYPE_CHECKING, Literal
2
+
3
+ from classiq.interface.model.quantum_statement import QuantumOperation
4
+
5
+ if TYPE_CHECKING:
6
+ from classiq.interface.model.statement_block import StatementBlock
7
+
8
+
9
+ class WithinApply(QuantumOperation):
10
+ kind: Literal["WithinApply"]
11
+
12
+ compute: "StatementBlock"
13
+ action: "StatementBlock"
@@ -1,10 +1,13 @@
1
+ from typing import Any
2
+
1
3
  import sympy
2
4
  from pyomo.core.base import _GeneralVarData
5
+ from pyomo.core.expr.sympy_tools import PyomoSympyBimap
3
6
 
4
7
 
5
8
  # This code is a pure copy paste from pyomo.core.expr.sympy_tools.PyomoSympyBimap.getSympySymbol
6
9
  # except one line.
7
- def get_sympy_symbol(self, pyomo_object):
10
+ def get_sympy_symbol(self: PyomoSympyBimap, pyomo_object: Any) -> sympy.Symbol:
8
11
  if pyomo_object in self.pyomo2sympy:
9
12
  return self.pyomo2sympy[pyomo_object]
10
13
  # Pyomo currently ONLY supports Real variables (not complex
@@ -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,13 @@ 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"
47
+
48
+ CHEMISTRY_QMOD_PATH = "/generate_model/chemistry/qmod"
49
+ GROVER_QMOD_PATH = "/generate_model/grover/qmod"
50
+ FINANCE_QMOD_PATH = "/generate_model/finance/qmod"
51
+
46
52
 
47
53
  TASK_TRAIN_SUFFIX = TASKS_SUFFIX + "/train"
48
54
  TASK_TEST_SUFFIX = TASKS_SUFFIX + "/test"
@@ -55,8 +61,6 @@ EXECUTION_JOBS_FULL_PATH = EXECUTION_PREFIX + EXECUTION_JOBS_SUFFIX
55
61
  EXECUTION_JOBS_NON_VERSIONED_FULL_PATH = (
56
62
  EXECUTION_NON_VERSIONED_PREFIX + EXECUTION_JOBS_SUFFIX
57
63
  )
58
- EXECUTE_QUANTUM_PROGRAM_FULL_PATH = LEGACY_EXECUTE_PREFIX + QUANTUM_PROGRAM_SUFFIX
59
- EXECUTE_ESTIMATE_FULL_PATH = LEGACY_EXECUTE_PREFIX + ESTIMATE_SUFFIX
60
64
 
61
65
  ANALYZER_FULL_PATH = ANALYZER_PREFIX + TASKS_SUFFIX
62
66
  ANALYZER_RB_FULL_PATH = ANALYZER_PREFIX + TASK_RB_SUFFIX
@@ -65,19 +69,16 @@ GENERATE_RESOURCE_ESTIMATOR_REPORT = "/resource_estimator_report"
65
69
  TASKS_SOLVE_EXACT_SUFFIX = "/tasks/solve_exact"
66
70
 
67
71
  GENERATE_HAMILTONIAN_SUFFIX = "/generate_hamiltonian"
68
- GENERATE_HAMILTONIAN_FULL_PATH = (
69
- SYNTHESIS_NON_VERSIONED_PREFIX + GENERATE_HAMILTONIAN_SUFFIX
70
- )
71
-
72
- FINANCE_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/finance"
73
-
74
- GROVER_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/grover"
75
-
76
- QMOD_PREFIX = ANALYZER_PREFIX + "/qmods"
77
- QMOD_METADATA_PATH = QMOD_PREFIX + "/metadata"
78
- QMOD_FILE_PATH = QMOD_PREFIX + "/file"
72
+ GENERATE_HAMILTONIAN_FULL_PATH = CHEMISTRY_PREFIX + GENERATE_HAMILTONIAN_SUFFIX
79
73
 
80
74
  CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_SUFFIX = "/execution_input"
81
75
  CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_FULL = (
82
76
  CONVERSION_PREFIX + CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_SUFFIX
83
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