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,5 @@
1
- from typing import Tuple, Union
1
+ from typing import Union
2
2
 
3
- from classiq.qmod.qmod_parameter import QParam
4
3
  from classiq.qmod.symbolic_expr import SymbolicExpr
5
4
 
6
- SymbolicTypes = Union[
7
- QParam, SymbolicExpr, int, float, bool, Tuple["SymbolicTypes", ...]
8
- ]
5
+ SymbolicTypes = Union[SymbolicExpr, int, float, bool, tuple["SymbolicTypes", ...]]
@@ -0,0 +1,32 @@
1
+ from classiq.interface.generator.visitor import Transformer
2
+ from classiq.interface.model.port_declaration import PortDeclaration
3
+ from classiq.interface.model.quantum_function_declaration import (
4
+ AnonQuantumOperandDeclaration,
5
+ )
6
+ from classiq.interface.model.quantum_type import QuantumBitvector, QuantumNumeric
7
+
8
+
9
+ def decl_without_type_attributes(
10
+ operand_declaration: AnonQuantumOperandDeclaration,
11
+ ) -> AnonQuantumOperandDeclaration:
12
+ remover = AttributeRemover()
13
+ return operand_declaration.model_copy(
14
+ update=dict(
15
+ positional_arg_declarations=[
16
+ remover.visit(arg) if isinstance(arg, PortDeclaration) else arg
17
+ for arg in operand_declaration.positional_arg_declarations
18
+ ]
19
+ )
20
+ )
21
+
22
+
23
+ class AttributeRemover(Transformer):
24
+ """Remove attributes that could be expressions such as length, fraction places, etc."""
25
+
26
+ def visit_QuantumNumeric(self, node: QuantumNumeric) -> QuantumNumeric:
27
+ return QuantumNumeric(source_ref=node.source_ref)
28
+
29
+ def visit_QuantumBitvector(self, node: QuantumBitvector) -> QuantumBitvector:
30
+ return QuantumBitvector(
31
+ element_type=self.visit(node.element_type), source_ref=node.source_ref
32
+ )
classiq/qmod/utilities.py CHANGED
@@ -1,4 +1,15 @@
1
+ import dataclasses
2
+ import inspect
3
+ import itertools
1
4
  import keyword
5
+ import sys
6
+ from enum import Enum as PythonEnum
7
+ from types import FrameType
8
+ from typing import Any, ForwardRef, Literal, Optional, get_args, get_origin, overload
9
+
10
+ from classiq.interface.source_reference import SourceReference
11
+
12
+ DEFAULT_DECIMAL_PRECISION = 4
2
13
 
3
14
 
4
15
  def mangle_keyword(name: str) -> str:
@@ -7,8 +18,104 @@ def mangle_keyword(name: str) -> str:
7
18
  return name
8
19
 
9
20
 
21
+ @overload
10
22
  def unmangle_keyword(name: str) -> str:
11
- assert name
23
+ pass
24
+
25
+
26
+ @overload
27
+ def unmangle_keyword(name: None) -> None:
28
+ pass
29
+
30
+
31
+ def unmangle_keyword(name: Optional[str]) -> Optional[str]:
32
+ if name is None:
33
+ return None
12
34
  if name[-1] == "_" and keyword.iskeyword(name[:-1]):
13
35
  name = name[:-1]
14
36
  return name
