classiq 0.38.0__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 (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.3.dist-info}/METADATA +16 -9
  414. classiq-0.65.3.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.3.dist-info}/WHEEL +0 -0
@@ -1,51 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.generator import function_params
4
- from classiq.interface.generator.arith.argument_utils import RegisterOrConst
5
- from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
6
- from classiq.interface.generator.parameters import ParameterFloatType
7
-
8
- DATA_REG_INPUT_NAME: str = "data_reg_input"
9
- BOUND_REG_INPUT_NAME: str = "bound_reg_input"
10
-
11
- DATA_REG_OUTPUT_NAME: str = "data_reg_output"
12
- BOUND_REG_OUTPUT_NAME: str = "bound_reg_output"
13
-
14
-
15
- class InequalityMixer(function_params.FunctionParams):
16
- """
17
- Mixing a fixed point number variable below a given upper bound or above a given
18
- lower bound. i.e. after applying this function the variable will hold a
19
- superposition position of all the valid values.
20
- """
21
-
22
- data_reg_input: RegisterArithmeticInfo = pydantic.Field(
23
- description="The input variable to mix."
24
- )
25
-
26
- bound_reg_input: RegisterOrConst = pydantic.Field(
27
- description="Fixed number or variable that define the upper or lower bound for"
28
- " the mixing operation. In case of a fixed number bound, the value"
29
- " must be positive."
30
- )
31
-
32
- mixer_parameter: ParameterFloatType = pydantic.Field(
33
- description="The parameter used for rotation gates in the mixer.",
34
- is_exec_param=True,
35
- )
36
-
37
- is_less_inequality: bool = pydantic.Field(
38
- default=True,
39
- description="Whether to mix below or above a certain bound."
40
- "Less inequality mixes between 0 and the given bound."
41
- "Greater inequality mixes between the bound and the maximal number allowed by"
42
- " the number of qubits (i.e 2^n - 1).",
43
- )
44
-
45
- def _create_ios(self) -> None:
46
- self._inputs = {DATA_REG_INPUT_NAME: self.data_reg_input}
47
- self._outputs = {DATA_REG_OUTPUT_NAME: self.data_reg_input}
48
-
49
- if isinstance(self.bound_reg_input, RegisterArithmeticInfo):
50
- self._inputs[BOUND_REG_INPUT_NAME] = self.bound_reg_input
51
- self._outputs[BOUND_REG_OUTPUT_NAME] = self.bound_reg_input
@@ -1,106 +0,0 @@
1
- import ast
2
- from typing import Dict, List
3
-
4
- from classiq.model.model import DEFAULT_RESULT_NAME
5
-
6
- STANDARD_CMAIN_BODY_LENGTH = 2 # assignment of sample call, save statement
7
-
8
-
9
- class NonStandardClassicalCodeError(Exception):
10
- pass
11
-
12
-
13
- # `is_standard_cmain` and `extract_sample_params` could easily be merged to one function, as they
14
- # are doing similar tasks, but we decided to separate them for the sake of a better interface
15
- def is_standard_cmain(model_classical_execution_code: str) -> bool:
16
- try:
17
- classical_body = _get_classical_body(model_classical_execution_code)
18
- if len(classical_body) != STANDARD_CMAIN_BODY_LENGTH:
19
- return False
20
-
21
- _assert_sample_call(classical_body)
22
- _assert_save_statement(classical_body)
23
-
24
- return True
25
- except NonStandardClassicalCodeError:
26
- return False
27
-
28
-
29
- def extract_sample_params(model_classical_execution_code: str) -> Dict[str, float]:
30
- classical_main = _get_classical_body(model_classical_execution_code)
31
-
32
- qmain_params: Dict[str, float] = {}
33
- sample_call = _get_sample_call(classical_main)
34
- if len(sample_call.args) == 1 and isinstance(sample_call.args[0], ast.Dict):
35
- ast_dict = sample_call.args[0]
36
- qmain_params = dict(
37
- zip(
38
- [k.value for k in ast_dict.keys if isinstance(k, ast.Constant)],
39
- [v.value for v in ast_dict.values if isinstance(v, ast.Constant)],
40
- )
41
- )
42
-
43
- return qmain_params
44
-
45
-
46
- def has_classical_exec(model_classical_execution_code: str) -> bool:
47
- return model_classical_execution_code != ""
48
-
49
-
50
- def _get_classical_body(model_classical_execution_code: str) -> List[ast.stmt]:
51
- if not has_classical_exec(model_classical_execution_code):
52
- raise NonStandardClassicalCodeError
53
- return ast.parse(model_classical_execution_code).body
54
-
55
-
56
- def _assert_sample_call(classical_body: List[ast.stmt]) -> None:
57
- _get_sample_call(classical_body)
58
-
59
-
60
- def _get_sample_call(
61
- classical_body: List[ast.stmt],
62
- ) -> ast.Call:
63
- classical_call = classical_body[0]
64
- if not isinstance(classical_call, ast.Assign):
65
- raise NonStandardClassicalCodeError
66
-
67
- if len(classical_call.targets) != 1:
68
- raise NonStandardClassicalCodeError
69
- target = classical_call.targets[0]
70
- if not isinstance(target, ast.Name) or target.id != DEFAULT_RESULT_NAME:
71
- raise NonStandardClassicalCodeError
72
-
73
- invoked_expression = classical_call.value
74
- if not isinstance(invoked_expression, ast.Call):
75
- raise NonStandardClassicalCodeError
76
- if (
77
- not isinstance(invoked_expression.func, ast.Name)
78
- or invoked_expression.func.id != "sample"
79
- ):
80
- raise NonStandardClassicalCodeError
81
-
82
- return invoked_expression
83
-
84
-
85
- def _assert_save_statement(classical_body: List[ast.stmt]) -> None:
86
- save_statement = classical_body[1]
87
- if not isinstance(save_statement, ast.Expr) or not isinstance(
88
- save_statement.value, ast.Call
89
- ):
90
- raise NonStandardClassicalCodeError
91
-
92
- call = save_statement.value
93
- if not isinstance(call.func, ast.Name) or call.func.id != "save":
94
- raise NonStandardClassicalCodeError
95
-
96
- if not len(call.args) == 1:
97
- raise NonStandardClassicalCodeError
98
-
99
- if (
100
- not isinstance(call.args[0], ast.Dict)
101
- or not isinstance(call.args[0].keys[0], ast.Constant)
102
- or call.args[0].keys[0].value != DEFAULT_RESULT_NAME
103
- or not isinstance(call.args[0].values[0], ast.Name)
104
- or call.args[0].values[0].id != DEFAULT_RESULT_NAME
105
- ):
106
- raise NonStandardClassicalCodeError
@@ -1,56 +0,0 @@
1
- import pydantic
2
-
3
- from classiq.interface.generator.arith.argument_utils import RegisterOrConst
4
- from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
5
- from classiq.interface.generator.function_params import FunctionParams
6
- from classiq.interface.generator.parameters import ParameterFloatType
7
-
8
- DATA_REG_INPUT_NAME: str = "data_reg_input"
9
- LOWER_BOUND_REG_INPUT_NAME: str = "lower_bound_reg_input"
10
- UPPER_BOUND_REG_INPUT_NAME: str = "upper_bound_reg_input"
11
-
12
-
13
- DATA_REG_OUTPUT_NAME: str = "data_reg_output"
14
- LOWER_BOUND_REG_OUTPUT_NAME: str = "lower_bound_reg_output"
15
- UPPER_BOUND_REG_OUTPUT_NAME: str = "upper_bound_reg_output"
16
-
17
-
18
- class RangeMixer(FunctionParams):
19
- """
20
- Mixing a fixed point number variable between a given lower and upper bounds.
21
- I.e. after applying this function the variable will hold a
22
- superposition of all the valid values.
23
- """
24
-
25
- data_reg_input: RegisterArithmeticInfo = pydantic.Field(
26
- description="The input variable to mix."
27
- )
28
-
29
- lower_bound_reg_input: RegisterOrConst = pydantic.Field(
30
- description="Fixed number or variable that define the lower bound for"
31
- " the mixing operation. In case of a fixed number bound, the value"
32
- " must be positive."
33
- )
34
-
35
- upper_bound_reg_input: RegisterOrConst = pydantic.Field(
36
- description="Fixed number or variable that define the upper bound for"
37
- " the mixing operation. In case of a fixed number bound, the value"
38
- " must be positive."
39
- )
40
-
41
- mixer_parameter: ParameterFloatType = pydantic.Field(
42
- description="The parameter used for rotation gates in the mixer.",
43
- is_exec_param=True,
44
- )
45
-
46
- def _create_ios(self) -> None:
47
- self._inputs = {DATA_REG_INPUT_NAME: self.data_reg_input}
48
- self._outputs = {DATA_REG_OUTPUT_NAME: self.data_reg_input}
49
-
50
- if isinstance(self.lower_bound_reg_input, RegisterArithmeticInfo):
51
- self._inputs[LOWER_BOUND_REG_INPUT_NAME] = self.lower_bound_reg_input
52
- self._outputs[LOWER_BOUND_REG_OUTPUT_NAME] = self.lower_bound_reg_input
53
-
54
- if isinstance(self.upper_bound_reg_input, RegisterArithmeticInfo):
55
- self._inputs[UPPER_BOUND_REG_INPUT_NAME] = self.upper_bound_reg_input
56
- self._outputs[UPPER_BOUND_REG_OUTPUT_NAME] = self.upper_bound_reg_input
@@ -1,74 +0,0 @@
1
- from typing import Any, Dict, List
2
-
3
- import numpy as np
4
- import pydantic
5
-
6
- from classiq.interface.generator import function_params
7
- from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
8
- from classiq.interface.generator.complex_type import Complex
9
- from classiq.interface.generator.function_params import (
10
- DEFAULT_INPUT_NAME,
11
- DEFAULT_OUTPUT_NAME,
12
- )
13
-
14
- from classiq.exceptions import ClassiqValueError
15
-
16
-
17
- class StatePropagator(function_params.FunctionParams):
18
- """
19
- Creates a quantum circuit that propagates the start state vector to the end state vector,
20
- both are assumed to be pure states.
21
- The default start state vector is |000...0>.
22
- """
23
-
24
- end_state_vector: List[Complex] = pydantic.Field(
25
- description="The desired state vector at the end of the operator."
26
- " Must be of size 2**num_qubits. Does not have to be "
27
- "normalized"
28
- )
29
-
30
- start_state_vector: List[Complex] = pydantic.Field(
31
- default_factory=list,
32
- description="The state vector at the input of the operator."
33
- " Must be of size 2**num_qubits. Does not have to be"
34
- " normalized",
35
- )
36
-
37
- @pydantic.validator("start_state_vector", always=True)
38
- def validate_start_state(
39
- cls, start_state_vector: List[Complex], values: Dict[str, Any]
40
- ) -> List[Complex]:
41
- end_state_vector = values.get("end_state_vector")
42
- if end_state_vector is None:
43
- raise ClassiqValueError(
44
- "Cannot validate start_start_vector without end_state_vector"
45
- )
46
-
47
- num_qubits = cls._num_qubits(end_state_vector)
48
- if len(start_state_vector) == 0:
49
- default_start_state_vector = [Complex(0.0) for _ in range(2**num_qubits)]
50
- default_start_state_vector[0] = Complex(1.0)
51
- start_state_vector = default_start_state_vector
52
-
53
- if len(start_state_vector) != len(end_state_vector):
54
- raise ClassiqValueError(
55
- "Start and end state vectors are of non-equal length"
56
- )
57
-
58
- return start_state_vector
59
-
60
- @staticmethod
61
- def _num_qubits(vector: List[Complex]) -> int:
62
- return int(np.log2(len(vector)))
63
-
64
- def _create_ios(self) -> None:
65
- self._inputs = {
66
- DEFAULT_INPUT_NAME: RegisterArithmeticInfo(
67
- size=self._num_qubits(self.start_state_vector)
68
- )
69
- }
70
- self._outputs = {
71
- DEFAULT_OUTPUT_NAME: RegisterArithmeticInfo(
72
- size=self._num_qubits(self.end_state_vector)
73
- )
74
- }
@@ -1 +0,0 @@
1
- from .pauli_struct_declarations import * # noqa: F403
@@ -1,22 +0,0 @@
1
- import functools
2
-
3
- from classiq.interface.generator.functions.classical_type import (
4
- ClassicalList,
5
- Pauli,
6
- Real,
7
- Struct,
8
- )
9
- from classiq.interface.generator.types.struct_declaration import StructDeclaration
10
- from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
11
-
12
- PAULI_TERM = StructDeclaration(
13
- name="PauliTerm",
14
- variables={
15
- "pauli": ClassicalList(element_type=Pauli()),
16
- "coefficient": Real(),
17
- },
18
- )
19
-
20
- Hamiltonian = functools.partial(ClassicalList, element_type=Struct(name="PauliTerm"))
21
-
22
- StructDeclaration.BUILTIN_STRUCT_DECLARATIONS.update(nameables_to_dict([PAULI_TERM]))
@@ -1,34 +0,0 @@
1
- import re
2
-
3
- import pydantic
4
-
5
- from classiq.interface.analyzer.result import QasmCode
6
-
7
- from classiq import QuantumProgram
8
- from classiq._internals.api_wrapper import ApiWrapper
9
- from classiq._internals.async_utils import syncify_function
10
- from classiq.exceptions import ClassiqValueError
11
- from classiq.synthesis import SerializedQuantumProgram
12
-
13
- QASM_VERSION_REGEX = re.compile("OPENQASM (\\d*.\\d*);")
14
-
15
-
16
- async def qasm_show_interactive_async(qasm_code: str) -> None:
17
- circuit = await ApiWrapper.get_generated_circuit_from_qasm(QasmCode(code=qasm_code))
18
- circuit.show() # type: ignore[attr-defined]
19
-
20
-
21
- qasm_show_interactive = syncify_function(qasm_show_interactive_async)
22
-
23
-
24
- CANT_PARSE_QUANTUM_PROGRAM_MSG = (
25
- "Can not parse quantum_program into GeneratedCircuit, \n"
26
- )
27
-
28
-
29
- def show(quantum_program: SerializedQuantumProgram) -> None:
30
- try:
31
- circuit = QuantumProgram.parse_raw(quantum_program)
32
- except pydantic.error_wrappers.ValidationError as exc:
33
- raise ClassiqValueError(CANT_PARSE_QUANTUM_PROGRAM_MSG) from exc
34
- circuit.show() # type: ignore[attr-defined]
@@ -1,68 +0,0 @@
1
- import dataclasses
2
- from typing import Any, List, Mapping
3
-
4
- from sympy import sympify
5
-
6
- from classiq.interface.generator.control_state import ControlState
7
- from classiq.interface.generator.synthesis_execution_parameter import PydanticPowerType
8
-
9
- from classiq.exceptions import ClassiqValueError
10
-
11
- ILLEGAL_NESTED_POWER_ERROR = "Nested power calls with a parametric power and an integer power are unsupported: {a}, {b}"
12
-
13
-
14
- def _merge_power(a: PydanticPowerType, b: PydanticPowerType) -> PydanticPowerType:
15
- symbolic_res = sympify(a) * sympify(b)
16
- if symbolic_res.is_Integer:
17
- return int(symbolic_res)
18
- elif symbolic_res.is_symbol:
19
- return str(symbolic_res)
20
- else:
21
- raise ClassiqValueError(ILLEGAL_NESTED_POWER_ERROR.format(a=a, b=b))
22
-
23
-
24
- @dataclasses.dataclass
25
- class CallSynthesisData(Mapping):
26
- power: PydanticPowerType = 1
27
- is_inverse: bool = False
28
- control_states: List[ControlState] = dataclasses.field(default_factory=list)
29
- should_control: bool = True
30
-
31
- def merge(self, other: "CallSynthesisData") -> "CallSynthesisData":
32
- return CallSynthesisData(
33
- power=_merge_power(self.power, other.power),
34
- is_inverse=self.is_inverse != other.is_inverse,
35
- control_states=self.control_states + other.control_states,
36
- should_control=self.should_control and other.should_control,
37
- )
38
-
39
- def set_control(self, ctrl_name: str, ctrl_size: int) -> None:
40
- self.control_states = [
41
- ControlState(
42
- name=ctrl_name,
43
- num_ctrl_qubits=ctrl_size,
44
- )
45
- ]
46
-
47
- def update_control_state(self, ctrl_size: int, ctrl_state: str) -> None:
48
- prev_ctrl_state = self.control_states.pop()
49
- self.control_states.append(
50
- ControlState(
51
- name=prev_ctrl_state.name,
52
- num_ctrl_qubits=ctrl_size,
53
- ctrl_state=ctrl_state,
54
- )
55
- )
56
-
57
- @property
58
- def has_control(self) -> bool:
59
- return bool(self.control_states)
60
-
61
- def __getitem__(self, key: str) -> Any:
62
- return dataclasses.asdict(self)[key]
63
-
64
- def __iter__(self):
65
- return iter(dataclasses.asdict(self))
66
-
67
- def __len__(self):
68
- return len(dataclasses.asdict(self))
@@ -1,23 +0,0 @@
1
- from typing import TypeVar, Union
2
-
3
- from pydantic import BaseModel
4
-
5
- from classiq.interface.generator.model.model import (
6
- SerializedModel as SerializedSynthesisModel,
7
- SynthesisModel,
8
- )
9
- from classiq.interface.model.model import (
10
- Model as UserModel,
11
- SerializedModel as SerializedUserModel,
12
- )
13
-
14
- ModelInput = Union[UserModel, SynthesisModel]
15
-
16
-
17
- class ModelRoot(BaseModel):
18
- __root__: ModelInput
19
-
20
-
21
- SerializedModelInput = TypeVar(
22
- "SerializedModelInput", SerializedSynthesisModel, SerializedUserModel
23
- )
@@ -1,38 +0,0 @@
1
- from classiq.exceptions import ClassiqValueError
2
-
3
-
4
- def min_unsigned_bit_length(number: int) -> int:
5
- if number < 0:
6
- raise ClassiqValueError(
7
- f"Quantum register is not signed but control value "
8
- f"'{number}' is negative"
9
- )
10
- return 1 if number == 0 else number.bit_length()
11
-
12
-
13
- def min_signed_bit_length(number: int) -> int:
14
- pos_val = abs(number)
15
- is_whole = pos_val & (pos_val - 1) == 0
16
- if number <= 0 and is_whole:
17
- return min_unsigned_bit_length(pos_val)
18
- return min_unsigned_bit_length(pos_val) + 1
19
-
20
-
21
- def min_bit_length(number: int, is_signed: bool) -> int:
22
- return (
23
- min_signed_bit_length(number) if is_signed else min_unsigned_bit_length(number)
24
- )
25
-
26
-
27
- def to_twos_complement(value: int, bits: int, is_signed: bool) -> str:
28
- required_bits = min_bit_length(value, is_signed)
29
- if bits < required_bits:
30
- raise ClassiqValueError(
31
- f"Cannot express '{value}' using {bits} bits: "
32
- f"at least {required_bits} bits are required"
33
- )
34
- if value >= 0:
35
- return bin(value)[2:].zfill(bits)[::-1]
36
- mask = (1 << bits) - 1
37
- value = (abs(value) ^ mask) + 1
38
- return bin(value)[:1:-1].rjust(bits, "1")
@@ -1,94 +0,0 @@
1
- from typing import TYPE_CHECKING, Optional
2
-
3
- import pydantic
4
- from sympy import Equality
5
- from sympy.core.numbers import Integer
6
-
7
- from classiq.interface.generator.expressions.expression import Expression
8
- from classiq.interface.generator.expressions.qmod_qscalar_proxy import QmodQNumProxy
9
- from classiq.interface.model.quantum_expressions.control_state import (
10
- min_bit_length,
11
- to_twos_complement,
12
- )
13
- from classiq.interface.model.quantum_expressions.quantum_expression import (
14
- QuantumExpressionOperation,
15
- )
16
-
17
- from classiq.exceptions import ClassiqValueError
18
-
19
- if TYPE_CHECKING:
20
- from classiq.interface.model.quantum_lambda_function import QuantumOperand
21
-
22
- QUANTUM_IF_INOUT_NAME = "ctrl"
23
- QUANTUM_IF_CONDITION_ARG_ERROR_MESSAGE_FORMAT = (
24
- "quantum_if condition must be of the form '<quantum-variable> == "
25
- "<classical-integer-expression>', but condition's {}-hand side was {!r}"
26
- )
27
-
28
-
29
- class QuantumIfOperation(QuantumExpressionOperation):
30
- then: "QuantumOperand"
31
- _ctrl: Optional[QmodQNumProxy] = pydantic.PrivateAttr(
32
- default=None,
33
- )
34
- _ctrl_val: Optional[int] = pydantic.PrivateAttr(
35
- default=None,
36
- )
37
-
38
- @property
39
- def condition(self) -> Expression:
40
- return self.expression
41
-
42
- @property
43
- def ctrl(self) -> QmodQNumProxy:
44
- assert self._ctrl is not None
45
- return self._ctrl
46
-
47
- @property
48
- def ctrl_val(self) -> int:
49
- assert self._ctrl_val is not None
50
- return self._ctrl_val
51
-
52
- def resolve_condition(self) -> None:
53
- condition = self.condition.value.value
54
- if not isinstance(condition, Equality):
55
- raise ClassiqValueError(
56
- f"quantum_if condition must be an equality, was {str(condition)!r}"
57
- )
58
- ctrl, ctrl_val = condition.args
59
- if isinstance(ctrl, Integer) and isinstance(ctrl_val, QmodQNumProxy):
60
- ctrl, ctrl_val = ctrl_val, ctrl
61
- if not isinstance(ctrl, QmodQNumProxy):
62
- raise ClassiqValueError(
63
- QUANTUM_IF_CONDITION_ARG_ERROR_MESSAGE_FORMAT.format("left", str(ctrl))
64
- )
65
- if not isinstance(ctrl_val, Integer):
66
- raise ClassiqValueError(
67
- QUANTUM_IF_CONDITION_ARG_ERROR_MESSAGE_FORMAT.format(
68
- "right", str(ctrl_val)
69
- )
70
- )
71
- self._ctrl, self._ctrl_val = ctrl, int(ctrl_val)
72
-
73
- @property
74
- def ctrl_state(self) -> str:
75
- is_signed = self.ctrl.is_signed
76
- fraction_places = self.ctrl.fraction_digits
77
- ctrl_size = len(self.ctrl)
78
- if not is_signed and self.ctrl_val < 0:
79
- raise ClassiqValueError(
80
- f"Variable {str(self.ctrl)!r} is not signed but control value "
81
- f"{self.ctrl_val} is negative"
82
- )
83
- required_qubits = min_bit_length(self.ctrl_val, is_signed)
84
- if ctrl_size < required_qubits:
85
- raise ClassiqValueError(
86
- f"Variable {str(self.ctrl)!r} has {ctrl_size} qubits but control value "
87
- f"{str(self.ctrl_val)!r} requires at least {required_qubits} qubits"
88
- )
89
- if fraction_places != 0:
90
- raise ClassiqValueError(
91
- f"quantum-if on a non-integer quantum variable {str(self.ctrl)!r} is "
92
- f"not supported at the moment"
93
- )
94
- return to_twos_complement(self.ctrl_val, ctrl_size, is_signed)
@@ -1,43 +0,0 @@
1
- from typing import Any, Mapping
2
-
3
- from classiq.interface.generator.visitor import Visitor
4
- from classiq.interface.model.native_function_definition import NativeFunctionDefinition
5
- from classiq.interface.model.quantum_function_call import QuantumFunctionCall
6
- from classiq.interface.model.quantum_function_declaration import (
7
- QuantumFunctionDeclaration,
8
- )
9
-
10
-
11
- class FunctionCallResolver(Visitor):
12
- def __init__(
13
- self,
14
- quantum_function_dict: Mapping[str, QuantumFunctionDeclaration],
15
- ) -> None:
16
- self._quantum_function_dict = quantum_function_dict
17
-
18
- def visit_QuantumFunctionCall(self, fc: QuantumFunctionCall) -> None:
19
- fc.resolve_function_decl(self._quantum_function_dict, check_operands=True)
20
- self.visit_BaseModel(fc)
21
-
22
- def visit_NativeFunctionDefinition(
23
- self, func_def: NativeFunctionDefinition
24
- ) -> None:
25
- curr_dict = self._quantum_function_dict
26
- self._quantum_function_dict = {
27
- **self._quantum_function_dict,
28
- **func_def.operand_declarations,
29
- }
30
- self.visit_BaseModel(func_def)
31
- self._quantum_function_dict = curr_dict
32
-
33
-
34
- def resolve_function_calls(
35
- root: Any,
36
- quantum_function_dict: Mapping[str, QuantumFunctionDeclaration],
37
- ) -> None:
38
- FunctionCallResolver(
39
- {
40
- **QuantumFunctionDeclaration.BUILTIN_FUNCTION_DECLARATIONS,
41
- **quantum_function_dict,
42
- },
43
- ).visit(root)
@@ -1,55 +0,0 @@
1
- import abc
2
- from typing import Dict, Mapping, Type
3
-
4
- from classiq.interface.generator.functions.port_declaration import (
5
- PortDeclarationDirection,
6
- )
7
- from classiq.interface.model.port_declaration import PortDeclaration
8
- from classiq.interface.model.validation_handle import HandleState, ValidationHandle
9
-
10
- EXPECTED_TERMINAL_STATES: Dict[PortDeclarationDirection, HandleState] = {
11
- PortDeclarationDirection.Output: HandleState.INITIALIZED,
12
- PortDeclarationDirection.Inout: HandleState.INITIALIZED,
13
- }
14
-
15
-
16
- class HandleValidationBase(abc.ABC):
17
- def __init__(
18
- self,
19
- port_declarations: Mapping[str, PortDeclaration],
20
- ) -> None:
21
- self._port_declarations = port_declarations.values()
22
-
23
- def report_errored_handles(self, exception_type: Type[Exception]) -> None:
24
- self._validate_terminal_handle_state()
25
-
26
- errored_handles = {
27
- name: state.errors
28
- for name, state in self._validation_handles_state.items()
29
- if state.state is HandleState.ERRORED
30
- }
31
- if errored_handles:
32
- raise exception_type(
33
- "\n".join(
34
- f"Handle {handle_name!r} was errored with {'. '.join(errors)!r}"
35
- for handle_name, errors in errored_handles.items()
36
- )
37
- )
38
-
39
- def _validate_terminal_handle_state(self) -> None:
40
- for port_decl in self._port_declarations:
41
- handle_state = self._validation_handles_state[port_decl.name]
42
- expected_terminal_state = EXPECTED_TERMINAL_STATES.get(port_decl.direction)
43
- if (
44
- expected_terminal_state is not None
45
- and handle_state.state is not expected_terminal_state
46
- and handle_state.state is not HandleState.ERRORED
47
- ):
48
- handle_state.append_error(
49
- f"At the end of the function, in port {port_decl.name} is expected to be {expected_terminal_state} but it isn't"
50
- )
51
-
52
- @property
53
- @abc.abstractmethod
54
- def _validation_handles_state(self) -> Mapping[str, ValidationHandle]:
55
- raise NotImplementedError