classiq 0.38.0__py3-none-any.whl → 0.65.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +47 -32
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
- classiq/_internals/api_wrapper.py +235 -97
- classiq/_internals/async_utils.py +1 -3
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +10 -5
- classiq/_internals/authentication/password_manager.py +18 -6
- classiq/_internals/authentication/token_manager.py +10 -5
- classiq/_internals/client.py +94 -33
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +60 -57
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +24 -19
- classiq/analyzer/analyzer_utilities.py +10 -10
- classiq/analyzer/rb.py +15 -15
- classiq/analyzer/show_interactive_hack.py +27 -4
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
- classiq/applications/combinatorial_optimization/__init__.py +20 -6
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
- classiq/applications/grover/__init__.py +9 -0
- classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +6 -6
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +5 -5
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +3 -6
- classiq/applications/qsvm/qsvm_data_generation.py +3 -3
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +20 -115
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +43 -13
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +28 -32
- classiq/interface/applications/qsvm.py +20 -29
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -121
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +25 -22
- classiq/interface/backend/quantum_backend_providers.py +69 -16
- classiq/interface/chemistry/fermionic_operator.py +30 -21
- classiq/interface/chemistry/ground_state_problem.py +28 -25
- classiq/interface/chemistry/molecule.py +14 -10
- classiq/interface/chemistry/operator.py +64 -231
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/{exceptions.py → interface/exceptions.py} +37 -9
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/execution_preferences.py +26 -114
- classiq/interface/executor/execution_request.py +24 -46
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +17 -14
- classiq/interface/executor/quantum_code.py +28 -24
- classiq/interface/executor/quantum_instruction_set.py +2 -2
- classiq/interface/executor/register_initialization.py +11 -14
- classiq/interface/executor/result.py +83 -56
- classiq/interface/executor/vqe_result.py +10 -10
- classiq/interface/finance/function_input.py +35 -25
- classiq/interface/finance/gaussian_model_input.py +5 -5
- classiq/interface/finance/log_normal_model_input.py +4 -4
- classiq/interface/finance/model_input.py +4 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +22 -12
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +46 -5
- classiq/interface/generator/arith/arithmetic.py +35 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
- classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
- classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
- classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
- classiq/interface/generator/arith/arithmetic_operations.py +14 -6
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
- classiq/interface/generator/arith/binary_ops.py +218 -130
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -25
- classiq/interface/generator/arith/logical_ops.py +14 -12
- classiq/interface/generator/arith/number_utils.py +12 -6
- classiq/interface/generator/arith/register_user_input.py +60 -37
- classiq/interface/generator/arith/unary_ops.py +49 -29
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +3 -3
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
- classiq/interface/generator/compiler_keywords.py +5 -1
- classiq/interface/generator/complex_type.py +13 -18
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +34 -29
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +5 -5
- classiq/interface/generator/expressions/expression.py +26 -14
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
- classiq/interface/generator/finance.py +2 -2
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +36 -64
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +153 -20
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -25
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
- classiq/interface/generator/hardware/hardware_data.py +72 -34
- classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
- classiq/interface/generator/hartree_fock.py +13 -5
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +32 -20
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +17 -15
- classiq/interface/generator/mcx.py +24 -17
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +26 -8
- classiq/interface/generator/model/model.py +27 -190
- classiq/interface/generator/model/preferences/preferences.py +115 -41
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +15 -13
- classiq/interface/generator/oracles/oracle_abc.py +7 -7
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +41 -30
- classiq/interface/generator/qsvm.py +9 -10
- classiq/interface/generator/quantum_function_call.py +88 -73
- classiq/interface/generator/quantum_program.py +41 -24
- classiq/interface/generator/range_types.py +11 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +5 -5
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +4 -7
- classiq/interface/generator/state_preparation/state_preparation.py +25 -20
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +7 -11
- classiq/interface/generator/ucc.py +5 -4
- classiq/interface/generator/unitary_gate.py +5 -5
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +7 -7
- classiq/interface/generator/validations/validator_functions.py +4 -4
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +29 -8
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +2 -2
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -5
- classiq/interface/helpers/validation_helpers.py +3 -20
- classiq/interface/helpers/versioned_model.py +1 -4
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +29 -69
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +32 -9
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +29 -24
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +69 -61
- classiq/interface/model/native_function_definition.py +17 -20
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +141 -343
- classiq/interface/model/quantum_function_declaration.py +190 -157
- classiq/interface/model/quantum_lambda_function.py +33 -32
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +177 -40
- classiq/interface/model/quantum_variable_declaration.py +3 -25
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +40 -14
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +7 -5
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +17 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +10 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +36 -14
- classiq/qmod/builtins/classical_functions.py +39 -43
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +373 -40
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +2 -2
- classiq/qmod/classical_function.py +4 -8
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +143 -101
- classiq/qmod/expression_query.py +20 -4
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +18 -6
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +16 -11
- classiq/qmod/native/pretty_printer.py +187 -97
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +60 -8
- classiq/qmod/qmod_constant.py +93 -26
- classiq/qmod/qmod_parameter.py +68 -59
- classiq/qmod/qmod_variable.py +468 -155
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +269 -96
- classiq/qmod/quantum_function.py +196 -41
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +147 -123
- classiq/qmod/symbolic_expr.py +27 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +98 -4
- classiq/qmod/write_qmod.py +17 -3
- classiq/synthesis.py +210 -22
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
- classiq-0.65.4.dist-info/RECORD +521 -0
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -25
- classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
- classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
- classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/interface/executor/aws_execution_cost.py +0 -73
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
- classiq/interface/generator/functions/foreign_function_definition.py +0 -114
- classiq/interface/generator/functions/function_implementation.py +0 -107
- classiq/interface/generator/functions/native_function_definition.py +0 -155
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -44
- classiq/interface/generator/functions/register_mapping_data.py +0 -106
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -74
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/call_synthesis_data.py +0 -68
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -94
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -156
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -462
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -229
- classiq/qmod/builtins/functions.py +0 -913
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -205
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.38.0.dist-info/RECORD +0 -454
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
- /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
- /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
- /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,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,74 +0,0 @@
|
|
1
|
-
from typing import Any, Dict, 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
|
-
from classiq.exceptions import ClassiqValueError
|
15
|
-
|
16
|
-
|
17
|
-
class StatePropagator(function_params.FunctionParams):
|
18
|
-
"""
|
19
|
-
Creates a quantum circuit that propagates the start state vector to the end state vector,
|
20
|
-
both are assumed to be pure states.
|
21
|
-
The default start state vector is |000...0>.
|
22
|
-
"""
|
23
|
-
|
24
|
-
end_state_vector: List[Complex] = pydantic.Field(
|
25
|
-
description="The desired state vector at the end of the operator."
|
26
|
-
" Must be of size 2**num_qubits. Does not have to be "
|
27
|
-
"normalized"
|
28
|
-
)
|
29
|
-
|
30
|
-
start_state_vector: List[Complex] = pydantic.Field(
|
31
|
-
default_factory=list,
|
32
|
-
description="The state vector at the input of the operator."
|
33
|
-
" Must be of size 2**num_qubits. Does not have to be"
|
34
|
-
" normalized",
|
35
|
-
)
|
36
|
-
|
37
|
-
@pydantic.validator("start_state_vector", always=True)
|
38
|
-
def validate_start_state(
|
39
|
-
cls, start_state_vector: List[Complex], values: Dict[str, Any]
|
40
|
-
) -> List[Complex]:
|
41
|
-
end_state_vector = values.get("end_state_vector")
|
42
|
-
if end_state_vector is None:
|
43
|
-
raise ClassiqValueError(
|
44
|
-
"Cannot validate start_start_vector without end_state_vector"
|
45
|
-
)
|
46
|
-
|
47
|
-
num_qubits = cls._num_qubits(end_state_vector)
|
48
|
-
if len(start_state_vector) == 0:
|
49
|
-
default_start_state_vector = [Complex(0.0) for _ in range(2**num_qubits)]
|
50
|
-
default_start_state_vector[0] = Complex(1.0)
|
51
|
-
start_state_vector = default_start_state_vector
|
52
|
-
|
53
|
-
if len(start_state_vector) != len(end_state_vector):
|
54
|
-
raise ClassiqValueError(
|
55
|
-
"Start and end state vectors are of non-equal length"
|
56
|
-
)
|
57
|
-
|
58
|
-
return start_state_vector
|
59
|
-
|
60
|
-
@staticmethod
|
61
|
-
def _num_qubits(vector: List[Complex]) -> int:
|
62
|
-
return int(np.log2(len(vector)))
|
63
|
-
|
64
|
-
def _create_ios(self) -> None:
|
65
|
-
self._inputs = {
|
66
|
-
DEFAULT_INPUT_NAME: RegisterArithmeticInfo(
|
67
|
-
size=self._num_qubits(self.start_state_vector)
|
68
|
-
)
|
69
|
-
}
|
70
|
-
self._outputs = {
|
71
|
-
DEFAULT_OUTPUT_NAME: RegisterArithmeticInfo(
|
72
|
-
size=self._num_qubits(self.end_state_vector)
|
73
|
-
)
|
74
|
-
}
|
@@ -1 +0,0 @@
|
|
1
|
-
from .pauli_struct_declarations import * # noqa: F403
|
@@ -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]))
|
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 QuantumProgram
|
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 = QuantumProgram.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,68 +0,0 @@
|
|
1
|
-
import dataclasses
|
2
|
-
from typing import Any, List, Mapping
|
3
|
-
|
4
|
-
from sympy import sympify
|
5
|
-
|
6
|
-
from classiq.interface.generator.control_state import ControlState
|
7
|
-
from classiq.interface.generator.synthesis_execution_parameter import PydanticPowerType
|
8
|
-
|
9
|
-
from classiq.exceptions import ClassiqValueError
|
10
|
-
|
11
|
-
ILLEGAL_NESTED_POWER_ERROR = "Nested power calls with a parametric power and an integer power are unsupported: {a}, {b}"
|
12
|
-
|
13
|
-
|
14
|
-
def _merge_power(a: PydanticPowerType, b: PydanticPowerType) -> PydanticPowerType:
|
15
|
-
symbolic_res = sympify(a) * sympify(b)
|
16
|
-
if symbolic_res.is_Integer:
|
17
|
-
return int(symbolic_res)
|
18
|
-
elif symbolic_res.is_symbol:
|
19
|
-
return str(symbolic_res)
|
20
|
-
else:
|
21
|
-
raise ClassiqValueError(ILLEGAL_NESTED_POWER_ERROR.format(a=a, b=b))
|
22
|
-
|
23
|
-
|
24
|
-
@dataclasses.dataclass
|
25
|
-
class CallSynthesisData(Mapping):
|
26
|
-
power: PydanticPowerType = 1
|
27
|
-
is_inverse: bool = False
|
28
|
-
control_states: List[ControlState] = dataclasses.field(default_factory=list)
|
29
|
-
should_control: bool = True
|
30
|
-
|
31
|
-
def merge(self, other: "CallSynthesisData") -> "CallSynthesisData":
|
32
|
-
return CallSynthesisData(
|
33
|
-
power=_merge_power(self.power, other.power),
|
34
|
-
is_inverse=self.is_inverse != other.is_inverse,
|
35
|
-
control_states=self.control_states + other.control_states,
|
36
|
-
should_control=self.should_control and other.should_control,
|
37
|
-
)
|
38
|
-
|
39
|
-
def set_control(self, ctrl_name: str, ctrl_size: int) -> None:
|
40
|
-
self.control_states = [
|
41
|
-
ControlState(
|
42
|
-
name=ctrl_name,
|
43
|
-
num_ctrl_qubits=ctrl_size,
|
44
|
-
)
|
45
|
-
]
|
46
|
-
|
47
|
-
def update_control_state(self, ctrl_size: int, ctrl_state: str) -> None:
|
48
|
-
prev_ctrl_state = self.control_states.pop()
|
49
|
-
self.control_states.append(
|
50
|
-
ControlState(
|
51
|
-
name=prev_ctrl_state.name,
|
52
|
-
num_ctrl_qubits=ctrl_size,
|
53
|
-
ctrl_state=ctrl_state,
|
54
|
-
)
|
55
|
-
)
|
56
|
-
|
57
|
-
@property
|
58
|
-
def has_control(self) -> bool:
|
59
|
-
return bool(self.control_states)
|
60
|
-
|
61
|
-
def __getitem__(self, key: str) -> Any:
|
62
|
-
return dataclasses.asdict(self)[key]
|
63
|
-
|
64
|
-
def __iter__(self):
|
65
|
-
return iter(dataclasses.asdict(self))
|
66
|
-
|
67
|
-
def __len__(self):
|
68
|
-
return len(dataclasses.asdict(self))
|
@@ -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,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 "
|
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: "
|
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")
|
@@ -1,94 +0,0 @@
|
|
1
|
-
from typing import TYPE_CHECKING, Optional
|
2
|
-
|
3
|
-
import pydantic
|
4
|
-
from sympy import Equality
|
5
|
-
from sympy.core.numbers import Integer
|
6
|
-
|
7
|
-
from classiq.interface.generator.expressions.expression import Expression
|
8
|
-
from classiq.interface.generator.expressions.qmod_qscalar_proxy import QmodQNumProxy
|
9
|
-
from classiq.interface.model.quantum_expressions.control_state import (
|
10
|
-
min_bit_length,
|
11
|
-
to_twos_complement,
|
12
|
-
)
|
13
|
-
from classiq.interface.model.quantum_expressions.quantum_expression import (
|
14
|
-
QuantumExpressionOperation,
|
15
|
-
)
|
16
|
-
|
17
|
-
from classiq.exceptions import ClassiqValueError
|
18
|
-
|
19
|
-
if TYPE_CHECKING:
|
20
|
-
from classiq.interface.model.quantum_lambda_function import QuantumOperand
|
21
|
-
|
22
|
-
QUANTUM_IF_INOUT_NAME = "ctrl"
|
23
|
-
QUANTUM_IF_CONDITION_ARG_ERROR_MESSAGE_FORMAT = (
|
24
|
-
"quantum_if condition must be of the form '<quantum-variable> == "
|
25
|
-
"<classical-integer-expression>', but condition's {}-hand side was {!r}"
|
26
|
-
)
|
27
|
-
|
28
|
-
|
29
|
-
class QuantumIfOperation(QuantumExpressionOperation):
|
30
|
-
then: "QuantumOperand"
|
31
|
-
_ctrl: Optional[QmodQNumProxy] = pydantic.PrivateAttr(
|
32
|
-
default=None,
|
33
|
-
)
|
34
|
-
_ctrl_val: Optional[int] = pydantic.PrivateAttr(
|
35
|
-
default=None,
|
36
|
-
)
|
37
|
-
|
38
|
-
@property
|
39
|
-
def condition(self) -> Expression:
|
40
|
-
return self.expression
|
41
|
-
|
42
|
-
@property
|
43
|
-
def ctrl(self) -> QmodQNumProxy:
|
44
|
-
assert self._ctrl is not None
|
45
|
-
return self._ctrl
|
46
|
-
|
47
|
-
@property
|
48
|
-
def ctrl_val(self) -> int:
|
49
|
-
assert self._ctrl_val is not None
|
50
|
-
return self._ctrl_val
|
51
|
-
|
52
|
-
def resolve_condition(self) -> None:
|
53
|
-
condition = self.condition.value.value
|
54
|
-
if not isinstance(condition, Equality):
|
55
|
-
raise ClassiqValueError(
|
56
|
-
f"quantum_if condition must be an equality, was {str(condition)!r}"
|
57
|
-
)
|
58
|
-
ctrl, ctrl_val = condition.args
|
59
|
-
if isinstance(ctrl, Integer) and isinstance(ctrl_val, QmodQNumProxy):
|
60
|
-
ctrl, ctrl_val = ctrl_val, ctrl
|
61
|
-
if not isinstance(ctrl, QmodQNumProxy):
|
62
|
-
raise ClassiqValueError(
|
63
|
-
QUANTUM_IF_CONDITION_ARG_ERROR_MESSAGE_FORMAT.format("left", str(ctrl))
|
64
|
-
)
|
65
|
-
if not isinstance(ctrl_val, Integer):
|
66
|
-
raise ClassiqValueError(
|
67
|
-
QUANTUM_IF_CONDITION_ARG_ERROR_MESSAGE_FORMAT.format(
|
68
|
-
"right", str(ctrl_val)
|
69
|
-
)
|
70
|
-
)
|
71
|
-
self._ctrl, self._ctrl_val = ctrl, int(ctrl_val)
|
72
|
-
|
73
|
-
@property
|
74
|
-
def ctrl_state(self) -> str:
|
75
|
-
is_signed = self.ctrl.is_signed
|
76
|
-
fraction_places = self.ctrl.fraction_digits
|
77
|
-
ctrl_size = len(self.ctrl)
|
78
|
-
if not is_signed and self.ctrl_val < 0:
|
79
|
-
raise ClassiqValueError(
|
80
|
-
f"Variable {str(self.ctrl)!r} is not signed but control value "
|
81
|
-
f"{self.ctrl_val} is negative"
|
82
|
-
)
|
83
|
-
required_qubits = min_bit_length(self.ctrl_val, is_signed)
|
84
|
-
if ctrl_size < required_qubits:
|
85
|
-
raise ClassiqValueError(
|
86
|
-
f"Variable {str(self.ctrl)!r} has {ctrl_size} qubits but control value "
|
87
|
-
f"{str(self.ctrl_val)!r} requires at least {required_qubits} qubits"
|
88
|
-
)
|
89
|
-
if fraction_places != 0:
|
90
|
-
raise ClassiqValueError(
|
91
|
-
f"quantum-if on a non-integer quantum variable {str(self.ctrl)!r} is "
|
92
|
-
f"not supported at the moment"
|
93
|
-
)
|
94
|
-
return to_twos_complement(self.ctrl_val, ctrl_size, is_signed)
|
@@ -1,43 +0,0 @@
|
|
1
|
-
from typing import Any, Mapping
|
2
|
-
|
3
|
-
from classiq.interface.generator.visitor import Visitor
|
4
|
-
from classiq.interface.model.native_function_definition import NativeFunctionDefinition
|
5
|
-
from classiq.interface.model.quantum_function_call import QuantumFunctionCall
|
6
|
-
from classiq.interface.model.quantum_function_declaration import (
|
7
|
-
QuantumFunctionDeclaration,
|
8
|
-
)
|
9
|
-
|
10
|
-
|
11
|
-
class FunctionCallResolver(Visitor):
|
12
|
-
def __init__(
|
13
|
-
self,
|
14
|
-
quantum_function_dict: Mapping[str, QuantumFunctionDeclaration],
|
15
|
-
) -> None:
|
16
|
-
self._quantum_function_dict = quantum_function_dict
|
17
|
-
|
18
|
-
def visit_QuantumFunctionCall(self, fc: QuantumFunctionCall) -> None:
|
19
|
-
fc.resolve_function_decl(self._quantum_function_dict, check_operands=True)
|
20
|
-
self.visit_BaseModel(fc)
|
21
|
-
|
22
|
-
def visit_NativeFunctionDefinition(
|
23
|
-
self, func_def: NativeFunctionDefinition
|
24
|
-
) -> None:
|
25
|
-
curr_dict = self._quantum_function_dict
|
26
|
-
self._quantum_function_dict = {
|
27
|
-
**self._quantum_function_dict,
|
28
|
-
**func_def.operand_declarations,
|
29
|
-
}
|
30
|
-
self.visit_BaseModel(func_def)
|
31
|
-
self._quantum_function_dict = curr_dict
|
32
|
-
|
33
|
-
|
34
|
-
def resolve_function_calls(
|
35
|
-
root: Any,
|
36
|
-
quantum_function_dict: Mapping[str, QuantumFunctionDeclaration],
|
37
|
-
) -> None:
|
38
|
-
FunctionCallResolver(
|
39
|
-
{
|
40
|
-
**QuantumFunctionDeclaration.BUILTIN_FUNCTION_DECLARATIONS,
|
41
|
-
**quantum_function_dict,
|
42
|
-
},
|
43
|
-
).visit(root)
|
@@ -1,55 +0,0 @@
|
|
1
|
-
import abc
|
2
|
-
from typing import Dict, Mapping, Type
|
3
|
-
|
4
|
-
from classiq.interface.generator.functions.port_declaration import (
|
5
|
-
PortDeclarationDirection,
|
6
|
-
)
|
7
|
-
from classiq.interface.model.port_declaration import PortDeclaration
|
8
|
-
from classiq.interface.model.validation_handle import HandleState, ValidationHandle
|
9
|
-
|
10
|
-
EXPECTED_TERMINAL_STATES: Dict[PortDeclarationDirection, HandleState] = {
|
11
|
-
PortDeclarationDirection.Output: HandleState.INITIALIZED,
|
12
|
-
PortDeclarationDirection.Inout: HandleState.INITIALIZED,
|
13
|
-
}
|
14
|
-
|
15
|
-
|
16
|
-
class HandleValidationBase(abc.ABC):
|
17
|
-
def __init__(
|
18
|
-
self,
|
19
|
-
port_declarations: Mapping[str, PortDeclaration],
|
20
|
-
) -> None:
|
21
|
-
self._port_declarations = port_declarations.values()
|
22
|
-
|
23
|
-
def report_errored_handles(self, exception_type: Type[Exception]) -> None:
|
24
|
-
self._validate_terminal_handle_state()
|
25
|
-
|
26
|
-
errored_handles = {
|
27
|
-
name: state.errors
|
28
|
-
for name, state in self._validation_handles_state.items()
|
29
|
-
if state.state is HandleState.ERRORED
|
30
|
-
}
|
31
|
-
if errored_handles:
|
32
|
-
raise exception_type(
|
33
|
-
"\n".join(
|
34
|
-
f"Handle {handle_name!r} was errored with {'. '.join(errors)!r}"
|
35
|
-
for handle_name, errors in errored_handles.items()
|
36
|
-
)
|
37
|
-
)
|
38
|
-
|
39
|
-
def _validate_terminal_handle_state(self) -> None:
|
40
|
-
for port_decl in self._port_declarations:
|
41
|
-
handle_state = self._validation_handles_state[port_decl.name]
|
42
|
-
expected_terminal_state = EXPECTED_TERMINAL_STATES.get(port_decl.direction)
|
43
|
-
if (
|
44
|
-
expected_terminal_state is not None
|
45
|
-
and handle_state.state is not expected_terminal_state
|
46
|
-
and handle_state.state is not HandleState.ERRORED
|
47
|
-
):
|
48
|
-
handle_state.append_error(
|
49
|
-
f"At the end of the function, in port {port_decl.name} is expected to be {expected_terminal_state} but it isn't"
|
50
|
-
)
|
51
|
-
|
52
|
-
@property
|
53
|
-
@abc.abstractmethod
|
54
|
-
def _validation_handles_state(self) -> Mapping[str, ValidationHandle]:
|
55
|
-
raise NotImplementedError
|