37
+
38
+
39
+ def version_portable_get_args(py_type: type) -> tuple:
40
+ if get_origin(py_type) is None:
41
+ return tuple()
42
+ if sys.version_info[0:2] < (3, 10):
43
+ type_args = get_args(py_type) # The result of __class_getitem__
44
+ else:
45
+ type_args = get_args(py_type)[0]
46
+ if not isinstance(type_args, tuple):
47
+ return (type_args,)
48
+ return tuple(
49
+ (
50
+ version_portable_get_args(type_arg)[0]
51
+ if get_origin(type_arg) == Literal
52
+ else type_arg
53
+ )
54
+ for type_arg in type_args
55
+ )
56
+
57
+
58
+ def get_source_ref(frame: FrameType) -> SourceReference:
59
+ filename = inspect.getfile(frame)
60
+ lineno = frame.f_lineno
61
+ if sys.version_info[0:2] < (3, 11) or frame.f_lasti < 0:
62
+ source_ref = SourceReference(
63
+ file_name=filename,
64
+ start_line=lineno - 1,
65
+ start_column=-1,
66
+ end_line=-1,
67
+ end_column=-1,
68
+ )
69
+ else:
70
+ positions_gen = frame.f_code.co_positions()
71
+ positions = next(itertools.islice(positions_gen, frame.f_lasti // 2, None))
72
+ source_ref = SourceReference(
73
+ file_name=filename,
74
+ start_line=(positions[0] or 0) - 1,
75
+ start_column=(positions[2] or 0) - 1,
76
+ end_line=(positions[1] or 0) - 1,
77
+ end_column=(positions[3] or 0) - 1,
78
+ )
79
+ return source_ref
80
+
81
+
82
+ def qmod_val_to_expr_str(val: Any) -> str:
83
+ if dataclasses.is_dataclass(type(val)):
84
+ kwargs_str = ", ".join(
85
+ [
86
+ f"{field.name}={qmod_val_to_expr_str(vars(val)[field.name])}"
87
+ for field in dataclasses.fields(val)
88
+ ]
89
+ )
90
+ return f"struct_literal({type(val).__name__}, {kwargs_str})"
91
+
92
+ if isinstance(val, list):
93
+ elements_str = ", ".join([qmod_val_to_expr_str(elem) for elem in val])
94
+ return f"[{elements_str}]"
95
+
96
+ if isinstance(val, PythonEnum):
97
+ return f"{type(val).__name__}.{val.name}"
98
+
99
+ return str(val)
100
+
101
+
102
+ def unwrap_forward_ref(x: Any) -> Any:
103
+ if isinstance(x, ForwardRef):
104
+ return x.__forward_arg__
105
+ return x
106
+
107
+
108
+ def varname(depth: int) -> Optional[str]:
109
+ frame = sys._getframe(depth)
110
+ codes = inspect.getframeinfo(frame).code_context
111
+ if codes is None or len(codes) != 1:
112
+ return None
113
+ code = codes[0]
114
+ if "=" not in code:
115
+ return None
116
+ var_name = code.split("=")[0].strip()
117
+ if ":" in var_name:
118
+ var_name = var_name.split(":")[0].strip()
119
+ if not var_name.isidentifier():
120
+ return None
121
+ return var_name
@@ -0,0 +1,53 @@
1
+ import json
2
+ from pathlib import Path
3
+ from typing import Optional
4
+
5
+ from classiq.interface.model.model import Model, SerializedModel
6
+
7
+ from classiq.qmod.native.pretty_printer import DSLPrettyPrinter
8
+ from classiq.qmod.utilities import DEFAULT_DECIMAL_PRECISION
9
+
10
+ _QMOD_SUFFIX = "qmod"
11
+ _SYNTHESIS_OPTIONS_SUFFIX = "synthesis_options.json"
12
+
13
+
14
+ def write_qmod(
15
+ serialized_model: SerializedModel,
16
+ name: str,
17
+ directory: Optional[Path] = None,
18
+ decimal_precision: int = DEFAULT_DECIMAL_PRECISION,
19
+ ) -> None:
20
+ """
21
+ Creates a native Qmod file from a serialized model and outputs the synthesis options (Preferences and Constraints) to a file.
22
+ The native Qmod file may be uploaded to the Classiq IDE.
23
+
24
+ Args:
25
+ serialized_model: The serialized model to write as a native Qmod file and synthesis options file.
26
+ name: The name to save the file by.
27
+ directory: The directory to save the files in. If None, the current working directory is used.
28
+ decimal_precision: The number of decimal places to use for numbers, set to 4 by default.
29
+
30
+ Returns:
31
+ None
32
+ """
33
+
34
+ model = Model.model_validate_json(serialized_model)
35
+ pretty_printed_model = DSLPrettyPrinter(decimal_precision=decimal_precision).visit(
36
+ model
37
+ )
38
+
39
+ synthesis_options = model.model_dump(
40
+ include={"constraints", "preferences"}, exclude_none=True
41
+ )
42
+
43
+ synthesis_options_path = Path(f"{name}.{_SYNTHESIS_OPTIONS_SUFFIX}")
44
+ if directory is not None:
45
+ synthesis_options_path = directory / synthesis_options_path
46
+
47
+ synthesis_options_path.write_text(json.dumps(synthesis_options, indent=2))
48
+
49
+ native_qmod_path = Path(f"{name}.{_QMOD_SUFFIX}")
50
+ if directory is not None:
51
+ native_qmod_path = directory / native_qmod_path
52
+
53
+ native_qmod_path.write_text(pretty_printed_model)
classiq/synthesis.py CHANGED
@@ -1,59 +1,247 @@
1
- from typing import NewType
1
+ from typing import Any, NewType, Optional
2
2
 
3
3
  import pydantic
4
4
 
5
+ from classiq.interface.analyzer.result import QasmCode
6
+ from classiq.interface.exceptions import ClassiqValueError
5
7
  from classiq.interface.executor.execution_preferences import ExecutionPreferences
6
8
  from classiq.interface.generator.model.constraints import Constraints
7
9
  from classiq.interface.generator.model.preferences.preferences import Preferences
8
- from classiq.interface.model.common_model_types import ModelInput, SerializedModelInput
9
- from classiq.interface.model.model import SerializedModel
10
+ from classiq.interface.model.model import Model, SerializedModel
10
11
 
12
+ from classiq import QuantumProgram
13
+ from classiq._internals import async_utils
11
14
  from classiq._internals.api_wrapper import ApiWrapper
12
- from classiq._internals.async_utils import syncify_function
13
15
 
14
16
  SerializedQuantumProgram = NewType("SerializedQuantumProgram", str)
15
17
 
18
+ CANT_PARSE_QUANTUM_PROGRAM_MSG = (
19
+ "Can not parse quantum_program into GeneratedCircuit, \n"
20
+ )
21
+
22
+
23
+ def show(quantum_program: SerializedQuantumProgram, display_url: bool = True) -> None:
24
+ """
25
+ Displays the interactive representation of the quantum program in the Classiq IDE.
26
+
27
+ Args:
28
+ quantum_program:
29
+ The serialized quantum program to be displayed.
30
+ display_url:
31
+ Whether to print the url
32
+
33
+ Links:
34
+ [Visualization tool](https://docs.classiq.io/latest/reference-manual/analyzer/quantum-program-visualization-tool/)
35
+ """
36
+ try:
37
+ circuit = QuantumProgram.model_validate_json(quantum_program)
38
+ except pydantic.ValidationError as exc:
39
+ raise ClassiqValueError(CANT_PARSE_QUANTUM_PROGRAM_MSG) from exc
40
+ circuit.show() # type: ignore[attr-defined]
41
+
42
+
43
+ async def quantum_program_from_qasm_async(qasm: str) -> SerializedQuantumProgram:
44
+ quantum_program = await ApiWrapper.get_generated_circuit_from_qasm(
45
+ QasmCode(code=qasm)
46
+ )
47
+ return SerializedQuantumProgram(quantum_program.model_dump_json())
48
+
49
+
50
+ def quantum_program_from_qasm(qasm: str) -> SerializedQuantumProgram:
51
+ """
52
+ generate a quantum program from a QASM file.
53
+
54
+ Args:
55
+ qasm: A QASM2/3 string.
56
+
57
+ Returns:
58
+ SerializedQuantumProgram: Quantum program serialized as a string. (See: QuantumProgram)
59
+ """
60
+ return async_utils.run(quantum_program_from_qasm_async(qasm))
61
+
16
62
 
17
63
  async def synthesize_async(
18
- serialized_model: SerializedModelInput,
64
+ serialized_model: SerializedModel,
19
65
  ) -> SerializedQuantumProgram:
20
- model: ModelInput = pydantic.parse_raw_as(ModelInput, serialized_model) # type: ignore[arg-type]
66
+ model = Model.model_validate_json(serialized_model)
21
67
  quantum_program = await ApiWrapper.call_generation_task(model)
22
- return SerializedQuantumProgram(quantum_program.json(indent=2))
68
+ return SerializedQuantumProgram(quantum_program.model_dump_json(indent=2))
69
+
70
+
71
+ def synthesize(
72
+ serialized_model: SerializedModel, auto_show: bool = False
73
+ ) -> SerializedQuantumProgram:
74
+ """
75
+ Synthesize a model with the Classiq engine to receive a quantum program.
76
+ [More details](https://docs.classiq.io/latest/reference-manual/synthesis/)
23
77
 
78
+ Args:
79
+ serialized_model: A model object serialized as a string.
80
+ auto_show: boolean. whether to call `show` on the output
24
81
 
25
- synthesize = syncify_function(synthesize_async)
82
+ Returns:
83
+ SerializedQuantumProgram: Quantum program serialized as a string. (See: QuantumProgram)
84
+ """
85
+ result = async_utils.run(synthesize_async(serialized_model))
86
+ if auto_show:
87
+ show(result)
88
+ return result
26
89
 
27
90
 
28
91
  def set_preferences(
29
- serialized_model: SerializedModelInput, preferences: Preferences
30
- ) -> SerializedModelInput:
31
- model: ModelInput = pydantic.parse_raw_as(ModelInput, serialized_model) # type: ignore[arg-type]
92
+ serialized_model: SerializedModel,
93
+ preferences: Optional[Preferences] = None,
94
+ **kwargs: Any
95
+ ) -> SerializedModel:
96
+ """
97
+ Overrides the preferences of a (serialized) model and returns the updated model.
98
+
99
+ Args:
100
+ serialized_model: The model in serialized form.
101
+ preferences: The new preferences to be set for the model. Can be passed as keyword arguments.
102
+
103
+ Returns:
104
+ SerializedModel: The updated model with the new preferences applied.
105
+ """
106
+ if preferences is None:
107
+ if kwargs:
108
+ preferences = Preferences(**kwargs)
109
+ else:
110
+ raise ClassiqValueError(
111
+ "Missing preferences. Either pass `Preferences` object or pass keywords"
112
+ )
113
+
114
+ model = Model.model_validate_json(serialized_model)
32
115
  model.preferences = preferences
33
- return model.get_model() # type: ignore[return-value]
116
+ return model.get_model()
117
+
118
+
119
+ def update_preferences(
120
+ serialized_model: SerializedModel, **kwargs: Any
121
+ ) -> SerializedModel:
122
+ """
123
+ Updates the preferences of a (serialized) model and returns the updated model.
124
+
125
+ Args:
126
+ serialized_model: The model in serialized form.
127
+ kwargs: key-value combination of preferences fields to update
128
+
129
+ Returns:
130
+ SerializedModel: The updated model with the new preferences applied.
131
+ """
132
+ model = Model.model_validate_json(serialized_model)
133
+
134
+ for key, value in kwargs.items():
135
+ setattr(model.preferences, key, value)
136
+ return model.get_model()
34
137
 
35
138
 
36
139
  def set_constraints(
37
- serialized_model: SerializedModelInput, constraints: Constraints
38
- ) -> SerializedModelInput:
39
- model: ModelInput = pydantic.parse_raw_as(ModelInput, serialized_model) # type: ignore[arg-type]
140
+ serialized_model: SerializedModel,
141
+ constraints: Optional[Constraints] = None,
142
+ **kwargs: Any
143
+ ) -> SerializedModel:
144
+ """
145
+ Overrides the constraints of a (serialized) model and returns the updated model.
146
+
147
+ Args:
148
+ serialized_model: The model in serialized form.
149
+ constraints: The new constraints to be set for the model. Can be passed as keyword arguments.
150
+
151
+ Returns:
152
+ SerializedModel: The updated model with the new constraints applied.
153
+ """
154
+ if constraints is None:
155
+ if kwargs:
156
+ constraints = Constraints(**kwargs)
157
+ else:
158
+ raise ClassiqValueError(
159
+ "Missing constraints. Either pass `Constraints` object or pass keywords"
160
+ )
161
+
162
+ model = Model.model_validate_json(serialized_model)
40
163
  model.constraints = constraints
