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