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,102 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import itertools
4
- from typing import Any, Dict, Iterable, List, Tuple
5
-
6
- import pydantic
7
-
8
- from classiq.interface.generator.functions.register import Register, get_register_names
9
- from classiq.interface.generator.register_role import RegisterRole as Role
10
- from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
11
-
12
- REGISTER_NOT_FOUND_ERROR = "Register name not found"
13
-
14
-
15
- class RegisterMappingData(pydantic.BaseModel):
16
- input_registers: List[Register] = pydantic.Field(default_factory=list)
17
- output_registers: List[Register] = pydantic.Field(default_factory=list)
18
- zero_input_registers: List[Register] = pydantic.Field(default_factory=list)
19
-
20
- @pydantic.root_validator()
21
- def validate_mapping(cls, values: Dict[str, Any]) -> Dict[str, Any]:
22
- input_registers = values.get("input_registers", list())
23
- output_registers = values.get("output_registers", list())
24
- zero_input_registers = values.get("zero_input_registers", list())
25
-
26
- input_qubits = cls._get_qubit_range(input_registers)
27
- output_qubits = cls._get_qubit_range(output_registers)
28
- zero_input_qubits = cls._get_qubit_range(zero_input_registers)
29
-
30
- all_input_qubits = sorted(input_qubits + zero_input_qubits)
31
- if not cls._validate_no_overlap(all_input_qubits):
32
- raise ValueError("overlapping input qubits are not allowed")
33
- if not cls._validate_no_overlap(output_qubits):
34
- raise ValueError("overlapping output qubits are not allowed")
35
-
36
- if not output_qubits == all_input_qubits:
37
- raise ValueError(
38
- "output registers should be included within the input / zero input registers"
39
- )
40
-
41
- return values
42
-
43
- @pydantic.validator("input_registers", "output_registers")
44
- def validate_input_registers_are_distinct(
45
- cls, field_value: List[Register]
46
- ) -> List[Register]:
47
- if len(field_value) != len({io_register.name for io_register in field_value}):
48
- raise ValueError("The names of PortDirection registers must be distinct.")
49
- return field_value
50
-
51
- @staticmethod
52
- def _validate_no_overlap(reg_list: List[int]) -> bool:
53
- return len(reg_list) == len(set(reg_list))
54
-
55
- @staticmethod
56
- def _get_qubit_range(registers: Iterable[Register]) -> List[int]:
57
- return sorted(
58
- list(itertools.chain.from_iterable(reg.qubits for reg in registers))
59
- )
60
-
61
- @property
62
- def input_names(self) -> Iterable[str]:
63
- return get_register_names(self.input_registers)
64
-
65
- @property
66
- def output_names(self) -> Iterable[str]:
67
- return get_register_names(self.output_registers)
68
-
69
- def validate_equal_mappings(self, other: RegisterMappingData) -> None:
70
- if any(
71
- [
72
- self.input_registers != other.input_registers,
73
- self.output_registers != other.output_registers,
74
- self.zero_input_registers != other.zero_input_registers,
75
- ]
76
- ):
77
- raise ValueError("Interface should be identical in all implementations")
78
-
79
- def get_input_register(self, name: PydanticNonEmptyString) -> Register:
80
- for reg in self.input_registers:
81
- if reg.name == name:
82
- return reg
83
- raise ValueError(REGISTER_NOT_FOUND_ERROR)
84
-
85
- def get_output_register(self, name: PydanticNonEmptyString) -> Register:
86
- for reg in self.output_registers:
87
- if reg.name == name:
88
- return reg
89
- raise ValueError(REGISTER_NOT_FOUND_ERROR)
90
-
91
- @staticmethod
92
- def from_registers_dict(
93
- regs_dict: Dict[Role, Tuple[Register, ...]]
94
- ) -> RegisterMappingData:
95
- return RegisterMappingData(
96
- input_registers=list(regs_dict[Role.INPUT]),
97
- output_registers=list(regs_dict[Role.OUTPUT]),
98
- zero_input_registers=list(regs_dict[Role.ZERO_INPUT]),
99
- )
100
-
101
- class Config:
102
- extra = "forbid"
@@ -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,63 +0,0 @@
1
- from typing import 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
-
15
- class StatePropagator(function_params.FunctionParams):
16
- """
17
- Creates a quantum circuit that propagates the start state vector to the end state vector,
18
- both are assumed to be pure states.
19
- The default start state vector is |000...0>.
20
- """
21
-
22
- end_state_vector: List[Complex] = pydantic.Field(
23
- description="The desired state vector at the end of the operator."
24
- " Must be of size 2**num_qubits. Does not have to be "
25
- "normalized"
26
- )
27
-
28
- start_state_vector: List[Complex] = pydantic.Field(
29
- default_factory=list,
30
- description="The state vector at the input of the operator."
31
- " Must be of size 2**num_qubits. Does not have to be"
32
- " normalized",
33
- )
34
-
35
- @pydantic.validator("start_state_vector", always=True)
36
- def validate_start_state(cls, start_state_vector, values):
37
- end_state_vector = values.get("end_state_vector")
38
- num_qubits = cls._num_qubits(end_state_vector)
39
- if len(start_state_vector) == 0:
40
- default_start_state_vector = [0.0 for _ in range(2**num_qubits)]
41
- default_start_state_vector[0] = 1.0
42
- start_state_vector = default_start_state_vector
43
-
44
- if len(start_state_vector) != len(end_state_vector):
45
- raise ValueError("Start and end state vectors are of non-equal length")
46
-
47
- return start_state_vector
48
-
49
- @staticmethod
50
- def _num_qubits(vector: List[Complex]) -> int:
51
- return int(np.log2(len(vector)))
52
-
53
- def _create_ios(self) -> None:
54
- self._inputs = {
55
- DEFAULT_INPUT_NAME: RegisterArithmeticInfo(
56
- size=self._num_qubits(self.start_state_vector)
57
- )
58
- }
59
- self._outputs = {
60
- DEFAULT_OUTPUT_NAME: RegisterArithmeticInfo(
61
- size=self._num_qubits(self.end_state_vector)
62
- )
63
- }
@@ -1,2 +0,0 @@
1
- from .pauli_struct_declarations import * # noqa: F403
2
- from .qaoa_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,23 +0,0 @@
1
- from classiq.interface.generator.functions.classical_function_declaration import (
2
- ClassicalFunctionDeclaration,
3
- )
4
- from classiq.interface.generator.functions.classical_type import (
5
- ClassicalList,
6
- Integer,
7
- Real,
8
- Struct,
9
- )
10
- from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
11
-
12
- COMPUTE_QAOA_INITIAL_POINT = ClassicalFunctionDeclaration(
13
- name="compute_qaoa_initial_point",
14
- param_decls={
15
- "hamiltonian": ClassicalList(element_type=Struct(name="PauliTerm")),
16
- "repetitions": Integer(),
17
- },
18
- return_type=ClassicalList(element_type=Real()),
19
- )
20
-
21
- ClassicalFunctionDeclaration.FOREIGN_FUNCTION_DECLARATIONS.update(
22
- nameables_to_dict([COMPUTE_QAOA_INITIAL_POINT])
23
- )
@@ -1,26 +0,0 @@
1
- from enum import Enum
2
- from typing import List
3
-
4
- import pydantic
5
-
6
- from classiq.interface.generator.expressions.expression import Expression
7
- from classiq.interface.generator.types.struct_declaration import StructDeclaration
8
-
9
-
10
- class ObjectiveType(Enum):
11
- Min = "Min"
12
- Max = "Max"
13
-
14
-
15
- class CombinatorialOptimizationStructDeclaration(StructDeclaration):
16
- variable_lower_bound: int = pydantic.Field(default=0)
17
- variable_upper_bound: int = pydantic.Field(default=1)
18
- constraints: List[Expression] = pydantic.Field(
19
- default_factory=list, description="List of constraint expressions"
20
- )
21
- objective_type: ObjectiveType = pydantic.Field(
22
- description="Specify whether the optimization problem is Min or Max"
23
- )
24
- objective_function: Expression = pydantic.Field(
25
- description="The expression to optimize, according to the objective type"
26
- )
@@ -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 GeneratedCircuit
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 = GeneratedCircuit.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,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,25 +0,0 @@
1
- from typing import Mapping
2
-
3
- import pydantic
4
-
5
- from classiq.interface.generator.expressions.expression import Expression
6
- from classiq.interface.model.handle_binding import HandleBinding
7
- from classiq.interface.model.quantum_statement import QuantumOperation
8
-
9
- from classiq.exceptions import ClassiqValueError
10
-
11
-
12
- class NumericReinterpretationOperation(QuantumOperation):
13
- target: HandleBinding
14
- fraction_digits: Expression
15
- is_signed: Expression
16
-
17
- @property
18
- def wiring_inouts(self) -> Mapping[str, HandleBinding]:
19
- return {"target": self.target}
20
-
21
- @pydantic.validator("target")
22
- def validate_handle(cls, handle: HandleBinding) -> HandleBinding:
23
- if not handle.is_bindable():
24
- raise ClassiqValueError(f"Cannot bind '{handle}'") # noqa: B907
25
- return handle
@@ -1,48 +0,0 @@
1
- from typing import Any, Dict, Optional
2
-
3
- from classiq.interface.generator.control_state import ControlState
4
-
5
-
6
- class OperatorSynthesisData:
7
- @property
8
- def call_kwargs(self) -> Dict[str, Any]:
9
- return dict()
10
-
11
-
12
- class PowerOperatorSynthesisData(OperatorSynthesisData):
13
- def __init__(self, power: int) -> None:
14
- self._power = power
15
-
16
- @property
17
- def call_kwargs(self) -> Dict[str, Any]:
18
- return {"power": self._power}
19
-
20
-
21
- class InvertOperatorSynthesisData(OperatorSynthesisData):
22
- @property
23
- def call_kwargs(self) -> Dict[str, Any]:
24
- return {"is_inverse": True}
25
-
26
-
27
- class ControlOperatorSynthesisData(OperatorSynthesisData):
28
- _CTRL_VAR_NAME = "ctrl"
29
-
30
- def __init__(self, ctrl_size: int, ctrl_state: Optional[str] = None) -> None:
31
- ctrl_state_kwargs = dict()
32
- if ctrl_state is not None:
33
- ctrl_state_kwargs["ctrl_state"] = ctrl_state
34
- self._ctrl_state = ControlState(
35
- name=self._CTRL_VAR_NAME, num_ctrl_qubits=ctrl_size, **ctrl_state_kwargs
36
- )
37
-
38
- @property
39
- def call_kwargs(self) -> Dict[str, Any]:
40
- return {
41
- "control_states": [self._ctrl_state],
42
- }
43
-
44
-
45
- class ComputeOperatorSynthesisData(OperatorSynthesisData):
46
- @property
47
- def call_kwargs(self) -> Dict[str, Any]:
48
- return {"should_control": False}
@@ -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 " # noqa: B907
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: " # noqa: B907
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")