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
classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py
RENAMED
@@ -1,6 +1,7 @@
|
|
1
1
|
from math import floor, log
|
2
2
|
from typing import Union
|
3
3
|
|
4
|
+
from classiq.interface.exceptions import ClassiqError
|
4
5
|
from classiq.interface.finance.function_input import FinanceFunctionInput
|
5
6
|
from classiq.interface.finance.gaussian_model_input import GaussianModelInput
|
6
7
|
from classiq.interface.finance.log_normal_model_input import LogNormalModelInput
|
@@ -8,23 +9,22 @@ from classiq.interface.generator.expressions.expression import Expression
|
|
8
9
|
from classiq.interface.generator.functions.port_declaration import (
|
9
10
|
PortDeclarationDirection,
|
10
11
|
)
|
12
|
+
from classiq.interface.model.allocate import Allocate
|
11
13
|
from classiq.interface.model.handle_binding import HandleBinding
|
12
14
|
from classiq.interface.model.model import Model, SerializedModel
|
13
15
|
from classiq.interface.model.native_function_definition import NativeFunctionDefinition
|
14
16
|
from classiq.interface.model.port_declaration import PortDeclaration
|
15
17
|
from classiq.interface.model.quantum_function_call import QuantumFunctionCall
|
16
18
|
from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
|
19
|
+
from classiq.interface.model.quantum_type import QuantumNumeric
|
17
20
|
from classiq.interface.model.variable_declaration_statement import (
|
18
21
|
VariableDeclarationStatement,
|
19
22
|
)
|
20
23
|
|
21
|
-
from classiq.
|
22
|
-
|
23
|
-
)
|
24
|
-
from classiq.applications_model_constructors.libraries.qmci_library import QMCI_LIBRARY
|
25
|
-
from classiq.exceptions import ClassiqError
|
24
|
+
from classiq.applications.libraries.qmci_library import QMCI_LIBRARY
|
25
|
+
from classiq.qmod.utilities import qmod_val_to_expr_str
|
26
26
|
|
27
|
-
_OUTPUT_VARIABLE_NAME = "
|
27
|
+
_OUTPUT_VARIABLE_NAME = "payoff_estimation"
|
28
28
|
|
29
29
|
|
30
30
|
def construct_finance_model(
|
@@ -58,7 +58,7 @@ def construct_finance_model(
|
|
58
58
|
if finance_function_input.tail_probability is not None:
|
59
59
|
tail_probability = finance_function_input.tail_probability
|
60
60
|
|
61
|
-
finance_function_object = f"struct_literal(FinanceFunction, f={finance_function_input.f}, threshold={finance_function_input.condition.threshold}, larger={finance_function_input.condition.larger}, polynomial_degree={polynomial_degree}, use_chebyshev_polynomial_approximation={finance_function_input.use_chebyshev_polynomial_approximation}, tail_probability={tail_probability})"
|
61
|
+
finance_function_object = f"struct_literal(FinanceFunction, f={qmod_val_to_expr_str(finance_function_input.f)}, threshold={finance_function_input.condition.threshold}, larger={finance_function_input.condition.larger}, polynomial_degree={polynomial_degree}, use_chebyshev_polynomial_approximation={finance_function_input.use_chebyshev_polynomial_approximation}, tail_probability={tail_probability})"
|
62
62
|
num_unitary_qubits = total_num_qubits + 1
|
63
63
|
|
64
64
|
model = Model(
|
@@ -66,57 +66,63 @@ def construct_finance_model(
|
|
66
66
|
*QMCI_LIBRARY,
|
67
67
|
NativeFunctionDefinition(
|
68
68
|
name="main",
|
69
|
-
|
70
|
-
|
69
|
+
positional_arg_declarations=[
|
70
|
+
PortDeclaration(
|
71
71
|
name="phase_port",
|
72
|
-
|
72
|
+
quantum_type=QuantumNumeric(
|
73
|
+
size=Expression(expr=f"{phase_port_size}"),
|
74
|
+
is_signed=Expression(expr="False"),
|
75
|
+
fraction_digits=Expression(expr=f"{phase_port_size}"),
|
76
|
+
),
|
73
77
|
direction=PortDeclarationDirection.Output,
|
74
78
|
),
|
75
|
-
|
79
|
+
],
|
76
80
|
body=[
|
77
81
|
VariableDeclarationStatement(name="unitary_port"),
|
82
|
+
Allocate(
|
83
|
+
size=Expression(expr=f"{num_unitary_qubits}"),
|
84
|
+
target=HandleBinding(name="unitary_port"),
|
85
|
+
),
|
86
|
+
Allocate(
|
87
|
+
size=Expression(expr=f"{phase_port_size}"),
|
88
|
+
target=HandleBinding(name="phase_port"),
|
89
|
+
),
|
78
90
|
QuantumFunctionCall(
|
79
91
|
function="qmci",
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
expr=f"{num_unitary_qubits}"
|
84
|
-
),
|
85
|
-
},
|
86
|
-
operands={
|
87
|
-
"sp_op": QuantumLambdaFunction(
|
92
|
+
positional_args=[
|
93
|
+
QuantumLambdaFunction(
|
94
|
+
pos_rename_params=["state", "ind"],
|
88
95
|
body=[
|
89
96
|
QuantumFunctionCall(
|
90
97
|
function=finance_function,
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
),
|
95
|
-
"
|
96
|
-
|
97
|
-
),
|
98
|
-
},
|
99
|
-
inouts={
|
100
|
-
"func_port": HandleBinding(name="reg"),
|
101
|
-
"obj_port": HandleBinding(name="ind"),
|
102
|
-
},
|
98
|
+
positional_args=[
|
99
|
+
Expression(expr=finance_model),
|
100
|
+
Expression(expr=finance_function_object),
|
101
|
+
HandleBinding(name="state"),
|
102
|
+
HandleBinding(name="ind"),
|
103
|
+
],
|
103
104
|
),
|
104
105
|
],
|
105
106
|
),
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
"unitary_port": HandleBinding(name="unitary_port"),
|
110
|
-
},
|
107
|
+
HandleBinding(name="phase_port"),
|
108
|
+
HandleBinding(name="unitary_port"),
|
109
|
+
],
|
111
110
|
),
|
112
111
|
],
|
113
112
|
),
|
114
113
|
],
|
115
|
-
classical_execution_code=
|
116
|
-
|
117
|
-
|
118
|
-
{
|
119
|
-
|
120
|
-
|
114
|
+
classical_execution_code=f"""
|
115
|
+
phase_port_size = {phase_port_size}
|
116
|
+
counts = sample()
|
117
|
+
save({{"counts": counts}})
|
118
|
+
probability_estimation = qae_with_qpe_result_post_processing(
|
119
|
+
estimation_register_size=phase_port_size,
|
120
|
+
estimation_method=1,
|
121
|
+
result=counts
|
122
|
+
)
|
123
|
+
save({{"probability_estimation": probability_estimation}})
|
124
|
+
{_OUTPUT_VARIABLE_NAME} = {post_process_function}({finance_model}, {finance_function_object}, probability_estimation)
|
125
|
+
save({{"{_OUTPUT_VARIABLE_NAME}": {_OUTPUT_VARIABLE_NAME}}})
|
126
|
+
""".strip(),
|
121
127
|
)
|
122
128
|
return model.get_model()
|
@@ -1,9 +1,8 @@
|
|
1
|
-
from typing import Dict, List, Tuple
|
2
|
-
|
3
1
|
from classiq.interface.generator.expressions.expression import Expression
|
4
2
|
from classiq.interface.generator.functions.port_declaration import (
|
5
3
|
PortDeclarationDirection,
|
6
4
|
)
|
5
|
+
from classiq.interface.model.allocate import Allocate
|
7
6
|
from classiq.interface.model.bind_operation import BindOperation
|
8
7
|
from classiq.interface.model.handle_binding import HandleBinding, SlicedHandleBinding
|
9
8
|
from classiq.interface.model.model import Model, SerializedModel
|
@@ -11,31 +10,35 @@ from classiq.interface.model.native_function_definition import NativeFunctionDef
|
|
11
10
|
from classiq.interface.model.port_declaration import PortDeclaration
|
12
11
|
from classiq.interface.model.quantum_expressions.arithmetic_operation import (
|
13
12
|
ArithmeticOperation,
|
13
|
+
ArithmeticOperationKind,
|
14
14
|
)
|
15
15
|
from classiq.interface.model.quantum_function_call import QuantumFunctionCall
|
16
16
|
from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
|
17
|
-
from classiq.interface.model.quantum_type import QuantumNumeric
|
17
|
+
from classiq.interface.model.quantum_type import QuantumBitvector, QuantumNumeric
|
18
18
|
from classiq.interface.model.variable_declaration_statement import (
|
19
19
|
VariableDeclarationStatement,
|
20
20
|
)
|
21
21
|
|
22
22
|
from classiq import RegisterUserInput
|
23
|
+
from classiq.open_library.functions.grover import grover_search, phase_oracle
|
23
24
|
|
24
25
|
_OUTPUT_VARIABLE_NAME = "result"
|
25
26
|
|
26
27
|
_PREDICATE_FUNCTION_NAME = "expr_predicate"
|
27
28
|
|
28
29
|
|
29
|
-
def
|
30
|
-
definitions:
|
31
|
-
) ->
|
30
|
+
def _arithmetic_oracle_ios(
|
31
|
+
definitions: list[tuple[str, RegisterUserInput]], handle_name: str
|
32
|
+
) -> list[HandleBinding]:
|
32
33
|
cursor = 0
|
33
|
-
ios:
|
34
|
-
for
|
35
|
-
ios
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
ios: list[HandleBinding] = []
|
35
|
+
for _, reg in definitions:
|
36
|
+
ios.append(
|
37
|
+
SlicedHandleBinding(
|
38
|
+
base_handle=HandleBinding(name=handle_name),
|
39
|
+
start=Expression(expr=f"{cursor}"),
|
40
|
+
end=Expression(expr=f"{cursor + reg.size}"),
|
41
|
+
)
|
39
42
|
)
|
40
43
|
cursor += reg.size
|
41
44
|
return ios
|
@@ -43,36 +46,34 @@ def _arithmetic_oracle_io_dict(
|
|
43
46
|
|
44
47
|
def _construct_arithmetic_oracle(
|
45
48
|
predicate_function: str,
|
46
|
-
definitions:
|
49
|
+
definitions: list[tuple[str, RegisterUserInput]],
|
47
50
|
) -> QuantumFunctionCall:
|
48
|
-
predicate_var_binding =
|
49
|
-
predicate_var_binding
|
51
|
+
predicate_var_binding = _arithmetic_oracle_ios(definitions, "state")
|
52
|
+
predicate_var_binding.append(HandleBinding(name="oracle"))
|
50
53
|
return QuantumFunctionCall(
|
51
54
|
function="phase_oracle",
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
operands={
|
56
|
-
"predicate": QuantumLambdaFunction(
|
55
|
+
positional_args=[
|
56
|
+
QuantumLambdaFunction(
|
57
|
+
pos_rename_params=["state", "oracle"],
|
57
58
|
body=[
|
58
59
|
QuantumFunctionCall(
|
59
60
|
function=predicate_function,
|
60
|
-
|
61
|
+
positional_args=predicate_var_binding,
|
61
62
|
),
|
62
63
|
],
|
63
64
|
),
|
64
|
-
|
65
|
+
HandleBinding(name="packed_vars"),
|
66
|
+
],
|
65
67
|
)
|
66
68
|
|
67
69
|
|
68
70
|
def grover_main_port_declarations(
|
69
|
-
definitions:
|
71
|
+
definitions: list[tuple[str, RegisterUserInput]],
|
70
72
|
direction: PortDeclarationDirection,
|
71
|
-
) ->
|
72
|
-
return
|
73
|
-
|
73
|
+
) -> list[PortDeclaration]:
|
74
|
+
return [
|
75
|
+
PortDeclaration(
|
74
76
|
name=name,
|
75
|
-
size=Expression(expr=f"{reg.size}"),
|
76
77
|
quantum_type=QuantumNumeric(
|
77
78
|
size=Expression(expr=f"{reg.size}"),
|
78
79
|
is_signed=Expression(expr=f"{reg.is_signed}"),
|
@@ -81,21 +82,23 @@ def grover_main_port_declarations(
|
|
81
82
|
direction=direction,
|
82
83
|
)
|
83
84
|
for name, reg in definitions
|
84
|
-
|
85
|
+
]
|
85
86
|
|
86
87
|
|
87
88
|
def construct_grover_model(
|
88
|
-
definitions:
|
89
|
+
definitions: list[tuple[str, RegisterUserInput]],
|
89
90
|
expression: str,
|
90
91
|
num_reps: int = 1,
|
91
92
|
) -> SerializedModel:
|
92
93
|
predicate_port_decls = grover_main_port_declarations(
|
93
94
|
definitions, PortDeclarationDirection.Inout
|
94
95
|
)
|
95
|
-
predicate_port_decls
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
predicate_port_decls.append(
|
97
|
+
PortDeclaration(
|
98
|
+
name="res",
|
99
|
+
quantum_type=QuantumBitvector(length=Expression(expr="1")),
|
100
|
+
direction=PortDeclarationDirection.Inout,
|
101
|
+
)
|
99
102
|
)
|
100
103
|
num_qubits = sum(reg.size for _, reg in definitions)
|
101
104
|
|
@@ -103,45 +106,41 @@ def construct_grover_model(
|
|
103
106
|
functions=[
|
104
107
|
NativeFunctionDefinition(
|
105
108
|
name=_PREDICATE_FUNCTION_NAME,
|
106
|
-
|
109
|
+
positional_arg_declarations=predicate_port_decls,
|
107
110
|
body=[
|
108
111
|
ArithmeticOperation(
|
109
112
|
expression=Expression(expr=expression),
|
110
113
|
result_var=HandleBinding(name="res"),
|
111
|
-
|
114
|
+
operation_kind=ArithmeticOperationKind.InplaceXor,
|
112
115
|
),
|
113
116
|
],
|
114
117
|
),
|
115
118
|
NativeFunctionDefinition(
|
116
119
|
name="main",
|
117
|
-
|
120
|
+
positional_arg_declarations=grover_main_port_declarations(
|
118
121
|
definitions, PortDeclarationDirection.Output
|
119
122
|
),
|
120
123
|
body=[
|
121
124
|
VariableDeclarationStatement(name="packed_vars"),
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
Expression(expr=f"{num_qubits}"),
|
126
|
-
HandleBinding(name="packed_vars"),
|
127
|
-
],
|
125
|
+
Allocate(
|
126
|
+
size=Expression(expr=f"{num_qubits}"),
|
127
|
+
target=HandleBinding(name="packed_vars"),
|
128
128
|
),
|
129
129
|
QuantumFunctionCall(
|
130
130
|
function="grover_search",
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
operands={
|
136
|
-
"oracle": QuantumLambdaFunction(
|
131
|
+
positional_args=[
|
132
|
+
Expression(expr=f"{num_reps}"),
|
133
|
+
QuantumLambdaFunction(
|
134
|
+
pos_rename_params=["packed_vars"],
|
137
135
|
body=[
|
138
136
|
_construct_arithmetic_oracle(
|
139
137
|
_PREDICATE_FUNCTION_NAME,
|
140
138
|
definitions,
|
141
139
|
)
|
142
|
-
]
|
143
|
-
)
|
144
|
-
|
140
|
+
],
|
141
|
+
),
|
142
|
+
HandleBinding(name="packed_vars"),
|
143
|
+
],
|
145
144
|
),
|
146
145
|
BindOperation(
|
147
146
|
in_handles=[HandleBinding(name="packed_vars")],
|
@@ -151,6 +150,8 @@ def construct_grover_model(
|
|
151
150
|
),
|
152
151
|
],
|
153
152
|
),
|
153
|
+
*[f for f in grover_search.create_model().functions if f.name != "main"],
|
154
|
+
*[f for f in phase_oracle.create_model().functions if f.name != "main"],
|
154
155
|
],
|
155
156
|
)
|
156
157
|
return grover_model.get_model()
|
@@ -0,0 +1,113 @@
|
|
1
|
+
from typing import Union
|
2
|
+
|
3
|
+
import numpy as np
|
4
|
+
from sympy import fwht
|
5
|
+
|
6
|
+
from classiq.qmod import ( # type:ignore[attr-defined]
|
7
|
+
Pauli,
|
8
|
+
PauliTerm,
|
9
|
+
)
|
10
|
+
|
11
|
+
ATOL = 1e-12
|
12
|
+
PAULI_MATRICES_DICT = {
|
13
|
+
Pauli.I: np.array([[1, 0], [0, 1]], dtype=np.complex128),
|
14
|
+
Pauli.Z: np.array([[1, 0], [0, -1]], dtype=np.complex128),
|
15
|
+
Pauli.X: np.array([[0, 1], [1, 0]], dtype=np.complex128),
|
16
|
+
Pauli.Y: np.array([[0, -1j], [1j, 0]], dtype=np.complex128),
|
17
|
+
}
|
18
|
+
|
19
|
+
|
20
|
+
def _get_pauli_string(set_index: int, term_index: int, num_qubits: int) -> list[Pauli]:
|
21
|
+
"""
|
22
|
+
The basis of 4^N Pauli strings on N qubits can be partitioned to 2^N sets, each contains 2^N Pauli strings.
|
23
|
+
In the k-th set we have Pauli strings of the form s_1s_2...s_N, where s_j is in {I,Z} if k_j is 0,
|
24
|
+
and in {X,iY} if k_j=1. The function get_pauli_string returns the m-th Pauli string in the k-th set of Pauli strings
|
25
|
+
"""
|
26
|
+
|
27
|
+
# returns the Pauli (I,Z) or (iY, X) appearing in the pauli_index position for a given set
|
28
|
+
def _get_paulis_for_set(set_index: int, pauli_index: int) -> tuple[Pauli, Pauli]:
|
29
|
+
if (set_index >> pauli_index) & 1:
|
30
|
+
return Pauli.Y, Pauli.X
|
31
|
+
else:
|
32
|
+
return Pauli.Z, Pauli.I
|
33
|
+
|
34
|
+
return [
|
35
|
+
(
|
36
|
+
_get_paulis_for_set(set_index, s)[0]
|
37
|
+
if (term_index >> s) & 1
|
38
|
+
else _get_paulis_for_set(set_index, s)[1]
|
39
|
+
)
|
40
|
+
for s in range(num_qubits)
|
41
|
+
][::-1]
|
42
|
+
|
43
|
+
|
44
|
+
def _coefficents_for_set(mat: np.ndarray, set_index: int) -> list:
|
45
|
+
"""
|
46
|
+
The 2^N coefficients in a 2^N x 2^N matrix that are decomposed to the elements
|
47
|
+
in the k-th set are the indices [i,j] such that i^j=k
|
48
|
+
The function coefficents_for_set returns the matrix entries that are decomposed to the same Pauli strigs set
|
49
|
+
"""
|
50
|
+
return [mat[k, k ^ set_index] / len(mat) for k in range(len(mat))]
|
51
|
+
|
52
|
+
|
53
|
+
def _get_signed_coefficient(
|
54
|
+
c: complex, k: int, i: int, is_hermitian: bool
|
55
|
+
) -> Union[complex, float]:
|
56
|
+
# correct from iY to Y
|
57
|
+
coef = complex((1j) ** ((i & k).bit_count()) * c)
|
58
|
+
if is_hermitian:
|
59
|
+
return coef.real
|
60
|
+
else:
|
61
|
+
return coef
|
62
|
+
|
63
|
+
|
64
|
+
def matrix_to_hamiltonian(
|
65
|
+
mat: np.ndarray, tol: float = ATOL, is_hermitian: bool = True
|
66
|
+
) -> list[PauliTerm]:
|
67
|
+
"""
|
68
|
+
The decomposition per set is done by the Walsh-Hadamard transform,
|
69
|
+
since the transformation between {e_0,e_3} ({e_1,e_2}) to {I,Z} ({X,iY}) is the Hadamard matrix.
|
70
|
+
"""
|
71
|
+
mat.shape[0] != 0, "matrix is of size 0"
|
72
|
+
if is_hermitian:
|
73
|
+
assert np.allclose(
|
74
|
+
mat, np.conjugate(mat.T)
|
75
|
+
), "Matrix is not hermitian, please pass is_hermitian=False"
|
76
|
+
assert mat.shape[0] == mat.shape[1], "Matrix is not square"
|
77
|
+
mat_dimension = mat.shape[0]
|
78
|
+
assert mat_dimension.bit_count() == 1, "Matrix dimension is not a power of 2"
|
79
|
+
num_qubits = (mat_dimension - 1).bit_length()
|
80
|
+
hamiltonian = []
|
81
|
+
for k in range(2**num_qubits):
|
82
|
+
coef = fwht(
|
83
|
+
_coefficents_for_set(mat, k)
|
84
|
+
) # the transformation per set is given by the Walsh-Hadamard transform
|
85
|
+
hamiltonian += [
|
86
|
+
PauliTerm(
|
87
|
+
pauli=_get_pauli_string(k, i, num_qubits),
|
88
|
+
coefficient=_get_signed_coefficient(coef[i], k, i, is_hermitian),
|
89
|
+
)
|
90
|
+
for i in range(2**num_qubits)
|
91
|
+
if abs(coef[i]) > tol
|
92
|
+
]
|
93
|
+
return hamiltonian
|
94
|
+
|
95
|
+
|
96
|
+
# convert a single puali string of length N to 2**N X 2**N matrix
|
97
|
+
def pauli_string_to_mat(seq: list[Pauli]) -> np.ndarray:
|
98
|
+
real_matrix = PAULI_MATRICES_DICT[seq[0]]
|
99
|
+
for p in seq[1:]:
|
100
|
+
real_matrix = np.kron(real_matrix, PAULI_MATRICES_DICT[p])
|
101
|
+
return real_matrix
|
102
|
+
|
103
|
+
|
104
|
+
# return matrix from hamiltonian
|
105
|
+
def hamiltonian_to_matrix(hamiltonian: list[PauliTerm]) -> np.ndarray:
|
106
|
+
matrix = np.zeros(
|
107
|
+
[2 ** len(hamiltonian[0].pauli), 2 ** len(hamiltonian[0].pauli)],
|
108
|
+
dtype=np.complex_,
|
109
|
+
)
|
110
|
+
for p in hamiltonian:
|
111
|
+
matrix += p.coefficient * pauli_string_to_mat(p.pauli)
|
112
|
+
|
113
|
+
return matrix
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from classiq.open_library.functions.amplitude_estimation import amplitude_estimation
|
2
|
+
from classiq.qmod.builtins.functions import Z
|
3
|
+
from classiq.qmod.qfunc import qfunc
|
4
|
+
from classiq.qmod.qmod_variable import QArray, QBit, QNum
|
5
|
+
from classiq.qmod.quantum_callable import QCallable
|
6
|
+
|
7
|
+
|
8
|
+
@qfunc
|
9
|
+
def qmci(
|
10
|
+
space_transform: QCallable[QArray[QBit], QBit],
|
11
|
+
phase: QNum,
|
12
|
+
packed_vars: QArray[QBit],
|
13
|
+
) -> None:
|
14
|
+
amplitude_estimation(
|
15
|
+
lambda reg: Z(reg[reg.len - 1]),
|
16
|
+
lambda reg: space_transform(reg[0 : reg.len - 1], reg[reg.len - 1]),
|
17
|
+
phase,
|
18
|
+
packed_vars,
|
19
|
+
)
|
20
|
+
|
21
|
+
|
22
|
+
QMCI_LIBRARY = [func for func in qmci.create_model().functions if func.name != "main"]
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# This file will be called first whenever any file from within this directory is imported.
|
2
2
|
# Thus, we'll test dependencies only here, once.
|
3
|
-
from typing import List
|
4
|
-
|
5
3
|
try:
|
6
4
|
import torch
|
7
5
|
except ImportError as exc:
|
@@ -10,8 +8,8 @@ except ImportError as exc:
|
|
10
8
|
from ..qnn import datasets, types
|
11
9
|
from ..qnn.qlayer import QLayer
|
12
10
|
|
13
|
-
__all__ = ["
|
11
|
+
__all__ = ["QLayer", "datasets", "types"]
|
14
12
|
|
15
13
|
|
16
|
-
def __dir__() ->
|
14
|
+
def __dir__() -> list[str]:
|
17
15
|
return __all__
|
@@ -1,21 +1,21 @@
|
|
1
1
|
import itertools
|
2
|
-
from collections.abc import Collection
|
3
|
-
from typing import
|
2
|
+
from collections.abc import Collection, Iterable
|
3
|
+
from typing import Union
|
4
4
|
|
5
5
|
from torch import Tensor
|
6
6
|
|
7
|
+
from classiq.interface.exceptions import ClassiqQNNError, ClassiqValueError
|
7
8
|
from classiq.interface.generator.circuit_code.types_and_constants import QasmVersion
|
8
9
|
from classiq.interface.generator.model.preferences.preferences import QuantumFormat
|
9
10
|
from classiq.interface.generator.quantum_program import QuantumProgram
|
10
11
|
|
11
12
|
from classiq.applications.qnn.types import Arguments, Circuit
|
12
|
-
from classiq.exceptions import ClassiqQNNError, ClassiqValueError
|
13
13
|
|
14
14
|
WEIGHT_INITIALS = ["weight_", "w_"]
|
15
15
|
INPUT_INITIALS = ["input_", "i_"]
|
16
16
|
|
17
|
-
Parameters =
|
18
|
-
ParametersTuple =
|
17
|
+
Parameters = list[str]
|
18
|
+
ParametersTuple = tuple[Parameters, Parameters]
|
19
19
|
|
20
20
|
|
21
21
|
def _is_name_valid(name: str) -> bool:
|
@@ -46,7 +46,7 @@ def validate_circuit(circuit: Circuit) -> bool:
|
|
46
46
|
return True
|
47
47
|
|
48
48
|
|
49
|
-
def _extract_by_prefix(lst: Parameters, prefix:
|
49
|
+
def _extract_by_prefix(lst: Parameters, prefix: list[str]) -> Parameters:
|
50
50
|
return [s for s in lst if any(s.startswith(p) for p in prefix)]
|
51
51
|
|
52
52
|
|
@@ -1,5 +1,3 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
from ..datasets import builtin_datasets
|
4
2
|
from ..datasets.builtin_datasets import (
|
5
3
|
DATALOADER_NOT,
|
@@ -15,21 +13,21 @@ from ..datasets.dataset_xor import DatasetXor
|
|
15
13
|
from ..datasets.datasets_utils import state_to_label, state_to_weights
|
16
14
|
|
17
15
|
__all__ = [
|
18
|
-
"builtin_datasets",
|
19
|
-
"DatasetNot",
|
20
|
-
"DATASET_NOT",
|
21
16
|
"DATALOADER_NOT",
|
22
|
-
"
|
23
|
-
"DATASET_XOR",
|
17
|
+
"DATALOADER_SUBSET_PARITY",
|
24
18
|
"DATALOADER_XOR",
|
25
|
-
"
|
19
|
+
"DATASET_NOT",
|
26
20
|
"DATASET_SUBSET_PARITY",
|
27
|
-
"
|
21
|
+
"DATASET_XOR",
|
22
|
+
"DatasetNot",
|
28
23
|
"DatasetParity",
|
29
|
-
"
|
24
|
+
"DatasetSubsetParity",
|
25
|
+
"DatasetXor",
|
26
|
+
"builtin_datasets",
|
30
27
|
"state_to_label",
|
28
|
+
"state_to_weights",
|
31
29
|
]
|
32
30
|
|
33
31
|
|
34
|
-
def __dir__() ->
|
32
|
+
def __dir__() -> list[str]:
|
35
33
|
return __all__
|
@@ -1,11 +1,13 @@
|
|
1
1
|
from abc import ABC, abstractmethod
|
2
|
-
from
|
2
|
+
from collections.abc import Sequence
|
3
|
+
from typing import Literal, Optional, TypeVar, Union
|
3
4
|
|
4
5
|
from torch import Tensor, tensor
|
5
6
|
from torch.utils.data import Dataset
|
6
7
|
|
8
|
+
from classiq.interface.exceptions import ClassiqIndexError, ClassiqValueError
|
9
|
+
|
7
10
|
from classiq.applications.qnn.types import DataAndLabel, Transform
|
8
|
-
from classiq.exceptions import ClassiqIndexError, ClassiqValueError
|
9
11
|
|
10
12
|
T = TypeVar("T")
|
11
13
|
|
@@ -29,7 +31,7 @@ class MyDataset(Dataset, ABC):
|
|
29
31
|
def _get_data_and_label(self, index: int) -> DataAndLabel:
|
30
32
|
pass
|
31
33
|
|
32
|
-
def __getitem__(self, index: int) ->
|
34
|
+
def __getitem__(self, index: int) -> tuple[Tensor, Tensor]:
|
33
35
|
if index < 0 or index >= len(self):
|
34
36
|
raise ClassiqIndexError(f"{self.__class__.__name__} out of range")
|
35
37
|
|
@@ -53,7 +55,7 @@ class MySubsetDataset(MyDataset, ABC):
|
|
53
55
|
def __init__(
|
54
56
|
self,
|
55
57
|
n: int = 2,
|
56
|
-
subset: Union[
|
58
|
+
subset: Union[list[int], Literal["all"]] = "all",
|
57
59
|
transform: Optional[Transform] = None,
|
58
60
|
target_transform: Optional[Transform] = None,
|
59
61
|
) -> None:
|
@@ -73,5 +75,5 @@ class MySubsetDataset(MyDataset, ABC):
|
|
73
75
|
'Invalid subset - please enter a `list` of `int`, or the string "all"'
|
74
76
|
)
|
75
77
|
|
76
|
-
def _get_subset(self, coll: Sequence[T]) ->
|
78
|
+
def _get_subset(self, coll: Sequence[T]) -> list[T]:
|
77
79
|
return [coll[i] for i in self._subset]
|
@@ -1,10 +1,11 @@
|
|
1
|
+
from classiq.interface.exceptions import ClassiqIndexError
|
2
|
+
|
1
3
|
from classiq.applications.qnn.datasets.dataset_base_classes import MyDataset
|
2
4
|
from classiq.applications.qnn.datasets.datasets_utils import (
|
3
5
|
all_bits_to_one,
|
4
6
|
all_bits_to_zero,
|
5
7
|
)
|
6
8
|
from classiq.applications.qnn.types import DataAndLabel
|
7
|
-
from classiq.exceptions import ClassiqIndexError
|
8
9
|
|
9
10
|
|
10
11
|
class DatasetNot(MyDataset):
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Literal, Optional, Union
|
2
2
|
|
3
3
|
from classiq.applications.qnn.datasets.dataset_base_classes import MySubsetDataset
|
4
4
|
from classiq.applications.qnn.types import DataAndLabel, Transform
|
@@ -8,7 +8,7 @@ class DatasetSubsetParity(MySubsetDataset):
|
|
8
8
|
def __init__(
|
9
9
|
self,
|
10
10
|
n: int = 2,
|
11
|
-
subset: Union[
|
11
|
+
subset: Union[list[int], Literal["all"]] = "all",
|
12
12
|
add_readout_qubit: bool = True,
|
13
13
|
transform: Optional[Transform] = None,
|
14
14
|
target_transform: Optional[Transform] = None,
|
@@ -23,7 +23,7 @@ class QuantumGradient(abc.ABC):
|
|
23
23
|
self._execute = execute
|
24
24
|
self._post_process = post_process
|
25
25
|
|
26
|
-
circuit = QuantumProgram.
|
26
|
+
circuit = QuantumProgram.model_validate_json(quantum_program)
|
27
27
|
validate_circuit(circuit)
|
28
28
|
self._quantum_program = quantum_program
|
29
29
|
self._parameters_names = extract_parameters(circuit)
|