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
@@ -0,0 +1,301 @@
|
|
1
|
+
import warnings
|
2
|
+
from typing import Literal
|
3
|
+
|
4
|
+
from classiq.interface.exceptions import ClassiqDeprecationWarning
|
5
|
+
|
6
|
+
from classiq.open_library.functions.utility_functions import (
|
7
|
+
hadamard_transform,
|
8
|
+
modular_increment,
|
9
|
+
)
|
10
|
+
from classiq.qmod.builtins.functions.standard_gates import CX, IDENTITY, RY, H, X
|
11
|
+
from classiq.qmod.builtins.operations import allocate, control, if_, repeat
|
12
|
+
from classiq.qmod.cparam import CBool, CInt
|
13
|
+
from classiq.qmod.qfunc import qfunc
|
14
|
+
from classiq.qmod.qmod_variable import Output, QArray, QBit, QNum
|
15
|
+
from classiq.qmod.symbolic import (
|
16
|
+
asin,
|
17
|
+
atan,
|
18
|
+
exp,
|
19
|
+
floor,
|
20
|
+
log,
|
21
|
+
logical_or,
|
22
|
+
max as qmax,
|
23
|
+
min as qmin,
|
24
|
+
pi,
|
25
|
+
sqrt,
|
26
|
+
)
|
27
|
+
|
28
|
+
|
29
|
+
@qfunc
|
30
|
+
def allocate_num(
|
31
|
+
num_qubits: CInt,
|
32
|
+
is_signed: CBool,
|
33
|
+
fraction_digits: CInt,
|
34
|
+
out: Output[
|
35
|
+
QNum[Literal["num_qubits"], Literal["is_signed"], Literal["fraction_digits"]]
|
36
|
+
],
|
37
|
+
) -> None:
|
38
|
+
"""
|
39
|
+
[Qmod Classiq-library function]
|
40
|
+
|
41
|
+
Initializes a quantum number with the given number of qubits, sign, and fractional digits.
|
42
|
+
|
43
|
+
Args:
|
44
|
+
num_qubits: The number of qubits to allocate.
|
45
|
+
is_signed: Whether the number is signed or unsigned.
|
46
|
+
fraction_digits: The number of fractional digits.
|
47
|
+
"""
|
48
|
+
allocate(num_qubits, out)
|
49
|
+
|
50
|
+
|
51
|
+
def prepare_uniform_trimmed_state_apply_rotation(
|
52
|
+
size_lsb: CInt, lsbs_val: CInt, rotation_var: QBit
|
53
|
+
) -> None:
|
54
|
+
# max hold for the case where the value is on the left side
|
55
|
+
# the fraction in the sqrt is the wanted amount of probability
|
56
|
+
# in the left side divided by the total amount
|
57
|
+
RY(
|
58
|
+
-2 * (asin(sqrt(qmin((2 ** (size_lsb)) / lsbs_val, 1))) + pi / 4) + pi,
|
59
|
+
rotation_var,
|
60
|
+
)
|
61
|
+
|
62
|
+
|
63
|
+
@qfunc
|
64
|
+
def _prepare_uniform_trimmed_state_step(
|
65
|
+
size_lsb: CInt, ctrl_val: CInt, lsbs_val: CInt, ctrl_var: QNum, rotation_var: QBit
|
66
|
+
) -> None:
|
67
|
+
if_(
|
68
|
+
lsbs_val != 0, # stop condition
|
69
|
+
lambda: control(
|
70
|
+
ctrl_var == ctrl_val,
|
71
|
+
lambda: prepare_uniform_trimmed_state_apply_rotation(
|
72
|
+
size_lsb, lsbs_val, rotation_var
|
73
|
+
),
|
74
|
+
),
|
75
|
+
)
|
76
|
+
|
77
|
+
|
78
|
+
@qfunc
|
79
|
+
def prepare_uniform_trimmed_state(m: CInt, q: QArray[QBit]) -> None:
|
80
|
+
"""
|
81
|
+
[Qmod Classiq-library function]
|
82
|
+
|
83
|
+
Initializes a quantum variable in a uniform superposition of the first `m` computational basis states:
|
84
|
+
|
85
|
+
$$
|
86
|
+
\\left|\\text{q}\\right\\rangle = \\frac{1}{\\sqrt{m}}\\sum_{i=0}^{m-1}{|i\\rangle}
|
87
|
+
$$
|
88
|
+
|
89
|
+
The number of allocated qubits would be $\\left\\lceil\\log_2{m}\\right\\rceil$.
|
90
|
+
The function is especially useful when `m` is not a power of 2.
|
91
|
+
|
92
|
+
Args:
|
93
|
+
m: The number of states to load in the superposition.
|
94
|
+
q: The quantum variable that will receive the initialized state. Must be uninitialized.
|
95
|
+
|
96
|
+
Notes:
|
97
|
+
1. If the output variable has been declared with a specific number of qubits, it must match the number of allocated qubits.
|
98
|
+
2. The synthesis engine automatically handles the allocation, either by drawing new qubits from the available pool or by reusing existing ones.
|
99
|
+
"""
|
100
|
+
hadamard_transform(q)
|
101
|
+
|
102
|
+
if_(
|
103
|
+
m < 2**q.len,
|
104
|
+
# initial step without control
|
105
|
+
lambda: prepare_uniform_trimmed_state_apply_rotation(
|
106
|
+
q.len - 1, # type:ignore[arg-type]
|
107
|
+
m,
|
108
|
+
q[q.len - 1],
|
109
|
+
),
|
110
|
+
)
|
111
|
+
|
112
|
+
repeat(
|
113
|
+
qmax(q.len - 1, 0),
|
114
|
+
lambda i: _prepare_uniform_trimmed_state_step(
|
115
|
+
q.len - i - 2,
|
116
|
+
floor(m / (2 ** (q.len - i - 1))),
|
117
|
+
m % (2 ** (q.len - i - 1)),
|
118
|
+
q[q.len - i - 1 : q.len],
|
119
|
+
q[q.len - i - 2],
|
120
|
+
),
|
121
|
+
)
|
122
|
+
|
123
|
+
|
124
|
+
@qfunc
|
125
|
+
def prepare_uniform_interval_state(start: CInt, end: CInt, q: QArray[QBit]) -> None:
|
126
|
+
"""
|
127
|
+
[Qmod Classiq-library function]
|
128
|
+
|
129
|
+
Initializes a quantum variable in a uniform superposition of the specified interval in the computational basis states:
|
130
|
+
|
131
|
+
$$
|
132
|
+
\\left|\\text{q}\\right\\rangle = \\frac{1}{\\sqrt{\\text{end} - \\text{start}}}\\sum_{i=\\text{start}}^{\\text{end}-1}{|i\\rangle}
|
133
|
+
$$
|
134
|
+
|
135
|
+
The number of allocated qubits would be $\\left\\lceil\\log_2{\\left(\\text{end}\\right)}\\right\\rceil$.
|
136
|
+
|
137
|
+
Args:
|
138
|
+
start: The lower bound of the interval to load (inclusive).
|
139
|
+
end: The upper bound of the interval to load (exclusive).
|
140
|
+
q: The quantum variable that will receive the initialized state. Must be uninitialized.
|
141
|
+
|
142
|
+
Notes:
|
143
|
+
1. If the output variable has been declared with a specific number of qubits, it must match the number of allocated qubits.
|
144
|
+
2. The synthesis engine automatically handles the allocation, either by drawing new qubits from the available pool or by reusing existing ones.
|
145
|
+
"""
|
146
|
+
prepare_uniform_trimmed_state(end - start, q)
|
147
|
+
modular_increment(start, q)
|
148
|
+
|
149
|
+
|
150
|
+
@qfunc
|
151
|
+
def prepare_ghz_state(size: CInt, q: Output[QArray[QBit]]) -> None:
|
152
|
+
"""
|
153
|
+
[Qmod Classiq-library function]
|
154
|
+
|
155
|
+
Initializes a quantum variable in a Greenberger-Horne-Zeilinger (GHZ) state. i.e., a balanced superposition of all ones and all zeros, on an arbitrary number of qubits..
|
156
|
+
|
157
|
+
Args:
|
158
|
+
size: The number of qubits in the GHZ state. Must be a positive integer.
|
159
|
+
q: The quantum variable that will receive the initialized state. Must be uninitialized.
|
160
|
+
|
161
|
+
Notes:
|
162
|
+
The synthesis engine automatically handles the allocation, either by drawing new qubits from the available pool or by reusing existing ones.
|
163
|
+
|
164
|
+
|
165
|
+
"""
|
166
|
+
|
167
|
+
def inner_lop(step: CInt) -> None:
|
168
|
+
repeat(
|
169
|
+
count=2**step,
|
170
|
+
iteration=lambda control_index: if_(
|
171
|
+
condition=control_index + 2**step >= size,
|
172
|
+
then=lambda: IDENTITY(q[0]),
|
173
|
+
else_=lambda: CX(q[control_index], q[control_index + 2**step]),
|
174
|
+
),
|
175
|
+
)
|
176
|
+
|
177
|
+
allocate(size, q)
|
178
|
+
H(q[0])
|
179
|
+
repeat(floor(log(size - 1, 2)) + 1, inner_lop) # type:ignore[arg-type]
|
180
|
+
|
181
|
+
|
182
|
+
@qfunc
|
183
|
+
def prepare_exponential_state(rate: CInt, q: QArray[QBit]) -> None:
|
184
|
+
"""
|
185
|
+
|
186
|
+
[Qmod Classiq-library function]
|
187
|
+
|
188
|
+
Prepares a quantum state with exponentially decreasing amplitudes. The state is prepared in the computational basis, with the amplitudes of the states decreasing exponentially with the index of the state:
|
189
|
+
|
190
|
+
$$
|
191
|
+
P(n) = \\frac{1}{Z} e^{- \\text{rate} \\cdot n}
|
192
|
+
$$
|
193
|
+
|
194
|
+
Args:
|
195
|
+
rate: The rate of the exponential decay.
|
196
|
+
q: The quantum register to prepare.
|
197
|
+
"""
|
198
|
+
repeat(q.len, lambda i: RY(2.0 * atan(exp((-rate * 2.0**i) / 2.0)), q[i]))
|
199
|
+
|
200
|
+
|
201
|
+
@qfunc
|
202
|
+
def prepare_bell_state(state_num: CInt, q: Output[QArray[QBit, Literal[2]]]) -> None:
|
203
|
+
"""
|
204
|
+
[Qmod Classiq-library function]
|
205
|
+
|
206
|
+
Initializes a quantum array of size 2 in one of the four Bell states.
|
207
|
+
|
208
|
+
Args:
|
209
|
+
state_num: The number of the Bell state to be prepared. Must be an integer between 0 and 3.
|
210
|
+
q: The quantum variable that will receive the initialized state. Must be uninitialized.
|
211
|
+
|
212
|
+
Bell States:
|
213
|
+
The four Bell states are defined as follows (each state correlates to an integer between 0 and 3 as defined by the `state_num` argument):
|
214
|
+
|
215
|
+
If `state_num` = 0 the function prepares the Bell state:
|
216
|
+
|
217
|
+
$$
|
218
|
+
\\left|\\Phi^+\\right\\rangle = \\frac{1}{\\sqrt{2}} \\left( \\left| 00 \\right\\rangle + \\left| 11 \\right\\rangle \\right)
|
219
|
+
$$
|
220
|
+
|
221
|
+
If `state_num` = 1 the function prepares the Bell state:
|
222
|
+
|
223
|
+
$$
|
224
|
+
\\left|\\Phi^-\\right\\rangle = \\frac{1}{\\sqrt{2}} \\left( \\left| 00 \\right\\rangle - \\left| 11 \\right\\rangle \\right)
|
225
|
+
$$
|
226
|
+
|
227
|
+
If `state_num` = 2 the function prepares the Bell state:
|
228
|
+
|
229
|
+
$$
|
230
|
+
\\left|\\Psi^+\\right\\rangle = \\frac{1}{\\sqrt{2}} \\left( \\left| 01 \\right\\rangle + \\left| 10 \\right\\rangle \\right)
|
231
|
+
$$
|
232
|
+
|
233
|
+
If `state_num` = 3 the function prepares the Bell state:
|
234
|
+
|
235
|
+
$$
|
236
|
+
\\left|\\Psi^-\\right\\rangle = \\frac{1}{\\sqrt{2}} \\left( \\left| 01 \\right\\rangle - \\left| 10 \\right\\rangle \\right)
|
237
|
+
$$
|
238
|
+
|
239
|
+
Notes:
|
240
|
+
The synthesis engine automatically handles the allocation, either by drawing new qubits from the available pool or by reusing existing ones.
|
241
|
+
|
242
|
+
|
243
|
+
"""
|
244
|
+
allocate(2, q)
|
245
|
+
if_(logical_or(state_num == 1, state_num == 3), lambda: X(q[0]))
|
246
|
+
if_(logical_or(state_num == 2, state_num == 3), lambda: X(q[1]))
|
247
|
+
H(q[0])
|
248
|
+
CX(q[0], q[1])
|
249
|
+
|
250
|
+
|
251
|
+
@qfunc
|
252
|
+
def inplace_prepare_int(value: CInt, target: QNum) -> None:
|
253
|
+
"""
|
254
|
+
[Qmod Classiq-library function]
|
255
|
+
|
256
|
+
This function is **deprecated**. Use in-place-xor assignment statement in the form _target-var_ **^=** _quantum-expression_ or **inplace_xor(**_quantum-expression_**,** _target-var_**)** instead.
|
257
|
+
|
258
|
+
Transitions a quantum variable in the zero state $|0\\rangle$ into the computational basis state $|\\text{value}\\rangle$.
|
259
|
+
In the general case, the function performs a bitwise-XOR, i.e. transitions the state $|\\psi\\rangle$ into $|\\psi \\oplus \\text{value}\\rangle$.
|
260
|
+
|
261
|
+
Args:
|
262
|
+
value: The value to assign to the quantum variable.
|
263
|
+
target: The quantum variable to act upon.
|
264
|
+
|
265
|
+
Note:
|
266
|
+
If the value cannot fit into the quantum variable, it is truncated, i.e. treated as the value modulo $2^\\text{target.size}$.
|
267
|
+
"""
|
268
|
+
warnings.warn(
|
269
|
+
"Function 'inplace_prepare_int' is deprecated. Use in-place-xor assignment statement in the form '<var> ^= <expression>' or 'inplace_xor(<expression>, <var>)' instead.",
|
270
|
+
ClassiqDeprecationWarning,
|
271
|
+
stacklevel=1,
|
272
|
+
)
|
273
|
+
target ^= value
|
274
|
+
|
275
|
+
|
276
|
+
@qfunc
|
277
|
+
def prepare_int(
|
278
|
+
value: CInt,
|
279
|
+
out: Output[QNum[Literal["floor(log(value, 2)) + 1"]]],
|
280
|
+
) -> None:
|
281
|
+
"""
|
282
|
+
[Qmod Classiq-library function]
|
283
|
+
|
284
|
+
This function is **deprecated**. Use assignment statement in the form _target-var_ **|=** _quantum-expression_ or **assign(**_quantum-expression_**,** _target-var_**)** instead.
|
285
|
+
|
286
|
+
Initializes a quantum variable to the computational basis state $|\\text{value}\\rangle$.
|
287
|
+
The number of allocated qubits is automatically computed from the value, and is the minimal number required for representation in the computational basis.
|
288
|
+
|
289
|
+
Args:
|
290
|
+
value: The value to assign to the quantum variable.
|
291
|
+
out: The allocated quantum variable. Must be uninitialized.
|
292
|
+
|
293
|
+
Note:
|
294
|
+
If the output variable has been declared with a specific number of qubits, it must match the number of allocated qubits.
|
295
|
+
"""
|
296
|
+
warnings.warn(
|
297
|
+
"Function 'prepare_int' is deprecated. Use assignment statement in the form '<var> |= <expression>' or 'assign(<expression>, <var>)' instead.",
|
298
|
+
ClassiqDeprecationWarning,
|
299
|
+
stacklevel=1,
|
300
|
+
)
|
301
|
+
out |= value
|
@@ -0,0 +1,27 @@
|
|
1
|
+
from classiq.qmod.builtins.functions.standard_gates import SWAP, H
|
2
|
+
from classiq.qmod.builtins.operations import allocate, control, repeat
|
3
|
+
from classiq.qmod.qfunc import qfunc
|
4
|
+
from classiq.qmod.qmod_variable import Output, QArray, QBit
|
5
|
+
|
6
|
+
|
7
|
+
@qfunc
|
8
|
+
def swap_test(state1: QArray[QBit], state2: QArray[QBit], test: Output[QBit]) -> None:
|
9
|
+
"""
|
10
|
+
[Qmod Classiq-library function]
|
11
|
+
|
12
|
+
Tests the overlap (in terms of fidelity) of two quantum states.
|
13
|
+
The fidelity of `state1` and `state2` is calculated from the probability of measuring `test` qubit in the state 0 as follows:
|
14
|
+
|
15
|
+
$$
|
16
|
+
|\\langle state1 | state2 \\rangle |^2 = 2*Prob(test=0)-1
|
17
|
+
$$
|
18
|
+
|
19
|
+
Args:
|
20
|
+
state1: A quantum state to check its overlap with state2.
|
21
|
+
state2: A quantum state to check its overlap with state1.
|
22
|
+
test: A qubit for which the probability of measuring 0 is $0.5*(|\\langle state1 | state2 \\rangle |^2+1)$
|
23
|
+
"""
|
24
|
+
allocate(1, test)
|
25
|
+
H(test)
|
26
|
+
control(test, lambda: repeat(state1.len, lambda i: SWAP(state1[i], state2[i])))
|
27
|
+
H(test)
|
@@ -0,0 +1,81 @@
|
|
1
|
+
from typing import Annotated
|
2
|
+
|
3
|
+
from classiq.open_library.functions.qft_functions import qft
|
4
|
+
from classiq.qmod.builtins.functions.standard_gates import PHASE, H
|
5
|
+
from classiq.qmod.builtins.operations import bind, repeat, within_apply
|
6
|
+
from classiq.qmod.cparam import CInt
|
7
|
+
from classiq.qmod.qfunc import qfunc
|
8
|
+
from classiq.qmod.qmod_variable import QArray, QBit, QCallable, QNum
|
9
|
+
from classiq.qmod.quantum_callable import QCallableList
|
10
|
+
from classiq.qmod.symbolic import pi
|
11
|
+
|
12
|
+
|
13
|
+
@qfunc
|
14
|
+
def apply_to_all(
|
15
|
+
gate_operand: QCallable[Annotated[QBit, "target"]], target: QArray[QBit]
|
16
|
+
) -> None:
|
17
|
+
"""
|
18
|
+
[Qmod Classiq-library function]
|
19
|
+
|
20
|
+
Applies the single-qubit operand `gate_operand` to each qubit in the qubit
|
21
|
+
array `target`.
|
22
|
+
|
23
|
+
Args:
|
24
|
+
gate_operand: The single-qubit gate to apply to each qubit in the array.
|
25
|
+
target: The qubit array to apply the gate to.
|
26
|
+
"""
|
27
|
+
repeat(target.len, lambda index: gate_operand(target[index]))
|
28
|
+
|
29
|
+
|
30
|
+
@qfunc
|
31
|
+
def hadamard_transform(target: QArray[QBit]) -> None:
|
32
|
+
"""
|
33
|
+
[Qmod Classiq-library function]
|
34
|
+
|
35
|
+
Applies Hadamard transform to the target qubits.
|
36
|
+
|
37
|
+
Corresponds to the braket notation:
|
38
|
+
|
39
|
+
$$
|
40
|
+
H^{\\otimes n} |x\rangle = \frac{1}{\\sqrt{2^n}} \\sum_{y=0}^{2^n - 1} (-1)^{x \\cdot y} |y\rangle
|
41
|
+
$$
|
42
|
+
|
43
|
+
Args:
|
44
|
+
target: qubits to apply to Hadamard transform to.
|
45
|
+
|
46
|
+
"""
|
47
|
+
apply_to_all(H, target)
|
48
|
+
|
49
|
+
|
50
|
+
@qfunc
|
51
|
+
def switch(selector: CInt, cases: QCallableList) -> None:
|
52
|
+
cases[selector]()
|
53
|
+
|
54
|
+
|
55
|
+
@qfunc
|
56
|
+
def modular_increment(a: CInt, x: QNum) -> None:
|
57
|
+
"""
|
58
|
+
[Qmod Classiq-library function]
|
59
|
+
|
60
|
+
Adds $a$ to $x$ modulo the range of $x$, assumed that $x$ is a non-negative integer and $a$ is an integer.
|
61
|
+
Mathematically it is described as:
|
62
|
+
|
63
|
+
$$
|
64
|
+
x = (x+a)\\ \\mod \\ 2^{x.size}-1
|
65
|
+
$$
|
66
|
+
|
67
|
+
Args:
|
68
|
+
a: A classical integer to be added to x.
|
69
|
+
x: A quantum number that is assumed to be non-negative integer.
|
70
|
+
|
71
|
+
"""
|
72
|
+
array_cast: QArray = QArray("array_cast")
|
73
|
+
within_apply(
|
74
|
+
lambda: ( # type:ignore[arg-type]
|
75
|
+
bind(x, array_cast), # type:ignore[func-returns-value]
|
76
|
+
qft(array_cast),
|
77
|
+
),
|
78
|
+
lambda: repeat(
|
79
|
+
x.size, lambda i: PHASE(a * 2 * pi * 2**i / (2**x.size), array_cast[i])
|
80
|
+
),
|
81
|
+
)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
from classiq.qmod.builtins.functions.standard_gates import RX, RY, RZ
|
2
|
+
from classiq.qmod.builtins.operations import allocate, repeat
|
3
|
+
from classiq.qmod.cparam import CReal
|
4
|
+
from classiq.qmod.qfunc import qfunc
|
5
|
+
from classiq.qmod.qmod_parameter import CArray
|
6
|
+
from classiq.qmod.qmod_variable import Output, QArray, QBit
|
7
|
+
from classiq.qmod.symbolic import ceiling, floor, pi
|
8
|
+
|
9
|
+
|
10
|
+
@qfunc
|
11
|
+
def encode_in_angle(data: CArray[CReal], qba: Output[QArray[QBit]]) -> None:
|
12
|
+
"""
|
13
|
+
[Qmod Classiq-library function]
|
14
|
+
|
15
|
+
Creates an angle encoding of n data points on n qubits.
|
16
|
+
|
17
|
+
Applies RY($\\pi$data[i]) on qba[i].
|
18
|
+
|
19
|
+
Args:
|
20
|
+
data: A classical array representing the data to encode.
|
21
|
+
qba: The array of qubits on which the data is encoded.
|
22
|
+
"""
|
23
|
+
allocate(data.len, qba)
|
24
|
+
repeat(
|
25
|
+
count=data.len,
|
26
|
+
iteration=lambda index: RY(pi * data[index], qba[index]),
|
27
|
+
)
|
28
|
+
|
29
|
+
|
30
|
+
@qfunc
|
31
|
+
def encode_on_bloch(data: CArray[CReal], qba: Output[QArray]) -> None:
|
32
|
+
"""
|
33
|
+
[Qmod Classiq-library function]
|
34
|
+
|
35
|
+
Creates a dense angle encoding of n data points on n//2 qubits.
|
36
|
+
|
37
|
+
Encodes pairs of data points on a Bloch sphere, via RX($\\pi$data[2*i])RZ($\\pi$data[2*i+1]) on qba[i].
|
38
|
+
If the length of the data is odd then RX($\\pi$data[i]) is applied on the last qubit.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
data: A classical array representing the data to encode.
|
42
|
+
qba: The QArray of QBits on which the data is encoded.
|
43
|
+
"""
|
44
|
+
allocate(ceiling(data.len / 2), qba)
|
45
|
+
repeat(
|
46
|
+
count=ceiling(data.len / 2),
|
47
|
+
iteration=lambda index: RX(pi * data[2 * index], qba[index]),
|
48
|
+
)
|
49
|
+
repeat(
|
50
|
+
count=floor(data.len / 2),
|
51
|
+
iteration=lambda index: RZ(pi * data[2 * index + 1], qba[index]),
|
52
|
+
)
|
classiq/qmod/__init__.py
CHANGED
@@ -1,20 +1,21 @@
|
|
1
|
-
from . import symbolic
|
2
1
|
from .builtins import * # noqa: F403
|
3
2
|
from .builtins import __all__ as _builtins_all
|
4
3
|
from .cfunc import cfunc
|
4
|
+
from .create_model_function import create_model
|
5
5
|
from .expression_query import get_expression_numeric_attributes
|
6
6
|
from .qfunc import qfunc
|
7
7
|
from .qmod_constant import QConstant
|
8
|
-
from .qmod_parameter import Array,
|
9
|
-
from .
|
10
|
-
from .qmod_variable import Input, Output, QArray, QBit, QNum
|
8
|
+
from .qmod_parameter import Array, CArray, CBool, CInt, CReal
|
9
|
+
from .qmod_variable import Input, Output, QArray, QBit, QNum, QStruct
|
11
10
|
from .quantum_callable import QCallable, QCallableList
|
12
|
-
from .quantum_function import create_model
|
13
11
|
from .write_qmod import write_qmod
|
14
12
|
|
15
13
|
__all__ = [
|
16
|
-
"QParam",
|
17
14
|
"Array",
|
15
|
+
"CArray",
|
16
|
+
"CBool",
|
17
|
+
"CInt",
|
18
|
+
"CReal",
|
18
19
|
"Input",
|
19
20
|
"Output",
|
20
21
|
"QArray",
|
@@ -23,11 +24,10 @@ __all__ = [
|
|
23
24
|
"QCallable",
|
24
25
|
"QCallableList",
|
25
26
|
"QConstant",
|
26
|
-
"
|
27
|
-
"qfunc",
|
27
|
+
"QStruct",
|
28
28
|
"cfunc",
|
29
29
|
"create_model",
|
30
|
-
"symbolic",
|
31
|
-
"write_qmod",
|
32
30
|
"get_expression_numeric_attributes",
|
31
|
+
"qfunc",
|
32
|
+
"write_qmod",
|
33
33
|
] + _builtins_all
|
@@ -1,20 +1,37 @@
|
|
1
|
+
from classiq.interface.finance.function_input import FinanceFunctionInput
|
2
|
+
|
1
3
|
from .classical_execution_primitives import * # noqa: F403
|
2
4
|
from .classical_execution_primitives import (
|
3
5
|
__all__ as _builtin_classical_execution_primitives,
|
4
6
|
)
|
5
7
|
from .classical_functions import * # noqa: F403
|
6
8
|
from .classical_functions import __all__ as _builtin_classical_functions
|
9
|
+
from .constants import * # noqa: F403
|
10
|
+
from .constants import __all__ as _builtin_constants
|
11
|
+
from .enums import * # noqa: F403
|
12
|
+
from .enums import __all__ as _builtin_enums
|
7
13
|
from .functions import * # noqa: F403
|
8
14
|
from .functions import __all__ as _builtin_functions
|
9
|
-
from .operations import * # noqa: F403
|
15
|
+
from .operations import * # type:ignore[assignment] # noqa: F403
|
10
16
|
from .operations import __all__ as _builtin_operations
|
11
17
|
from .structs import * # noqa: F403
|
12
18
|
from .structs import __all__ as _builtin_structs
|
13
19
|
|
20
|
+
FinanceFunctionInput.model_rebuild()
|
21
|
+
BUILTIN_CONSTANTS = [
|
22
|
+
constant._get_constant_node()
|
23
|
+
for constant in [
|
24
|
+
SIGNED, # noqa: F405
|
25
|
+
UNSIGNED, # noqa: F405
|
26
|
+
]
|
27
|
+
]
|
28
|
+
|
14
29
|
__all__ = (
|
15
|
-
|
30
|
+
_builtin_enums
|
31
|
+
+ _builtin_structs
|
16
32
|
+ _builtin_functions
|
17
33
|
+ _builtin_operations
|
18
34
|
+ _builtin_classical_execution_primitives
|
19
35
|
+ _builtin_classical_functions
|
36
|
+
+ _builtin_constants
|
20
37
|
)
|
@@ -1,21 +1,28 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Final, Optional, Union
|
2
2
|
|
3
|
+
from classiq.interface.exceptions import ClassiqError
|
3
4
|
from classiq.interface.executor.execution_preferences import QaeWithQpeEstimationMethod
|
4
5
|
from classiq.interface.executor.iqae_result import IQAEResult
|
5
|
-
from classiq.interface.executor.result import
|
6
|
+
from classiq.interface.executor.result import (
|
7
|
+
EstimationResult,
|
8
|
+
EstimationResults,
|
9
|
+
ExecutionDetails,
|
10
|
+
MultipleExecutionDetails,
|
11
|
+
)
|
6
12
|
from classiq.interface.executor.vqe_result import VQESolverResult
|
7
|
-
from classiq.interface.generator.expressions.enums import Optimizer
|
8
13
|
from classiq.interface.generator.functions.qmod_python_interface import QmodPyStruct
|
9
14
|
|
10
15
|
from classiq.applications.qsvm.qsvm import Data, Labels
|
11
|
-
from classiq.
|
16
|
+
from classiq.qmod.builtins.enums import Optimizer
|
12
17
|
|
13
|
-
ExecutionParams =
|
18
|
+
ExecutionParams = dict[str, Union[float, int, list[int], list[float]]]
|
14
19
|
|
15
20
|
_CALL_IN_QFUNC_ERROR = (
|
16
21
|
'Cannot call "{}" in a quantum context. "{}" is a classical execution primitive.'
|
17
22
|
)
|
18
23
|
|
24
|
+
CARRAY_SEPARATOR: Final[str] = "_"
|
25
|
+
|
19
26
|
|
20
27
|
def _raise_error(primitive_name: str) -> None:
|
21
28
|
raise ClassiqError(_CALL_IN_QFUNC_ERROR.format(primitive_name, primitive_name))
|
@@ -31,16 +38,29 @@ def sample( # type: ignore[return]
|
|
31
38
|
_raise_error("sample")
|
32
39
|
|
33
40
|
|
41
|
+
def batch_sample( # type: ignore[return]
|
42
|
+
batch_execution_params: list[ExecutionParams],
|
43
|
+
) -> MultipleExecutionDetails:
|
44
|
+
_raise_error("batch_sample")
|
45
|
+
|
46
|
+
|
34
47
|
def estimate( # type: ignore[return]
|
35
|
-
hamiltonian:
|
48
|
+
hamiltonian: list[QmodPyStruct], execution_params: Optional[ExecutionParams] = None
|
36
49
|
) -> EstimationResult:
|
37
50
|
_raise_error("estimate")
|
38
51
|
|
39
52
|
|
53
|
+
def batch_estimate( # type: ignore[return]
|
54
|
+
hamiltonian: list[QmodPyStruct],
|
55
|
+
batch_execution_params: list[ExecutionParams],
|
56
|
+
) -> EstimationResults:
|
57
|
+
_raise_error("batch_estimate")
|
58
|
+
|
59
|
+
|
40
60
|
def vqe( # type: ignore[return]
|
41
|
-
hamiltonian:
|
61
|
+
hamiltonian: list[QmodPyStruct],
|
42
62
|
maximize: bool,
|
43
|
-
initial_point:
|
63
|
+
initial_point: list[float],
|
44
64
|
optimizer: Optimizer,
|
45
65
|
max_iteration: int,
|
46
66
|
tolerance: float,
|
@@ -85,16 +105,18 @@ def molecule_ground_state_solution_post_process( # type: ignore[return]
|
|
85
105
|
|
86
106
|
__all__ = [
|
87
107
|
"ExecutionParams",
|
88
|
-
"
|
89
|
-
"
|
108
|
+
"batch_estimate",
|
109
|
+
"batch_sample",
|
90
110
|
"estimate",
|
91
|
-
"vqe",
|
92
|
-
"qae_with_qpe_result_post_processing",
|
93
|
-
"qsvm_full_run",
|
94
111
|
"iqae",
|
95
112
|
"molecule_ground_state_solution_post_process",
|
113
|
+
"qae_with_qpe_result_post_processing",
|
114
|
+
"qsvm_full_run",
|
115
|
+
"sample",
|
116
|
+
"save",
|
117
|
+
"vqe",
|
96
118
|
]
|
97
119
|
|
98
120
|
|
99
|
-
def __dir__() ->
|
121
|
+
def __dir__() -> list[str]:
|
100
122
|
return __all__
|