41
- return model.get_model() # type: ignore[return-value]
164
+ return model.get_model()
165
+
166
+
167
+ def update_constraints(
168
+ serialized_model: SerializedModel, **kwargs: Any
169
+ ) -> SerializedModel:
170
+ """
171
+ Updates the constraints of a (serialized) model and returns the updated model.
172
+
173
+ Args:
174
+ serialized_model: The model in serialized form.
175
+ kwargs: key-value combination of constraints fields to update
176
+
177
+ Returns:
178
+ SerializedModel: The updated model with the new constraints applied.
179
+ """
180
+ model = Model.model_validate_json(serialized_model)
181
+
182
+ for key, value in kwargs.items():
183
+ setattr(model.constraints, key, value)
184
+ return model.get_model()
42
185
 
43
186
 
44
187
  def set_execution_preferences(
45
- serialized_model: SerializedModelInput, execution_preferences: ExecutionPreferences
46
- ) -> SerializedModelInput:
47
- model: ModelInput = pydantic.parse_raw_as(ModelInput, serialized_model) # type: ignore[arg-type]
188
+ serialized_model: SerializedModel,
189
+ execution_preferences: Optional[ExecutionPreferences] = None,
190
+ **kwargs: Any
191
+ ) -> SerializedModel:
192
+ """
193
+ Overrides the execution preferences of a (serialized) model and returns the updated model.
194
+
195
+ Args:
196
+ serialized_model: A serialization of the defined model.
197
+ execution_preferences: The new execution preferences to be set for the model. Can be passed as keyword arguments.
198
+ Returns:
199
+ SerializedModel: The model with the attached execution preferences.
200
+
201
+ For more examples please see: [set_execution_preferences](https://docs.classiq.io/latest/reference-manual/executor/?h=set_execution_preferences#usage)
202
+ """
203
+ if execution_preferences is None:
204
+ if kwargs:
205
+ execution_preferences = ExecutionPreferences(**kwargs)
206
+ else:
207
+ raise ClassiqValueError(
208
+ "Missing execution_preferences. Either pass `ExecutionPreferences` object or pass keywords"
209
+ )
210
+
211
+ model = Model.model_validate_json(serialized_model)
48
212
  model.execution_preferences = execution_preferences
