classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- 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 +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- 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 +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- 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 +2 -2
- 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 +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- 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 +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- 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/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -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/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- 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/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- 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 +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- 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 +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- 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 +5 -5
- 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 +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- 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 +26 -8
- 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 +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- 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 +59 -0
- 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 +20 -11
- classiq/interface/generator/finance.py +3 -3
- 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 +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- 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 +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- 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 +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- 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 +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -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 +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- 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 +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- 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 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- 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 +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- 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 +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- 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 +38 -21
- 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 +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -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 +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- 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 +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- 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 +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- 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 +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- 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/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- 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/expressions/qmod_qnum_proxy.py +0 -22
- 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 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- 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 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- 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 -154
- 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 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- 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.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -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
|
File without changes
|
@@ -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
|
-
from classiq.interface.generator.generated_circuit import GeneratedCircuit
|
9
9
|
from classiq.interface.generator.model.preferences.preferences import QuantumFormat
|
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
|
|
@@ -95,7 +95,7 @@ def _get_extracted_parameters(obj: CircuitOrExtractedParameters) -> ParametersTu
|
|
95
95
|
# This `if` is for caching
|
96
96
|
if isinstance(obj, tuple):
|
97
97
|
weight_params, input_params = obj
|
98
|
-
elif isinstance(obj,
|
98
|
+
elif isinstance(obj, QuantumProgram):
|
99
99
|
weight_params, input_params = extract_parameters(obj)
|
100
100
|
else:
|
101
101
|
raise ClassiqValueError("Invalid object passed to `map_parameters`")
|
@@ -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,
|
@@ -4,7 +4,7 @@ from typing import Any
|
|
4
4
|
|
5
5
|
from torch import Tensor
|
6
6
|
|
7
|
-
from classiq.interface.generator.
|
7
|
+
from classiq.interface.generator.quantum_program import QuantumProgram
|
8
8
|
|
9
9
|
from classiq.applications.qnn.circuit_utils import extract_parameters, validate_circuit
|
10
10
|
from classiq.applications.qnn.types import ExecuteFunction, PostProcessFunction
|
@@ -23,7 +23,7 @@ class QuantumGradient(abc.ABC):
|
|
23
23
|
self._execute = execute
|
24
24
|
self._post_process = post_process
|
25
25
|
|
26
|
-
circuit =
|
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)
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import functools
|
2
|
-
from typing import Any, Callable, Optional,
|
2
|
+
from typing import Any, Callable, Optional, Union
|
3
3
|
|
4
4
|
import torch
|
5
5
|
import torch.nn as nn
|
6
6
|
from torch import Tensor
|
7
7
|
from torch.nn.parameter import Parameter
|
8
8
|
|
9
|
+
from classiq.interface.exceptions import ClassiqQNNError, ClassiqTorchError
|
10
|
+
|
9
11
|
from classiq.applications.qnn.circuit_utils import (
|
10
12
|
extract_parameters,
|
11
13
|
is_single_layer_circuit,
|
@@ -13,6 +15,7 @@ from classiq.applications.qnn.circuit_utils import (
|
|
13
15
|
validate_circuit,
|
14
16
|
)
|
15
17
|
from classiq.applications.qnn.gradients.simple_quantum_gradient import (
|
18
|
+
EPSILON,
|
16
19
|
SimpleQuantumGradient,
|
17
20
|
)
|
18
21
|
from classiq.applications.qnn.torch_utils import (
|
@@ -26,7 +29,6 @@ from classiq.applications.qnn.types import (
|
|
26
29
|
MultipleArguments,
|
27
30
|
PostProcessFunction,
|
28
31
|
)
|
29
|
-
from classiq.exceptions import ClassiqQNNError, ClassiqTorchError
|
30
32
|
from classiq.synthesis import SerializedQuantumProgram
|
31
33
|
|
32
34
|
|
@@ -39,6 +41,7 @@ class QLayerFunction(torch.autograd.Function):
|
|
39
41
|
quantum_program: SerializedQuantumProgram,
|
40
42
|
execute: ExecuteFunction,
|
41
43
|
post_process: PostProcessFunction,
|
44
|
+
epsilon: Optional[float] = EPSILON,
|
42
45
|
) -> Tensor:
|
43
46
|
"""
|
44
47
|
This function receives:
|
@@ -51,7 +54,9 @@ class QLayerFunction(torch.autograd.Function):
|
|
51
54
|
and returning a `Tensor`
|
52
55
|
|
53
56
|
"""
|
54
|
-
|
57
|
+
if epsilon is None:
|
58
|
+
epsilon = EPSILON
|
59
|
+
circuit = Circuit.model_validate_json(quantum_program)
|
55
60
|
validate_circuit(circuit)
|
56
61
|
|
57
62
|
# save for backward
|
@@ -60,7 +65,7 @@ class QLayerFunction(torch.autograd.Function):
|
|
60
65
|
ctx.execute = execute
|
61
66
|
ctx.post_process = post_process
|
62
67
|
ctx.quantum_gradient = SimpleQuantumGradient(
|
63
|
-
quantum_program, execute, post_process
|
68
|
+
quantum_program, execute, post_process, epsilon
|
64
69
|
)
|
65
70
|
|
66
71
|
ctx.batch_size, ctx.num_in_features = inputs.shape
|
@@ -94,7 +99,7 @@ class QLayerFunction(torch.autograd.Function):
|
|
94
99
|
@staticmethod
|
95
100
|
def backward( # type: ignore[override]
|
96
101
|
ctx: Any, grad_output: Tensor
|
97
|
-
) ->
|
102
|
+
) -> tuple[Optional[Tensor], Optional[Tensor], None, None, None, None]:
|
98
103
|
"""
|
99
104
|
grad_output: Tensor
|
100
105
|
is of shape (ctx.batch_size, ctx.num_out_features)
|
@@ -103,6 +108,7 @@ class QLayerFunction(torch.autograd.Function):
|
|
103
108
|
|
104
109
|
grad_weights = grad_inputs = None
|
105
110
|
grad_circuit = grad_execute = grad_post_process = None
|
111
|
+
grad_epsilon = None
|
106
112
|
is_single_layer = is_single_layer_circuit(weights)
|
107
113
|
|
108
114
|
if ctx.needs_input_grad[1]:
|
@@ -118,7 +124,14 @@ class QLayerFunction(torch.autograd.Function):
|
|
118
124
|
f"Grad required for unknown type: {ctx.needs_input_grad}"
|
119
125
|
)
|
120
126
|
|
121
|
-
return
|
127
|
+
return (
|
128
|
+
grad_inputs,
|
129
|
+
grad_weights,
|
130
|
+
grad_circuit,
|
131
|
+
grad_execute,
|
132
|
+
grad_post_process,
|
133
|
+
grad_epsilon,
|
134
|
+
)
|
122
135
|
|
123
136
|
|
124
137
|
CalcNumOutFeatures = Callable[[SerializedQuantumProgram], int]
|
@@ -142,8 +155,9 @@ class QLayer(nn.Module):
|
|
142
155
|
head_start: Union[float, Tensor, None] = None,
|
143
156
|
# Experimental parameters:
|
144
157
|
calc_num_out_features: CalcNumOutFeatures = calc_num_out_features_single_output,
|
158
|
+
epsilon: float = EPSILON,
|
145
159
|
) -> None:
|
146
|
-
circuit = Circuit.
|
160
|
+
circuit = Circuit.model_validate_json(quantum_program)
|
147
161
|
validate_circuit(circuit)
|
148
162
|
|
149
163
|
super().__init__()
|
@@ -151,6 +165,7 @@ class QLayer(nn.Module):
|
|
151
165
|
self._execute = execute
|
152
166
|
self._post_process = post_process
|
153
167
|
self._head_start = head_start
|
168
|
+
self._epsilon = epsilon
|
154
169
|
|
155
170
|
self.quantum_program = quantum_program
|
156
171
|
|
@@ -161,7 +176,7 @@ class QLayer(nn.Module):
|
|
161
176
|
self._initialize_parameters()
|
162
177
|
|
163
178
|
def _initialize_parameters(self) -> None:
|
164
|
-
shape:
|
179
|
+
shape: tuple[int, ...] = (
|
165
180
|
(self.out_features, self.in_features)
|
166
181
|
if self.out_features > 1
|
167
182
|
else (self.in_features,)
|
@@ -181,6 +196,11 @@ class QLayer(nn.Module):
|
|
181
196
|
self.weight = Parameter(value)
|
182
197
|
|
183
198
|
def forward(self, x: Tensor) -> Tensor:
|
184
|
-
return QLayerFunction.apply(
|
185
|
-
x,
|
199
|
+
return QLayerFunction.apply(
|
200
|
+
x,
|
201
|
+
self.weight,
|
202
|
+
self.quantum_program,
|
203
|
+
self._execute,
|
204
|
+
self._post_process,
|
205
|
+
self._epsilon,
|
186
206
|
)
|
@@ -1,11 +1,13 @@
|
|
1
1
|
from collections.abc import Sized
|
2
2
|
from functools import reduce
|
3
|
-
from typing import Optional
|
3
|
+
from typing import Optional
|
4
4
|
|
5
5
|
import torch
|
6
6
|
import torch.nn as nn
|
7
7
|
from torch import Tensor
|
8
8
|
|
9
|
+
from classiq.interface.exceptions import ClassiqValueError
|
10
|
+
|
9
11
|
from classiq.applications.qnn.circuit_utils import is_single_layer_circuit
|
10
12
|
from classiq.applications.qnn.types import (
|
11
13
|
ExecuteFuncitonOnlyArguments,
|
@@ -13,7 +15,6 @@ from classiq.applications.qnn.types import (
|
|
13
15
|
Shape,
|
14
16
|
TensorToArgumentsCallable,
|
15
17
|
)
|
16
|
-
from classiq.exceptions import ClassiqValueError
|
17
18
|
|
18
19
|
|
19
20
|
def get_shape_second_dimension(shape: torch.Size) -> int:
|
@@ -97,7 +98,7 @@ def iter_inputs_weights(
|
|
97
98
|
) -> Tensor:
|
98
99
|
if is_single_layer_circuit(weights):
|
99
100
|
iter_weights = torch.reshape(weights, (1, weights.shape[0]))
|
100
|
-
inputs_weights_shape:
|
101
|
+
inputs_weights_shape: tuple[int, ...] = (inputs.shape[0],)
|
101
102
|
else:
|
102
103
|
iter_weights = weights
|
103
104
|
inputs_weights_shape = (inputs.shape[0], weights.shape[0])
|
@@ -1,17 +1,17 @@
|
|
1
|
-
from typing import Callable,
|
1
|
+
from typing import Callable, Union
|
2
2
|
|
3
3
|
import torch
|
4
4
|
from torch import Tensor
|
5
5
|
|
6
6
|
from classiq.interface.executor.execution_result import ResultsCollection, SavedResult
|
7
7
|
|
8
|
-
from classiq import
|
8
|
+
from classiq import QuantumProgram
|
9
9
|
from classiq.synthesis import SerializedQuantumProgram
|
10
10
|
|
11
|
-
Arguments =
|
12
|
-
MultipleArguments =
|
11
|
+
Arguments = dict[str, float]
|
12
|
+
MultipleArguments = tuple[Arguments, ...]
|
13
13
|
|
14
|
-
Circuit =
|
14
|
+
Circuit = QuantumProgram
|
15
15
|
ExecuteFunction = Callable[
|
16
16
|
[SerializedQuantumProgram, MultipleArguments], ResultsCollection
|
17
17
|
]
|
@@ -19,10 +19,10 @@ ExecuteFuncitonOnlyArguments = Callable[[MultipleArguments], ResultsCollection]
|
|
19
19
|
PostProcessFunction = Callable[[SavedResult], Tensor]
|
20
20
|
TensorToArgumentsCallable = Callable[[Tensor, Tensor], MultipleArguments]
|
21
21
|
|
22
|
-
Shape = Union[torch.Size,
|
22
|
+
Shape = Union[torch.Size, tuple[int, ...]]
|
23
23
|
|
24
24
|
GradientFunction = Callable[[Tensor, Tensor], Tensor]
|
25
25
|
SimulateFunction = Callable[[Tensor, Tensor], Tensor]
|
26
26
|
|
27
|
-
DataAndLabel =
|
27
|
+
DataAndLabel = tuple[list[int], Union[list[int], int]]
|
28
28
|
Transform = Callable[[Tensor], Tensor]
|
@@ -1,8 +1,10 @@
|
|
1
|
-
from classiq.
|
2
|
-
QSVMFeatureMapEntanglement,
|
3
|
-
)
|
1
|
+
from classiq.qmod.builtins.enums import QSVMFeatureMapEntanglement
|
4
2
|
|
5
3
|
from ..qsvm import qsvm_data_generation
|
6
4
|
from .qsvm import * # noqa: F403
|
5
|
+
from .qsvm_model_constructor import construct_qsvm_model
|
7
6
|
|
8
|
-
__all__ = [
|
7
|
+
__all__ = [
|
8
|
+
"QSVMFeatureMapEntanglement",
|
9
|
+
"construct_qsvm_model",
|
10
|
+
]
|
@@ -1,17 +1,11 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
import numpy as np
|
4
|
-
|
5
|
-
from classiq.interface.applications.qsvm import DataList, QSVMData, QSVMPreferences
|
6
|
-
|
7
|
-
Data = Union[DataList, np.ndarray]
|
8
|
-
Labels = Union[List[Any], np.ndarray]
|
1
|
+
from classiq.interface.applications.qsvm import Data, Labels, QSVMData
|
9
2
|
|
10
3
|
__all__ = [
|
4
|
+
"Data",
|
5
|
+
"Labels",
|
11
6
|
"QSVMData",
|
12
|
-
"QSVMPreferences",
|
13
7
|
]
|
14
8
|
|
15
9
|
|
16
|
-
def __dir__() ->
|
10
|
+
def __dir__() -> list[str]:
|
17
11
|
return __all__
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import logging
|
2
2
|
from collections import defaultdict
|
3
|
-
from typing import
|
3
|
+
from typing import Optional
|
4
4
|
|
5
5
|
import numpy as np
|
6
6
|
|
@@ -15,7 +15,7 @@ def generate_data(
|
|
15
15
|
range_max: float = 2 * np.pi,
|
16
16
|
std: float = 0.5,
|
17
17
|
sources: Optional[np.ndarray] = None,
|
18
|
-
) ->
|
18
|
+
) -> dict[int, np.ndarray]:
|
19
19
|
if sources is None:
|
20
20
|
sources = np.random.uniform(
|
21
21
|
range_min, range_max, (amount_of_sources, dimension)
|
@@ -24,11 +24,8 @@ def generate_data(
|
|
24
24
|
|
25
25
|
results = {}
|
26
26
|
for index, s in enumerate(sources):
|
27
|
-
|
28
|
-
|
29
|
-
for point in s:
|
30
|
-
# draw from a gaussian distribution
|
31
|
-
temp.append(np.random.normal(point, std, amount))
|
27
|
+
# for each dimension draw from a gaussian distribution
|
28
|
+
temp = [np.random.normal(point, std, amount) for point in s]
|
32
29
|
# combine the list of np.arrays
|
33
30
|
results[index] = np.array(list(zip(*temp)))
|
34
31
|
|
@@ -39,7 +36,7 @@ def generate_data(
|
|
39
36
|
return results
|
40
37
|
|
41
38
|
|
42
|
-
def data_dict_to_data_and_labels(data_dict: dict) ->
|
39
|
+
def data_dict_to_data_and_labels(data_dict: dict) -> tuple[np.ndarray, np.ndarray]:
|
43
40
|
data = []
|
44
41
|
labels = []
|
45
42
|
for k, v in data_dict.items():
|