classiq 0.38.0__py3-none-any.whl → 0.40.0__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 (154) hide show
  1. classiq/__init__.py +22 -22
  2. classiq/_internals/api_wrapper.py +13 -1
  3. classiq/_internals/client.py +12 -2
  4. classiq/analyzer/analyzer.py +3 -1
  5. classiq/applications/__init__.py +1 -8
  6. classiq/applications/chemistry/__init__.py +6 -0
  7. classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +1 -1
  8. classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
  9. classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +25 -6
  10. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +1 -1
  11. classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +1 -1
  12. classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +2 -4
  13. classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +13 -16
  14. classiq/{applications_model_constructors → applications}/combinatorial_helpers/pyomo_utils.py +4 -2
  15. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +3 -10
  16. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +4 -6
  17. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +3 -5
  18. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
  19. classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +4 -6
  20. classiq/applications/combinatorial_optimization/__init__.py +11 -3
  21. classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +9 -10
  22. classiq/applications/finance/__init__.py +3 -2
  23. classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +24 -14
  24. classiq/applications/grover/__init__.py +11 -0
  25. classiq/applications/libraries/qmci_library.py +35 -0
  26. classiq/applications/qsvm/__init__.py +5 -1
  27. classiq/execution/all_hardware_devices.py +13 -0
  28. classiq/executor.py +2 -1
  29. classiq/interface/_version.py +1 -1
  30. classiq/interface/analyzer/result.py +1 -5
  31. classiq/interface/applications/qsvm.py +4 -2
  32. classiq/interface/ast_node.py +23 -0
  33. classiq/interface/backend/backend_preferences.py +5 -5
  34. classiq/interface/backend/quantum_backend_providers.py +7 -7
  35. classiq/interface/combinatorial_optimization/examples/mht.py +8 -3
  36. classiq/interface/executor/execution_preferences.py +4 -9
  37. classiq/interface/executor/execution_request.py +2 -37
  38. classiq/interface/executor/vqe_result.py +1 -1
  39. classiq/interface/generator/application_apis/chemistry_declarations.py +2 -4
  40. classiq/interface/generator/application_apis/finance_declarations.py +1 -1
  41. classiq/interface/generator/arith/arithmetic_expression_validator.py +2 -0
  42. classiq/interface/generator/builtin_api_builder.py +0 -5
  43. classiq/interface/generator/constant.py +2 -3
  44. classiq/interface/generator/expressions/expression.py +2 -4
  45. classiq/interface/generator/expressions/qmod_qarray_proxy.py +82 -0
  46. classiq/interface/generator/expressions/qmod_qscalar_proxy.py +22 -1
  47. classiq/interface/generator/expressions/qmod_sized_proxy.py +22 -0
  48. classiq/interface/generator/functions/__init__.py +2 -2
  49. classiq/interface/generator/functions/builtins/__init__.py +15 -0
  50. classiq/interface/generator/functions/builtins/core_library/__init__.py +14 -0
  51. classiq/interface/generator/functions/{core_lib_declarations/quantum_functions → builtins/core_library}/atomic_quantum_functions.py +8 -6
  52. classiq/interface/generator/functions/{core_lib_declarations/quantum_functions → builtins/core_library}/exponentiation_functions.py +10 -4
  53. classiq/interface/generator/functions/builtins/internal_operators.py +62 -0
  54. classiq/interface/generator/functions/{core_lib_declarations/quantum_functions/std_lib_functions.py → builtins/open_lib_functions.py} +893 -319
  55. classiq/interface/generator/functions/builtins/quantum_operators.py +37 -0
  56. classiq/interface/generator/functions/classical_type.py +31 -21
  57. classiq/interface/generator/functions/function_declaration.py +2 -2
  58. classiq/interface/generator/hartree_fock.py +10 -2
  59. classiq/interface/generator/model/classical_main_validator.py +1 -1
  60. classiq/interface/generator/model/model.py +1 -1
  61. classiq/interface/generator/model/preferences/preferences.py +4 -2
  62. classiq/interface/generator/quantum_function_call.py +1 -1
  63. classiq/interface/generator/types/struct_declaration.py +2 -4
  64. classiq/interface/model/call_synthesis_data.py +3 -3
  65. classiq/interface/model/classical_if.py +13 -0
  66. classiq/interface/model/classical_parameter_declaration.py +2 -3
  67. classiq/interface/model/{quantum_if_operation.py → control.py} +39 -21
  68. classiq/interface/model/handle_binding.py +3 -2
  69. classiq/interface/model/invert.py +10 -0
  70. classiq/interface/model/model.py +2 -1
  71. classiq/interface/model/power.py +12 -0
  72. classiq/interface/model/quantum_function_call.py +9 -4
  73. classiq/interface/model/quantum_lambda_function.py +3 -9
  74. classiq/interface/model/quantum_statement.py +3 -2
  75. classiq/interface/model/quantum_type.py +8 -9
  76. classiq/interface/model/quantum_variable_declaration.py +2 -2
  77. classiq/interface/model/repeat.py +13 -0
  78. classiq/interface/model/resolvers/function_call_resolver.py +21 -0
  79. classiq/interface/model/statement_block.py +18 -4
  80. classiq/interface/model/validations/handles_validator.py +8 -12
  81. classiq/interface/model/within_apply_operation.py +4 -4
  82. classiq/interface/server/routes.py +0 -4
  83. classiq/qmod/__init__.py +6 -2
  84. classiq/qmod/builtins/classical_functions.py +34 -39
  85. classiq/qmod/builtins/functions.py +287 -300
  86. classiq/qmod/builtins/operations.py +217 -16
  87. classiq/qmod/builtins/structs.py +50 -48
  88. classiq/qmod/declaration_inferrer.py +30 -18
  89. classiq/qmod/native/expression_to_qmod.py +5 -4
  90. classiq/qmod/native/pretty_printer.py +48 -26
  91. classiq/qmod/qmod_constant.py +29 -5
  92. classiq/qmod/qmod_parameter.py +56 -34
  93. classiq/qmod/qmod_struct.py +2 -2
  94. classiq/qmod/qmod_variable.py +87 -43
  95. classiq/qmod/quantum_callable.py +8 -4
  96. classiq/qmod/quantum_expandable.py +25 -20
  97. classiq/qmod/quantum_function.py +29 -2
  98. classiq/qmod/symbolic.py +79 -69
  99. classiq/qmod/symbolic_expr.py +1 -1
  100. classiq/qmod/symbolic_type.py +1 -4
  101. classiq/qmod/utilities.py +29 -0
  102. {classiq-0.38.0.dist-info → classiq-0.40.0.dist-info}/METADATA +1 -1
  103. {classiq-0.38.0.dist-info → classiq-0.40.0.dist-info}/RECORD +122 -141
  104. classiq/applications/benchmarking/__init__.py +0 -9
  105. classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
  106. classiq/applications/numpy_utils.py +0 -37
  107. classiq/applications_model_constructors/__init__.py +0 -25
  108. classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
  109. classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
  110. classiq/builtin_functions/__init__.py +0 -43
  111. classiq/builtin_functions/amplitude_loading.py +0 -3
  112. classiq/builtin_functions/binary_ops.py +0 -1
  113. classiq/builtin_functions/exponentiation.py +0 -5
  114. classiq/builtin_functions/qpe.py +0 -4
  115. classiq/builtin_functions/qsvm.py +0 -7
  116. classiq/builtin_functions/range_types.py +0 -5
  117. classiq/builtin_functions/standard_gates.py +0 -1
  118. classiq/builtin_functions/state_preparation.py +0 -6
  119. classiq/builtin_functions/suzuki_trotter.py +0 -3
  120. classiq/interface/executor/error_mitigation.py +0 -6
  121. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
  122. classiq/interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py +0 -0
  123. classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
  124. classiq/model/__init__.py +0 -14
  125. classiq/model/composite_function_generator.py +0 -33
  126. classiq/model/function_handler.py +0 -462
  127. classiq/model/logic_flow.py +0 -149
  128. classiq/model/logic_flow_change_handler.py +0 -71
  129. classiq/model/model.py +0 -229
  130. classiq/quantum_functions/__init__.py +0 -17
  131. classiq/quantum_functions/annotation_parser.py +0 -205
  132. classiq/quantum_functions/decorators.py +0 -22
  133. classiq/quantum_functions/function_library.py +0 -181
  134. classiq/quantum_functions/function_parser.py +0 -74
  135. classiq/quantum_functions/quantum_function.py +0 -236
  136. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
  137. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +0 -0
  138. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
  139. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +0 -0
  140. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
  141. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
  142. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -0
  143. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
  144. /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
  145. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +0 -0
  146. /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
  147. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +0 -0
  148. /classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +0 -0
  149. /classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +0 -0
  150. /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
  151. /classiq/{applications_model_constructors → applications}/libraries/ampltitude_estimation_library.py +0 -0
  152. /classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +0 -0
  153. /classiq/{quantum_register.py → interface/model/quantum_register.py} +0 -0
  154. {classiq-0.38.0.dist-info → classiq-0.40.0.dist-info}/WHEEL +0 -0
