classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. classiq/__init__.py +49 -34
  2. classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
  3. classiq/_analyzer_extras/interactive_hardware.py +3 -3
  4. classiq/_internals/api_wrapper.py +241 -95
  5. classiq/_internals/async_utils.py +2 -77
  6. classiq/_internals/authentication/auth0.py +26 -10
  7. classiq/_internals/authentication/authentication.py +11 -0
  8. classiq/_internals/authentication/device.py +18 -8
  9. classiq/_internals/authentication/password_manager.py +40 -13
  10. classiq/_internals/authentication/token_manager.py +11 -6
  11. classiq/_internals/client.py +106 -37
  12. classiq/_internals/config.py +3 -4
  13. classiq/_internals/host_checker.py +38 -15
  14. classiq/_internals/jobs.py +56 -50
  15. classiq/_internals/type_validation.py +9 -9
  16. classiq/analyzer/__init__.py +1 -3
  17. classiq/analyzer/analyzer.py +50 -47
  18. classiq/analyzer/analyzer_utilities.py +15 -15
  19. classiq/analyzer/rb.py +19 -20
  20. classiq/analyzer/show_interactive_hack.py +30 -7
  21. classiq/analyzer/url_utils.py +2 -3
  22. classiq/applications/__init__.py +3 -12
  23. classiq/applications/chemistry/__init__.py +14 -10
  24. classiq/applications/chemistry/ansatz_parameters.py +4 -4
  25. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
  26. classiq/applications/chemistry/ground_state_problem.py +1 -1
  27. classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
  28. classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
  29. classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
  30. classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
  31. classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
  32. classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
  33. classiq/applications/combinatorial_helpers/memory.py +75 -0
  34. classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
  35. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
  36. classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
  37. classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
  38. classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
  39. classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
  40. classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
  41. classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
  42. classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
  43. classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
  44. classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
  45. classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
  46. classiq/applications/combinatorial_optimization/__init__.py +24 -5
  47. classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
  48. classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
  49. classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
  50. classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
  51. classiq/applications/finance/__init__.py +4 -5
  52. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
  53. classiq/applications/grover/__init__.py +9 -0
  54. classiq/applications/grover/grover_model_constructor.py +157 -0
  55. classiq/applications/hamiltonian/__init__.py +0 -0
  56. classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
  57. classiq/applications/libraries/__init__.py +0 -0
  58. classiq/applications/libraries/qmci_library.py +22 -0
  59. classiq/applications/qnn/__init__.py +2 -4
  60. classiq/applications/qnn/circuit_utils.py +8 -8
  61. classiq/applications/qnn/datasets/__init__.py +9 -11
  62. classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
  63. classiq/applications/qnn/datasets/dataset_not.py +2 -1
  64. classiq/applications/qnn/datasets/dataset_parity.py +2 -2
  65. classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
  66. classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
  67. classiq/applications/qnn/qlayer.py +30 -10
  68. classiq/applications/qnn/torch_utils.py +4 -3
  69. classiq/applications/qnn/types.py +7 -7
  70. classiq/applications/qsvm/__init__.py +6 -4
  71. classiq/applications/qsvm/qsvm.py +4 -10
  72. classiq/applications/qsvm/qsvm_data_generation.py +5 -8
  73. classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
  74. classiq/execution/__init__.py +8 -3
  75. classiq/execution/all_hardware_devices.py +11 -0
  76. classiq/execution/execution_session.py +400 -0
  77. classiq/execution/iqcc.py +63 -0
  78. classiq/execution/jobs.py +197 -25
  79. classiq/execution/qnn.py +79 -0
  80. classiq/executor.py +23 -117
  81. classiq/interface/_version.py +1 -1
  82. classiq/interface/analyzer/analysis_params.py +49 -16
  83. classiq/interface/analyzer/cytoscape_graph.py +15 -9
  84. classiq/interface/analyzer/result.py +36 -32
  85. classiq/interface/applications/qsvm.py +28 -25
  86. classiq/interface/ast_node.py +16 -0
  87. classiq/interface/backend/backend_preferences.py +390 -119
  88. classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
  89. classiq/interface/backend/pydantic_backend.py +27 -22
  90. classiq/interface/backend/quantum_backend_providers.py +70 -16
  91. classiq/interface/chemistry/fermionic_operator.py +43 -32
  92. classiq/interface/chemistry/ground_state_problem.py +42 -24
  93. classiq/interface/chemistry/molecule.py +20 -14
  94. classiq/interface/chemistry/operator.py +75 -236
  95. classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
  96. classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
  97. classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
  98. classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
  99. classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
  100. classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
  101. classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
  102. classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
  103. classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
  104. classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
  105. classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
  106. classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
  107. classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
  108. classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
  109. classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
  110. classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
  111. classiq/interface/combinatorial_optimization/result.py +1 -3
  112. classiq/interface/combinatorial_optimization/solver_types.py +1 -1
  113. classiq/interface/debug_info/__init__.py +0 -0
  114. classiq/interface/debug_info/debug_info.py +86 -0
  115. classiq/interface/exceptions.py +201 -0
  116. classiq/interface/execution/iqcc.py +19 -0
  117. classiq/interface/execution/jobs.py +15 -12
  118. classiq/interface/execution/primitives.py +18 -0
  119. classiq/interface/executor/constants.py +1 -0
  120. classiq/interface/executor/estimation.py +2 -2
  121. classiq/interface/executor/execution_preferences.py +26 -143
  122. classiq/interface/executor/execution_request.py +36 -56
  123. classiq/interface/executor/execution_result.py +30 -8
  124. classiq/interface/executor/iqae_result.py +4 -6
  125. classiq/interface/executor/optimizer_preferences.py +34 -22
  126. classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
  127. classiq/interface/executor/quantum_instruction_set.py +3 -2
  128. classiq/interface/executor/register_initialization.py +12 -17
  129. classiq/interface/executor/result.py +122 -64
  130. classiq/interface/executor/vqe_result.py +11 -11
  131. classiq/interface/finance/function_input.py +42 -19
  132. classiq/interface/finance/gaussian_model_input.py +7 -5
  133. classiq/interface/finance/log_normal_model_input.py +6 -4
  134. classiq/interface/finance/model_input.py +6 -4
  135. classiq/interface/generator/adjacency.py +1 -3
  136. classiq/interface/generator/amplitude_loading.py +27 -14
  137. classiq/interface/generator/ansatz_library.py +5 -5
  138. classiq/interface/generator/application_apis/__init__.py +1 -0
  139. classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
  140. classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
  141. classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
  142. classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
  143. classiq/interface/generator/application_apis/finance_declarations.py +48 -69
  144. classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
  145. classiq/interface/generator/arith/argument_utils.py +57 -6
  146. classiq/interface/generator/arith/arithmetic.py +37 -16
  147. classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
  148. classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
  149. classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
  150. classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
  151. classiq/interface/generator/arith/arithmetic_operations.py +19 -16
  152. classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
  153. classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
  154. classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
  155. classiq/interface/generator/arith/binary_ops.py +375 -139
  156. classiq/interface/generator/arith/endianness.py +1 -1
  157. classiq/interface/generator/arith/extremum_operations.py +96 -23
  158. classiq/interface/generator/arith/logical_ops.py +16 -12
  159. classiq/interface/generator/arith/machine_precision.py +3 -0
  160. classiq/interface/generator/arith/number_utils.py +44 -48
  161. classiq/interface/generator/arith/register_user_input.py +70 -27
  162. classiq/interface/generator/arith/unary_ops.py +57 -46
  163. classiq/interface/generator/arith/uncomputation_methods.py +1 -1
  164. classiq/interface/generator/builtin_api_builder.py +2 -9
  165. classiq/interface/generator/chemistry_function_params.py +5 -5
  166. classiq/interface/generator/circuit_code/circuit_code.py +7 -7
  167. classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
  168. classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
  169. classiq/interface/generator/compiler_keywords.py +8 -0
  170. classiq/interface/generator/complex_type.py +13 -25
  171. classiq/interface/generator/constant.py +3 -4
  172. classiq/interface/generator/control_state.py +35 -28
  173. classiq/interface/generator/copy.py +47 -0
  174. classiq/interface/generator/custom_ansatz.py +2 -5
  175. classiq/interface/generator/distance.py +3 -5
  176. classiq/interface/generator/excitations.py +3 -2
  177. classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
  178. classiq/interface/generator/expressions/enums/__init__.py +0 -10
  179. classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
  180. classiq/interface/generator/expressions/evaluated_expression.py +21 -7
  181. classiq/interface/generator/expressions/expression.py +27 -15
  182. classiq/interface/generator/expressions/expression_constants.py +9 -3
  183. classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
  184. classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
  185. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
  186. classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
  187. classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
  188. classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
  189. classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
  190. classiq/interface/generator/finance.py +3 -3
  191. classiq/interface/generator/function_param_library.py +6 -6
  192. classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
  193. classiq/interface/generator/function_params.py +42 -69
  194. classiq/interface/generator/functions/__init__.py +0 -22
  195. classiq/interface/generator/functions/builtins/__init__.py +0 -0
  196. classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
  197. classiq/interface/generator/functions/classical_function_declaration.py +18 -9
  198. classiq/interface/generator/functions/classical_type.py +47 -166
  199. classiq/interface/generator/functions/concrete_types.py +55 -0
  200. classiq/interface/generator/functions/function_declaration.py +13 -14
  201. classiq/interface/generator/functions/port_declaration.py +1 -13
  202. classiq/interface/generator/functions/qmod_python_interface.py +2 -1
  203. classiq/interface/generator/functions/type_name.py +90 -0
  204. classiq/interface/generator/generated_circuit_data.py +155 -22
  205. classiq/interface/generator/grover_diffuser.py +32 -25
  206. classiq/interface/generator/grover_operator.py +34 -23
  207. classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
  208. classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
  209. classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
  210. classiq/interface/generator/hardware/hardware_data.py +76 -36
  211. classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
  212. classiq/interface/generator/hartree_fock.py +14 -4
  213. classiq/interface/generator/identity.py +10 -6
  214. classiq/interface/generator/linear_pauli_rotations.py +33 -19
  215. classiq/interface/generator/mcmt_method.py +1 -1
  216. classiq/interface/generator/mcu.py +20 -16
  217. classiq/interface/generator/mcx.py +29 -20
  218. classiq/interface/generator/model/__init__.py +2 -5
  219. classiq/interface/generator/model/constraints.py +27 -8
  220. classiq/interface/generator/model/model.py +32 -203
  221. classiq/interface/generator/model/preferences/preferences.py +118 -43
  222. classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
  223. classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
  224. classiq/interface/generator/oracles/custom_oracle.py +17 -13
  225. classiq/interface/generator/oracles/oracle_abc.py +9 -9
  226. classiq/interface/generator/partitioned_register.py +7 -7
  227. classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
  228. classiq/interface/generator/preferences/optimization.py +1 -2
  229. classiq/interface/generator/qpe.py +47 -34
  230. classiq/interface/generator/qsvm.py +13 -17
  231. classiq/interface/generator/quantum_function_call.py +107 -87
  232. classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
  233. classiq/interface/generator/range_types.py +13 -12
  234. classiq/interface/generator/register_role.py +18 -6
  235. classiq/interface/generator/slice_parsing_utils.py +11 -6
  236. classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
  237. classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
  238. classiq/interface/generator/standard_gates/standard_gates.py +3 -3
  239. classiq/interface/generator/standard_gates/u_gate.py +7 -10
  240. classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
  241. classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
  242. classiq/interface/generator/state_preparation/distributions.py +16 -15
  243. classiq/interface/generator/state_preparation/metrics.py +5 -7
  244. classiq/interface/generator/state_preparation/state_preparation.py +30 -23
  245. classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
  246. classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
  247. classiq/interface/generator/transpiler_basis_gates.py +7 -3
  248. classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
  249. classiq/interface/generator/types/compilation_metadata.py +6 -0
  250. classiq/interface/generator/types/enum_declaration.py +54 -0
  251. classiq/interface/generator/types/qstruct_declaration.py +18 -0
  252. classiq/interface/generator/types/struct_declaration.py +15 -14
  253. classiq/interface/generator/ucc.py +9 -6
  254. classiq/interface/generator/unitary_gate.py +10 -6
  255. classiq/interface/generator/user_defined_function_params.py +4 -1
  256. classiq/interface/generator/validations/flow_graph.py +11 -9
  257. classiq/interface/generator/validations/validator_functions.py +8 -6
  258. classiq/interface/generator/visitor.py +23 -16
  259. classiq/interface/hardware.py +31 -10
  260. classiq/interface/helpers/classproperty.py +8 -0
  261. classiq/interface/helpers/custom_encoders.py +3 -0
  262. classiq/interface/helpers/custom_pydantic_types.py +40 -50
  263. classiq/interface/helpers/datastructures.py +26 -0
  264. classiq/interface/helpers/hashable_mixin.py +3 -2
  265. classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
  266. classiq/interface/helpers/pydantic_model_helpers.py +7 -11
  267. classiq/interface/helpers/validation_helpers.py +4 -21
  268. classiq/interface/helpers/versioned_model.py +1 -1
  269. classiq/interface/ide/ide_data.py +16 -20
  270. classiq/interface/ide/visual_model.py +130 -0
  271. classiq/interface/interface_version.py +1 -0
  272. classiq/interface/jobs.py +35 -6
  273. classiq/interface/model/allocate.py +16 -0
  274. classiq/interface/model/bind_operation.py +44 -14
  275. classiq/interface/model/classical_if.py +15 -0
  276. classiq/interface/model/classical_parameter_declaration.py +33 -3
  277. classiq/interface/model/control.py +45 -0
  278. classiq/interface/model/handle_binding.py +298 -20
  279. classiq/interface/model/inplace_binary_operation.py +31 -26
  280. classiq/interface/model/invert.py +12 -0
  281. classiq/interface/model/model.py +87 -73
  282. classiq/interface/model/native_function_definition.py +16 -21
  283. classiq/interface/model/parameter.py +13 -0
  284. classiq/interface/model/phase_operation.py +11 -0
  285. classiq/interface/model/port_declaration.py +27 -9
  286. classiq/interface/model/power.py +14 -0
  287. classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
  288. classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
  289. classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
  290. classiq/interface/model/quantum_function_call.py +146 -462
  291. classiq/interface/model/quantum_function_declaration.py +193 -152
  292. classiq/interface/model/quantum_lambda_function.py +65 -0
  293. classiq/interface/model/quantum_statement.py +71 -12
  294. classiq/interface/model/quantum_type.py +205 -67
  295. classiq/interface/model/quantum_variable_declaration.py +4 -26
  296. classiq/interface/model/repeat.py +15 -0
  297. classiq/interface/model/statement_block.py +58 -0
  298. classiq/interface/model/validation_handle.py +13 -6
  299. classiq/interface/model/variable_declaration_statement.py +3 -1
  300. classiq/interface/model/within_apply_operation.py +13 -0
  301. classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
  302. classiq/interface/server/global_versions.py +6 -7
  303. classiq/interface/server/routes.py +22 -21
  304. classiq/interface/source_reference.py +59 -0
  305. classiq/model_expansions/__init__.py +0 -0
  306. classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
  307. classiq/model_expansions/capturing/__init__.py +0 -0
  308. classiq/model_expansions/capturing/captured_vars.py +435 -0
  309. classiq/model_expansions/capturing/mangling_utils.py +56 -0
  310. classiq/model_expansions/closure.py +171 -0
  311. classiq/model_expansions/debug_flag.py +3 -0
  312. classiq/model_expansions/evaluators/__init__.py +0 -0
  313. classiq/model_expansions/evaluators/arg_type_match.py +158 -0
  314. classiq/model_expansions/evaluators/argument_types.py +42 -0
  315. classiq/model_expansions/evaluators/classical_expression.py +36 -0
  316. classiq/model_expansions/evaluators/control.py +144 -0
  317. classiq/model_expansions/evaluators/parameter_types.py +226 -0
  318. classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
  319. classiq/model_expansions/evaluators/type_type_match.py +90 -0
  320. classiq/model_expansions/expression_evaluator.py +135 -0
  321. classiq/model_expansions/expression_renamer.py +76 -0
  322. classiq/model_expansions/function_builder.py +247 -0
  323. classiq/model_expansions/generative_functions.py +158 -0
  324. classiq/model_expansions/interpreters/__init__.py +0 -0
  325. classiq/model_expansions/interpreters/base_interpreter.py +263 -0
  326. classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
  327. classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
  328. classiq/model_expansions/model_tables.py +18 -0
  329. classiq/model_expansions/quantum_operations/__init__.py +9 -0
  330. classiq/model_expansions/quantum_operations/bind.py +60 -0
  331. classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
  332. classiq/model_expansions/quantum_operations/classicalif.py +53 -0
  333. classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
  334. classiq/model_expansions/quantum_operations/emitter.py +181 -0
  335. classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
  336. classiq/model_expansions/quantum_operations/repeat.py +56 -0
  337. classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
  338. classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
  339. classiq/model_expansions/scope.py +240 -0
  340. classiq/model_expansions/scope_initialization.py +150 -0
  341. classiq/model_expansions/sympy_conversion/__init__.py +0 -0
  342. classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
  343. classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
  344. classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
  345. classiq/model_expansions/transformers/__init__.py +0 -0
  346. classiq/model_expansions/transformers/ast_renamer.py +26 -0
  347. classiq/model_expansions/transformers/var_splitter.py +299 -0
  348. classiq/model_expansions/utils/__init__.py +0 -0
  349. classiq/model_expansions/utils/counted_name_allocator.py +11 -0
  350. classiq/model_expansions/utils/handles_collector.py +33 -0
  351. classiq/model_expansions/visitors/__init__.py +0 -0
  352. classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
  353. classiq/model_expansions/visitors/variable_references.py +144 -0
  354. classiq/open_library/__init__.py +4 -0
  355. classiq/open_library/functions/__init__.py +130 -0
  356. classiq/open_library/functions/amplitude_estimation.py +30 -0
  357. classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
  358. classiq/open_library/functions/grover.py +157 -0
  359. classiq/open_library/functions/hea.py +115 -0
  360. classiq/open_library/functions/linear_pauli_rotation.py +82 -0
  361. classiq/open_library/functions/modular_exponentiation.py +201 -0
  362. classiq/open_library/functions/qaoa_penalty.py +117 -0
  363. classiq/open_library/functions/qft_functions.py +54 -0
  364. classiq/open_library/functions/qpe.py +46 -0
  365. classiq/open_library/functions/qsvt.py +331 -0
  366. classiq/open_library/functions/state_preparation.py +301 -0
  367. classiq/open_library/functions/swap_test.py +27 -0
  368. classiq/open_library/functions/utility_functions.py +81 -0
  369. classiq/open_library/functions/variational.py +52 -0
  370. classiq/qmod/__init__.py +17 -10
  371. classiq/qmod/builtins/__init__.py +19 -2
  372. classiq/qmod/builtins/classical_execution_primitives.py +60 -47
  373. classiq/qmod/builtins/classical_functions.py +44 -38
  374. classiq/qmod/builtins/constants.py +10 -0
  375. classiq/qmod/builtins/enums.py +208 -0
  376. classiq/qmod/builtins/functions/__init__.py +137 -0
  377. classiq/qmod/builtins/functions/allocation.py +150 -0
  378. classiq/qmod/builtins/functions/arithmetic.py +55 -0
  379. classiq/qmod/builtins/functions/benchmarking.py +8 -0
  380. classiq/qmod/builtins/functions/chemistry.py +91 -0
  381. classiq/qmod/builtins/functions/exponentiation.py +105 -0
  382. classiq/qmod/builtins/functions/finance.py +34 -0
  383. classiq/qmod/builtins/functions/operators.py +16 -0
  384. classiq/qmod/builtins/functions/qsvm.py +24 -0
  385. classiq/qmod/builtins/functions/standard_gates.py +651 -0
  386. classiq/qmod/builtins/operations.py +379 -57
  387. classiq/qmod/builtins/structs.py +103 -80
  388. classiq/qmod/cfunc.py +42 -0
  389. classiq/qmod/classical_function.py +8 -20
  390. classiq/qmod/cparam.py +64 -0
  391. classiq/qmod/create_model_function.py +56 -0
  392. classiq/qmod/declaration_inferrer.py +145 -112
  393. classiq/qmod/expression_query.py +39 -0
  394. classiq/qmod/generative.py +42 -0
  395. classiq/qmod/model_state_container.py +19 -5
  396. classiq/qmod/native/__init__.py +7 -0
  397. classiq/qmod/native/expression_to_qmod.py +194 -0
  398. classiq/qmod/native/pretty_printer.py +401 -0
  399. classiq/qmod/pretty_print/__init__.py +7 -0
  400. classiq/qmod/pretty_print/expression_to_python.py +222 -0
  401. classiq/qmod/pretty_print/pretty_printer.py +572 -0
  402. classiq/qmod/python_classical_type.py +67 -0
  403. classiq/qmod/qfunc.py +79 -0
  404. classiq/qmod/qmod_constant.py +143 -0
  405. classiq/qmod/qmod_parameter.py +84 -53
  406. classiq/qmod/qmod_variable.py +497 -100
  407. classiq/qmod/quantum_callable.py +17 -7
  408. classiq/qmod/quantum_expandable.py +278 -105
  409. classiq/qmod/quantum_function.py +232 -48
  410. classiq/qmod/semantics/__init__.py +0 -0
  411. classiq/qmod/semantics/annotation/__init__.py +0 -0
  412. classiq/qmod/semantics/annotation/call_annotation.py +92 -0
  413. classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
  414. classiq/qmod/semantics/error_manager.py +88 -0
  415. classiq/qmod/semantics/lambdas.py +25 -0
  416. classiq/qmod/semantics/static_semantics_visitor.py +384 -0
  417. classiq/qmod/semantics/validation/__init__.py +0 -0
  418. classiq/qmod/semantics/validation/constants_validation.py +16 -0
  419. classiq/qmod/semantics/validation/func_call_validation.py +99 -0
  420. classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
  421. classiq/qmod/semantics/validation/handle_validation.py +85 -0
  422. classiq/qmod/semantics/validation/main_validation.py +33 -0
  423. classiq/qmod/semantics/validation/types_validation.py +128 -0
  424. classiq/qmod/symbolic.py +178 -111
  425. classiq/qmod/symbolic_expr.py +36 -12
  426. classiq/qmod/symbolic_type.py +2 -5
  427. classiq/qmod/type_attribute_remover.py +32 -0
  428. classiq/qmod/utilities.py +108 -1
  429. classiq/qmod/write_qmod.py +53 -0
  430. classiq/synthesis.py +210 -22
  431. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
  432. classiq-0.65.3.dist-info/RECORD +521 -0
  433. {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
  434. classiq/_internals/_qfunc_ext.py +0 -6
  435. classiq/applications/benchmarking/__init__.py +0 -9
  436. classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
  437. classiq/applications/numpy_utils.py +0 -37
  438. classiq/applications_model_constructors/__init__.py +0 -17
  439. classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
  440. classiq/applications_model_constructors/grover_model_constructor.py +0 -227
  441. classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
  442. classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
  443. classiq/builtin_functions/__init__.py +0 -43
  444. classiq/builtin_functions/amplitude_loading.py +0 -3
  445. classiq/builtin_functions/binary_ops.py +0 -1
  446. classiq/builtin_functions/exponentiation.py +0 -5
  447. classiq/builtin_functions/qpe.py +0 -4
  448. classiq/builtin_functions/qsvm.py +0 -7
  449. classiq/builtin_functions/range_types.py +0 -5
  450. classiq/builtin_functions/standard_gates.py +0 -1
  451. classiq/builtin_functions/state_preparation.py +0 -6
  452. classiq/builtin_functions/suzuki_trotter.py +0 -3
  453. classiq/exceptions.py +0 -131
  454. classiq/interface/executor/aws_execution_cost.py +0 -72
  455. classiq/interface/executor/error_mitigation.py +0 -6
  456. classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
  457. classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
  458. classiq/interface/generator/expressions/enums/chemistry.py +0 -28
  459. classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
  460. classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
  461. classiq/interface/generator/expressions/enums/optimizers.py +0 -9
  462. classiq/interface/generator/expressions/enums/pauli.py +0 -8
  463. classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
  464. classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
  465. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  466. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
  467. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
  468. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
  469. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
  470. classiq/interface/generator/functions/foreign_function_definition.py +0 -106
  471. classiq/interface/generator/functions/function_implementation.py +0 -103
  472. classiq/interface/generator/functions/native_function_definition.py +0 -153
  473. classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
  474. classiq/interface/generator/functions/register.py +0 -42
  475. classiq/interface/generator/functions/register_mapping_data.py +0 -102
  476. classiq/interface/generator/inequality_mixer.py +0 -51
  477. classiq/interface/generator/model/classical_main_validator.py +0 -106
  478. classiq/interface/generator/range_mixer.py +0 -56
  479. classiq/interface/generator/state_propagator.py +0 -63
  480. classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
  481. classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
  482. classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
  483. classiq/interface/generator/types/combinatorial_problem.py +0 -26
  484. classiq/interface/ide/show.py +0 -34
  485. classiq/interface/model/common_model_types.py +0 -23
  486. classiq/interface/model/numeric_reinterpretation.py +0 -25
  487. classiq/interface/model/operator_synthesis_data.py +0 -48
  488. classiq/interface/model/quantum_expressions/control_state.py +0 -38
  489. classiq/interface/model/quantum_if_operation.py +0 -95
  490. classiq/interface/model/resolvers/function_call_resolver.py +0 -43
  491. classiq/interface/model/validations/handle_validation_base.py +0 -55
  492. classiq/interface/model/validations/handles_validator.py +0 -154
  493. classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
  494. classiq/model/__init__.py +0 -14
  495. classiq/model/composite_function_generator.py +0 -33
  496. classiq/model/function_handler.py +0 -466
  497. classiq/model/function_handler.pyi +0 -152
  498. classiq/model/logic_flow.py +0 -149
  499. classiq/model/logic_flow_change_handler.py +0 -71
  500. classiq/model/model.py +0 -246
  501. classiq/qmod/builtins/functions.py +0 -896
  502. classiq/qmod/qmod_struct.py +0 -37
  503. classiq/quantum_functions/__init__.py +0 -17
  504. classiq/quantum_functions/annotation_parser.py +0 -207
  505. classiq/quantum_functions/decorators.py +0 -22
  506. classiq/quantum_functions/function_library.py +0 -181
  507. classiq/quantum_functions/function_parser.py +0 -74
  508. classiq/quantum_functions/quantum_function.py +0 -236
  509. classiq-0.37.1.dist-info/RECORD +0 -418
  510. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
  511. /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
  512. /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
  513. /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
  514. /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  515. /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  516. /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,8 +1,14 @@
1
- from typing import Any, Dict, Optional, Union
1
+ from typing import Any, Optional, Union
2
2
 
3
3
  import pydantic
4
+ from pydantic import ConfigDict
5
+ from pydantic_core.core_schema import ValidationInfo
4
6
 
7
+ from classiq.interface.exceptions import ClassiqValueError
5
8
  from classiq.interface.generator.expressions.enums.finance_functions import (
9
+ get_finance_function_dict,
10
+ )
11
+ from classiq.interface.generator.types.builtin_enum_declarations import (
6
12
  FinanceFunctionType,
7
13
  )
8
14
  from classiq.interface.helpers.custom_pydantic_types import (
@@ -16,14 +22,13 @@ class FunctionCondition(pydantic.BaseModel):
16
22
  default=False,
17
23
  description="When true, function is set when input is larger to threshold and otherwise 0. Default is False.",
18
24
  )
19
-
20
- class Config:
21
- frozen = True
25
+ model_config = ConfigDict(frozen=True)
22
26
 
23
27
 
24
28
  class FinanceFunctionInput(pydantic.BaseModel):
25
- f: Union[int, str, FinanceFunctionType] = pydantic.Field(
26
- description="A callable function to solve the model"
29
+ f: "FinanceFunctionType" = pydantic.Field(
30
+ description="An enumeration of the wanted financial function: VaR, expected "
31
+ "shortfall, European call options or x^2"
27
32
  )
28
33
  variable: str = pydantic.Field(
29
34
  default="x", description="Variable/s of the function"
@@ -45,35 +50,53 @@ class FinanceFunctionInput(pydantic.BaseModel):
45
50
  description="The required probability on the tail of the distribution (1 - percentile)",
46
51
  )
47
52
 
48
- @pydantic.validator("use_chebyshev_polynomial_approximation")
53
+ @pydantic.model_validator(mode="before")
54
+ @classmethod
55
+ def _convert_f_if_str(cls, values: Any, info: ValidationInfo) -> dict[str, Any]:
56
+ if isinstance(values, dict):
57
+ f = values.get("f")
58
+ elif isinstance(values, FinanceFunctionInput):
59
+ f = values.f
60
+ values = values.model_dump()
61
+ else:
62
+ f = info.data.get("f")
63
+ if isinstance(f, str) and f in get_finance_function_dict():
64
+ values["f"] = get_finance_function_dict()[f]
65
+ return values
66
+
67
+ @pydantic.field_validator("use_chebyshev_polynomial_approximation", mode="before")
68
+ @classmethod
49
69
  def _validate_polynomial_flag(
50
- cls, use_chebyshev_flag: bool, values: Dict[str, Any]
70
+ cls, use_chebyshev_flag: bool, info: ValidationInfo
51
71
  ) -> bool:
52
- if use_chebyshev_flag ^ (values.get("polynomial_degree") is None):
72
+ if use_chebyshev_flag ^ (info.data.get("polynomial_degree") is None):
53
73
  return use_chebyshev_flag
54
- raise ValueError(
74
+ raise ClassiqValueError(
55
75
  "Degree must be positive and use_chebyshev_polynomial_approximation set to True"
56
76
  )
57
77
 
58
- @pydantic.validator("f")
78
+ @pydantic.field_validator("f", mode="before")
79
+ @classmethod
59
80
  def _validate_finance_function(
60
- cls, f: Union[int, str, FinanceFunctionType]
81
+ cls, f: Union[int, str, "FinanceFunctionType"]
61
82
  ) -> FinanceFunctionType:
62
83
  if isinstance(f, FinanceFunctionType):
63
84
  return f
64
85
  if isinstance(f, int):
65
86
  return FinanceFunctionType(f)
66
- return FinanceFunctionType.from_string(f)
87
+ return get_finance_function_dict()[f]
67
88
 
68
- @pydantic.validator("tail_probability", always=True)
89
+ @pydantic.field_validator("tail_probability", mode="before")
90
+ @classmethod
69
91
  def _validate_tail_probability_assignment_for_shortfall(
70
92
  cls,
71
93
  tail_probability: Optional[PydanticNonZeroProbabilityFloat],
72
- values: Dict[str, Any],
94
+ info: ValidationInfo,
73
95
  ) -> Optional[PydanticNonZeroProbabilityFloat]:
74
- if values.get("f") == FinanceFunctionType.SHORTFALL and not tail_probability:
75
- raise ValueError("Tail probability must be set for expected shortfall")
96
+ if info.data.get("f") == FinanceFunctionType.SHORTFALL and not tail_probability:
97
+ raise ClassiqValueError(
98
+ "Tail probability must be set for expected shortfall"
99
+ )
76
100
  return tail_probability
77
101
 
78
- class Config:
79
- frozen = True
102
+ model_config = ConfigDict(frozen=True)
@@ -1,5 +1,5 @@
1
1
  import math
2
- from typing import List, Optional, Tuple
2
+ from typing import Literal, Optional
3
3
 
4
4
  import pydantic
5
5
 
@@ -8,6 +8,8 @@ from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityF
8
8
 
9
9
 
10
10
  class GaussianModelInput(FinanceModelInput):
11
+ kind: Literal["gaussian"] = pydantic.Field(default="gaussian")
12
+
11
13
  num_qubits: pydantic.PositiveInt = pydantic.Field(
12
14
  description="The number of qubits represent"
13
15
  "the latent normal random variable Z (Resolution of "
@@ -16,15 +18,15 @@ class GaussianModelInput(FinanceModelInput):
16
18
  normal_max_value: float = pydantic.Field(
17
19
  description="Min/max value to truncate the " "latent normal random variable Z"
18
20
  )
19
- default_probabilities: List[PydanticProbabilityFloat] = pydantic.Field(
21
+ default_probabilities: list[PydanticProbabilityFloat] = pydantic.Field(
20
22
  description="default probabilities for each asset"
21
23
  )
22
24
 
23
- rhos: List[pydantic.PositiveFloat] = pydantic.Field(
25
+ rhos: list[pydantic.PositiveFloat] = pydantic.Field(
24
26
  description="Sensitivities of default probability of assets "
25
27
  "with respect to Z (1/sigma(Z))"
26
28
  )
27
- loss: List[int] = pydantic.Field(
29
+ loss: list[int] = pydantic.Field(
28
30
  description="List of ints signifying loss per asset"
29
31
  )
30
32
  min_loss: Optional[int] = pydantic.Field(
@@ -36,7 +38,7 @@ class GaussianModelInput(FinanceModelInput):
36
38
  return len(self.rhos)
37
39
 
38
40
  @property
39
- def distribution_range(self) -> Tuple[float, float]:
41
+ def distribution_range(self) -> tuple[float, float]:
40
42
  return 0, sum(self.loss)
41
43
 
42
44
  @property
@@ -1,12 +1,15 @@
1
- from typing import Tuple
1
+ from typing import Literal
2
2
 
3
3
  import numpy as np
4
4
  import pydantic
5
+ from pydantic import ConfigDict
5
6
 
6
7
  from classiq.interface.finance.model_input import FinanceModelInput
7
8
 
8
9
 
9
10
  class LogNormalModelInput(FinanceModelInput):
11
+ kind: Literal["log_normal"] = pydantic.Field(default="log_normal")
12
+
10
13
  num_qubits: pydantic.PositiveInt = pydantic.Field(
11
14
  description="Number of qubits to represent the probability."
12
15
  )
@@ -18,7 +21,7 @@ class LogNormalModelInput(FinanceModelInput):
18
21
  )
19
22
 
20
23
  @property
21
- def distribution_range(self) -> Tuple[float, float]:
24
+ def distribution_range(self) -> tuple[float, float]:
22
25
  mean = np.exp(self.mu + self.sigma**2 / 2)
23
26
  variance = (np.exp(self.sigma**2) - 1) * np.exp(2 * self.mu + self.sigma**2)
24
27
  stddev = np.sqrt(variance)
@@ -34,5 +37,4 @@ class LogNormalModelInput(FinanceModelInput):
34
37
  def num_output_qubits(self) -> int:
35
38
  return self.num_qubits
36
39
 
37
- class Config:
38
- frozen = True
40
+ model_config = ConfigDict(frozen=True)
@@ -1,5 +1,6 @@
1
1
  import abc
2
- from typing import Tuple
2
+
3
+ from pydantic import ConfigDict
3
4
 
4
5
  from classiq.interface.helpers.hashable_pydantic_base_model import (
5
6
  HashablePydanticBaseModel,
@@ -7,14 +8,15 @@ from classiq.interface.helpers.hashable_pydantic_base_model import (
7
8
 
8
9
 
9
10
  class FinanceModelInput(HashablePydanticBaseModel):
11
+ kind: str
12
+
10
13
  @property
11
14
  def num_output_qubits(self) -> int:
12
15
  return 0
13
16
 
14
- class Config:
15
- frozen = True
17
+ model_config = ConfigDict(frozen=True)
16
18
 
17
19
  @property
18
20
  @abc.abstractmethod
19
- def distribution_range(self) -> Tuple[float, float]:
21
+ def distribution_range(self) -> tuple[float, float]:
20
22
  pass
@@ -1,9 +1,7 @@
1
- from typing import List
2
-
3
1
  import numpy as np
4
2
 
5
3
 
6
- def get_rand_adjacency_matrix(num_vertices: int) -> List[List[bool]]:
4
+ def get_rand_adjacency_matrix(num_vertices: int) -> list[list[bool]]:
7
5
  adjacency_matrix = np.random.choice([0, 1], size=(num_vertices, num_vertices))
8
6
  for i in range(num_vertices):
9
7
  for j in range(num_vertices):
@@ -1,14 +1,18 @@
1
1
  import re
2
- from typing import Any, Dict, get_args
2
+ from typing import get_args
3
3
 
4
4
  import pydantic
5
5
  import sympy
6
+ from typing_extensions import Self
6
7
 
8
+ from classiq.interface.enum_utils import StrEnum
9
+ from classiq.interface.exceptions import ClassiqValueError
7
10
  from classiq.interface.generator.arith.arithmetic_expression_validator import (
8
11
  validate_expression,
9
12
  )
10
13
  from classiq.interface.generator.arith.register_user_input import RegisterUserInput
11
14
  from classiq.interface.generator.expressions.expression_constants import (
15
+ BOOLEAN_LITERALS,
12
16
  FORBIDDEN_LITERALS,
13
17
  SUPPORTED_FUNC_NAMES,
14
18
  SUPPORTED_VAR_NAMES_REG,
@@ -19,8 +23,6 @@ from classiq.interface.generator.function_params import (
19
23
  )
20
24
  from classiq.interface.helpers.custom_pydantic_types import PydanticExpressionStr
21
25
 
22
- from classiq._internals.enum_utils import StrEnum
23
-
24
26
  AMPLITUDE_IO_NAME = "AMPLITUDE"
25
27
  TARGET_OUTPUT_NAME = "TARGET"
26
28
 
@@ -35,6 +37,12 @@ class AmplitudeLoading(FunctionParams):
35
37
  size: pydantic.PositiveInt = pydantic.Field(
36
38
  description="The number of qubits of the amplitude input."
37
39
  )
40
+ fraction_digits: pydantic.NonNegativeInt = pydantic.Field(
41
+ description="The number of fraction digits of the amplitude input."
42
+ )
43
+ is_signed: bool = pydantic.Field(
44
+ description="Whether the amplitude input has a sign qubit."
45
+ )
38
46
  expression: PydanticExpressionStr = pydantic.Field(
39
47
  description="The mathematical expression of the amplitude loading function."
40
48
  )
@@ -43,7 +51,8 @@ class AmplitudeLoading(FunctionParams):
43
51
  description="Implementation options.",
44
52
  )
45
53
 
46
- @pydantic.validator("expression", pre=True)
54
+ @pydantic.field_validator("expression", mode="before")
55
+ @classmethod
47
56
  def validate_coefficient(cls, expression: str) -> str:
48
57
  if isinstance(expression, str):
49
58
  # We validate the given value is legal and does not contain code that will be executed in our BE.
@@ -58,22 +67,25 @@ class AmplitudeLoading(FunctionParams):
58
67
  return str(expression)
59
68
  return expression
60
69
 
61
- @pydantic.root_validator()
62
- def check_all_variable_are_defined(cls, values: Dict[str, Any]) -> Dict[str, Any]:
63
- expression = values.get("expression", "")
70
+ @pydantic.model_validator(mode="after")
71
+ def check_all_variable_are_defined(self) -> Self:
72
+ expression = self.expression or ""
64
73
  literals = set(re.findall(SUPPORTED_VAR_NAMES_REG, expression))
65
74
 
66
- not_allowed = literals.intersection(FORBIDDEN_LITERALS)
67
- variables = literals.difference(SUPPORTED_FUNC_NAMES)
75
+ not_allowed = literals.intersection(FORBIDDEN_LITERALS) - BOOLEAN_LITERALS
76
+ variables = literals.difference(SUPPORTED_FUNC_NAMES) - BOOLEAN_LITERALS
68
77
  if not_allowed:
69
- raise ValueError(f"The following names: {not_allowed} are not allowed")
78
+ raise ClassiqValueError(
79
+ f"The following names: {not_allowed} are not allowed"
80
+ )
70
81
 
71
82
  if len(variables) != 1:
72
- raise ValueError(f"{variables} must contain exactly single variable")
73
- return values
83
+ raise ClassiqValueError(f"{variables} must contain exactly single variable")
84
+ return self
74
85
 
75
86
  def _create_ios(self) -> None:
76
87
  self._inputs = {
88
+ TARGET_OUTPUT_NAME: RegisterUserInput(name=TARGET_OUTPUT_NAME, size=1),
77
89
  AMPLITUDE_IO_NAME: RegisterUserInput(
78
90
  name=AMPLITUDE_IO_NAME, size=self.size
79
91
  ),
@@ -82,9 +94,10 @@ class AmplitudeLoading(FunctionParams):
82
94
  TARGET_OUTPUT_NAME: RegisterUserInput(name=TARGET_OUTPUT_NAME, size=1),
83
95
  **self._inputs,
84
96
  }
85
- self._create_zero_input_registers({TARGET_OUTPUT_NAME: 1})
86
97
 
87
98
  @property
88
99
  def variable(self) -> str:
89
- literals = set(re.findall(SUPPORTED_VAR_NAMES_REG, self.expression))
100
+ literals = (
101
+ set(re.findall(SUPPORTED_VAR_NAMES_REG, self.expression)) - BOOLEAN_LITERALS
102
+ )
90
103
  return list(literals.difference(SUPPORTED_FUNC_NAMES))[0]
@@ -1,8 +1,8 @@
1
- from typing import Dict, List, Optional, Union
1
+ from typing import Optional, Union
2
2
 
3
3
  from pydantic import BaseModel
4
4
 
5
- from classiq._internals.enum_utils import StrEnum
5
+ from classiq.interface.enum_utils import StrEnum
6
6
 
7
7
 
8
8
  class RotationBlocksType(StrEnum):
@@ -42,7 +42,7 @@ class EntanglingLayersArgs(CustomAnsatzArgs):
42
42
 
43
43
  class RandomArgs(CustomAnsatzArgs):
44
44
  gate_count: int = 100
45
- gate_probabilities: Dict[str, float] = {"cx": 0.5, "u": 0.5}
45
+ gate_probabilities: dict[str, float] = {"cx": 0.5, "u": 0.5}
46
46
  random_seed: Optional[int] = None
47
47
 
48
48
 
@@ -52,11 +52,11 @@ class RandomTwoQubitGatesArgs(CustomAnsatzArgs):
52
52
 
53
53
 
54
54
  class TwoLocalArgs(CustomAnsatzArgs):
55
- rotation_blocks: Optional[Union[RotationBlocksType, List[RotationBlocksType]]] = (
55
+ rotation_blocks: Optional[Union[RotationBlocksType, list[RotationBlocksType]]] = (
56
56
  RotationBlocksType.ry
57
57
  )
58
58
  entanglement_blocks: Optional[
59
- Union[EntanglementBlocksType, List[EntanglementBlocksType]]
59
+ Union[EntanglementBlocksType, list[EntanglementBlocksType]]
60
60
  ] = EntanglementBlocksType.cx
61
61
  entanglement: EntanglementStructureType = EntanglementStructureType.full
62
62
  reps: int = 3
@@ -2,6 +2,7 @@ from classiq.interface.generator.builtin_api_builder import (
2
2
  populate_builtin_declarations,
3
3
  )
4
4
 
5
+ from .arithmetic_declarations import * # noqa: F403
5
6
  from .chemistry_declarations import * # noqa: F403
6
7
  from .combinatorial_optimization_declarations import * # noqa: F403
7
8
  from .entangler_declarations import * # noqa: F403
@@ -0,0 +1,17 @@
1
+ from classiq.interface.generator.functions.classical_function_declaration import (
2
+ ClassicalFunctionDeclaration,
3
+ )
4
+ from classiq.interface.generator.functions.classical_type import Integer, Real
5
+ from classiq.interface.model.classical_parameter_declaration import (
6
+ ClassicalParameterDeclaration,
7
+ )
8
+
9
+ qft_const_adder_phase = ClassicalFunctionDeclaration(
10
+ name="qft_const_adder_phase",
11
+ positional_parameters=[
12
+ ClassicalParameterDeclaration(name="bit_index", classical_type=Integer()),
13
+ ClassicalParameterDeclaration(name="value", classical_type=Integer()),
14
+ ClassicalParameterDeclaration(name="reg_len", classical_type=Integer()),
15
+ ],
16
+ return_type=Real(),
17
+ )
@@ -1,54 +1,26 @@
1
- import functools
2
1
  from enum import Enum
3
2
 
4
- from classiq.interface.generator.expressions.expression import Expression
5
3
  from classiq.interface.generator.functions.classical_function_declaration import (
6
4
  ClassicalFunctionDeclaration,
7
5
  )
8
6
  from classiq.interface.generator.functions.classical_type import (
9
- Bool,
10
7
  ClassicalList,
11
- Integer,
12
- LadderOperator,
13
- Real,
14
- Struct,
15
8
  VQEResult,
16
9
  )
17
- from classiq.interface.generator.functions.port_declaration import (
18
- PortDeclarationDirection,
19
- )
20
- from classiq.interface.generator.types.struct_declaration import StructDeclaration
21
- from classiq.interface.model.port_declaration import PortDeclaration
22
- from classiq.interface.model.quantum_function_declaration import (
23
- QuantumFunctionDeclaration,
10
+ from classiq.interface.generator.functions.type_name import Struct
11
+ from classiq.interface.model.classical_parameter_declaration import (
12
+ ClassicalParameterDeclaration,
24
13
  )
25
14
 
26
- MOLECULE_PROBLEM_PARAM = {"molecule_problem": Struct(name="MoleculeProblem")}
27
- MOLECULE_PROBLEM_SIZE = (
28
- "len(get_field(molecule_problem_to_hamiltonian(molecule_problem)[0], 'pauli'))"
15
+ MOLECULE_PROBLEM_PARAM = ClassicalParameterDeclaration(
16
+ name="molecule_problem", classical_type=Struct(name="MoleculeProblem")
29
17
  )
30
- MOLECULE_PROBLEM_PORT = {
31
- "qbv": PortDeclaration(
32
- name="qbv",
33
- direction=PortDeclarationDirection.Inout,
34
- size=Expression(
35
- expr=MOLECULE_PROBLEM_SIZE,
36
- ),
37
- )
38
- }
39
-
40
- FOCK_HAMILTONIAN_PROBLEM_PARAM = {
41
- "fock_hamiltonian_problem": Struct(name="FockHamiltonianProblem")
42
- }
43
- FOCK_HAMILTONIAN_SIZE = "len(get_field(fock_hamiltonian_problem_to_hamiltonian(fock_hamiltonian_problem)[0], 'pauli'))"
44
18
 
45
- FOCK_HAMILTONIAN_PROBLEM_PORT = {
46
- "qbv": PortDeclaration(
47
- name="qbv",
48
- direction=PortDeclarationDirection.Inout,
49
- size=Expression(expr=FOCK_HAMILTONIAN_SIZE),
50
- )
51
- }
19
+ FOCK_HAMILTONIAN_PROBLEM_PARAM = ClassicalParameterDeclaration(
20
+ name="fock_hamiltonian_problem",
21
+ classical_type=Struct(name="FockHamiltonianProblem"),
22
+ )
23
+ FOCK_HAMILTONIAN_SIZE = "get_field(get_field(fock_hamiltonian_problem_to_hamiltonian(fock_hamiltonian_problem)[0], 'pauli'), 'len')"
52
24
 
53
25
 
54
26
  class ChemistryProblemType(Enum):
@@ -56,172 +28,40 @@ class ChemistryProblemType(Enum):
56
28
  FockHamiltonianProblem = "fock_hamiltonian_problem"
57
29
 
58
30
 
59
- MOLECULE_UCC_ANSATZ = QuantumFunctionDeclaration(
60
- name="molecule_ucc",
61
- param_decls={
62
- **MOLECULE_PROBLEM_PARAM,
63
- "excitations": ClassicalList(element_type=Integer()),
64
- },
65
- port_declarations=MOLECULE_PROBLEM_PORT,
66
- )
67
-
68
-
69
- MOLECULE_HVA_ANSATZ = QuantumFunctionDeclaration(
70
- name="molecule_hva",
71
- param_decls={
72
- **MOLECULE_PROBLEM_PARAM,
73
- "reps": Integer(),
74
- },
75
- port_declarations=MOLECULE_PROBLEM_PORT,
76
- )
77
-
78
-
79
- MOLECULE_HARTREE_FOCK = QuantumFunctionDeclaration(
80
- name="molecule_hartree_fock",
81
- param_decls={
82
- **MOLECULE_PROBLEM_PARAM,
83
- },
84
- port_declarations=MOLECULE_PROBLEM_PORT,
85
- )
86
-
87
-
88
- FOCK_HAMILTONIAN_UCC_ANSATZ = QuantumFunctionDeclaration(
89
- name="fock_hamiltonian_ucc",
90
- param_decls={
91
- **FOCK_HAMILTONIAN_PROBLEM_PARAM,
92
- "excitations": ClassicalList(element_type=Integer()),
93
- },
94
- port_declarations=FOCK_HAMILTONIAN_PROBLEM_PORT,
95
- )
96
-
97
- FOCK_HAMILTONIAN_HVA_ANSATZ = QuantumFunctionDeclaration(
98
- name="fock_hamiltonian_hva",
99
- param_decls={
100
- **FOCK_HAMILTONIAN_PROBLEM_PARAM,
101
- "reps": Integer(),
102
- },
103
- port_declarations=FOCK_HAMILTONIAN_PROBLEM_PORT,
104
- )
105
-
106
- FOCK_HAMILTONIAN_HARTREE_FOCK = QuantumFunctionDeclaration(
107
- name="fock_hamiltonian_hartree_fock",
108
- param_decls={
109
- **FOCK_HAMILTONIAN_PROBLEM_PARAM,
110
- },
111
- port_declarations=FOCK_HAMILTONIAN_PROBLEM_PORT,
112
- )
113
-
114
-
115
- MOLECULE_PROBLEM = StructDeclaration(
116
- name="MoleculeProblem",
117
- variables={
118
- "mapping": Integer(),
119
- "z2_symmetries": Bool(),
120
- # A negative number of qubits is considered None
121
- # basis: str = pydantic.Field(default="sto3g", description="Molecular basis set")
122
- "molecule": Struct(name="Molecule"),
123
- "freeze_core": Bool(),
124
- "remove_orbitals": ClassicalList(element_type=Integer()),
125
- },
126
- )
127
-
128
- MOLECULE = StructDeclaration(
129
- name="Molecule",
130
- variables={
131
- "atoms": ClassicalList(element_type=Struct(name="ChemistryAtom")),
132
- "spin": Integer(),
133
- "charge": Integer(),
134
- },
135
- )
136
-
137
- CHEMISTRY_ATOM = StructDeclaration(
138
- name="ChemistryAtom",
139
- variables={
140
- "element": Integer(),
141
- "position": Struct(name="Position"),
142
- },
143
- )
144
-
145
- POSITION = StructDeclaration(
146
- name="Position", variables={"x": Real(), "y": Real(), "z": Real()}
147
- )
148
-
149
- FockHamiltonian = functools.partial(
150
- ClassicalList, element_type=Struct(name="LadderTerm")
151
- )
152
-
153
- FOCK_HAMILTONIAN_PROBLEM = StructDeclaration(
154
- name="FockHamiltonianProblem",
155
- variables={
156
- "mapping": Integer(),
157
- "z2_symmetries": Bool(),
158
- "terms": FockHamiltonian(),
159
- "num_particles": ClassicalList(element_type=Integer()),
160
- },
161
- )
162
-
163
- LADDER_TERM = StructDeclaration(
164
- name="LadderTerm",
165
- variables={
166
- "coefficient": Real(),
167
- "ops": ClassicalList(element_type=Struct(name="LadderOp")),
168
- },
169
- )
170
-
171
- LADDER_OP = StructDeclaration(
172
- name="LadderOp",
173
- variables={
174
- "op": LadderOperator(),
175
- "index": Integer(),
176
- },
177
- )
178
-
179
- MOLECULE_RESULT = StructDeclaration(
180
- name="MoleculeResult",
181
- variables={
182
- "energy": Real(),
183
- "nuclear_repulsion_energy": Real(),
184
- "total_energy": Real(),
185
- "hartree_fock_energy": Real(),
186
- "vqe_result": VQEResult(),
187
- },
188
- )
189
-
190
31
  MOLECULE_PROBLEM_TO_HAMILTONIAN = ClassicalFunctionDeclaration(
191
32
  name="molecule_problem_to_hamiltonian",
192
- param_decls={"problem": Struct(name="MoleculeProblem")},
33
+ positional_parameters=[
34
+ ClassicalParameterDeclaration(
35
+ name="problem", classical_type=Struct(name="MoleculeProblem")
36
+ ),
37
+ ],
193
38
  return_type=ClassicalList(element_type=Struct(name="PauliTerm")),
194
39
  )
195
40
 
196
41
  FOCK_HAMILTONIAN_PROBLEM_TO_HAMILTONIAN = ClassicalFunctionDeclaration(
197
42
  name="fock_hamiltonian_problem_to_hamiltonian",
198
- param_decls={"problem": Struct(name="FockHamiltonianProblem")},
43
+ positional_parameters=[
44
+ ClassicalParameterDeclaration(
45
+ name="problem", classical_type=Struct(name="FockHamiltonianProblem")
46
+ ),
47
+ ],
199
48
  return_type=ClassicalList(element_type=Struct(name="PauliTerm")),
200
49
  )
201
50
 
202
51
 
203
52
  MOLECULE_GROUND_STATE_SOLUTION_POST_PROCESS = ClassicalFunctionDeclaration(
204
53
  name="molecule_ground_state_solution_post_process",
205
- param_decls={"problem": Struct(name="MoleculeProblem"), "vqe_result": VQEResult()},
54
+ positional_parameters=[
55
+ ClassicalParameterDeclaration(
56
+ name="problem", classical_type=Struct(name="MoleculeProblem")
57
+ ),
58
+ ClassicalParameterDeclaration(name="vqe_result", classical_type=VQEResult()),
59
+ ],
206
60
  return_type=Struct(name="MoleculeResult"),
207
61
  )
208
62
 
209
63
  __all__ = [
210
- "MOLECULE_UCC_ANSATZ",
211
- "MOLECULE_HVA_ANSATZ",
212
- "MOLECULE_HARTREE_FOCK",
213
- "FOCK_HAMILTONIAN_UCC_ANSATZ",
214
- "FOCK_HAMILTONIAN_HVA_ANSATZ",
215
- "FOCK_HAMILTONIAN_HARTREE_FOCK",
216
- "MOLECULE_PROBLEM",
217
- "MOLECULE",
218
- "CHEMISTRY_ATOM",
219
- "POSITION",
220
- "FOCK_HAMILTONIAN_PROBLEM",
221
- "LADDER_TERM",
222
- "LADDER_OP",
223
- "MOLECULE_PROBLEM_TO_HAMILTONIAN",
224
64
  "FOCK_HAMILTONIAN_PROBLEM_TO_HAMILTONIAN",
225
65
  "MOLECULE_GROUND_STATE_SOLUTION_POST_PROCESS",
226
- "MOLECULE_RESULT",
66
+ "MOLECULE_PROBLEM_TO_HAMILTONIAN",
227
67
  ]