49
- return model.get_model() # type: ignore[return-value]
213
+ return model.get_model()
214
+
215
+
216
+ def update_execution_preferences(
217
+ serialized_model: SerializedModel, **kwargs: Any
218
+ ) -> SerializedModel:
219
+ """
220
+ Updates the execution_preferences of a (serialized) model and returns the updated model.
221
+
222
+ Args:
223
+ serialized_model: The model in serialized form.
224
+ kwargs: key-value combination of execution_preferences fields to update
225
+
226
+ Returns:
227
+ SerializedModel: The updated model with the new execution_preferences applied.
228
+ """
229
+ model = Model.model_validate_json(serialized_model)
230
+
231
+ for key, value in kwargs.items():
232
+ setattr(model.execution_preferences, key, value)
233
+
234
+ return model.get_model()
50
235
 
51
236
 
52
237
  __all__ = [
53
238
  "SerializedModel",
54
239
  "SerializedQuantumProgram",
55
- "synthesize",
56
- "set_preferences",
57
240
  "set_constraints",
58
241
  "set_execution_preferences",
242
+ "set_preferences",
243
+ "synthesize",
244
+ "update_constraints",
245
+ "update_execution_preferences",
246
+ "update_preferences",
59
247
  ]
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: classiq
3
- Version: 0.37.1
3
+ Version: 0.65.3
4
4
  Summary: Classiq's Python SDK for quantum computing