classiq/__init__.py CHANGED
@@ -1,6 +1,5 @@
1
1
  """Classiq SDK."""
2
2
 
3
- import sys
4
3
  from typing import List
5
4
 
6
5
  from classiq.interface._version import VERSION as _VERSION
@@ -13,17 +12,12 @@ from classiq.interface.generator.control_state import ControlState
13
12
  from classiq.interface.generator.expressions.enums.pauli import Pauli
14
13
  from classiq.interface.generator.functions import * # noqa: F403
15
14
  from classiq.interface.generator.functions import __all__ as _ifunc_all
15
+ from classiq.interface.generator.model import * # noqa: F403
16
+ from classiq.interface.generator.model import __all__ as _md_all
16
17
  from classiq.interface.generator.quantum_program import QuantumProgram
17
18
  from classiq.interface.ide.show import show
18
19
 
19
- from classiq import (
20
- applications,
21
- builtin_functions,
22
- exceptions,
23
- execution,
24
- model,
25
- synthesis,
26
- )
20
+ from classiq import applications, exceptions, execution, synthesis
27
21
  from classiq._internals import _qfunc_ext, logger
28
22
  from classiq._internals.async_utils import (
29
23
  enable_jupyter_notebook,
@@ -34,23 +28,24 @@ from classiq._internals.client import configure
34
28
  from classiq._internals.config import Configuration
35
29
  from classiq._internals.help import open_help
36
30
  from classiq.analyzer import Analyzer
37
- from classiq.applications_model_constructors import * # noqa: F403
38
- from classiq.applications_model_constructors import (
39
- __all__ as _application_constructors_all,
31
+ from classiq.applications.chemistry import (
32
+ construct_chemistry_model,
33
+ molecule_problem_to_qmod,
34
+ )
35
+ from classiq.applications.combinatorial_optimization import (
36
+ construct_combinatorial_optimization_model,
37
+ pyo_model_to_hamiltonian,
40
38
  )
39
+ from classiq.applications.finance import construct_finance_model
40
+ from classiq.applications.grover import construct_grover_model
41
+ from classiq.applications.qsvm import construct_qsvm_model
41
42
  from classiq.executor import (
42
43
  execute,
43
44
  execute_async,
44
45
  set_quantum_program_execution_preferences,
45
46
  )
46
- from classiq.model import * # noqa: F403
47
- from classiq.model import __all__ as _md_all
48
47
  from classiq.qmod import * # noqa: F403
49
48
  from classiq.qmod import __all__ as _qmod_all
50
- from classiq.quantum_functions import * # noqa: F403
51
- from classiq.quantum_functions import __all__ as _qfuncs_all
52
- from classiq.quantum_register import * # noqa: F403
53
- from classiq.quantum_register import __all__ as _qregs_all
54
49
  from classiq.synthesis import (
55
50
  set_constraints,
56
51
  set_execution_preferences,
@@ -59,6 +54,15 @@ from classiq.synthesis import (
59
54
  synthesize_async,
60
55
  )
61
56
 
57
+ _application_constructors_all = [
58
+ "construct_qsvm_model",
59
+ "construct_combinatorial_optimization_model",
60
+ "construct_chemistry_model",
61
+ "construct_finance_model",
62
+ "construct_grover_model",
63
+ "molecule_problem_to_qmod",
64
+ ]
65
+
62
66
  __version__ = _VERSION
63
67
 
64
68
  if _is_notebook():
@@ -67,10 +71,8 @@ if _is_notebook():
67
71
  _sub_modules = [
68
72
  "analyzer",
69
73
  "applications",
70
- "builtin_functions",
71
74
  "exceptions",
72
75
  "execution",
73
- "model",
74
76
  "open_help",
75
77
  "qmod",
76
78
  "synthesis",
@@ -95,8 +97,6 @@ __all__ = (
95
97
  "show",
96
98
  "Pauli",
97
99
  ]
98
- + _qregs_all
99
- + _qfuncs_all
100
100
  + _md_all
101
101
  + _ifunc_all
102
102
  + _sub_modules
@@ -1,5 +1,5 @@
1
1
  import json
2
- from typing import Dict, Optional, Protocol, Type, TypeVar
2
+ from typing import Dict, List, Optional, Protocol, Type, TypeVar
3
3
 
4
4
  import pydantic
5
5
 
@@ -14,6 +14,7 @@ from classiq.interface.execution.jobs import (
14
14
  )
15
15
  from classiq.interface.executor import execution_request, result as execute_result
16
16
  from classiq.interface.generator import quantum_program as generator_result
17
+ from classiq.interface.hardware import HardwareInformation
17
18
  from classiq.interface.jobs import (
18
19
  JobDescriptionBase,
19
20
  JobDescriptionFailure,
@@ -297,6 +298,17 @@ class ApiWrapper:
297
298
  )
298
299
  return analysis_result.DevicesResult.parse_obj(data)
299
300
 
301
+ @classmethod
302
+ async def call_get_all_hardware_devices(cls) -> List[HardwareInformation]:
303
+ data = await client().call_api(
304
+ http_method=HTTPMethod.GET,
305
+ url="/hardware-catalog/v1/hardwares",
306
+ use_versioned_url=False,
307
+ )
308
+ if not isinstance(data, list):
309
+ raise ClassiqAPIError(f"Unexpected value: {data}")
310
+ return [HardwareInformation.parse_obj(info) for info in data]
311
+
300
312
  @classmethod
301
313
  async def call_generate_hamiltonian_task(
302
314
  cls, problem: ground_state_problem.CHEMISTRY_PROBLEMS_TYPE
@@ -6,7 +6,17 @@ import os
6
6
  import platform
7
7
  import ssl
8
8
  import sys
9
- from typing import Any, Awaitable, Callable, Dict, NoReturn, Optional, TypeVar, Union
9
+ from typing import (
10
+ Any,
11
+ Awaitable,
12
+ Callable,
13
+ Dict,
14
+ List,
15
+ NoReturn,
16
+ Optional,
17
+ TypeVar,
18
+ Union,
19
+ )
10
20
 
11
21
  import httpx
12
22
  from packaging.version import Version
@@ -214,7 +224,7 @@ class Client:
214
224
  params: Optional[Dict] = None,
215
225
  use_versioned_url: bool = True,
216
226
  headers: Optional[Dict[str, str]] = None,
217
- ) -> Union[Dict, str]:
227
+ ) -> Union[Dict, List, str]:
218
228
  if use_versioned_url:
219
229
  url = self.make_versioned_url(url)
220
230
  async with self.async_client() as async_client:
@@ -81,7 +81,9 @@ class Analyzer(AnalyzerUtilities):
81
81
  def get_available_devices(
82
82
  self, providers: Optional[List[ProviderNameEnum]] = None
83
83
  ) -> Dict[ProviderNameEnum, List[DeviceName]]:
84
- """Returns dict of the available devices by the providers. only devices
84
+ """Deprecated. Use get_all_hardware_devices instead.
85
+
86
+ Returns dict of the available devices by the providers. only devices
85
87
  with sufficient number of qubits are returns
86
88
 
87
89
  Args: providers (): List of providers (string or `AnalyzerProviderVendor`).
@@ -1,15 +1,8 @@
1
1
  from typing import List
2
2
 
3
- from classiq.applications import (
4
- benchmarking,
5
- chemistry,
6
- combinatorial_optimization,
7
- finance,
8
- qsvm,
9
- )
3
+ from classiq.applications import chemistry, combinatorial_optimization, finance, qsvm
10
4
 
11
5
  __all__ = [
12
- "benchmarking",
13
6
  "combinatorial_optimization",
14
7
  "chemistry",
15
8
  "finance",
@@ -15,6 +15,10 @@ from classiq.interface.chemistry.operator import PauliOperator, PauliOperators
15
15
  from . import ground_state_problem
16
16
  from .ansatz_parameters import HEAParameters, HVAParameters, UCCParameters
17
17
  from .chemistry_execution_parameters import ChemistryExecutionParameters
18
+ from .chemistry_model_constructor import (
19
+ construct_chemistry_model,
20
+ molecule_problem_to_qmod,
21
+ )
18
22
 
19
23
  __all__ = [
20
24
  "Molecule",
@@ -29,6 +33,8 @@ __all__ = [
29
33
  "HVAParameters",
30
34
  "HEAParameters",
31
35
  "ChemistryExecutionParameters",
36
+ "construct_chemistry_model",
37
+ "molecule_problem_to_qmod",
32
38
  ]
33
39
 
34
40
 
@@ -446,7 +446,7 @@ def _get_chemistry_quantum_main(
446
446
  function="allocate",
447
447
  positional_args=[
448
448
  Expression(
449
- expr=f"len(get_field({_get_problem_to_hamiltonian_name(chemistry_problem)}({_convert_library_problem_to_qmod_problem(chemistry_problem)})[0], 'pauli'))"
449
+ expr=f"get_field(get_field({_get_problem_to_hamiltonian_name(chemistry_problem)}({_convert_library_problem_to_qmod_problem(chemistry_problem)})[0], 'pauli'), 'len')"
450
450
  ),
451
451
  HandleBinding(name="qbv"),
452
452
  ],
@@ -5,7 +5,7 @@ from pyomo.core.expr.sympy_tools import PyomoSympyBimap
5
5
  from scipy.optimize import differential_evolution
6
6
  from sympy import Expr
7
7
 
8
- from classiq.applications_model_constructors.combinatorial_helpers import encoding_utils
8
+ from classiq.applications.combinatorial_helpers import encoding_utils
9
9
 
10
10
 
11
11
  def sympy_lambdify(*args: Any, **kwargs: Any) -> Any:
@@ -1,5 +1,5 @@
1
1
  import itertools
2
- from typing import List, Union
2
+ from typing import List, Union, cast
3
3
 
4
4
  import numpy as np
5
5
  import pyomo.environ as pyo
@@ -9,18 +9,21 @@ from classiq.interface.combinatorial_optimization.solver_types import QSolver
9
9
  from classiq.interface.executor.vqe_result import VQESolverResult
10
10
  from classiq.interface.generator.functions.qmod_python_interface import QmodPyStruct
11
11
 
12
- from classiq.applications_model_constructors.combinatorial_helpers.optimization_model import (
12
+ from classiq import Pauli
13
+ from classiq.applications.combinatorial_helpers.optimization_model import (
13
14
  OptimizationModel,
14
15
  )
15
- from classiq.applications_model_constructors.combinatorial_helpers.pauli_helpers.pauli_sparsing import (
16
+ from classiq.applications.combinatorial_helpers.pauli_helpers.pauli_sparsing import (
16
17
  SparsePauliOp,
17
18
  )
18
- from classiq.applications_model_constructors.combinatorial_helpers.pauli_helpers.pauli_utils import (
19
+ from classiq.applications.combinatorial_helpers.pauli_helpers.pauli_utils import (
20
+ get_pauli_operator,
19
21
  pauli_operator_to_hamiltonian,
20
22
  )
21
- from classiq.applications_model_constructors.combinatorial_helpers.pyomo_utils import (
23
+ from classiq.applications.combinatorial_helpers.pyomo_utils import (
22
24
  convert_pyomo_to_global_presentation,
23
25
  )
26
+ from classiq.qmod.builtins import PauliTerm
24
27
 
25
28
 
26
29
  def compute_qaoa_initial_point(
@@ -39,7 +42,7 @@ def compute_qaoa_initial_point(
39
42
  return list(itertools.chain(*zip(gamma_params, beta_params)))
40
43
 
41
44
 
42
- def pyo_model_to_hamiltonian(
45
+ def _internal_pyo_model_to_hamiltonian(
43
46
  pyo_model: pyo.ConcreteModel, penalty_energy: float
44
47
  ) -> List[QmodPyStruct]:
45
48
  pauli_list = OptimizationModel(
@@ -48,6 +51,22 @@ def pyo_model_to_hamiltonian(
48
51
  return pauli_operator_to_hamiltonian(pauli_list)
49
52
 
50
53
 
54
+ def pyo_model_to_hamiltonian(
55
+ pyo_model: pyo.ConcreteModel, penalty_energy: float
56
+ ) -> List[PauliTerm]:
57
+ hamiltonian = _internal_pyo_model_to_hamiltonian(pyo_model, penalty_energy)
58
+ pauli_operator = get_pauli_operator(hamiltonian).pauli_list
59
+ pauli_terms = []
60
+ for item in pauli_operator:
61
+ term = PauliTerm(
62
+ [Pauli[p] for p in item[0]], # type:ignore[arg-type]
63
+ cast(complex, item[1]).real, # type:ignore[arg-type]
64
+ )
65
+ pauli_terms.append(term)
66
+
67
+ return pauli_terms
68
+
69
+
51
70
  def _str_to_list_int(str_ints: str) -> List[int]:
52
71
  return list(map(int, list(str_ints)))
53
72
 
@@ -8,7 +8,7 @@ from pyomo.core.expr.visitor import clone_expression, identify_variables
8
8
 
9
9
  from classiq.interface.combinatorial_optimization.encoding_types import EncodingType
10
10
 
11
- from classiq.applications_model_constructors.combinatorial_helpers import pyomo_utils
11
+ from classiq.applications.combinatorial_helpers import pyomo_utils
12
12
  from classiq.exceptions import ClassiqCombOptError
13
13
 
14
14
 
@@ -14,7 +14,7 @@ from pyomo.core.expr.numeric_expr import (
14
14
  )
15
15
  from sympy import Expr
16
16
 
17
- from classiq.applications_model_constructors.combinatorial_helpers import pyomo_utils
17
+ from classiq.applications.combinatorial_helpers import pyomo_utils
18
18
  from classiq.exceptions import ClassiqCombOptNoSolutionError
19
19
 
20
20
  _INTEGER_TYPES = [pyo.NonNegativeIntegers, pyo.Integers, pyo.PositiveIntegers]
@@ -6,10 +6,8 @@ from pyomo.core.base import _GeneralVarData
6
6
 
7
7
  from classiq.interface.generator.function_params import IOName
8
8
 
9
- from classiq.applications_model_constructors.combinatorial_helpers import encoding_utils
10
- from classiq.applications_model_constructors.combinatorial_helpers.encoding_mapping import (
11
- EncodingMapping,
12
- )
9
+ from classiq.applications.combinatorial_helpers import encoding_utils
10
+ from classiq.applications.combinatorial_helpers.encoding_mapping import EncodingMapping
13
11
 
14
12
  AUXILIARY_NAME = "auxiliary"
15
13
 
@@ -13,28 +13,24 @@ from classiq.interface.combinatorial_optimization import sense
13
13
  from classiq.interface.combinatorial_optimization.encoding_types import EncodingType
14
14
  from classiq.interface.combinatorial_optimization.solver_types import QSolver
15
15
 
16
- from classiq.applications_model_constructors.combinatorial_helpers import (
16
+ from classiq.applications.combinatorial_helpers import (
17
17
  encoding_utils,
18
18
  memory,
19
19
  pyomo_utils,
20
20
  )
21
- from classiq.applications_model_constructors.combinatorial_helpers.encoding_mapping import (
22
- EncodingMapping,
23
- )
24
- from classiq.applications_model_constructors.combinatorial_helpers.memory import (
25
- InternalQuantumReg,
26
- )
27
- from classiq.applications_model_constructors.combinatorial_helpers.transformations import (
21
+ from classiq.applications.combinatorial_helpers.encoding_mapping import EncodingMapping
22
+ from classiq.applications.combinatorial_helpers.memory import InternalQuantumReg
23
+ from classiq.applications.combinatorial_helpers.transformations import (
28
24
  encoding,
29
25
  ising_converter,
30
26
  penalty,
31
27
  slack_variables,
32
28
  )
33
- from classiq.applications_model_constructors.combinatorial_helpers.transformations.fixed_variables import (
29
+ from classiq.applications.combinatorial_helpers.transformations.fixed_variables import (
34
30
  add_fixed_variables_to_solution,
35
31
  remove_fixed_variables,
36
32
  )
37
- from classiq.applications_model_constructors.combinatorial_helpers.transformations.penalty_support import (
33
+ from classiq.applications.combinatorial_helpers.transformations.penalty_support import (
38
34
  is_model_penalty_supported,
39
35
  )
40
36
  from classiq.exceptions import ClassiqCombOptError
@@ -49,22 +45,23 @@ class OptimizationModel:
49
45
  encoding_type: Optional[EncodingType] = None,
50
46
  ) -> None:
51
47
  assert model.nobjectives() == 1, "model must have a single objective"
52
- self._model_original = copy.deepcopy(model)
53
- self._assigned_model = remove_fixed_variables(model)
48
+ model_copy = copy.deepcopy(model)
49
+ self._model_original = model
50
+ self._assigned_model = remove_fixed_variables(model_copy)
54
51
  self.qsolver = qsolver
55
52
  self._encoding_type = encoding_type
56
53
 
57
- self.is_encoded = encoding_utils.is_model_encodable(model)
54
+ self.is_encoded = encoding_utils.is_model_encodable(model_copy)
58
55
  if self.is_encoded:
59
56
  if self._encoding_type is None:
60
57
  self._encoding_type = EncodingType.BINARY
61
58
  self._model_encoder = encoding.ModelEncoder(
62
- model, qsolver, self._encoding_type
59
+ model_copy, qsolver, self._encoding_type
63
60
  )
64
61
  self._model = self._model_encoder.encoded_model
65
62
  self._vars_encoding_mapping = self._model_encoder.vars_encoding_mapping
66
63
  else:
67
- self._model = model
64
+ self._model = model_copy
68
65
  # TODO How to handle encoding_type == None
69
66
  self._vars_encoding_mapping = EncodingMapping(self._encoding_type) # type: ignore[arg-type]
70
67
 
@@ -74,7 +71,7 @@ class OptimizationModel:
74
71
  self.vars_not_encoded, self._vars_encoding_mapping
75
72
  )
76
73
 
77
- self.is_maximization = sense.is_maximization(model)
74
+ self.is_maximization = sense.is_maximization(model_copy)
78
75
  self.objective = next(self._model.component_objects(pyo.Objective))
79
76
 
80
77
  self.penalty_energy = penalty_energy
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  from enum import Enum
3
- from typing import Any, Dict, List, Type, TypeVar, Union
3
+ from typing import Any, Dict, List, Optional, Tuple, Type, TypeVar, Union
4
4
 
5
5
  import pydantic
6
6
  import pyomo.core.expr.numeric_expr as pyo_expr
@@ -120,7 +120,9 @@ def get_name(component: Union[IndexedComponent, ComponentData]) -> str:
120
120
 
121
121
 
122
122
  class FixedSympy2PyomoVisitor(Sympy2PyomoVisitor):
123
- def beforeChild(self, node, child, child_idx): # noqa: N802
123
+ def beforeChild( # noqa: N802
124
+ self, node: Optional[sympy.Expr], child: sympy.Expr, child_idx: Optional[int]
125
+ ) -> Tuple[bool, Union[int, float, None]]:
124
126
  if not child._args:
125
127
  item = self.object_map.getPyomoSymbol(child, None)
126
128
  if item is None:
@@ -10,16 +10,9 @@ from pyomo.core.expr.relational_expr import EqualityExpression
10
10
  from classiq.interface.combinatorial_optimization.encoding_types import EncodingType
11
11
  from classiq.interface.combinatorial_optimization.solver_types import QSolver
12
12
 
13
- from classiq.applications_model_constructors.combinatorial_helpers import (
14
- encoding_utils,
15
- pyomo_utils,
16
- )
17
- from classiq.applications_model_constructors.combinatorial_helpers.encoding_mapping import (
18
- EncodingMapping,
19
- )
20
- from classiq.applications_model_constructors.combinatorial_helpers.encoding_utils import (
21
- ONE_HOT_SUFFIX,
22
- )
13
+ from classiq.applications.combinatorial_helpers import encoding_utils, pyomo_utils
14
+ from classiq.applications.combinatorial_helpers.encoding_mapping import EncodingMapping
15
+ from classiq.applications.combinatorial_helpers.encoding_utils import ONE_HOT_SUFFIX
23
16
  from classiq.exceptions import ClassiqCombOptInvalidEncodingTypeError
24
17
 
25
18
 
@@ -7,18 +7,16 @@ from pyomo.core.expr.relational_expr import EqualityExpression
7
7
  from pyomo.core.expr.visitor import identify_variables
8
8
  from pyomo.repn.standard_repn import _GeneralVarData
9
9
 
10
- from classiq.applications_model_constructors.combinatorial_helpers import (
10
+ from classiq.applications.combinatorial_helpers import (
11
11
  encoding_utils,
12
12
  pyomo_utils,
13
13
  sympy_utils,
14
14
  )
15
- from classiq.applications_model_constructors.combinatorial_helpers.arithmetic.isolation import (
16
- isolate,
17
- )
18
- from classiq.applications_model_constructors.combinatorial_helpers.encoding_utils import (
15
+ from classiq.applications.combinatorial_helpers.arithmetic.isolation import isolate
16
+ from classiq.applications.combinatorial_helpers.encoding_utils import (
19
17
  deal_with_trivial_boolean_constraint,
20
18
  )
21
- from classiq.applications_model_constructors.combinatorial_helpers.sympy_utils import (
19
+ from classiq.applications.combinatorial_helpers.sympy_utils import (
22
20
  sympyify_expression,
23
21
  sympyify_vars,
24
22
  )
@@ -7,11 +7,9 @@ from pyomo.core.base import _GeneralVarData
7
7
  from classiq.interface.chemistry.operator import PauliOperator
8
8
  from classiq.interface.helpers import custom_pydantic_types
9
9
 
10
- from classiq.applications_model_constructors.combinatorial_helpers import memory
11
- from classiq.applications_model_constructors.combinatorial_helpers.memory import (
12
- InternalQuantumReg,
13
- )
14
- from classiq.applications_model_constructors.combinatorial_helpers.sympy_utils import (
10
+ from classiq.applications.combinatorial_helpers import memory
11
+ from classiq.applications.combinatorial_helpers.memory import InternalQuantumReg
12
+ from classiq.applications.combinatorial_helpers.sympy_utils import (
15
13
  sympyify_expression,
16
14
  sympyify_vars,
17
15
  )
@@ -3,16 +3,12 @@ from pyomo.core.base.constraint import _GeneralConstraintData
3
3
  from pyomo.core.expr.relational_expr import EqualityExpression
4
4
  from pyomo.repn.standard_repn import _GeneralVarData
5
5
 
6
- from classiq.applications_model_constructors.combinatorial_helpers import (
6
+ from classiq.applications.combinatorial_helpers import (
7
7
  allowed_constraints,
8
8
  encoding_utils,
9
9
  )
10
- from classiq.applications_model_constructors.combinatorial_helpers.pyomo_utils import (
11
- extract,
12
- )
13
- from classiq.applications_model_constructors.combinatorial_helpers.sympy_utils import (
14
- sympyify_expression,
15
- )
10
+ from classiq.applications.combinatorial_helpers.pyomo_utils import extract
11
+ from classiq.applications.combinatorial_helpers.sympy_utils import sympyify_expression
16
12
 
17
13
 
18
14
  def is_model_penalty_supported(model: ConcreteModel) -> bool:
@@ -7,14 +7,12 @@ import pyomo.core as pyo
7
7
  from pyomo.core.base.component import _ComponentBase
8
8
  from pyomo.core.expr.sympy_tools import sympy2pyomo_expression, sympyify_expression
9
9
 
10
- from classiq.applications_model_constructors.combinatorial_helpers import pyomo_utils
11
- from classiq.applications_model_constructors.combinatorial_helpers.arithmetic.arithmetic_expression import (
10
+ from classiq.applications.combinatorial_helpers import pyomo_utils
11
+ from classiq.applications.combinatorial_helpers.arithmetic.arithmetic_expression import (
12
12
  multivariate_extremum,
13
13
  )
14
- from classiq.applications_model_constructors.combinatorial_helpers.transformations import (
15
- penalty_support,
16
- )
17
- from classiq.applications_model_constructors.combinatorial_helpers.transformations.sign_seperation import (
14
+ from classiq.applications.combinatorial_helpers.transformations import penalty_support
15
+ from classiq.applications.combinatorial_helpers.transformations.sign_seperation import (
18
16
  sign_separation,
19
17
  )
20
18
 
@@ -1,20 +1,28 @@
1
1
  from typing import List
2
2
 
3
3
  from classiq.interface.combinatorial_optimization import examples
4
+ from classiq.interface.combinatorial_optimization.encoding_types import EncodingType
4
5
  from classiq.interface.combinatorial_optimization.solver_types import QSolver
5
6
 
6
- from classiq.applications_model_constructors.combinatorial_helpers.combinatorial_problem_utils import (
7
+ from classiq.applications.combinatorial_helpers.combinatorial_problem_utils import (
7
8
  get_optimization_solution_from_pyo,
9
+ pyo_model_to_hamiltonian,
8
10
  )
9
11
 
10
12
  from .combinatorial_optimization_config import OptimizerConfig, QAOAConfig
13
+ from .combinatorial_optimization_model_constructor import (
14
+ construct_combinatorial_optimization_model,
15
+ )
11
16
 
12
17
  __all__ = [
18
+ "EncodingType",
19
+ "OptimizerConfig",
20
+ "QAOAConfig",
13
21
  "QSolver",
22
+ "construct_combinatorial_optimization_model",
14
23
  "examples",
15
- "QAOAConfig",
16
- "OptimizerConfig",
17
24
  "get_optimization_solution_from_pyo",
25
+ "pyo_model_to_hamiltonian",
18
26
  ]
19
27
 
20
28
 
@@ -20,19 +20,16 @@ from classiq.interface.model.native_function_definition import NativeFunctionDef
20
20
  from classiq.interface.model.port_declaration import PortDeclaration
21
21
  from classiq.interface.model.quantum_function_call import QuantumFunctionCall
22
22
 
23
- from classiq.applications.combinatorial_optimization.combinatorial_optimization_config import (
24
- OptimizerConfig,
25
- QAOAConfig,
26
- )
27
- from classiq.applications_model_constructors.combinatorial_helpers.combinatorial_problem_utils import (
23
+ from classiq.applications.combinatorial_helpers.combinatorial_problem_utils import (
24
+ _internal_pyo_model_to_hamiltonian,
28
25
  compute_qaoa_initial_point,
29
26
  convert_pyomo_to_global_presentation,
30
- pyo_model_to_hamiltonian,
31
27
  )
32
- from classiq.applications_model_constructors.combinatorial_helpers.pauli_helpers.pauli_utils import (
28
+ from classiq.applications.combinatorial_helpers.pauli_helpers.pauli_utils import (
33
29
  _pauli_operator_to_qmod,
34
30
  get_pauli_operator,
35
31
  )
32
+ from classiq.applications.combinatorial_optimization import OptimizerConfig, QAOAConfig
36
33
 
37
34
 
38
35
  def construct_combi_opt_py_model(
@@ -50,7 +47,9 @@ def construct_combi_opt_py_model(
50
47
  if optimizer_config.max_iteration is not None:
51
48
  max_iteration = optimizer_config.max_iteration
52
49
 
53
- hamiltonian = pyo_model_to_hamiltonian(pyo_model, qaoa_config.penalty_energy)
50
+ hamiltonian = _internal_pyo_model_to_hamiltonian(
51
+ pyo_model, qaoa_config.penalty_energy
52
+ )
54
53
  qaoa_initial_point = compute_qaoa_initial_point(hamiltonian, qaoa_config.num_layers)
55
54
  len_hamiltonian = len(hamiltonian[0]["pauli"])
56
55
  pauli_oper = get_pauli_operator(hamiltonian)
@@ -89,14 +88,14 @@ def construct_combi_opt_py_model(
89
88
  QuantumFunctionCall(
90
89
  function="allocate",
91
90
  positional_args=[
92
- Expression(expr="len(target)"),
91
+ Expression(expr="target.len"),
93
92
  HandleBinding(name="target"),
94
93
  ],
95
94
  ),
96
95
  QuantumFunctionCall(
97
96
  function="qaoa_penalty",
98
97
  params={
99
- "num_qubits": Expression(expr="len(target)"),
98
+ "num_qubits": Expression(expr="target.len"),
100
99
  "params_list": Expression(expr="params_list"),
101
100
  "hamiltonian": Expression(expr="hamiltonian"),
102
101
  },
@@ -4,14 +4,15 @@ from classiq.interface.finance import (
4
4
  function_input,
5
5
  gaussian_model_input,
6
6
  log_normal_model_input,
7
- model_input,
8
7
  )
9
8
 
9
+ from .finance_model_constructor import construct_finance_model
10
+
10
11
  __all__ = [
12
+ "construct_finance_model",
11
13
  "function_input",
12
14
  "gaussian_model_input",
13
15
  "log_normal_model_input",
14
- "model_input",
15
16
  ]
16
17
 
17
18