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,149 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import Any, Optional, Tuple
3
-
4
- import networkx as nx
5
-
6
- from classiq.interface.generator.function_params import PortDirection
7
- from classiq.interface.generator.quantum_function_call import (
8
- ZERO_INDICATOR,
9
- SynthesisQuantumFunctionCall,
10
- )
11
-
12
- from classiq.exceptions import ClassiqWiringError
13
- from classiq.model import logic_flow_change_handler
14
- from classiq.quantum_register import QReg, Qubit
15
-
16
-
17
- # We need the dataclass to be hashable for inserting it into the graph,
18
- # hence the dataclass is frozen.
19
- @dataclass(frozen=True)
20
- class _Pin:
21
- pin_name: str
22
- index: int
23
- func_call: Optional[SynthesisQuantumFunctionCall]
24
- io: PortDirection # We need to store PortDirection because a function may have an input and an output pin with the same name
25
-
26
- def __str__(self) -> str:
27
- return f"{self.pin_name}[{self.index}]"
28
-
29
-
30
- @dataclass(frozen=True)
31
- class _ZeroPin(_Pin):
32
- def __init__(self, io: PortDirection) -> None:
33
- super().__init__(pin_name=ZERO_INDICATOR, index=0, func_call=None, io=io)
34
-
35
- def __str__(self) -> str:
36
- return ZERO_INDICATOR
37
-
38
-
39
- class _StrictDiGraph(nx.DiGraph):
40
- def add_edge(self, u_of_edge: Any, v_of_edge: Any, **attr: Any) -> None:
41
- if u_of_edge in self and v_of_edge in self[u_of_edge]:
42
- raise ClassiqWiringError(
43
- f"Cannot reconnect an already connected edge: {u_of_edge}, {v_of_edge}"
44
- )
45
- super().add_edge(u_of_edge, v_of_edge, **attr)
46
-
47
-
48
- INVALID_QUBITS_ERROR_MESSAGE = (
49
- "Cannot use a QReg with consumed or uninitialized qubits:"
50
- )
51
-
52
-
53
- class LogicFlowBuilder:
54
- def __init__(self) -> None:
55
- self._logic_flow_graph = _StrictDiGraph()
56
- self._connect_qubit_func = {
57
- PortDirection.Input: self._connect_qubit_to_func_call,
58
- PortDirection.Output: self._connect_func_call_to_qubit,
59
- }
60
-
61
- def _is_qubit_available(self, qubit: Qubit) -> bool:
62
- return qubit in self._logic_flow_graph.nodes
63
-
64
- def _validate_qreg(self, qreg: QReg) -> None:
65
- invalid_qubit_indices = [
66
- i
67
- for i, qubit in enumerate(qreg.qubits)
68
- if not self._is_qubit_available(qubit)
69
- ]
70
- if invalid_qubit_indices:
71
- raise ClassiqWiringError(
72
- f"{INVALID_QUBITS_ERROR_MESSAGE} {invalid_qubit_indices}"
73
- )
74
-
75
- def _verify_no_loops(self, dest_node: SynthesisQuantumFunctionCall) -> None:
76
- if not nx.is_directed_acyclic_graph(self._logic_flow_graph):
77
- raise ClassiqWiringError(f"Cannot wire function {dest_node} to itself")
78
-
79
- def _connect_qubit_to_func_call(
80
- self,
81
- qubit: Qubit,
82
- dest_pin: _Pin,
83
- dest_node: Optional[SynthesisQuantumFunctionCall],
84
- ) -> None:
85
- if dest_node is not None:
86
- self._logic_flow_graph.add_edge(dest_pin, dest_node)
87
- source_node, source_pin = self._get_source_node_and_pin(qubit)
88
- # relabel_nodes replaces a node with another (inplace and keeping the edges)
89
- nx.relabel_nodes(self._logic_flow_graph, {qubit: dest_pin}, copy=False)
90
- logic_flow_change_handler.handle_inner_connection(
91
- source_node,
92
- str(source_pin),
93
- str(dest_pin),
94
- dest_node,
95
- )
96
-
97
- def _get_source_node_and_pin(
98
- self, qubit: Qubit
99
- ) -> Tuple[SynthesisQuantumFunctionCall, _Pin]:
100
- source_pin = next(self._logic_flow_graph.predecessors(qubit))
101
- source_node = next(self._logic_flow_graph.predecessors(source_pin))
102
- return source_node, source_pin
103
-
104
- def _connect_func_call_to_qubit(
105
- self, qubit: Qubit, source_pin: _Pin, source_node: SynthesisQuantumFunctionCall
106
- ) -> None:
107
- self._logic_flow_graph.add_edge(source_node, source_pin)
108
- self._logic_flow_graph.add_edge(source_pin, qubit)
109
-
110
- def _connect_io(
111
- self,
112
- io: PortDirection,
113
- func_node: SynthesisQuantumFunctionCall,
114
- pin_name: str,
115
- qreg: QReg,
116
- pin_indices: Optional[range] = None,
117
- ) -> None:
118
- if pin_indices is None:
119
- pin_indices = range(len(qreg))
120
- pins = [_Pin(pin_name, i, func_node, io) for i in pin_indices]
121
- for pin, qubit in zip(pins, qreg.qubits):
122
- self._connect_qubit_func[io](qubit, pin, func_node)
123
-
124
- def connect_qreg_to_func_call(
125
- self,
126
- source: QReg,
127
- dest_pin_name: str,
128
- dest_func_call: SynthesisQuantumFunctionCall,
129
- pin_indices: Optional[range] = None,
130
- ) -> None:
131
- self._validate_qreg(source)
132
- self._connect_io(
133
- PortDirection.Input, dest_func_call, dest_pin_name, source, pin_indices
134
- )
135
- self._verify_no_loops(dest_func_call)
136
-
137
- def connect_func_call_to_qreg(
138
- self,
139
- source_func_call: SynthesisQuantumFunctionCall,
140
- source_pin_name: str,
141
- dest: QReg,
142
- ) -> None:
143
- self._connect_io(PortDirection.Output, source_func_call, source_pin_name, dest)
144
-
145
- def connect_qreg_to_zero(self, source: QReg) -> None:
146
- for qubit in source.qubits:
147
- self._connect_qubit_to_func_call(
148
- qubit, _ZeroPin(PortDirection.Output), None
149
- )
@@ -1,71 +0,0 @@
1
- from typing import Optional
2
-
3
- from classiq.interface.generator.function_params import PortDirection
4
- from classiq.interface.generator.quantum_function_call import (
5
- ZERO_INDICATOR,
6
- SynthesisQuantumFunctionCall,
7
- )
8
-
9
-
10
- def _get_io_wire_name(
11
- name: str, call: SynthesisQuantumFunctionCall, io: PortDirection
12
- ) -> str:
13
- if io == PortDirection.Input:
14
- return f"{io.name}:{name}->{call.name}:{name}"
15
- else:
16
- return f"{call.name}:{name}->{io.name}:{name}"
17
-
18
-
19
- def _get_wire_name(
20
- source_call: SynthesisQuantumFunctionCall,
21
- source_pin_name: str,
22
- dest_pin_name: str,
23
- dest_call: Optional[SynthesisQuantumFunctionCall],
24
- ) -> str:
25
- if dest_call is None:
26
- assert dest_pin_name == ZERO_INDICATOR
27
- return ZERO_INDICATOR
28
- return f"{source_call.name}:{source_pin_name}->{dest_call.name}:{dest_pin_name}"
29
-
30
-
31
- def _set_model_output(
32
- call: SynthesisQuantumFunctionCall, pin_name: str, wire_name: str
33
- ) -> None:
34
- call_outputs = dict(call.outputs_dict)
35
- call_outputs[pin_name] = wire_name
36
- call.outputs = call_outputs
37
- if wire_name != ZERO_INDICATOR:
38
- call.non_zero_output_wires.append(wire_name)
39
-
40
-
41
- def _set_model_input(
42
- call: Optional[SynthesisQuantumFunctionCall], pin_name: str, wire_name: str
43
- ) -> None:
44
- if call is None:
45
- return
46
- call_inputs = dict(call.inputs_dict)
47
- call_inputs[pin_name] = wire_name
48
- call.inputs = call_inputs
49
- call.non_zero_input_wires.append(wire_name)
50
-
51
-
52
- def handle_inner_connection(
53
- source_call: SynthesisQuantumFunctionCall,
54
- source_pin_name: str,
55
- dest_pin_name: str,
56
- dest_call: Optional[SynthesisQuantumFunctionCall],
57
- ) -> None:
58
- wire_name = _get_wire_name(source_call, source_pin_name, dest_pin_name, dest_call)
59
- _set_model_output(source_call, source_pin_name, wire_name)
60
- _set_model_input(dest_call, dest_pin_name, wire_name)
61
-
62
-
63
- def handle_io_connection(
64
- io_dir: PortDirection, call: SynthesisQuantumFunctionCall, io_name: str
65
- ) -> str:
66
- wire_name = _get_io_wire_name(io_name, call, io_dir)
67
- if io_dir == PortDirection.Input:
68
- _set_model_input(call, io_name, wire_name)
69
- else:
70
- _set_model_output(call, io_name, wire_name)
71
- return wire_name
classiq/model/model.py DELETED
@@ -1,229 +0,0 @@
1
- """Model module, implementing facilities for designing models and generating circuits using Classiq platform."""
2
-
3
- from __future__ import annotations
4
-
5
- import logging
6
- from typing import Any, Dict, List, Mapping, Optional, cast
7
-
8
- from classiq.interface.chemistry.operator import PauliOperator
9
- from classiq.interface.executor.execution_preferences import (
10
- ExecutionPreferences,
11
- QaeWithQpeEstimationMethod,
12
- )
13
- from classiq.interface.generator.expressions.enums import Optimizer
14
- from classiq.interface.generator.function_params import IOName
15
- from classiq.interface.generator.functions import SynthesisNativeFunctionDefinition
16
- from classiq.interface.generator.model import (
17
- Constraints,
18
- Preferences,
19
- SynthesisModel as APIModel,
20
- )
21
- from classiq.interface.generator.model.model import MAIN_FUNCTION_NAME, SerializedModel
22
- from classiq.interface.generator.quantum_function_call import (
23
- SynthesisQuantumFunctionCall,
24
- )
25
-
26
- from classiq.exceptions import ClassiqError, ClassiqValueError
27
- from classiq.model import function_handler
28
- from classiq.quantum_functions.function_library import FunctionLibrary
29
- from classiq.quantum_register import QReg, QRegGenericAlias
30
-
31
- _logger = logging.getLogger(__name__)
32
-
33
- # TODO: Add docstrings for auto generated methods.
34
-
35
-
36
- ILLEGAL_SETTING_MSG = "Illegal value type provided"
37
-
38
-
39
- def _pauli_str_to_enums(pauli_str: str) -> str:
40
- return ", ".join(f"Pauli.{pauli_term}" for pauli_term in pauli_str)
41
-
42
-
43
- def _pauli_operator_to_qmod(hamiltonian: PauliOperator) -> str:
44
- if not all(isinstance(summand[1], complex) for summand in hamiltonian.pauli_list):
45
- raise ClassiqValueError(
46
- "Supporting only Hamiltonian with numeric coefficients."
47
- )
48
- return ", ".join(
49
- f"struct_literal(PauliTerm, pauli=[{_pauli_str_to_enums(pauli)}], coefficient={cast(complex, coeff).real})"
50
- for pauli, coeff in hamiltonian.pauli_list
51
- )
52
-
53
-
54
- DEFAULT_RESULT_NAME = "result"
55
- DEFAULT_AMPLITUDE_ESTIMATION_RESULT_NAME = "estimation"
56
-
57
-
58
- class Model(function_handler.FunctionHandler):
59
- """Facility to generate circuits, based on the model."""
60
-
61
- def __init__(self, **kwargs: Any) -> None:
62
- """Init self."""
63
- super().__init__()
64
- self._model = APIModel(**kwargs)
65
-
66
- @classmethod
67
- def from_model(cls, model: APIModel) -> Model:
68
- return cls(**dict(model))
69
-
70
- @property
71
- def _body(
72
- self,
73
- ) -> List[SynthesisQuantumFunctionCall]:
74
- return self._model.body
75
-
76
- @property
77
- def constraints(self) -> Constraints:
78
- """Get the constraints aggregated in self.
79
-
80
- Returns:
81
- The constraints data.
82
- """
83
- return self._model.constraints
84
-
85
- @constraints.setter
86
- def constraints(self, value: Any) -> None:
87
- if not isinstance(value, Constraints):
88
- raise ClassiqError(ILLEGAL_SETTING_MSG)
89
- self._model.constraints = value
90
-
91
- @property
92
- def preferences(self) -> Preferences:
93
- """Get the preferences aggregated in self.
94
-
95
- Returns:
96
- The preferences data.
97
- """
98
- return self._model.preferences
99
-
100
- @preferences.setter
101
- def preferences(self, value: Any) -> None:
102
- if not isinstance(value, Preferences):
103
- raise ClassiqError(ILLEGAL_SETTING_MSG)
104
- self._model.preferences = value
105
-
106
- @property
107
- def execution_preferences(self) -> ExecutionPreferences:
108
- return self._model.execution_preferences
109
-
110
- @execution_preferences.setter
111
- def execution_preferences(self, value: Any) -> None:
112
- if not isinstance(value, ExecutionPreferences):
113
- raise ClassiqError(ILLEGAL_SETTING_MSG)
114
- self._model.execution_preferences = value
115
-
116
- def create_inputs(
117
- self, inputs: Mapping[IOName, QRegGenericAlias]
118
- ) -> Dict[IOName, QReg]:
119
- qregs = super().create_inputs(inputs=inputs)
120
- self._model.set_inputs(inputs, self.input_wires)
121
- return qregs
122
-
123
- def set_outputs(self, outputs: Mapping[IOName, QReg]) -> None:
124
- super().set_outputs(outputs=outputs)
125
- self._model.set_outputs(outputs, self.output_wires)
126
-
127
- def include_library(self, library: FunctionLibrary) -> None:
128
- """Includes a user-defined custom function library.
129
-
130
- Args:
131
- library (FunctionLibrary): The custom function library.
132
- """
133
- super().include_library(library=library)
134
- # It is important that the .functions list is shared between the library and
135
- # the model, as it is modified in-place
136
- self._model.functions = library._data
137
- library.remove_function_definition(MAIN_FUNCTION_NAME)
138
- self._model.functions.append(
139
- SynthesisNativeFunctionDefinition(name=MAIN_FUNCTION_NAME)
140
- )
141
-
142
- def get_model(self) -> SerializedModel:
143
- return self._model.get_model()
144
-
145
- def create_library(self) -> None:
146
- self._function_library = FunctionLibrary(*self._model.functions)
147
- self._model.functions = self._function_library._data
148
-
149
- def sample(
150
- self,
151
- execution_params: Optional[Dict[str, float]] = None,
152
- ) -> None:
153
- execution_params = execution_params or dict()
154
-
155
- self._model.classical_execution_code += classical_sample_function(
156
- execution_params=execution_params
157
- )
158
-
159
- def vqe(
160
- self,
161
- hamiltonian: PauliOperator,
162
- maximize: bool,
163
- optimizer: Optimizer,
164
- max_iteration: int,
165
- initial_point: Optional[List[int]] = None,
166
- tolerance: float = 0,
167
- step_size: float = 0,
168
- skip_compute_variance: bool = False,
169
- alpha_cvar: float = 1,
170
- ) -> None:
171
- initial_point = initial_point or []
172
- vqe_classical_code = f"""
173
- {DEFAULT_RESULT_NAME} = vqe(
174
- hamiltonian=[{_pauli_operator_to_qmod(hamiltonian)}],
175
- maximize={maximize},
176
- initial_point={initial_point},
177
- optimizer=Optimizer.{optimizer.name},
178
- max_iteration={max_iteration},
179
- tolerance={tolerance},
180
- step_size={step_size},
181
- skip_compute_variance={skip_compute_variance},
182
- alpha_cvar={alpha_cvar}
183
- )
184
- save({{{DEFAULT_RESULT_NAME!r}: {DEFAULT_RESULT_NAME}}})
185
- """
186
-
187
- self._model.classical_execution_code += vqe_classical_code
188
-
189
- def iqae(
190
- self,
191
- epsilon: float,
192
- alpha: float,
193
- execution_params: Optional[Dict[str, float]] = None,
194
- ) -> None:
195
- execution_params = execution_params or {}
196
-
197
- iqae_classical_code = f"""
198
- {DEFAULT_RESULT_NAME} = iqae(
199
- epsilon={epsilon},
200
- alpha={alpha},
201
- execution_params={execution_params}
202
- )
203
- save({{{DEFAULT_RESULT_NAME!r}: {DEFAULT_RESULT_NAME}}})
204
- """
205
-
206
- self._model.classical_execution_code += iqae_classical_code
207
-
208
- def post_process_amplitude_estimation(
209
- self,
210
- estimation_register_size: int,
211
- estimation_method: QaeWithQpeEstimationMethod,
212
- ) -> None:
213
- postprocess_classical_code = f"""
214
- {DEFAULT_AMPLITUDE_ESTIMATION_RESULT_NAME} = qae_with_qpe_result_post_processing(
215
- {estimation_register_size},
216
- {estimation_method},
217
- {DEFAULT_RESULT_NAME}
218
- )
219
- save({{{DEFAULT_AMPLITUDE_ESTIMATION_RESULT_NAME!r}: {DEFAULT_AMPLITUDE_ESTIMATION_RESULT_NAME}}})
220
- """
221
-
222
- self._model.classical_execution_code += postprocess_classical_code
223
-
224
-
225
- def classical_sample_function(execution_params: Dict[str, float]) -> str:
226
- return f"""
227
- {DEFAULT_RESULT_NAME} = sample({execution_params})
228
- save({{{DEFAULT_RESULT_NAME!r}: {DEFAULT_RESULT_NAME}}})
229
- """