5
5
  Home-page: https://classiq.io
6
6
  License: Proprietary
7
7
  Keywords: quantum computing,quantum circuits,quantum algorithms,QAD,QDL
8
8
  Author: Classiq Technologies
9
9
  Author-email: support@classiq.io
10
- Requires-Python: >=3.8,<3.12
10
+ Requires-Python: >=3.9,<3.13
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Intended Audience :: Education
@@ -16,10 +16,10 @@ Classifier: License :: Other/Proprietary License
16
16
  Classifier: Natural Language :: English
17
17
  Classifier: Operating System :: OS Independent
18
18
  Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.8
20
19
  Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
23
  Classifier: Programming Language :: Python :: 3 :: Only
24
24
  Classifier: Topic :: Scientific/Engineering
25
25
  Classifier: Topic :: Software Development
@@ -31,21 +31,29 @@ Provides-Extra: analyzer-sdk
31
31
  Provides-Extra: qml
32
32
  Requires-Dist: ConfigArgParse (>=1.5.3,<2.0.0)
33
33
  Requires-Dist: Pyomo (>=6.5,<6.6)
34
+ Requires-Dist: black (>=24.0,<25.0)
34
35
  Requires-Dist: httpx (>=0.23.0,<1)
35
36
  Requires-Dist: ipywidgets (>=7.7.1,<8.0.0) ; extra == "analyzer-sdk"
