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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. classiq/__init__.py +47 -32
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
  3. classiq/_internals/api_wrapper.py +235 -97
  4. classiq/_internals/async_utils.py +1 -3
  5. classiq/_internals/authentication/auth0.py +26 -10
  6. classiq/_internals/authentication/authentication.py +11 -0
  7. classiq/_internals/authentication/device.py +10 -5
  8. classiq/_internals/authentication/password_manager.py +18 -6
  9. classiq/_internals/authentication/token_manager.py +10 -5
  10. classiq/_internals/client.py +94 -33
  11. classiq/_internals/config.py +3 -4
  12. classiq/_internals/host_checker.py +38 -15
  13. classiq/_internals/jobs.py +60 -57
  14. classiq/_internals/type_validation.py +9 -9
  15. classiq/analyzer/__init__.py +1 -3
  16. classiq/analyzer/analyzer.py +24 -19
  17. classiq/analyzer/analyzer_utilities.py +10 -10
  18. classiq/analyzer/rb.py +15 -15
  19. classiq/analyzer/show_interactive_hack.py +27 -4
  20. classiq/analyzer/url_utils.py +2 -3
  21. classiq/applications/__init__.py +3 -12
  22. classiq/applications/chemistry/__init__.py +14 -10
  23. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  24. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
  25. classiq/applications/chemistry/ground_state_problem.py +1 -1
  26. classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
  27. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  28. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
  29. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
  30. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
  31. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
  32. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
  33. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
  34. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  35. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  36. classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
  37. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
  38. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
  39. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
  40. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
  41. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  42. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
  43. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
  44. classiq/applications/combinatorial_optimization/__init__.py +20 -6
  45. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  46. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
  47. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  48. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  49. classiq/applications/finance/__init__.py +4 -5
  50. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
  51. classiq/applications/grover/__init__.py +9 -0
  52. classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
  53. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  54. classiq/applications/libraries/qmci_library.py +22 -0
  55. classiq/applications/qnn/__init__.py +2 -4
  56. classiq/applications/qnn/circuit_utils.py +6 -6
  57. classiq/applications/qnn/datasets/__init__.py +9 -11
  58. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  59. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  60. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  61. classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
  62. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  63. classiq/applications/qnn/qlayer.py +30 -10
  64. classiq/applications/qnn/torch_utils.py +4 -3
  65. classiq/applications/qnn/types.py +5 -5
  66. classiq/applications/qsvm/__init__.py +6 -4
  67. classiq/applications/qsvm/qsvm.py +3 -6
  68. classiq/applications/qsvm/qsvm_data_generation.py +3 -3
  69. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  70. classiq/execution/__init__.py +8 -3
  71. classiq/execution/all_hardware_devices.py +11 -0
  72. classiq/execution/execution_session.py +400 -0
  73. classiq/execution/iqcc.py +63 -0
  74. classiq/execution/jobs.py +197 -25
  75. classiq/execution/qnn.py +79 -0
  76. classiq/executor.py +20 -115
  77. classiq/interface/_version.py +1 -1
  78. classiq/interface/analyzer/analysis_params.py +43 -13
  79. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  80. classiq/interface/analyzer/result.py +28 -32
  81. classiq/interface/applications/qsvm.py +20 -29
  82. classiq/interface/ast_node.py +16 -0
  83. classiq/interface/backend/backend_preferences.py +390 -121
  84. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  85. classiq/interface/backend/pydantic_backend.py +25 -22
  86. classiq/interface/backend/quantum_backend_providers.py +69 -16
  87. classiq/interface/chemistry/fermionic_operator.py +30 -21
  88. classiq/interface/chemistry/ground_state_problem.py +28 -25
  89. classiq/interface/chemistry/molecule.py +14 -10
  90. classiq/interface/chemistry/operator.py +64 -231
  91. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  92. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
  93. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  94. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  95. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  96. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  97. classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
  98. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
  99. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  100. classiq/interface/combinatorial_optimization/result.py +1 -3
  101. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  102. classiq/interface/debug_info/debug_info.py +86 -0
  103. classiq/{exceptions.py → interface/exceptions.py} +37 -9
  104. classiq/interface/execution/iqcc.py +19 -0
  105. classiq/interface/execution/jobs.py +15 -12
  106. classiq/interface/execution/primitives.py +18 -0
  107. classiq/interface/executor/constants.py +1 -0
  108. classiq/interface/executor/execution_preferences.py +26 -114
  109. classiq/interface/executor/execution_request.py +24 -46
  110. classiq/interface/executor/execution_result.py +30 -8
  111. classiq/interface/executor/iqae_result.py +4 -6
  112. classiq/interface/executor/optimizer_preferences.py +17 -14
  113. classiq/interface/executor/quantum_code.py +28 -24
  114. classiq/interface/executor/quantum_instruction_set.py +2 -2
  115. classiq/interface/executor/register_initialization.py +11 -14
  116. classiq/interface/executor/result.py +83 -56
  117. classiq/interface/executor/vqe_result.py +10 -10
  118. classiq/interface/finance/function_input.py +35 -25
  119. classiq/interface/finance/gaussian_model_input.py +5 -5
  120. classiq/interface/finance/log_normal_model_input.py +4 -4
  121. classiq/interface/finance/model_input.py +4 -4
  122. classiq/interface/generator/adjacency.py +1 -3
  123. classiq/interface/generator/amplitude_loading.py +22 -12
  124. classiq/interface/generator/ansatz_library.py +5 -5
  125. classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
  126. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  127. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  128. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  129. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  130. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  131. classiq/interface/generator/arith/argument_utils.py +46 -5
  132. classiq/interface/generator/arith/arithmetic.py +35 -16
  133. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
  134. classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
  135. classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
  136. classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
  137. classiq/interface/generator/arith/arithmetic_operations.py +14 -6
  138. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  139. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  140. classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
  141. classiq/interface/generator/arith/binary_ops.py +218 -130
  142. classiq/interface/generator/arith/endianness.py +1 -1
  143. classiq/interface/generator/arith/extremum_operations.py +96 -25
  144. classiq/interface/generator/arith/logical_ops.py +14 -12
  145. classiq/interface/generator/arith/number_utils.py +12 -6
  146. classiq/interface/generator/arith/register_user_input.py +60 -37
  147. classiq/interface/generator/arith/unary_ops.py +49 -29
  148. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  149. classiq/interface/generator/builtin_api_builder.py +2 -9
  150. classiq/interface/generator/chemistry_function_params.py +3 -3
  151. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  152. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  153. classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
  154. classiq/interface/generator/compiler_keywords.py +5 -1
  155. classiq/interface/generator/complex_type.py +13 -18
  156. classiq/interface/generator/constant.py +3 -4
  157. classiq/interface/generator/control_state.py +34 -29
  158. classiq/interface/generator/copy.py +47 -0
  159. classiq/interface/generator/custom_ansatz.py +2 -5
  160. classiq/interface/generator/distance.py +3 -5
  161. classiq/interface/generator/excitations.py +3 -2
  162. classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
  163. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  164. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  165. classiq/interface/generator/expressions/evaluated_expression.py +5 -5
  166. classiq/interface/generator/expressions/expression.py +26 -14
  167. classiq/interface/generator/expressions/expression_constants.py +9 -3
  168. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  169. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  170. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
  171. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  172. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  173. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  174. classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
  175. classiq/interface/generator/finance.py +2 -2
  176. classiq/interface/generator/function_param_library.py +6 -6
  177. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  178. classiq/interface/generator/function_params.py +36 -64
  179. classiq/interface/generator/functions/__init__.py +0 -22
  180. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  181. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  182. classiq/interface/generator/functions/classical_type.py +47 -166
  183. classiq/interface/generator/functions/concrete_types.py +55 -0
  184. classiq/interface/generator/functions/function_declaration.py +13 -14
  185. classiq/interface/generator/functions/port_declaration.py +1 -13
  186. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  187. classiq/interface/generator/functions/type_name.py +90 -0
  188. classiq/interface/generator/generated_circuit_data.py +153 -20
  189. classiq/interface/generator/grover_diffuser.py +32 -25
  190. classiq/interface/generator/grover_operator.py +34 -25
  191. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  192. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  193. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
  194. classiq/interface/generator/hardware/hardware_data.py +72 -34
  195. classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
  196. classiq/interface/generator/hartree_fock.py +13 -5
  197. classiq/interface/generator/identity.py +10 -6
  198. classiq/interface/generator/linear_pauli_rotations.py +32 -20
  199. classiq/interface/generator/mcmt_method.py +1 -1
  200. classiq/interface/generator/mcu.py +17 -15
  201. classiq/interface/generator/mcx.py +24 -17
  202. classiq/interface/generator/model/__init__.py +2 -5
  203. classiq/interface/generator/model/constraints.py +26 -8
  204. classiq/interface/generator/model/model.py +27 -190
  205. classiq/interface/generator/model/preferences/preferences.py +115 -41
  206. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
  207. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  208. classiq/interface/generator/oracles/custom_oracle.py +15 -13
  209. classiq/interface/generator/oracles/oracle_abc.py +7 -7
  210. classiq/interface/generator/partitioned_register.py +7 -7
  211. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  212. classiq/interface/generator/preferences/optimization.py +1 -2
  213. classiq/interface/generator/qpe.py +41 -30
  214. classiq/interface/generator/qsvm.py +9 -10
  215. classiq/interface/generator/quantum_function_call.py +88 -73
  216. classiq/interface/generator/quantum_program.py +41 -24
  217. classiq/interface/generator/range_types.py +11 -12
  218. classiq/interface/generator/register_role.py +18 -6
  219. classiq/interface/generator/slice_parsing_utils.py +5 -5
  220. classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
  221. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  222. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  223. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  224. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  225. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  226. classiq/interface/generator/state_preparation/distributions.py +16 -15
  227. classiq/interface/generator/state_preparation/metrics.py +4 -7
  228. classiq/interface/generator/state_preparation/state_preparation.py +25 -20
  229. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  230. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  231. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  232. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  233. classiq/interface/generator/types/compilation_metadata.py +6 -0
  234. classiq/interface/generator/types/enum_declaration.py +54 -0
  235. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  236. classiq/interface/generator/types/struct_declaration.py +7 -11
  237. classiq/interface/generator/ucc.py +5 -4
  238. classiq/interface/generator/unitary_gate.py +5 -5
  239. classiq/interface/generator/user_defined_function_params.py +4 -1
  240. classiq/interface/generator/validations/flow_graph.py +7 -7
  241. classiq/interface/generator/validations/validator_functions.py +4 -4
  242. classiq/interface/generator/visitor.py +23 -16
  243. classiq/interface/hardware.py +29 -8
  244. classiq/interface/helpers/classproperty.py +8 -0
  245. classiq/interface/helpers/custom_encoders.py +2 -2
  246. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  247. classiq/interface/helpers/datastructures.py +26 -0
  248. classiq/interface/helpers/hashable_mixin.py +3 -2
  249. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  250. classiq/interface/helpers/pydantic_model_helpers.py +7 -5
  251. classiq/interface/helpers/validation_helpers.py +3 -20
  252. classiq/interface/helpers/versioned_model.py +1 -4
  253. classiq/interface/ide/ide_data.py +16 -20
  254. classiq/interface/ide/visual_model.py +130 -0
  255. classiq/interface/interface_version.py +1 -0
  256. classiq/interface/jobs.py +29 -69
  257. classiq/interface/model/allocate.py +16 -0
  258. classiq/interface/model/bind_operation.py +32 -9
  259. classiq/interface/model/classical_if.py +15 -0
  260. classiq/interface/model/classical_parameter_declaration.py +33 -3
  261. classiq/interface/model/control.py +45 -0
  262. classiq/interface/model/handle_binding.py +298 -20
  263. classiq/interface/model/inplace_binary_operation.py +29 -24
  264. classiq/interface/model/invert.py +12 -0
  265. classiq/interface/model/model.py +69 -61
  266. classiq/interface/model/native_function_definition.py +17 -20
  267. classiq/interface/model/parameter.py +13 -0
  268. classiq/interface/model/phase_operation.py +11 -0
  269. classiq/interface/model/port_declaration.py +27 -9
  270. classiq/interface/model/power.py +14 -0
  271. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
  272. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  273. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  274. classiq/interface/model/quantum_function_call.py +141 -343
  275. classiq/interface/model/quantum_function_declaration.py +190 -157
  276. classiq/interface/model/quantum_lambda_function.py +33 -32
  277. classiq/interface/model/quantum_statement.py +71 -12
  278. classiq/interface/model/quantum_type.py +177 -40
  279. classiq/interface/model/quantum_variable_declaration.py +3 -25
  280. classiq/interface/model/repeat.py +15 -0
  281. classiq/interface/model/statement_block.py +40 -14
  282. classiq/interface/model/validation_handle.py +13 -6
  283. classiq/interface/model/variable_declaration_statement.py +3 -1
  284. classiq/interface/model/within_apply_operation.py +7 -5
  285. classiq/interface/server/global_versions.py +6 -7
  286. classiq/interface/server/routes.py +17 -21
  287. classiq/interface/source_reference.py +59 -0
  288. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  289. classiq/model_expansions/capturing/__init__.py +0 -0
  290. classiq/model_expansions/capturing/captured_vars.py +435 -0
  291. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  292. classiq/model_expansions/closure.py +171 -0
  293. classiq/model_expansions/debug_flag.py +3 -0
  294. classiq/model_expansions/evaluators/__init__.py +0 -0
  295. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  296. classiq/model_expansions/evaluators/argument_types.py +42 -0
  297. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  298. classiq/model_expansions/evaluators/control.py +144 -0
  299. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  300. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  301. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  302. classiq/model_expansions/expression_evaluator.py +135 -0
  303. classiq/model_expansions/expression_renamer.py +76 -0
  304. classiq/model_expansions/function_builder.py +247 -0
  305. classiq/model_expansions/generative_functions.py +158 -0
  306. classiq/model_expansions/interpreters/__init__.py +0 -0
  307. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  308. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  309. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  310. classiq/model_expansions/model_tables.py +18 -0
  311. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  312. classiq/model_expansions/quantum_operations/bind.py +60 -0
  313. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  314. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  315. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  316. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  317. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  318. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  319. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  320. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  321. classiq/model_expansions/scope.py +240 -0
  322. classiq/model_expansions/scope_initialization.py +150 -0
  323. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  324. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  325. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  326. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  327. classiq/model_expansions/transformers/__init__.py +0 -0
  328. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  329. classiq/model_expansions/transformers/var_splitter.py +299 -0
  330. classiq/model_expansions/utils/__init__.py +0 -0
  331. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  332. classiq/model_expansions/utils/handles_collector.py +33 -0
  333. classiq/model_expansions/visitors/__init__.py +0 -0
  334. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  335. classiq/model_expansions/visitors/variable_references.py +144 -0
  336. classiq/open_library/__init__.py +4 -0
  337. classiq/open_library/functions/__init__.py +130 -0
  338. classiq/open_library/functions/amplitude_estimation.py +30 -0
  339. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  340. classiq/open_library/functions/grover.py +157 -0
  341. classiq/open_library/functions/hea.py +115 -0
  342. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  343. classiq/open_library/functions/modular_exponentiation.py +201 -0
  344. classiq/open_library/functions/qaoa_penalty.py +117 -0
  345. classiq/open_library/functions/qft_functions.py +54 -0
  346. classiq/open_library/functions/qpe.py +46 -0
  347. classiq/open_library/functions/qsvt.py +331 -0
  348. classiq/open_library/functions/state_preparation.py +301 -0
  349. classiq/open_library/functions/swap_test.py +27 -0
  350. classiq/open_library/functions/utility_functions.py +81 -0
  351. classiq/open_library/functions/variational.py +52 -0
  352. classiq/qmod/__init__.py +10 -10
  353. classiq/qmod/builtins/__init__.py +19 -2
  354. classiq/qmod/builtins/classical_execution_primitives.py +36 -14
  355. classiq/qmod/builtins/classical_functions.py +39 -43
  356. classiq/qmod/builtins/constants.py +10 -0
  357. classiq/qmod/builtins/enums.py +208 -0
  358. classiq/qmod/builtins/functions/__init__.py +137 -0
  359. classiq/qmod/builtins/functions/allocation.py +150 -0
  360. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  361. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  362. classiq/qmod/builtins/functions/chemistry.py +91 -0
  363. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  364. classiq/qmod/builtins/functions/finance.py +34 -0
  365. classiq/qmod/builtins/functions/operators.py +16 -0
  366. classiq/qmod/builtins/functions/qsvm.py +24 -0
  367. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  368. classiq/qmod/builtins/operations.py +373 -40
  369. classiq/qmod/builtins/structs.py +103 -80
  370. classiq/qmod/cfunc.py +2 -2
  371. classiq/qmod/classical_function.py +4 -8
  372. classiq/qmod/cparam.py +64 -0
  373. classiq/qmod/create_model_function.py +56 -0
  374. classiq/qmod/declaration_inferrer.py +143 -101
  375. classiq/qmod/expression_query.py +20 -4
  376. classiq/qmod/generative.py +42 -0
  377. classiq/qmod/model_state_container.py +18 -6
  378. classiq/qmod/native/__init__.py +7 -0
  379. classiq/qmod/native/expression_to_qmod.py +16 -11
  380. classiq/qmod/native/pretty_printer.py +187 -97
  381. classiq/qmod/pretty_print/__init__.py +7 -0
  382. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  383. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  384. classiq/qmod/python_classical_type.py +67 -0
  385. classiq/qmod/qfunc.py +60 -8
  386. classiq/qmod/qmod_constant.py +93 -26
  387. classiq/qmod/qmod_parameter.py +68 -59
  388. classiq/qmod/qmod_variable.py +468 -155
  389. classiq/qmod/quantum_callable.py +17 -7
  390. classiq/qmod/quantum_expandable.py +269 -96
  391. classiq/qmod/quantum_function.py +196 -41
  392. classiq/qmod/semantics/__init__.py +0 -0
  393. classiq/qmod/semantics/annotation/__init__.py +0 -0
  394. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  395. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  396. classiq/qmod/semantics/error_manager.py +88 -0
  397. classiq/qmod/semantics/lambdas.py +25 -0
  398. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  399. classiq/qmod/semantics/validation/__init__.py +0 -0
  400. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  401. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  402. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  403. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  404. classiq/qmod/semantics/validation/main_validation.py +33 -0
  405. classiq/qmod/semantics/validation/types_validation.py +128 -0
  406. classiq/qmod/symbolic.py +147 -123
  407. classiq/qmod/symbolic_expr.py +27 -12
  408. classiq/qmod/symbolic_type.py +2 -5
  409. classiq/qmod/type_attribute_remover.py +32 -0
  410. classiq/qmod/utilities.py +98 -4
  411. classiq/qmod/write_qmod.py +17 -3
  412. classiq/synthesis.py +210 -22
  413. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
  414. classiq-0.65.4.dist-info/RECORD +521 -0
  415. classiq/_internals/_qfunc_ext.py +0 -6
  416. classiq/applications/benchmarking/__init__.py +0 -9
  417. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  418. classiq/applications/numpy_utils.py +0 -37
  419. classiq/applications_model_constructors/__init__.py +0 -25
  420. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  421. classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
  422. classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
  423. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  424. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  425. classiq/builtin_functions/__init__.py +0 -43
  426. classiq/builtin_functions/amplitude_loading.py +0 -3
  427. classiq/builtin_functions/binary_ops.py +0 -1
  428. classiq/builtin_functions/exponentiation.py +0 -5
  429. classiq/builtin_functions/qpe.py +0 -4
  430. classiq/builtin_functions/qsvm.py +0 -7
  431. classiq/builtin_functions/range_types.py +0 -5
  432. classiq/builtin_functions/standard_gates.py +0 -1
  433. classiq/builtin_functions/state_preparation.py +0 -6
  434. classiq/builtin_functions/suzuki_trotter.py +0 -3
  435. classiq/interface/executor/aws_execution_cost.py +0 -73
  436. classiq/interface/executor/error_mitigation.py +0 -6
  437. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
  438. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
  439. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  440. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  441. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  442. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  443. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  444. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  445. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  446. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  447. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  448. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
  449. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  450. classiq/interface/generator/functions/foreign_function_definition.py +0 -114
  451. classiq/interface/generator/functions/function_implementation.py +0 -107
  452. classiq/interface/generator/functions/native_function_definition.py +0 -155
  453. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  454. classiq/interface/generator/functions/register.py +0 -44
  455. classiq/interface/generator/functions/register_mapping_data.py +0 -106
  456. classiq/interface/generator/inequality_mixer.py +0 -51
  457. classiq/interface/generator/model/classical_main_validator.py +0 -106
  458. classiq/interface/generator/range_mixer.py +0 -56
  459. classiq/interface/generator/state_propagator.py +0 -74
  460. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
  461. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  462. classiq/interface/ide/show.py +0 -34
  463. classiq/interface/model/call_synthesis_data.py +0 -68
  464. classiq/interface/model/common_model_types.py +0 -23
  465. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  466. classiq/interface/model/quantum_if_operation.py +0 -94
  467. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  468. classiq/interface/model/validations/handle_validation_base.py +0 -55
  469. classiq/interface/model/validations/handles_validator.py +0 -156
  470. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  471. classiq/model/__init__.py +0 -14
  472. classiq/model/composite_function_generator.py +0 -33
  473. classiq/model/function_handler.py +0 -462
  474. classiq/model/logic_flow.py +0 -149
  475. classiq/model/logic_flow_change_handler.py +0 -71
  476. classiq/model/model.py +0 -229
  477. classiq/qmod/builtins/functions.py +0 -913
  478. classiq/qmod/qmod_struct.py +0 -37
  479. classiq/quantum_functions/__init__.py +0 -17
  480. classiq/quantum_functions/annotation_parser.py +0 -205
  481. classiq/quantum_functions/decorators.py +0 -22
  482. classiq/quantum_functions/function_library.py +0 -181
  483. classiq/quantum_functions/function_parser.py +0 -74
  484. classiq/quantum_functions/quantum_function.py +0 -236
  485. classiq-0.38.0.dist-info/RECORD +0 -454
  486. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  487. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  488. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  489. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  490. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  491. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  492. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  493. /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
  494. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  495. /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
  496. /classiq/{_internals → interface}/enum_utils.py +0 -0
  497. /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
  498. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
  499. {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,70 +0,0 @@
1
- from copy import deepcopy
2
-
3
- from classiq.interface.generator.model.preferences.preferences import (
4
- Preferences,
5
- QuantumFormat,
6
- TranspilationOption,
7
- )
8
- from classiq.interface.generator.quantum_program import QuantumProgram
9
-
10
- from classiq._internals import async_utils
11
- from classiq.model.model import Model
12
- from classiq.quantum_functions.decorators import quantum_function
13
- from classiq.quantum_functions.function_library import QASM_INTRO, FunctionLibrary
14
- from classiq.quantum_register import QReg, ZeroQReg
15
- from classiq.synthesis import synthesize_async
16
-
17
- _MB_NAME: str = "mirror_benchmarking"
18
- _MB_FUNCTION_LIBRARY_NAME: str = f"{_MB_NAME}_function_library"
19
-
20
-
21
- class MirrorBenchmarking:
22
- def __init__(self, model: Model) -> None:
23
- self.functional_model: Model = model
24
- self.functional_model._model.preferences = self.get_functional_preferences(
25
- model.preferences
26
- )
27
-
28
- async def mirror_benchmarking_model_async(self) -> Model:
29
- functional_circuit: QuantumProgram = QuantumProgram.parse_raw(
30
- await synthesize_async(self.functional_model.get_model())
31
- )
32
-
33
- num_qubits: int = functional_circuit.data.width
34
- circuit_qasm_list = functional_circuit.qasm.split(QASM_INTRO) # type: ignore[union-attr]
35
- if not circuit_qasm_list:
36
- raise AssertionError(
37
- "Functional model synthesis did not result in a legal QASM"
38
- )
39
- circuit_qasm: str = circuit_qasm_list[-1]
40
-
41
- @quantum_function
42
- def functional_model_function(reg: ZeroQReg[num_qubits]) -> QReg[num_qubits]: # type: ignore[type-arg, valid-type]
43
- return QASM_INTRO + circuit_qasm # type: ignore[return-value]
44
-
45
- model_function_library = FunctionLibrary(functional_model_function)
46
-
47
- mb_model = Model(
48
- preferences=self.get_mirror_benchmarking_preferences(
49
- self.functional_model.preferences
50
- )
51
- )
52
- mb_model.include_library(model_function_library)
53
- inner_wires = mb_model.functional_model_function()
54
- mb_model.functional_model_function(in_wires=inner_wires, is_inverse=True)
55
- return mb_model
56
-
57
- def mirror_benchmarking_model(self) -> Model:
58
- return async_utils.run(self.mirror_benchmarking_model_async())
59
-
60
- @staticmethod
61
- def get_functional_preferences(preferences: Preferences) -> Preferences:
62
- functional_preferences = deepcopy(preferences)
63
- functional_preferences.output_format = [QuantumFormat.QASM]
64
- return functional_preferences
65
-
66
- @staticmethod
67
- def get_mirror_benchmarking_preferences(preferences: Preferences) -> Preferences:
68
- mb_preferences = deepcopy(preferences)
69
- mb_preferences.transpilation_option = TranspilationOption.DECOMPOSE
70
- return mb_preferences
@@ -1,37 +0,0 @@
1
- from typing import Any, TypeVar, cast
2
-
3
- import numpy as np
4
-
5
-
6
- # numpy utils
7
- def _is_empty_ndarray(obj: np.ndarray) -> bool:
8
- return 0 in obj.shape
9
-
10
-
11
- def bool_datum(
12
- obj: Any,
13
- ) -> Any: # returning `Any` since any object in python is convertable to `bool`
14
- if isinstance(obj, np.ndarray):
15
- # check that it's non-empty
16
- return not _is_empty_ndarray(obj)
17
- else:
18
- return obj
19
-
20
-
21
- def bool_data(*objects: Any) -> bool:
22
- return all(map(bool_datum, objects))
23
-
24
-
25
- T = TypeVar("T")
26
-
27
-
28
- def choose_first(*objects: T) -> T:
29
- for obj in objects:
30
- if isinstance(obj, np.ndarray):
31
- if not _is_empty_ndarray(obj):
32
- return cast(T, obj)
33
- else:
34
- if obj:
35
- return obj
36
- # if everything failed, return the last
37
- return objects[-1]
@@ -1,25 +0,0 @@
1
- from typing import List
2
-
3
- from .chemistry_model_constructor import (
4
- construct_chemistry_model,
5
- molecule_problem_to_qmod,
6
- )
7
- from .combinatorial_optimization_model_constructor import (
8
- construct_combinatorial_optimization_model,
9
- )
10
- from .finance_model_constructor import construct_finance_model
11
- from .grover_model_constructor import construct_grover_model
12
- from .qsvm_model_constructor import construct_qsvm_model
13
-
14
- __all__: List[str] = [
15
- "construct_qsvm_model",
16
- "construct_combinatorial_optimization_model",
17
- "construct_chemistry_model",
18
- "construct_finance_model",
19
- "construct_grover_model",
20
- "molecule_problem_to_qmod",
21
- ]
22
-
23
-
24
- def __dir__():
25
- return __all__
@@ -1,34 +0,0 @@
1
- from classiq.interface.generator.function_params import DEFAULT_OUTPUT_NAME
2
- from classiq.interface.generator.functions import SynthesisNativeFunctionDefinition
3
- from classiq.interface.generator.state_preparation import (
4
- ComputationalBasisStatePreparation,
5
- )
6
-
7
- from classiq import FunctionGenerator, QReg
8
-
9
- BinaryStr = str
10
- Name = str
11
-
12
-
13
- def multiple_comp_basis_sp(
14
- function_name: str, states: dict[Name, BinaryStr], call_name_frmt: str = "{}"
15
- ) -> SynthesisNativeFunctionDefinition:
16
- generator = FunctionGenerator(function_name=function_name)
17
- qregs_dict = {
18
- var_name: QReg[len(state)] # type:ignore[misc]
19
- for var_name, state in states.items()
20
- }
21
- qregs = generator.create_inputs(qregs_dict)
22
-
23
- for var_name, state in states.items():
24
- params = ComputationalBasisStatePreparation(computational_state=state)
25
- qregs[var_name] = generator.ComputationalBasisStatePreparation(
26
- params,
27
- in_wires=qregs[var_name],
28
- strict_zero_ios=False,
29
- call_name=call_name_frmt.format(var_name),
30
- )[DEFAULT_OUTPUT_NAME]
31
-
32
- generator.set_outputs(qregs)
33
-
34
- return generator.to_function_definition()
@@ -1,65 +0,0 @@
1
- from typing import List, cast
2
-
3
- from classiq.interface.chemistry.operator import PauliOperator
4
- from classiq.interface.generator.expressions.enums.pauli import Pauli
5
- from classiq.interface.generator.functions.qmod_python_interface import QmodPyStruct
6
- from classiq.interface.helpers.custom_pydantic_types import PydanticPauliList
7
-
8
- from classiq.exceptions import (
9
- ClassiqExecutorInvalidHamiltonianError,
10
- ClassiqNonNumericCoefficientInPauliError,
11
- ClassiqValueError,
12
- )
13
-
14
-
15
- def _pauli_str_to_enums(pauli_str: str) -> str:
16
- return ", ".join(f"Pauli.{pauli_term}" for pauli_term in pauli_str)
17
-
18
-
19
- def pauli_integers_to_str(paulis: List[Pauli]) -> str:
20
- return "".join([Pauli(pauli).name for pauli in paulis])
21
-
22
-
23
- def pauli_operator_to_hamiltonian(pauli_list: PydanticPauliList) -> List[QmodPyStruct]:
24
- pauli_struct_list: List[QmodPyStruct] = []
25
- for pauli_term in pauli_list:
26
- if not isinstance(pauli_term[1], complex) or pauli_term[1].imag != 0:
27
- raise ClassiqNonNumericCoefficientInPauliError(
28
- "Coefficient is not a number."
29
- )
30
-
31
- pauli_struct_list.append(
32
- {
33
- "pauli": [Pauli[p] for p in pauli_term[0]],
34
- "coefficient": pauli_term[1].real,
35
- }
36
- )
37
- return pauli_struct_list
38
-
39
-
40
- def get_pauli_operator(pauli_operator: List[QmodPyStruct]) -> PauliOperator:
41
- pauli_list = [
42
- (
43
- pauli_integers_to_str(elem["pauli"]),
44
- elem["coefficient"],
45
- )
46
- for elem in pauli_operator
47
- ]
48
-
49
- try:
50
- pauli = PauliOperator(pauli_list=pauli_list)
51
- except ValueError:
52
- raise ClassiqExecutorInvalidHamiltonianError() from None
53
-
54
- return pauli
55
-
56
-
57
- def _pauli_operator_to_qmod(hamiltonian: PauliOperator) -> str:
58
- if not all(isinstance(summand[1], complex) for summand in hamiltonian.pauli_list):
59
- raise ClassiqValueError(
60
- "Supporting only Hamiltonian with numeric coefficients."
61
- )
62
- return ", ".join(
63
- f"struct_literal(PauliTerm, pauli=[{_pauli_str_to_enums(pauli)}], coefficient={cast(complex, coeff).real})"
64
- for pauli, coeff in hamiltonian.pauli_list
65
- )
@@ -1,243 +0,0 @@
1
- import json
2
- from enum import Enum
3
- from typing import Any, Dict, List, Type, TypeVar, Union
4
-
5
- import pydantic
6
- import pyomo.core.expr.numeric_expr as pyo_expr
7
- import pyomo.environ as pyo
8
- import sympy
9
- from pyomo.core import ConcreteModel, Constraint, Objective, Var, maximize
10
- from pyomo.core.base import _GeneralVarData
11
- from pyomo.core.base.component import ComponentData
12
- from pyomo.core.base.constraint import _GeneralConstraintData
13
- from pyomo.core.base.indexed_component import IndexedComponent
14
- from pyomo.core.base.objective import ScalarObjective
15
- from pyomo.core.expr.sympy_tools import (
16
- Pyomo2SympyVisitor,
17
- PyomoSympyBimap,
18
- Sympy2PyomoVisitor,
19
- )
20
-
21
- from classiq.interface.generator.expressions.expression import Expression
22
- from classiq.interface.generator.types.struct_declaration import StructDeclaration
23
-
24
- from classiq.exceptions import ClassiqValueError
25
-
26
- ListVars = List[_GeneralVarData]
27
-
28
-
29
- class ObjectiveType(Enum):
30
- Min = "Min"
31
- Max = "Max"
32
-
33
-
34
- class CombinatorialOptimizationStructDeclaration(StructDeclaration):
35
- variable_lower_bound: int = pydantic.Field(default=0)
36
- variable_upper_bound: int = pydantic.Field(default=1)
37
- constraints: List[Expression] = pydantic.Field(
38
- default_factory=list, description="List of constraint expressions"
39
- )
40
- objective_type: ObjectiveType = pydantic.Field(
41
- description="Specify whether the optimization problem is Min or Max"
42
- )
43
- objective_function: Expression = pydantic.Field(
44
- description="The expression to optimize, according to the objective type"
45
- )
46
-
47
-
48
- def contains(var_data: _GeneralVarData, vars_data: ListVars) -> bool:
49
- # HACK: standard "__containts__ (in)" method doesn't work, because pyomo overrode the __eq__ method (IMO)
50
- return any(var_data is var_data_temp for var_data_temp in vars_data)
51
-
52
-
53
- def remove(var_data: _GeneralVarData, vars_data: ListVars) -> ListVars:
54
- # HACK: standard "list method remove" method doesn't work, because pyomo overrode the __eq__ method (IMO)
55
- assert contains(var_data, vars_data), "var not in list"
56
- vars_data = vars_data.copy()
57
- for idx, var_data_temp in enumerate(vars_data):
58
- if var_data_temp is var_data:
59
- del vars_data[idx]
60
- break
61
- return vars_data
62
-
63
-
64
- def index(var_data: _GeneralVarData, vars_data: ListVars) -> int:
65
- # HACK: standard "index method" doesn't work.
66
- assert contains(var_data, vars_data), "var not in list"
67
- idxs = [
68
- idx for idx, var_data_temp in enumerate(vars_data) if var_data is var_data_temp
69
- ]
70
- return idxs[0]
71
-
72
-
73
- T = TypeVar("T")
74
-
75
-
76
- def extract(model: ConcreteModel, type_: Type[T]) -> List[T]:
77
- if type_ == _GeneralVarData:
78
- type_ = Var
79
-
80
- elif type_ == _GeneralConstraintData:
81
- type_ = Constraint
82
-
83
- components = model.component_objects(type_)
84
- return [
85
- component[component_idx]
86
- for component in components
87
- for component_idx in component
88
- ]
89
-
90
-
91
- def delete_component(model: ConcreteModel, component: ComponentData) -> None:
92
- parent_ref = component._component
93
-
94
- if parent_ref is None:
95
- return
96
-
97
- parent_component = parent_ref()
98
-
99
- if component is parent_component:
100
- model.del_component(component)
101
- else:
102
- _delete_element_by_value(parent_component, component)
103
-
104
- if not parent_component:
105
- model.del_component(parent_component)
106
-
107
-
108
- def _delete_element_by_value(dict_: Dict, value: Any) -> None:
109
- iter_dict = {**dict_}
110
- for k, v in iter_dict.items():
111
- if v is value and k in dict_:
112
- del dict_[k]
113
-
114
-
115
- def get_name(component: Union[IndexedComponent, ComponentData]) -> str:
116
- if isinstance(component, IndexedComponent):
117
- return component._name # constraint.name returns "'{name}'"
118
- else:
119
- return component.name
120
-
121
-
122
- class FixedSympy2PyomoVisitor(Sympy2PyomoVisitor):
123
- def beforeChild(self, node, child, child_idx): # noqa: N802
124
- if not child._args:
125
- item = self.object_map.getPyomoSymbol(child, None)
126
- if item is None:
127
- if isinstance(child, sympy.Integer): # addition to base implementation
128
- item = int(child.evalf())
129
- else:
130
- item = float(child.evalf())
131
- return False, item
132
- return True, None
133
-
134
-
135
- def sympy2pyomo_expression(
136
- expr: sympy.core.Basic, object_map: PyomoSympyBimap
137
- ) -> pyo_expr.ExpressionBase:
138
- return FixedSympy2PyomoVisitor(object_map).walk_expression(expr)
139
-
140
-
141
- def convert_pyomo_to_global_presentation(
142
- pyo_model: pyo.ConcreteModel,
143
- ) -> pyo.ConcreteModel:
144
- pyo_model_str = pyomo2qmod("nativePyoModel", pyo_model)
145
- problem_struct = CombinatorialOptimizationStructDeclaration.parse_raw(pyo_model_str)
146
-
147
- pyomo_model = pyo.ConcreteModel()
148
-
149
- var_names = list(problem_struct.variables.keys())
150
- pyomo_model.var_set = pyo.Var(
151
- var_names,
152
- domain=pyo.NonNegativeIntegers,
153
- bounds=(
154
- problem_struct.variable_lower_bound,
155
- problem_struct.variable_upper_bound,
156
- ),
157
- )
158
- obj_map = PyomoSympyBimap()
159
- var_dict = {
160
- var_name: obj_map.getSympySymbol(pyomo_model.var_set[var_name])
161
- for var_name in var_names
162
- }
163
-
164
- def expr2pyomo(expr: Expression) -> pyo_expr.ExpressionBase:
165
- sp_expr = sympy.sympify(expr.expr, locals=var_dict)
166
- if isinstance(sp_expr, sympy.core.relational.Equality):
167
- return sympy2pyomo_expression(
168
- sp_expr.args[0], obj_map
169
- ) == sympy2pyomo_expression(sp_expr.args[1], obj_map)
170
-
171
- # Note that strict greater/less than are not supported by Pyomo
172
- return sympy2pyomo_expression(sp_expr, obj_map)
173
-
174
- pyomo_model.constraints = pyo.Constraint(
175
- pyo.RangeSet(0, len(problem_struct.constraints) - 1),
176
- rule=lambda model, i: expr2pyomo(problem_struct.constraints[i]),
177
- )
178
- pyomo_model.objective = pyo.Objective(
179
- expr=expr2pyomo(problem_struct.objective_function),
180
- sense=(
181
- pyo.maximize
182
- if problem_struct.objective_type == ObjectiveType.Max
183
- else pyo.minimize
184
- ),
185
- )
186
-
187
- return pyomo_model
188
-
189
-
190
- def pyomo2qmod(struct_name: str, pyo_model: ConcreteModel) -> str:
191
- symbols_map = PyomoSympyBimap()
192
-
193
- variables: List[sympy.Symbol] = []
194
-
195
- bounds_set = False
196
- lower_bound = None
197
- upper_bound = None
198
-
199
- for var_dict in pyo_model.component_objects(Var):
200
- for key in var_dict:
201
- var = Pyomo2SympyVisitor(symbols_map).walk_expression(var_dict[key])
202
- var.name = var.name.replace(",", "_")
203
- variables.append(var)
204
- if bounds_set:
205
- if lower_bound != var_dict[key].lb:
206
- raise ClassiqValueError(
207
- "All problem variables must agree on lower bound"
208
- )
209
- if upper_bound != var_dict[key].ub:
210
- raise ClassiqValueError(
211
- "All problem variables must agree on upper bound"
212
- )
213
- else:
214
- lower_bound = var_dict[key].lb
215
- upper_bound = var_dict[key].ub
216
- bounds_set = True
217
-
218
- constraint_exprs: List[sympy.Expr] = []
219
-
220
- constraint_exprs.extend(
221
- Pyomo2SympyVisitor(symbols_map).walk_expression(constraint_dict[key].expr)
222
- for constraint_dict in pyo_model.component_objects(Constraint)
223
- for key in constraint_dict
224
- )
225
-
226
- pyo_objective: ScalarObjective = next(pyo_model.component_objects(Objective))
227
- objective_type_str = "Max" if pyo_objective.sense == maximize else "Min"
228
- objective_expr: sympy.Expr = Pyomo2SympyVisitor(symbols_map).walk_expression(
229
- pyo_objective
230
- )
231
-
232
- combi_struct_decl = {
233
- "name": struct_name,
234
- "variables": {str(variable): {"kind": "int"} for variable in variables},
235
- "variable_lower_bound": lower_bound,
236
- "variable_upper_bound": upper_bound,
237
- "constraints": [
238
- {"expr": str(constraint_expr)} for constraint_expr in constraint_exprs
239
- ],
240
- "objective_type": objective_type_str,
241
- "objective_function": {"expr": str(objective_expr)},
242
- }
243
- return json.dumps(combi_struct_decl, indent=2)
@@ -1,11 +0,0 @@
1
- AE_CLASSICAL_LIBRARY = """
2
- def execute_amplitude_estimation(phase_port_size):
3
- result = sample()
4
- estimation = qae_with_qpe_result_post_processing(
5
- estimation_register_size=phase_port_size,
6
- estimation_method=1,
7
- result=result
8
- )
9
- save({"result": result, "estimation": estimation})
10
- return estimation
11
- """
@@ -1,107 +0,0 @@
1
- from classiq.interface.generator.expressions.expression import Expression
2
- from classiq.interface.generator.functions.port_declaration import (
3
- PortDeclarationDirection,
4
- )
5
- from classiq.interface.model.handle_binding import HandleBinding, SlicedHandleBinding
6
- from classiq.interface.model.native_function_definition import NativeFunctionDefinition
7
- from classiq.interface.model.port_declaration import PortDeclaration
8
- from classiq.interface.model.quantum_function_call import QuantumFunctionCall
9
- from classiq.interface.model.quantum_function_declaration import (
10
- QuantumOperandDeclaration,
11
- )
12
- from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
13
-
14
- from classiq import Integer
15
-
16
- QMCI_LIBRARY = [
17
- NativeFunctionDefinition(
18
- name="qmci",
19
- param_decls={
20
- "num_phase_qubits": Integer(),
21
- "num_unitary_qubits": Integer(),
22
- },
23
- port_declarations={
24
- "phase_port": PortDeclaration(
25
- name="phase_port",
26
- size=Expression(expr="num_phase_qubits"),
27
- direction=PortDeclarationDirection.Output,
28
- ),
29
- "unitary_port": PortDeclaration(
30
- name="unitary_port",
31
- size=Expression(expr="num_unitary_qubits"),
32
- direction=PortDeclarationDirection.Output,
33
- ),
34
- },
35
- operand_declarations={
36
- "sp_op": QuantumOperandDeclaration(
37
- name="sp_op",
38
- param_decls={"num_unitary_qubits": Integer()},
39
- port_declarations={
40
- "reg": PortDeclaration(
41
- name="reg",
42
- direction=PortDeclarationDirection.Inout,
43
- size=Expression(expr="num_unitary_qubits-1"),
44
- ),
45
- "ind": PortDeclaration(
46
- name="ind",
47
- direction=PortDeclarationDirection.Inout,
48
- size=Expression(expr="1"),
49
- ),
50
- },
51
- ),
52
- },
53
- body=[
54
- QuantumFunctionCall(
55
- function="amplitude_estimation",
56
- params={
57
- "num_phase_qubits": Expression(expr="num_phase_qubits"),
58
- "num_unitary_qubits": Expression(expr="num_unitary_qubits"),
59
- },
60
- outputs={
61
- "phase_port": HandleBinding(name="phase_port"),
62
- "unitary_port": HandleBinding(name="unitary_port"),
63
- },
64
- operands={
65
- "sp_op": QuantumLambdaFunction(
66
- body=[
67
- QuantumFunctionCall(
68
- function="sp_op",
69
- params={
70
- "num_unitary_qubits": Expression(
71
- expr="num_unitary_qubits"
72
- )
73
- },
74
- inouts={
75
- "reg": SlicedHandleBinding(
76
- name="spq",
77
- start=Expression(expr="0"),
78
- end=Expression(expr="num_unitary_qubits-1"),
79
- ),
80
- "ind": SlicedHandleBinding(
81
- name="spq",
82
- start=Expression(expr="num_unitary_qubits-1"),
83
- end=Expression(expr="num_unitary_qubits"),
84
- ),
85
- },
86
- )
87
- ],
88
- ),
89
- "oracle_op": QuantumLambdaFunction(
90
- body=[
91
- QuantumFunctionCall(
92
- function="Z",
93
- inouts={
94
- "target": SlicedHandleBinding(
95
- name="oq",
96
- start=Expression(expr="num_unitary_qubits-1"),
97
- end=Expression(expr="num_unitary_qubits"),
98
- ),
99
- },
100
- ),
101
- ]
102
- ),
103
- },
104
- ),
105
- ],
106
- ),
107
- ]
@@ -1,43 +0,0 @@
1
- from typing import List
2
-
3
- from classiq.interface.generator.function_param_list import * # noqa: F403
4
- from classiq.interface.generator.function_param_list_without_self_reference import * # noqa: F403
5
- from classiq.interface.generator.oracles.oracle_function_param_list import * # noqa: F403
6
-
7
- from ..builtin_functions import (
8
- amplitude_loading,
9
- binary_ops,
10
- exponentiation,
11
- qpe,
12
- qsvm,
13
- range_types,
14
- state_preparation,
15
- suzuki_trotter,
16
- )
17
- from .standard_gates import * # noqa: F403
18
-
19
- __all__ = (
20
- [function.__name__ for function in function_param_library.param_list] # noqa: F405
21
- + [
22
- function.__name__
23
- for function in standard_gate_function_param_library.param_list # noqa: F405
24
- ]
25
- + [
26
- function.__name__
27
- for function in oracle_function_param_library.param_list # noqa: F405
28
- ]
29
- + [
30
- "exponentiation",
31
- "state_preparation",
32
- "suzuki_trotter",
33
- "range_types",
34
- "binary_ops",
35
- "qpe",
36
- "amplitude_loading",
37
- "qsvm",
38
- ]
39
- )
40
-
41
-
42
- def __dir__() -> List[str]:
43
- return __all__
@@ -1,3 +0,0 @@
1
- from classiq.interface.generator.amplitude_loading import ( # noqa: F401
2
- AmplitudeLoadingImplementation,
3
- )
@@ -1 +0,0 @@
1
- from classiq.interface.generator.arith.binary_ops import ArgToInplace # noqa: F401
@@ -1,5 +0,0 @@
1
- from classiq.interface.chemistry.operator import PauliOperator # noqa: F401
2
- from classiq.interface.generator.hamiltonian_evolution.exponentiation import ( # noqa: F401
3
- ExponentiationConstraints,
4
- ExponentiationOptimization,
5
- )
@@ -1,4 +0,0 @@
1
- from classiq.interface.generator.qpe import ( # noqa: F401
2
- ExponentiationScaling,
3
- ExponentiationSpecification,
4
- )
@@ -1,7 +0,0 @@
1
- from classiq.interface.generator.qsvm import ( # noqa: F401
2
- FeatureMapType,
3
- QSVMFeatureMapBlochSphere,
4
- QSVMFeatureMapDimensional,
5
- QSVMFeatureMapEntanglement,
6
- QSVMFeatureMapPauli,
7
- )
@@ -1,5 +0,0 @@
1
- from classiq.interface.generator.range_types import ( # noqa: F401
2
- NonNegativeFloatRange,
3
- NonNegativeIntRange,
4
- Range,
5
- )
@@ -1 +0,0 @@
1
- from classiq.interface.generator.standard_gates.standard_gates_param_list import * # noqa: F403
@@ -1,6 +0,0 @@
1
- from classiq.interface.generator.state_preparation import ( # noqa: F401
2
- PMF,
3
- GaussianMixture,
4
- GaussianMoments,
5
- Metrics,
6
- )