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,169 +0,0 @@
1
- from classiq.interface.generator.expressions.expression import Expression
2
- from classiq.interface.generator.functions.classical_type import Bool, Integer
3
- from classiq.interface.generator.functions.port_declaration import (
4
- PortDeclarationDirection,
5
- )
6
- from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
7
- from classiq.interface.model.port_declaration import PortDeclaration
8
- from classiq.interface.model.quantum_function_declaration import (
9
- QuantumFunctionDeclaration,
10
- QuantumOperandDeclaration,
11
- )
12
-
13
- REPEAT_OPERATOR = QuantumFunctionDeclaration(
14
- name="repeat",
15
- param_decls={"count": Integer()},
16
- operand_declarations={
17
- "iteration": QuantumOperandDeclaration(
18
- name="iteration", param_decls={"index": Integer()}
19
- )
20
- },
21
- )
22
-
23
- OPERAND_FIELD_NAME = "operand"
24
- CTRL_FIELD_NAME = "ctrl"
25
-
26
-
27
- INVERT_OPERATOR = QuantumFunctionDeclaration(
28
- name="invert",
29
- operand_declarations={
30
- OPERAND_FIELD_NAME: QuantumOperandDeclaration(name=OPERAND_FIELD_NAME)
31
- },
32
- )
33
-
34
-
35
- CONTROL_OPERATOR = QuantumFunctionDeclaration(
36
- name="control",
37
- port_declarations={
38
- CTRL_FIELD_NAME: PortDeclaration(
39
- name=CTRL_FIELD_NAME,
40
- direction=PortDeclarationDirection.Inout,
41
- )
42
- },
43
- operand_declarations={
44
- OPERAND_FIELD_NAME: QuantumOperandDeclaration(name=OPERAND_FIELD_NAME)
45
- },
46
- )
47
-
48
- IF_OPERATOR = QuantumFunctionDeclaration(
49
- name="if",
50
- param_decls={"condition": Bool()},
51
- operand_declarations={
52
- "then": QuantumOperandDeclaration(name="then"),
53
- "else": QuantumOperandDeclaration(name="else"),
54
- },
55
- )
56
-
57
- SWITCH_OPERATOR = QuantumFunctionDeclaration(
58
- name="switch",
59
- param_decls={"selector": Integer()},
60
- operand_declarations={
61
- "cases": QuantumOperandDeclaration(
62
- name="cases",
63
- is_list=True,
64
- )
65
- },
66
- )
67
-
68
-
69
- JOIN_OPERATOR = QuantumFunctionDeclaration(
70
- name="join",
71
- port_declarations={
72
- "in1": PortDeclaration(name="in1", direction="input"),
73
- "in2": PortDeclaration(name="in2", direction="input"),
74
- "out": PortDeclaration(
75
- name="out",
76
- direction="output",
77
- size=Expression(expr="len(in1)+len(in2)"),
78
- ),
79
- },
80
- )
81
-
82
-
83
- SPLIT_OPERATOR = QuantumFunctionDeclaration(
84
- name="split",
85
- param_decls={"out1_size": Integer(), "out2_size": Integer()},
86
- port_declarations={
87
- "in": PortDeclaration(
88
- name="in",
89
- direction="input",
90
- size=Expression(expr="out1_size+out2_size"),
91
- ),
92
- "out1": PortDeclaration(
93
- name="out1", direction="output", size=Expression(expr="out1_size")
94
- ),
95
- "out2": PortDeclaration(
96
- name="out2", direction="output", size=Expression(expr="out2_size")
97
- ),
98
- },
99
- )
100
-
101
-
102
- PERMUTE_OPERATOR = QuantumFunctionDeclaration(
103
- name="permute",
104
- operand_declarations={
105
- "functions": QuantumOperandDeclaration(
106
- name="functions",
107
- is_list=True,
108
- )
109
- },
110
- )
111
-
112
-
113
- POWER_OPERATOR = QuantumFunctionDeclaration(
114
- name="power",
115
- param_decls={"power": Integer()},
116
- operand_declarations={
117
- OPERAND_FIELD_NAME: QuantumOperandDeclaration(name=OPERAND_FIELD_NAME)
118
- },
119
- )
120
-
121
- APPLY = QuantumFunctionDeclaration(
122
- name="apply",
123
- operand_declarations={
124
- OPERAND_FIELD_NAME: QuantumOperandDeclaration(
125
- name=OPERAND_FIELD_NAME,
126
- )
127
- },
128
- )
129
-
130
-
131
- COMPUTE = QuantumFunctionDeclaration(
132
- name="compute",
133
- operand_declarations={
134
- OPERAND_FIELD_NAME: QuantumOperandDeclaration(
135
- name=OPERAND_FIELD_NAME,
136
- )
137
- },
138
- )
139
-
140
-
141
- UNCOMPUTE = QuantumFunctionDeclaration(
142
- name="uncompute",
143
- operand_declarations={
144
- OPERAND_FIELD_NAME: QuantumOperandDeclaration(
145
- name=OPERAND_FIELD_NAME,
146
- )
147
- },
148
- )
149
-
150
-
151
- BUILTIN_QUANTUM_OPERATOR_LIST = [
152
- REPEAT_OPERATOR,
153
- INVERT_OPERATOR,
154
- CONTROL_OPERATOR,
155
- IF_OPERATOR,
156
- SWITCH_OPERATOR,
157
- JOIN_OPERATOR,
158
- SPLIT_OPERATOR,
159
- PERMUTE_OPERATOR,
160
- POWER_OPERATOR,
161
- APPLY,
162
- COMPUTE,
163
- UNCOMPUTE,
164
- ]
165
-
166
-
167
- QuantumFunctionDeclaration.BUILTIN_FUNCTION_DECLARATIONS.update(
168
- nameables_to_dict(BUILTIN_QUANTUM_OPERATOR_LIST)
169
- )
@@ -1,106 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Any, Dict, List, NoReturn, Optional, Tuple, Union
4
-
5
- import pydantic
6
-
7
- from classiq.interface.generator.arith.register_user_input import RegisterUserInput
8
- from classiq.interface.generator.function_params import ArithmeticIODict, IOName
9
- from classiq.interface.generator.functions.function_implementation import (
10
- FunctionImplementation,
11
- )
12
- from classiq.interface.generator.functions.port_declaration import (
13
- SynthesisPortDeclaration,
14
- )
15
- from classiq.interface.generator.functions.quantum_function_declaration import (
16
- SynthesisQuantumFunctionDeclaration,
17
- )
18
- from classiq.interface.generator.functions.register import Register
19
- from classiq.interface.generator.functions.register_mapping_data import (
20
- RegisterMappingData,
21
- )
22
-
23
- ImplementationsType = Tuple[FunctionImplementation, ...]
24
-
25
-
26
- class SynthesisForeignFunctionDefinition(SynthesisQuantumFunctionDeclaration):
27
- """
28
- Facilitates the creation of a user-defined elementary function
29
-
30
- This class sets extra to forbid so that it can be used in a Union and not "steal"
31
- objects from other classes.
32
- """
33
-
34
- register_mapping: RegisterMappingData = pydantic.Field(
35
- default_factory=RegisterMappingData,
36
- description="The PortDirection data that is common to all implementations of the function",
37
- )
38
- implementations: Optional[ImplementationsType] = pydantic.Field(
39
- description="The implementations of the custom function",
40
- )
41
-
42
- @pydantic.validator("register_mapping")
43
- def _validate_register_mapping(
44
- cls, register_mapping: RegisterMappingData
45
- ) -> RegisterMappingData:
46
- if not register_mapping.output_registers:
47
- raise ValueError("The outputs of a custom function must be non-empty")
48
- return register_mapping
49
-
50
- @pydantic.validator("implementations", pre=True)
51
- def _parse_implementations(
52
- cls,
53
- implementations: Optional[Union[ImplementationsType, FunctionImplementation]],
54
- ) -> Optional[ImplementationsType]:
55
- if isinstance(implementations, FunctionImplementation):
56
- return (implementations,)
57
-
58
- return implementations
59
-
60
- @pydantic.validator("implementations")
61
- def _validate_implementations(
62
- cls,
63
- implementations: Optional[ImplementationsType],
64
- values: Dict[str, Any],
65
- ) -> Optional[ImplementationsType]:
66
- if not implementations:
67
- raise ValueError(
68
- "The implementations of a custom function must be non-empty."
69
- )
70
-
71
- register_mapping = values.get("register_mapping")
72
- assert isinstance(register_mapping, RegisterMappingData)
73
- for impl in implementations:
74
- impl.validate_ranges_of_all_registers(register_mapping=register_mapping)
75
-
76
- return implementations
77
-
78
- @property
79
- def inputs(self) -> ArithmeticIODict:
80
- return _map_reg_user_input(self.register_mapping.input_registers)
81
-
82
- @property
83
- def outputs(self) -> ArithmeticIODict:
84
- return _map_reg_user_input(self.register_mapping.output_registers)
85
-
86
- def renamed(self, new_name: str) -> SynthesisForeignFunctionDefinition:
87
- return SynthesisForeignFunctionDefinition(
88
- name=new_name,
89
- implementations=self.implementations,
90
- register_mapping=self.register_mapping,
91
- )
92
-
93
- @property
94
- def port_declarations(self) -> Dict[IOName, SynthesisPortDeclaration]:
95
- raise ValueError("Bad usage of foreign function definition: port_declarations")
96
-
97
- @port_declarations.setter
98
- def port_declarations(self, value: Any) -> NoReturn:
99
- raise ValueError("Bad usage of foreign function definition: port_declarations")
100
-
101
-
102
- def _map_reg_user_input(registers: List[Register]) -> ArithmeticIODict:
103
- return {
104
- reg.name: RegisterUserInput(size=len(reg.qubits), name=reg.name)
105
- for reg in registers
106
- }
@@ -1,103 +0,0 @@
1
- from itertools import chain
2
- from typing import Optional, Tuple, Union
3
-
4
- import pydantic
5
- from pydantic import BaseModel
6
-
7
- from classiq.interface.generator.functions.register import Register
8
- from classiq.interface.generator.functions.register_mapping_data import (
9
- RegisterMappingData,
10
- )
11
- from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
12
-
13
- RegistersStrictType = Tuple[Register, ...]
14
- RegistersType = Union[Register, RegistersStrictType]
15
-
16
-
17
- def to_tuple(reg_type: RegistersType) -> RegistersStrictType:
18
- if isinstance(reg_type, Register):
19
- return (reg_type,)
20
- else:
21
- return reg_type
22
-
23
-
24
- class FunctionImplementation(BaseModel):
25
- """
26
- Facilitates the creation of a user-defined custom function implementation
27
- """
28
-
29
- class Config:
30
- validate_all = True
31
- extra = "forbid"
32
-
33
- name: Optional[PydanticNonEmptyString] = pydantic.Field(
34
- default=None,
35
- description="The name of the custom implementation",
36
- )
37
-
38
- serialized_circuit: PydanticNonEmptyString = pydantic.Field(
39
- description="The QASM code of the custom function implementation",
40
- )
41
-
42
- auxiliary_registers: RegistersStrictType = pydantic.Field(
43
- default_factory=tuple,
44
- description="A tuple of auxiliary registers to the custom implementation",
45
- )
46
-
47
- def num_qubits_in_all_registers(self, register_mapping: RegisterMappingData) -> int:
48
- all_input_registers = (
49
- register_mapping.input_registers
50
- + register_mapping.zero_input_registers
51
- + list(self.auxiliary_registers)
52
- )
53
- input_qubits = set(
54
- chain.from_iterable(register.qubits for register in all_input_registers)
55
- )
56
- return len(input_qubits)
57
-
58
- @pydantic.validator(
59
- "auxiliary_registers",
60
- pre=True,
61
- always=True,
62
- )
63
- def validate_all_registers_are_tuples(
64
- cls,
65
- registers: RegistersType,
66
- ) -> RegistersStrictType:
67
- if isinstance(registers, Register):
68
- return (registers,)
69
- return registers
70
-
71
- def validate_ranges_of_all_registers(
72
- self, register_mapping: RegisterMappingData
73
- ) -> None:
74
- input_registers = register_mapping.input_registers
75
- output_registers = register_mapping.output_registers
76
- zero_input_registers = register_mapping.zero_input_registers
77
- auxiliary_registers = list(self.auxiliary_registers)
78
-
79
- all_input_registers = (
80
- input_registers + zero_input_registers + auxiliary_registers
81
- )
82
- input_qubits = set(
83
- chain.from_iterable(register.qubits for register in all_input_registers)
84
- )
85
- num_qubits = len(input_qubits)
86
- all_qubits = set(range(num_qubits))
87
- if num_qubits != sum(register.width for register in all_input_registers):
88
- raise ValueError("The input registers must not overlap.")
89
- if input_qubits != all_qubits:
90
- raise ValueError(
91
- "The set of qubits contained in all registers must be consecutive."
92
- )
93
-
94
- all_output_registers = output_registers + auxiliary_registers
95
- output_qubits = set(
96
- chain.from_iterable(register.qubits for register in all_output_registers)
97
- )
98
- if len(output_qubits) != sum(
99
- register.width for register in all_output_registers
100
- ):
101
- raise ValueError("The output registers must not overlap.")
102
- if not output_qubits == all_qubits:
103
- raise ValueError("The input and output qubits must be mutually consistent.")
@@ -1,153 +0,0 @@
1
- from typing import Any, Dict, List, Optional
2
-
3
- import pydantic
4
-
5
- from classiq.interface.generator.arith.register_user_input import RegisterUserInput
6
- from classiq.interface.generator.function_params import IOName, PortDirection
7
- from classiq.interface.generator.functions.port_declaration import (
8
- SynthesisPortDeclaration,
9
- )
10
- from classiq.interface.generator.functions.quantum_function_declaration import (
11
- SynthesisQuantumFunctionDeclaration,
12
- )
13
- from classiq.interface.generator.quantum_function_call import (
14
- SynthesisQuantumFunctionCall,
15
- WireDict,
16
- WireName,
17
- )
18
- from classiq.interface.generator.validations import flow_graph
19
-
20
- LOGIC_FLOW_DUPLICATE_NAME_ERROR_MSG = (
21
- "Cannot have multiple function calls with the same name"
22
- )
23
-
24
-
25
- class IOData(pydantic.BaseModel):
26
- wire: WireName = pydantic.Field(
27
- description="The name of the wire of the PortDirection data."
28
- )
29
- reg: RegisterUserInput = pydantic.Field(
30
- description="The register information about the PortDirection data."
31
- )
32
-
33
- class Config:
34
- frozen = True
35
-
36
-
37
- class SynthesisNativeFunctionDefinition(SynthesisQuantumFunctionDeclaration):
38
- """
39
- Facilitates the creation of a user-defined composite function
40
-
41
- This class sets extra to forbid so that it can be used in a Union and not "steal"
42
- objects from other classes.
43
- """
44
-
45
- input_ports_wiring: Dict[IOName, WireName] = pydantic.Field(
46
- description="The mapping between the functions input ports, to inner wires",
47
- default_factory=dict,
48
- )
49
-
50
- output_ports_wiring: Dict[IOName, WireName] = pydantic.Field(
51
- description="The mapping between the functions output ports, to inner wires",
52
- default_factory=dict,
53
- )
54
-
55
- body: List[SynthesisQuantumFunctionCall] = pydantic.Field(
56
- default_factory=list, description="List of function calls to perform."
57
- )
58
-
59
- def validate_body(self) -> None:
60
- function_call_names = {call.name for call in self.body}
61
- if len(function_call_names) != len(self.body):
62
- raise ValueError(LOGIC_FLOW_DUPLICATE_NAME_ERROR_MSG)
63
- flow_graph.validate_legal_wiring(
64
- self.body,
65
- flow_input_names=list(self.input_ports_wiring.values()),
66
- flow_output_names=list(self.output_ports_wiring.values()),
67
- )
68
- flow_graph.validate_acyclic_logic_flow(
69
- self.body,
70
- flow_input_names=list(self.input_ports_wiring.values()),
71
- flow_output_names=list(self.output_ports_wiring.values()),
72
- )
73
-
74
- @classmethod
75
- def _validate_direction_ports(
76
- cls,
77
- port_declarations: Dict[IOName, SynthesisPortDeclaration],
78
- directions_external_port_wiring: WireDict,
79
- direction: PortDirection,
80
- ) -> None:
81
- for io_name in directions_external_port_wiring:
82
- if (
83
- io_name not in port_declarations
84
- or not port_declarations[io_name].direction == direction
85
- ):
86
- raise ValueError(
87
- f"The wired {direction} port {io_name!r} is not declared."
88
- )
89
-
90
- @pydantic.root_validator
91
- def validate_ports(cls, values: Dict[str, Any]) -> Dict[str, Any]:
92
- port_declarations: Optional[Dict[IOName, SynthesisPortDeclaration]] = (
93
- values.get("port_declarations")
94
- )
95
- if port_declarations is None:
96
- return values
97
- cls._validate_direction_ports(
98
- port_declarations,
99
- values.get("input_ports_wiring", dict()),
100
- PortDirection.Input,
101
- )
102
- cls._validate_direction_ports(
103
- port_declarations,
104
- values.get("output_ports_wiring", dict()),
105
- PortDirection.Output,
106
- )
107
- return values
108
-
109
- @pydantic.validator("input_ports_wiring", always=True)
110
- def _populate_input_ports_wiring(
111
- cls, input_ports_wiring: Dict[IOName, WireName], values: Dict[str, Any]
112
- ) -> Dict[IOName, WireName]:
113
- return _validate_ports_wiring_for_direction(
114
- input_ports_wiring, values, PortDirection.Input
115
- )
116
-
117
- @pydantic.validator("output_ports_wiring", always=True)
118
- def _populate_output_ports_wiring(
119
- cls, output_ports_wiring: Dict[IOName, WireName], values: Dict[str, Any]
120
- ) -> Dict[IOName, WireName]:
121
- return _validate_ports_wiring_for_direction(
122
- output_ports_wiring, values, PortDirection.Output
123
- )
124
-
125
-
126
- def _get_single_port_wiring(
127
- ports_wiring: Dict[IOName, WireName], name: str, direction: PortDirection
128
- ) -> WireName:
129
- direction_id = "out" if direction == PortDirection.Output else "in"
130
- return ports_wiring.get(name) or f"{name}_{direction_id}"
131
-
132
-
133
- def _port_declarations_to_wiring(
134
- ports_wiring: Dict[IOName, WireName],
135
- port_decls: Dict[IOName, SynthesisPortDeclaration],
136
- direction: PortDirection,
137
- ) -> Dict[IOName, WireName]:
138
- return {
139
- name: _get_single_port_wiring(ports_wiring, name, direction)
140
- for name, port in port_decls.items()
141
- if port.direction.includes_port_direction(direction)
142
- }
143
-
144
-
145
- def _validate_ports_wiring_for_direction(
146
- ports_wiring: Dict[IOName, WireName],
147
- values: Dict[str, Any],
148
- direction: PortDirection,
149
- ) -> Dict[IOName, WireName]:
150
- port_decls = values.get("port_declarations")
151
- if port_decls is None:
152
- return ports_wiring
153
- return _port_declarations_to_wiring(ports_wiring, port_decls, direction)
@@ -1,69 +0,0 @@
1
- from typing import Dict, Set
2
-
3
- import pydantic
4
- from pydantic import BaseModel
5
-
6
- from classiq.interface.generator.arith.register_user_input import RegisterUserInput
7
- from classiq.interface.generator.function_params import (
8
- ArithmeticIODict,
9
- IOName,
10
- PortDirection,
11
- )
12
- from classiq.interface.generator.functions.port_declaration import (
13
- SynthesisPortDeclaration,
14
- )
15
- from classiq.interface.helpers.validation_helpers import validate_nameables_mapping
16
-
17
-
18
- class SynthesisQuantumFunctionDeclaration(BaseModel):
19
- """
20
- Facilitates the creation of a common quantum function interface object.
21
- """
22
-
23
- name: str = pydantic.Field(description="The name of the function")
24
-
25
- port_declarations: Dict[IOName, SynthesisPortDeclaration] = pydantic.Field(
26
- description="The input and output ports of the function.",
27
- default_factory=dict,
28
- )
29
-
30
- @property
31
- def input_set(self) -> Set[IOName]:
32
- return set(self.inputs.keys())
33
-
34
- @property
35
- def output_set(self) -> Set[IOName]:
36
- return set(self.outputs.keys())
37
-
38
- @property
39
- def inputs(self) -> ArithmeticIODict:
40
- return _ports_to_registers(self.port_declarations, PortDirection.Input)
41
-
42
- @property
43
- def outputs(self) -> ArithmeticIODict:
44
- return _ports_to_registers(self.port_declarations, PortDirection.Output)
45
-
46
- @pydantic.validator("port_declarations")
47
- def _validate_port_declarations_names(
48
- cls, port_declarations: Dict[IOName, SynthesisPortDeclaration]
49
- ) -> Dict[IOName, SynthesisPortDeclaration]:
50
- validate_nameables_mapping(port_declarations, "Port")
51
- return port_declarations
52
-
53
- class Config:
54
- extra = pydantic.Extra.forbid
55
-
56
-
57
- def _ports_to_registers(
58
- port_declarations: Dict[IOName, SynthesisPortDeclaration], direction: PortDirection
59
- ) -> ArithmeticIODict:
60
- return {
61
- name: RegisterUserInput(
62
- name=name,
63
- size=port_decl.size,
64
- is_signed=port_decl.is_signed,
65
- fraction_places=port_decl.fraction_places,
66
- )
67
- for name, port_decl in port_declarations.items()
68
- if port_decl.direction.includes_port_direction(direction)
69
- }
@@ -1,42 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from operator import attrgetter
4
- from typing import Iterable, Tuple
5
-
6
- import pydantic
7
- from pydantic import BaseModel
8
-
9
- from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
10
-
11
- QubitsType = Tuple[pydantic.NonNegativeInt, ...]
12
-
13
-
14
- class Register(BaseModel):
15
- """
16
- A user-defined custom register.
17
- """
18
-
19
- name: PydanticNonEmptyString = pydantic.Field(
20
- description="The name of the custom register",
21
- )
22
-
23
- qubits: QubitsType = pydantic.Field(
24
- description="A tuple of qubits as integers as indexed within a custom function code",
25
- )
26
-
27
- @property
28
- def width(self) -> pydantic.PositiveInt:
29
- """The number of qubits of the custom register"""
30
- return len(self.qubits)
31
-
32
- @pydantic.validator("qubits")
33
- def validate_qubits(cls, qubits: QubitsType) -> QubitsType:
34
- if len(qubits) == 0:
35
- raise ValueError("qubits field must be non-empty.")
36
- if len(set(qubits)) != len(qubits):
37
- raise ValueError("All qubits of a register must be distinct.")
38
- return qubits
39
-
40
-
41
- def get_register_names(reg_list: Iterable[Register]) -> Iterable[str]:
42
- return map(attrgetter("name"), reg_list)