37
+ Requires-Dist: jupyterlab (>=4.2.5,<5.0.0) ; extra == "analyzer-sdk"
36
38
  Requires-Dist: keyring (>=23.5.0,<24.0.0)
37
39
  Requires-Dist: matplotlib (>=3.4.3,<4.0.0)
38
40
  Requires-Dist: networkx (>=2.5.1,<3.0.0)
41
+ Requires-Dist: notebook (>=7.2.2,<8.0.0) ; extra == "analyzer-sdk"
39
42
  Requires-Dist: numexpr (>=2.7.3,<3.0.0)
40
- Requires-Dist: numpy (>=1.20.1,<2.0.0)
41
- Requires-Dist: packaging (>=21.3,<22.0)
42
- Requires-Dist: pandas (>=1.4.0,<2.0.0)
43
+ Requires-Dist: numpy (>=1.20.1,<2.0.0) ; python_version < "3.12"
44
+ Requires-Dist: numpy (>=1.26.0,<2.0.0) ; python_version >= "3.12"
45
+ Requires-Dist: packaging (>=23.2,<24.0)
46
+ Requires-Dist: pandas (>=1.4.0,<3.0.0)
43
47
  Requires-Dist: plotly (>=5.7.0,<6.0.0)
44
- Requires-Dist: pydantic (>=1.9.1,<2.0.0)
45
- Requires-Dist: sympy (>=1.9.0,<1.11.0)
48
+ Requires-Dist: pydantic (>=2.9.0,<2.10.0)
49
+ Requires-Dist: pydantic-settings (>=2.4.0,<3.0.0)
50
+ Requires-Dist: scipy (>=1.10.0,<2.0.0) ; python_version < "3.12"
51
+ Requires-Dist: scipy (>=1.11.0,<2.0.0) ; python_version >= "3.12"
52
+ Requires-Dist: sympy (>=1.13.0,<2.0.0)
46
53
  Requires-Dist: tabulate (>=0.8.9,<1)
47
54
  Requires-Dist: torch (>=2.0,<3.0) ; extra == "qml"
48
55
  Requires-Dist: torchvision (>=0.15,<1.0) ; extra == "qml"
56
+ Requires-Dist: tqdm (>=4.67.1,<5.0.0)
49
57
  Project-URL: Documentation, https://docs.classiq.io/
50
58
  Description-Content-Type: text/markdown
51
59