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
@@ -1,102 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
import itertools
|
4
|
-
from typing import Any, Dict, Iterable, List, Tuple
|
5
|
-
|
6
|
-
import pydantic
|
7
|
-
|
8
|
-
from classiq.interface.generator.functions.register import Register, get_register_names
|
9
|
-
from classiq.interface.generator.register_role import RegisterRole as Role
|
10
|
-
from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
|
11
|
-
|
12
|
-
REGISTER_NOT_FOUND_ERROR = "Register name not found"
|
13
|
-
|
14
|
-
|
15
|
-
class RegisterMappingData(pydantic.BaseModel):
|
16
|
-
input_registers: List[Register] = pydantic.Field(default_factory=list)
|
17
|
-
output_registers: List[Register] = pydantic.Field(default_factory=list)
|
18
|
-
zero_input_registers: List[Register] = pydantic.Field(default_factory=list)
|
19
|
-
|
20
|
-
@pydantic.root_validator()
|
21
|
-
def validate_mapping(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
22
|
-
input_registers = values.get("input_registers", list())
|
23
|
-
output_registers = values.get("output_registers", list())
|
24
|
-
zero_input_registers = values.get("zero_input_registers", list())
|
25
|
-
|
26
|
-
input_qubits = cls._get_qubit_range(input_registers)
|
27
|
-
output_qubits = cls._get_qubit_range(output_registers)
|
28
|
-
zero_input_qubits = cls._get_qubit_range(zero_input_registers)
|
29
|
-
|
30
|
-
all_input_qubits = sorted(input_qubits + zero_input_qubits)
|
31
|
-
if not cls._validate_no_overlap(all_input_qubits):
|
32
|
-
raise ValueError("overlapping input qubits are not allowed")
|
33
|
-
if not cls._validate_no_overlap(output_qubits):
|
34
|
-
raise ValueError("overlapping output qubits are not allowed")
|
35
|
-
|
36
|
-
if not output_qubits == all_input_qubits:
|
37
|
-
raise ValueError(
|
38
|
-
"output registers should be included within the input / zero input registers"
|
39
|
-
)
|
40
|
-
|
41
|
-
return values
|
42
|
-
|
43
|
-
@pydantic.validator("input_registers", "output_registers")
|
44
|
-
def validate_input_registers_are_distinct(
|
45
|
-
cls, field_value: List[Register]
|
46
|
-
) -> List[Register]:
|
47
|
-
if len(field_value) != len({io_register.name for io_register in field_value}):
|
48
|
-
raise ValueError("The names of PortDirection registers must be distinct.")
|
49
|
-
return field_value
|
50
|
-
|
51
|
-
@staticmethod
|
52
|
-
def _validate_no_overlap(reg_list: List[int]) -> bool:
|
53
|
-
return len(reg_list) == len(set(reg_list))
|
54
|
-
|
55
|
-
@staticmethod
|
56
|
-
def _get_qubit_range(registers: Iterable[Register]) -> List[int]:
|
57
|
-
return sorted(
|
58
|
-
list(itertools.chain.from_iterable(reg.qubits for reg in registers))
|
59
|
-
)
|
60
|
-
|
61
|
-
@property
|
62
|
-
def input_names(self) -> Iterable[str]:
|
63
|
-
return get_register_names(self.input_registers)
|
64
|
-
|
65
|
-
@property
|
66
|
-
def output_names(self) -> Iterable[str]:
|
67
|
-
return get_register_names(self.output_registers)
|
68
|
-
|
69
|
-
def validate_equal_mappings(self, other: RegisterMappingData) -> None:
|
70
|
-
if any(
|
71
|
-
[
|
72
|
-
self.input_registers != other.input_registers,
|
73
|
-
self.output_registers != other.output_registers,
|
74
|
-
self.zero_input_registers != other.zero_input_registers,
|
75
|
-
]
|
76
|
-
):
|
77
|
-
raise ValueError("Interface should be identical in all implementations")
|
78
|
-
|
79
|
-
def get_input_register(self, name: PydanticNonEmptyString) -> Register:
|
80
|
-
for reg in self.input_registers:
|
81
|
-
if reg.name == name:
|
82
|
-
return reg
|
83
|
-
raise ValueError(REGISTER_NOT_FOUND_ERROR)
|
84
|
-
|
85
|
-
def get_output_register(self, name: PydanticNonEmptyString) -> Register:
|
86
|
-
for reg in self.output_registers:
|
87
|
-
if reg.name == name:
|
88
|
-
return reg
|
89
|
-
raise ValueError(REGISTER_NOT_FOUND_ERROR)
|
90
|
-
|
91
|
-
@staticmethod
|
92
|
-
def from_registers_dict(
|
93
|
-
regs_dict: Dict[Role, Tuple[Register, ...]]
|
94
|
-
) -> RegisterMappingData:
|
95
|
-
return RegisterMappingData(
|
96
|
-
input_registers=list(regs_dict[Role.INPUT]),
|
97
|
-
output_registers=list(regs_dict[Role.OUTPUT]),
|
98
|
-
zero_input_registers=list(regs_dict[Role.ZERO_INPUT]),
|
99
|
-
)
|
100
|
-
|
101
|
-
class Config:
|
102
|
-
extra = "forbid"
|
@@ -1,51 +0,0 @@
|
|
1
|
-
import pydantic
|
2
|
-
|
3
|
-
from classiq.interface.generator import function_params
|
4
|
-
from classiq.interface.generator.arith.argument_utils import RegisterOrConst
|
5
|
-
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
6
|
-
from classiq.interface.generator.parameters import ParameterFloatType
|
7
|
-
|
8
|
-
DATA_REG_INPUT_NAME: str = "data_reg_input"
|
9
|
-
BOUND_REG_INPUT_NAME: str = "bound_reg_input"
|
10
|
-
|
11
|
-
DATA_REG_OUTPUT_NAME: str = "data_reg_output"
|
12
|
-
BOUND_REG_OUTPUT_NAME: str = "bound_reg_output"
|
13
|
-
|
14
|
-
|
15
|
-
class InequalityMixer(function_params.FunctionParams):
|
16
|
-
"""
|
17
|
-
Mixing a fixed point number variable below a given upper bound or above a given
|
18
|
-
lower bound. i.e. after applying this function the variable will hold a
|
19
|
-
superposition position of all the valid values.
|
20
|
-
"""
|
21
|
-
|
22
|
-
data_reg_input: RegisterArithmeticInfo = pydantic.Field(
|
23
|
-
description="The input variable to mix."
|
24
|
-
)
|
25
|
-
|
26
|
-
bound_reg_input: RegisterOrConst = pydantic.Field(
|
27
|
-
description="Fixed number or variable that define the upper or lower bound for"
|
28
|
-
" the mixing operation. In case of a fixed number bound, the value"
|
29
|
-
" must be positive."
|
30
|
-
)
|
31
|
-
|
32
|
-
mixer_parameter: ParameterFloatType = pydantic.Field(
|
33
|
-
description="The parameter used for rotation gates in the mixer.",
|
34
|
-
is_exec_param=True,
|
35
|
-
)
|
36
|
-
|
37
|
-
is_less_inequality: bool = pydantic.Field(
|
38
|
-
default=True,
|
39
|
-
description="Whether to mix below or above a certain bound."
|
40
|
-
"Less inequality mixes between 0 and the given bound."
|
41
|
-
"Greater inequality mixes between the bound and the maximal number allowed by"
|
42
|
-
" the number of qubits (i.e 2^n - 1).",
|
43
|
-
)
|
44
|
-
|
45
|
-
def _create_ios(self) -> None:
|
46
|
-
self._inputs = {DATA_REG_INPUT_NAME: self.data_reg_input}
|
47
|
-
self._outputs = {DATA_REG_OUTPUT_NAME: self.data_reg_input}
|
48
|
-
|
49
|
-
if isinstance(self.bound_reg_input, RegisterArithmeticInfo):
|
50
|
-
self._inputs[BOUND_REG_INPUT_NAME] = self.bound_reg_input
|
51
|
-
self._outputs[BOUND_REG_OUTPUT_NAME] = self.bound_reg_input
|
@@ -1,106 +0,0 @@
|
|
1
|
-
import ast
|
2
|
-
from typing import Dict, List
|
3
|
-
|
4
|
-
from classiq.model.model import DEFAULT_RESULT_NAME
|
5
|
-
|
6
|
-
STANDARD_CMAIN_BODY_LENGTH = 2 # assignment of sample call, save statement
|
7
|
-
|
8
|
-
|
9
|
-
class NonStandardClassicalCodeError(Exception):
|
10
|
-
pass
|
11
|
-
|
12
|
-
|
13
|
-
# `is_standard_cmain` and `extract_sample_params` could easily be merged to one function, as they
|
14
|
-
# are doing similar tasks, but we decided to separate them for the sake of a better interface
|
15
|
-
def is_standard_cmain(model_classical_execution_code: str) -> bool:
|
16
|
-
try:
|
17
|
-
classical_body = _get_classical_body(model_classical_execution_code)
|
18
|
-
if len(classical_body) != STANDARD_CMAIN_BODY_LENGTH:
|
19
|
-
return False
|
20
|
-
|
21
|
-
_assert_sample_call(classical_body)
|
22
|
-
_assert_save_statement(classical_body)
|
23
|
-
|
24
|
-
return True
|
25
|
-
except NonStandardClassicalCodeError:
|
26
|
-
return False
|
27
|
-
|
28
|
-
|
29
|
-
def extract_sample_params(model_classical_execution_code: str) -> Dict[str, float]:
|
30
|
-
classical_main = _get_classical_body(model_classical_execution_code)
|
31
|
-
|
32
|
-
qmain_params: Dict[str, float] = {}
|
33
|
-
sample_call = _get_sample_call(classical_main)
|
34
|
-
if len(sample_call.args) == 1 and isinstance(sample_call.args[0], ast.Dict):
|
35
|
-
ast_dict = sample_call.args[0]
|
36
|
-
qmain_params = dict(
|
37
|
-
zip(
|
38
|
-
[k.value for k in ast_dict.keys if isinstance(k, ast.Constant)],
|
39
|
-
[v.value for v in ast_dict.values if isinstance(v, ast.Constant)],
|
40
|
-
)
|
41
|
-
)
|
42
|
-
|
43
|
-
return qmain_params
|
44
|
-
|
45
|
-
|
46
|
-
def has_classical_exec(model_classical_execution_code: str) -> bool:
|
47
|
-
return model_classical_execution_code != ""
|
48
|
-
|
49
|
-
|
50
|
-
def _get_classical_body(model_classical_execution_code: str) -> List[ast.stmt]:
|
51
|
-
if not has_classical_exec(model_classical_execution_code):
|
52
|
-
raise NonStandardClassicalCodeError
|
53
|
-
return ast.parse(model_classical_execution_code).body
|
54
|
-
|
55
|
-
|
56
|
-
def _assert_sample_call(classical_body: List[ast.stmt]) -> None:
|
57
|
-
_get_sample_call(classical_body)
|
58
|
-
|
59
|
-
|
60
|
-
def _get_sample_call(
|
61
|
-
classical_body: List[ast.stmt],
|
62
|
-
) -> ast.Call:
|
63
|
-
classical_call = classical_body[0]
|
64
|
-
if not isinstance(classical_call, ast.Assign):
|
65
|
-
raise NonStandardClassicalCodeError
|
66
|
-
|
67
|
-
if len(classical_call.targets) != 1:
|
68
|
-
raise NonStandardClassicalCodeError
|
69
|
-
target = classical_call.targets[0]
|
70
|
-
if not isinstance(target, ast.Name) or target.id != DEFAULT_RESULT_NAME:
|
71
|
-
raise NonStandardClassicalCodeError
|
72
|
-
|
73
|
-
invoked_expression = classical_call.value
|
74
|
-
if not isinstance(invoked_expression, ast.Call):
|
75
|
-
raise NonStandardClassicalCodeError
|
76
|
-
if (
|
77
|
-
not isinstance(invoked_expression.func, ast.Name)
|
78
|
-
or invoked_expression.func.id != "sample"
|
79
|
-
):
|
80
|
-
raise NonStandardClassicalCodeError
|
81
|
-
|
82
|
-
return invoked_expression
|
83
|
-
|
84
|
-
|
85
|
-
def _assert_save_statement(classical_body: List[ast.stmt]) -> None:
|
86
|
-
save_statement = classical_body[1]
|
87
|
-
if not isinstance(save_statement, ast.Expr) or not isinstance(
|
88
|
-
save_statement.value, ast.Call
|
89
|
-
):
|
90
|
-
raise NonStandardClassicalCodeError
|
91
|
-
|
92
|
-
call = save_statement.value
|
93
|
-
if not isinstance(call.func, ast.Name) or call.func.id != "save":
|
94
|
-
raise NonStandardClassicalCodeError
|
95
|
-
|
96
|
-
if not len(call.args) == 1:
|
97
|
-
raise NonStandardClassicalCodeError
|
98
|
-
|
99
|
-
if (
|
100
|
-
not isinstance(call.args[0], ast.Dict)
|
101
|
-
or not isinstance(call.args[0].keys[0], ast.Constant)
|
102
|
-
or call.args[0].keys[0].value != DEFAULT_RESULT_NAME
|
103
|
-
or not isinstance(call.args[0].values[0], ast.Name)
|
104
|
-
or call.args[0].values[0].id != DEFAULT_RESULT_NAME
|
105
|
-
):
|
106
|
-
raise NonStandardClassicalCodeError
|
@@ -1,56 +0,0 @@
|
|
1
|
-
import pydantic
|
2
|
-
|
3
|
-
from classiq.interface.generator.arith.argument_utils import RegisterOrConst
|
4
|
-
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
5
|
-
from classiq.interface.generator.function_params import FunctionParams
|
6
|
-
from classiq.interface.generator.parameters import ParameterFloatType
|
7
|
-
|
8
|
-
DATA_REG_INPUT_NAME: str = "data_reg_input"
|
9
|
-
LOWER_BOUND_REG_INPUT_NAME: str = "lower_bound_reg_input"
|
10
|
-
UPPER_BOUND_REG_INPUT_NAME: str = "upper_bound_reg_input"
|
11
|
-
|
12
|
-
|
13
|
-
DATA_REG_OUTPUT_NAME: str = "data_reg_output"
|
14
|
-
LOWER_BOUND_REG_OUTPUT_NAME: str = "lower_bound_reg_output"
|
15
|
-
UPPER_BOUND_REG_OUTPUT_NAME: str = "upper_bound_reg_output"
|
16
|
-
|
17
|
-
|
18
|
-
class RangeMixer(FunctionParams):
|
19
|
-
"""
|
20
|
-
Mixing a fixed point number variable between a given lower and upper bounds.
|
21
|
-
I.e. after applying this function the variable will hold a
|
22
|
-
superposition of all the valid values.
|
23
|
-
"""
|
24
|
-
|
25
|
-
data_reg_input: RegisterArithmeticInfo = pydantic.Field(
|
26
|
-
description="The input variable to mix."
|
27
|
-
)
|
28
|
-
|
29
|
-
lower_bound_reg_input: RegisterOrConst = pydantic.Field(
|
30
|
-
description="Fixed number or variable that define the lower bound for"
|
31
|
-
" the mixing operation. In case of a fixed number bound, the value"
|
32
|
-
" must be positive."
|
33
|
-
)
|
34
|
-
|
35
|
-
upper_bound_reg_input: RegisterOrConst = pydantic.Field(
|
36
|
-
description="Fixed number or variable that define the upper bound for"
|
37
|
-
" the mixing operation. In case of a fixed number bound, the value"
|
38
|
-
" must be positive."
|
39
|
-
)
|
40
|
-
|
41
|
-
mixer_parameter: ParameterFloatType = pydantic.Field(
|
42
|
-
description="The parameter used for rotation gates in the mixer.",
|
43
|
-
is_exec_param=True,
|
44
|
-
)
|
45
|
-
|
46
|
-
def _create_ios(self) -> None:
|
47
|
-
self._inputs = {DATA_REG_INPUT_NAME: self.data_reg_input}
|
48
|
-
self._outputs = {DATA_REG_OUTPUT_NAME: self.data_reg_input}
|
49
|
-
|
50
|
-
if isinstance(self.lower_bound_reg_input, RegisterArithmeticInfo):
|
51
|
-
self._inputs[LOWER_BOUND_REG_INPUT_NAME] = self.lower_bound_reg_input
|
52
|
-
self._outputs[LOWER_BOUND_REG_OUTPUT_NAME] = self.lower_bound_reg_input
|
53
|
-
|
54
|
-
if isinstance(self.upper_bound_reg_input, RegisterArithmeticInfo):
|
55
|
-
self._inputs[UPPER_BOUND_REG_INPUT_NAME] = self.upper_bound_reg_input
|
56
|
-
self._outputs[UPPER_BOUND_REG_OUTPUT_NAME] = self.upper_bound_reg_input
|
@@ -1,63 +0,0 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
|
-
import numpy as np
|
4
|
-
import pydantic
|
5
|
-
|
6
|
-
from classiq.interface.generator import function_params
|
7
|
-
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
8
|
-
from classiq.interface.generator.complex_type import Complex
|
9
|
-
from classiq.interface.generator.function_params import (
|
10
|
-
DEFAULT_INPUT_NAME,
|
11
|
-
DEFAULT_OUTPUT_NAME,
|
12
|
-
)
|
13
|
-
|
14
|
-
|
15
|
-
class StatePropagator(function_params.FunctionParams):
|
16
|
-
"""
|
17
|
-
Creates a quantum circuit that propagates the start state vector to the end state vector,
|
18
|
-
both are assumed to be pure states.
|
19
|
-
The default start state vector is |000...0>.
|
20
|
-
"""
|
21
|
-
|
22
|
-
end_state_vector: List[Complex] = pydantic.Field(
|
23
|
-
description="The desired state vector at the end of the operator."
|
24
|
-
" Must be of size 2**num_qubits. Does not have to be "
|
25
|
-
"normalized"
|
26
|
-
)
|
27
|
-
|
28
|
-
start_state_vector: List[Complex] = pydantic.Field(
|
29
|
-
default_factory=list,
|
30
|
-
description="The state vector at the input of the operator."
|
31
|
-
" Must be of size 2**num_qubits. Does not have to be"
|
32
|
-
" normalized",
|
33
|
-
)
|
34
|
-
|
35
|
-
@pydantic.validator("start_state_vector", always=True)
|
36
|
-
def validate_start_state(cls, start_state_vector, values):
|
37
|
-
end_state_vector = values.get("end_state_vector")
|
38
|
-
num_qubits = cls._num_qubits(end_state_vector)
|
39
|
-
if len(start_state_vector) == 0:
|
40
|
-
default_start_state_vector = [0.0 for _ in range(2**num_qubits)]
|
41
|
-
default_start_state_vector[0] = 1.0
|
42
|
-
start_state_vector = default_start_state_vector
|
43
|
-
|
44
|
-
if len(start_state_vector) != len(end_state_vector):
|
45
|
-
raise ValueError("Start and end state vectors are of non-equal length")
|
46
|
-
|
47
|
-
return start_state_vector
|
48
|
-
|
49
|
-
@staticmethod
|
50
|
-
def _num_qubits(vector: List[Complex]) -> int:
|
51
|
-
return int(np.log2(len(vector)))
|
52
|
-
|
53
|
-
def _create_ios(self) -> None:
|
54
|
-
self._inputs = {
|
55
|
-
DEFAULT_INPUT_NAME: RegisterArithmeticInfo(
|
56
|
-
size=self._num_qubits(self.start_state_vector)
|
57
|
-
)
|
58
|
-
}
|
59
|
-
self._outputs = {
|
60
|
-
DEFAULT_OUTPUT_NAME: RegisterArithmeticInfo(
|
61
|
-
size=self._num_qubits(self.end_state_vector)
|
62
|
-
)
|
63
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
import functools
|
2
|
-
|
3
|
-
from classiq.interface.generator.functions.classical_type import (
|
4
|
-
ClassicalList,
|
5
|
-
Pauli,
|
6
|
-
Real,
|
7
|
-
Struct,
|
8
|
-
)
|
9
|
-
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
10
|
-
from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
|
11
|
-
|
12
|
-
PAULI_TERM = StructDeclaration(
|
13
|
-
name="PauliTerm",
|
14
|
-
variables={
|
15
|
-
"pauli": ClassicalList(element_type=Pauli()),
|
16
|
-
"coefficient": Real(),
|
17
|
-
},
|
18
|
-
)
|
19
|
-
|
20
|
-
Hamiltonian = functools.partial(ClassicalList, element_type=Struct(name="PauliTerm"))
|
21
|
-
|
22
|
-
StructDeclaration.BUILTIN_STRUCT_DECLARATIONS.update(nameables_to_dict([PAULI_TERM]))
|
@@ -1,23 +0,0 @@
|
|
1
|
-
from classiq.interface.generator.functions.classical_function_declaration import (
|
2
|
-
ClassicalFunctionDeclaration,
|
3
|
-
)
|
4
|
-
from classiq.interface.generator.functions.classical_type import (
|
5
|
-
ClassicalList,
|
6
|
-
Integer,
|
7
|
-
Real,
|
8
|
-
Struct,
|
9
|
-
)
|
10
|
-
from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
|
11
|
-
|
12
|
-
COMPUTE_QAOA_INITIAL_POINT = ClassicalFunctionDeclaration(
|
13
|
-
name="compute_qaoa_initial_point",
|
14
|
-
param_decls={
|
15
|
-
"hamiltonian": ClassicalList(element_type=Struct(name="PauliTerm")),
|
16
|
-
"repetitions": Integer(),
|
17
|
-
},
|
18
|
-
return_type=ClassicalList(element_type=Real()),
|
19
|
-
)
|
20
|
-
|
21
|
-
ClassicalFunctionDeclaration.FOREIGN_FUNCTION_DECLARATIONS.update(
|
22
|
-
nameables_to_dict([COMPUTE_QAOA_INITIAL_POINT])
|
23
|
-
)
|
@@ -1,26 +0,0 @@
|
|
1
|
-
from enum import Enum
|
2
|
-
from typing import List
|
3
|
-
|
4
|
-
import pydantic
|
5
|
-
|
6
|
-
from classiq.interface.generator.expressions.expression import Expression
|
7
|
-
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
8
|
-
|
9
|
-
|
10
|
-
class ObjectiveType(Enum):
|
11
|
-
Min = "Min"
|
12
|
-
Max = "Max"
|
13
|
-
|
14
|
-
|
15
|
-
class CombinatorialOptimizationStructDeclaration(StructDeclaration):
|
16
|
-
variable_lower_bound: int = pydantic.Field(default=0)
|
17
|
-
variable_upper_bound: int = pydantic.Field(default=1)
|
18
|
-
constraints: List[Expression] = pydantic.Field(
|
19
|
-
default_factory=list, description="List of constraint expressions"
|
20
|
-
)
|
21
|
-
objective_type: ObjectiveType = pydantic.Field(
|
22
|
-
description="Specify whether the optimization problem is Min or Max"
|
23
|
-
)
|
24
|
-
objective_function: Expression = pydantic.Field(
|
25
|
-
description="The expression to optimize, according to the objective type"
|
26
|
-
)
|
classiq/interface/ide/show.py
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
import re
|
2
|
-
|
3
|
-
import pydantic
|
4
|
-
|
5
|
-
from classiq.interface.analyzer.result import QasmCode
|
6
|
-
|
7
|
-
from classiq import GeneratedCircuit
|
8
|
-
from classiq._internals.api_wrapper import ApiWrapper
|
9
|
-
from classiq._internals.async_utils import syncify_function
|
10
|
-
from classiq.exceptions import ClassiqValueError
|
11
|
-
from classiq.synthesis import SerializedQuantumProgram
|
12
|
-
|
13
|
-
QASM_VERSION_REGEX = re.compile("OPENQASM (\\d*.\\d*);")
|
14
|
-
|
15
|
-
|
16
|
-
async def qasm_show_interactive_async(qasm_code: str) -> None:
|
17
|
-
circuit = await ApiWrapper.get_generated_circuit_from_qasm(QasmCode(code=qasm_code))
|
18
|
-
circuit.show() # type: ignore[attr-defined]
|
19
|
-
|
20
|
-
|
21
|
-
qasm_show_interactive = syncify_function(qasm_show_interactive_async)
|
22
|
-
|
23
|
-
|
24
|
-
CANT_PARSE_QUANTUM_PROGRAM_MSG = (
|
25
|
-
"Can not parse quantum_program into GeneratedCircuit, \n"
|
26
|
-
)
|
27
|
-
|
28
|
-
|
29
|
-
def show(quantum_program: SerializedQuantumProgram) -> None:
|
30
|
-
try:
|
31
|
-
circuit = GeneratedCircuit.parse_raw(quantum_program)
|
32
|
-
except pydantic.error_wrappers.ValidationError as exc:
|
33
|
-
raise ClassiqValueError(CANT_PARSE_QUANTUM_PROGRAM_MSG) from exc
|
34
|
-
circuit.show() # type: ignore[attr-defined]
|
@@ -1,23 +0,0 @@
|
|
1
|
-
from typing import TypeVar, Union
|
2
|
-
|
3
|
-
from pydantic import BaseModel
|
4
|
-
|
5
|
-
from classiq.interface.generator.model.model import (
|
6
|
-
SerializedModel as SerializedSynthesisModel,
|
7
|
-
SynthesisModel,
|
8
|
-
)
|
9
|
-
from classiq.interface.model.model import (
|
10
|
-
Model as UserModel,
|
11
|
-
SerializedModel as SerializedUserModel,
|
12
|
-
)
|
13
|
-
|
14
|
-
ModelInput = Union[UserModel, SynthesisModel]
|
15
|
-
|
16
|
-
|
17
|
-
class ModelRoot(BaseModel):
|
18
|
-
__root__: ModelInput
|
19
|
-
|
20
|
-
|
21
|
-
SerializedModelInput = TypeVar(
|
22
|
-
"SerializedModelInput", SerializedSynthesisModel, SerializedUserModel
|
23
|
-
)
|
@@ -1,25 +0,0 @@
|
|
1
|
-
from typing import Mapping
|
2
|
-
|
3
|
-
import pydantic
|
4
|
-
|
5
|
-
from classiq.interface.generator.expressions.expression import Expression
|
6
|
-
from classiq.interface.model.handle_binding import HandleBinding
|
7
|
-
from classiq.interface.model.quantum_statement import QuantumOperation
|
8
|
-
|
9
|
-
from classiq.exceptions import ClassiqValueError
|
10
|
-
|
11
|
-
|
12
|
-
class NumericReinterpretationOperation(QuantumOperation):
|
13
|
-
target: HandleBinding
|
14
|
-
fraction_digits: Expression
|
15
|
-
is_signed: Expression
|
16
|
-
|
17
|
-
@property
|
18
|
-
def wiring_inouts(self) -> Mapping[str, HandleBinding]:
|
19
|
-
return {"target": self.target}
|
20
|
-
|
21
|
-
@pydantic.validator("target")
|
22
|
-
def validate_handle(cls, handle: HandleBinding) -> HandleBinding:
|
23
|
-
if not handle.is_bindable():
|
24
|
-
raise ClassiqValueError(f"Cannot bind '{handle}'") # noqa: B907
|
25
|
-
return handle
|
@@ -1,48 +0,0 @@
|
|
1
|
-
from typing import Any, Dict, Optional
|
2
|
-
|
3
|
-
from classiq.interface.generator.control_state import ControlState
|
4
|
-
|
5
|
-
|
6
|
-
class OperatorSynthesisData:
|
7
|
-
@property
|
8
|
-
def call_kwargs(self) -> Dict[str, Any]:
|
9
|
-
return dict()
|
10
|
-
|
11
|
-
|
12
|
-
class PowerOperatorSynthesisData(OperatorSynthesisData):
|
13
|
-
def __init__(self, power: int) -> None:
|
14
|
-
self._power = power
|
15
|
-
|
16
|
-
@property
|
17
|
-
def call_kwargs(self) -> Dict[str, Any]:
|
18
|
-
return {"power": self._power}
|
19
|
-
|
20
|
-
|
21
|
-
class InvertOperatorSynthesisData(OperatorSynthesisData):
|
22
|
-
@property
|
23
|
-
def call_kwargs(self) -> Dict[str, Any]:
|
24
|
-
return {"is_inverse": True}
|
25
|
-
|
26
|
-
|
27
|
-
class ControlOperatorSynthesisData(OperatorSynthesisData):
|
28
|
-
_CTRL_VAR_NAME = "ctrl"
|
29
|
-
|
30
|
-
def __init__(self, ctrl_size: int, ctrl_state: Optional[str] = None) -> None:
|
31
|
-
ctrl_state_kwargs = dict()
|
32
|
-
if ctrl_state is not None:
|
33
|
-
ctrl_state_kwargs["ctrl_state"] = ctrl_state
|
34
|
-
self._ctrl_state = ControlState(
|
35
|
-
name=self._CTRL_VAR_NAME, num_ctrl_qubits=ctrl_size, **ctrl_state_kwargs
|
36
|
-
)
|
37
|
-
|
38
|
-
@property
|
39
|
-
def call_kwargs(self) -> Dict[str, Any]:
|
40
|
-
return {
|
41
|
-
"control_states": [self._ctrl_state],
|
42
|
-
}
|
43
|
-
|
44
|
-
|
45
|
-
class ComputeOperatorSynthesisData(OperatorSynthesisData):
|
46
|
-
@property
|
47
|
-
def call_kwargs(self) -> Dict[str, Any]:
|
48
|
-
return {"should_control": False}
|
@@ -1,38 +0,0 @@
|
|
1
|
-
from classiq.exceptions import ClassiqValueError
|
2
|
-
|
3
|
-
|
4
|
-
def min_unsigned_bit_length(number: int) -> int:
|
5
|
-
if number < 0:
|
6
|
-
raise ClassiqValueError(
|
7
|
-
f"Quantum register is not signed but control value " # noqa: B907
|
8
|
-
f"'{number}' is negative"
|
9
|
-
)
|
10
|
-
return 1 if number == 0 else number.bit_length()
|
11
|
-
|
12
|
-
|
13
|
-
def min_signed_bit_length(number: int) -> int:
|
14
|
-
pos_val = abs(number)
|
15
|
-
is_whole = pos_val & (pos_val - 1) == 0
|
16
|
-
if number <= 0 and is_whole:
|
17
|
-
return min_unsigned_bit_length(pos_val)
|
18
|
-
return min_unsigned_bit_length(pos_val) + 1
|
19
|
-
|
20
|
-
|
21
|
-
def min_bit_length(number: int, is_signed: bool) -> int:
|
22
|
-
return (
|
23
|
-
min_signed_bit_length(number) if is_signed else min_unsigned_bit_length(number)
|
24
|
-
)
|
25
|
-
|
26
|
-
|
27
|
-
def to_twos_complement(value: int, bits: int, is_signed: bool) -> str:
|
28
|
-
required_bits = min_bit_length(value, is_signed)
|
29
|
-
if bits < required_bits:
|
30
|
-
raise ClassiqValueError(
|
31
|
-
f"Cannot express '{value}' using {bits} bits: " # noqa: B907
|
32
|
-
f"at least {required_bits} bits are required"
|
33
|
-
)
|
34
|
-
if value >= 0:
|
35
|
-
return bin(value)[2:].zfill(bits)[::-1]
|
36
|
-
mask = (1 << bits) - 1
|
37
|
-
value = (abs(value) ^ mask) + 1
|
38
|
-
return bin(value)[:1:-1].rjust(bits, "1")
|