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,20 +1,17 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
from classiq.interface.generator.model.constraints import (
|
4
2
|
Constraints,
|
5
3
|
OptimizationParameter,
|
6
4
|
TranspilerBasisGates,
|
7
5
|
)
|
8
|
-
from classiq.interface.generator.model.model import SynthesisModel
|
9
6
|
from classiq.interface.generator.model.preferences import (
|
10
7
|
CustomHardwareSettings,
|
11
8
|
Preferences,
|
12
9
|
)
|
13
10
|
|
14
|
-
__all__:
|
11
|
+
__all__: list[str] = [
|
15
12
|
"Constraints",
|
16
|
-
"Preferences",
|
17
13
|
"CustomHardwareSettings",
|
18
14
|
"OptimizationParameter",
|
15
|
+
"Preferences",
|
19
16
|
"TranspilerBasisGates",
|
20
17
|
]
|
@@ -1,14 +1,13 @@
|
|
1
1
|
from collections import defaultdict
|
2
|
-
from typing import
|
2
|
+
from typing import Optional, Union
|
3
3
|
|
4
4
|
import pydantic
|
5
|
-
from pydantic import BaseModel,
|
5
|
+
from pydantic import BaseModel, ConfigDict
|
6
6
|
|
7
|
+
from classiq.interface.enum_utils import StrEnum
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
7
9
|
from classiq.interface.generator.transpiler_basis_gates import TranspilerBasisGates
|
8
10
|
|
9
|
-
from classiq._internals.enum_utils import StrEnum
|
10
|
-
from classiq.exceptions import ClassiqValueError
|
11
|
-
|
12
11
|
UNCONSTRAINED = -1
|
13
12
|
|
14
13
|
|
@@ -30,18 +29,37 @@ def optimization_parameter_type_from_string(param: str) -> OptimizationParameter
|
|
30
29
|
raise ClassiqValueError(f"Invalid OptimizationParameterType {param}")
|
31
30
|
|
32
31
|
|
33
|
-
class Constraints(BaseModel
|
32
|
+
class Constraints(BaseModel):
|
34
33
|
"""
|
35
|
-
|
34
|
+
Constraints for the quantum circuit synthesis engine.
|
35
|
+
|
36
|
+
This class is used to specify constraints such as maximum width, depth,
|
37
|
+
gate count, and optimization parameters for the synthesis engine,
|
38
|
+
guiding the generation of quantum circuits that satisfy these constraints.
|
39
|
+
|
40
|
+
Attributes:
|
41
|
+
max_width (int):
|
42
|
+
Maximum number of qubits allowed in the generated quantum circuit.
|
43
|
+
Defaults to `None`.
|
44
|
+
max_depth (int):
|
45
|
+
Maximum depth of the generated quantum circuit. Defaults to `None`.
|
46
|
+
max_gate_count (Dict[TranspilerBasisGates, int]):
|
47
|
+
A dictionary specifying the maximum allowed count for each type of gate
|
48
|
+
in the quantum circuit. Defaults to an empty dictionary.
|
49
|
+
optimization_parameter (OptimizationParameterType):
|
50
|
+
Determines if and how the synthesis engine should optimize
|
51
|
+
the solution. Defaults to `NO_OPTIMIZATION`. See `OptimizationParameterType`
|
36
52
|
"""
|
37
53
|
|
54
|
+
model_config = ConfigDict(extra="forbid")
|
55
|
+
|
38
56
|
max_width: Optional[pydantic.PositiveInt] = pydantic.Field(
|
39
57
|
default=None,
|
40
58
|
description="Maximum number of qubits in generated quantum circuit",
|
41
59
|
)
|
42
60
|
max_depth: Optional[pydantic.PositiveInt] = None
|
43
61
|
|
44
|
-
max_gate_count:
|
62
|
+
max_gate_count: dict[TranspilerBasisGates, pydantic.NonNegativeInt] = (
|
45
63
|
pydantic.Field(default_factory=lambda: defaultdict(int))
|
46
64
|
)
|
47
65
|
|
@@ -1,71 +1,44 @@
|
|
1
1
|
from abc import ABC
|
2
|
-
from typing import Any, Dict, List, Literal, Mapping, NewType, Optional, Union
|
3
2
|
|
4
3
|
import pydantic
|
5
4
|
|
5
|
+
from classiq.interface.exceptions import ClassiqValueError
|
6
6
|
from classiq.interface.executor.execution_preferences import ExecutionPreferences
|
7
7
|
from classiq.interface.generator.constant import Constant
|
8
|
-
from classiq.interface.generator.function_params import ArithmeticIODict
|
9
|
-
from classiq.interface.generator.
|
10
|
-
|
11
|
-
SynthesisPortDeclaration,
|
12
|
-
SynthesisQuantumFunctionDeclaration,
|
13
|
-
)
|
14
|
-
from classiq.interface.generator.functions.port_declaration import (
|
15
|
-
PortDeclarationDirection,
|
16
|
-
)
|
17
|
-
from classiq.interface.generator.model.constraints import Constraints
|
18
|
-
from classiq.interface.generator.model.preferences.preferences import Preferences
|
19
|
-
from classiq.interface.generator.quantum_function_call import (
|
20
|
-
SUFFIX_RANDOMIZER,
|
21
|
-
SynthesisQuantumFunctionCall,
|
22
|
-
WireDict,
|
23
|
-
WireName,
|
24
|
-
)
|
8
|
+
from classiq.interface.generator.function_params import ArithmeticIODict
|
9
|
+
from classiq.interface.generator.types.enum_declaration import EnumDeclaration
|
10
|
+
from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
|
25
11
|
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
26
|
-
from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
|
27
12
|
from classiq.interface.helpers.validation_helpers import is_list_unique
|
28
13
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
29
|
-
|
30
|
-
from classiq import ForeignFunctionDefinition as SynthesisForeignFunctionDefinition
|
31
|
-
from classiq.exceptions import ClassiqValueError
|
32
|
-
from classiq.quantum_register import QReg, QRegGenericAlias
|
33
|
-
|
34
|
-
MAIN_FUNCTION_NAME = "main"
|
35
|
-
CLASSICAL_ENTRY_FUNCTION_NAME = "cmain"
|
36
|
-
|
37
|
-
DEFAULT_PORT_SIZE = 1
|
38
|
-
|
39
|
-
|
40
|
-
SerializedModel = NewType("SerializedModel", str)
|
41
|
-
|
42
|
-
# We need to define ConcreteFunctionData so pydantic will know
|
43
|
-
# what class to use when deserializing from object (pydantic attempts to
|
44
|
-
# parse as each of the classes in the Union, in order).
|
45
|
-
ConcreteFunctionDefinition = Union[
|
46
|
-
SynthesisForeignFunctionDefinition, SynthesisNativeFunctionDefinition
|
47
|
-
]
|
14
|
+
from classiq.interface.model.quantum_type import RegisterQuantumTypeDict
|
48
15
|
|
49
16
|
TYPE_LIBRARY_DUPLICATED_TYPE_NAMES = (
|
50
17
|
"Cannot have multiple struct types with the same name"
|
51
18
|
)
|
52
19
|
|
53
20
|
|
54
|
-
def _create_default_functions() -> List[ConcreteFunctionDefinition]:
|
55
|
-
return [SynthesisNativeFunctionDefinition(name=MAIN_FUNCTION_NAME)]
|
56
|
-
|
57
|
-
|
58
21
|
class ClassiqBaseModel(VersionedModel, ABC):
|
59
22
|
"""
|
60
23
|
All the relevant data for evaluating execution in one place.
|
61
24
|
"""
|
62
25
|
|
63
|
-
|
26
|
+
enums: list[EnumDeclaration] = pydantic.Field(
|
64
27
|
default_factory=list,
|
65
|
-
description="
|
28
|
+
description="user-defined enums",
|
66
29
|
)
|
67
30
|
|
68
|
-
|
31
|
+
types: list[StructDeclaration] = pydantic.Field(
|
32
|
+
default_factory=list,
|
33
|
+
description="user-defined structs",
|
34
|
+
)
|
35
|
+
|
36
|
+
qstructs: list[QStructDeclaration] = pydantic.Field(
|
37
|
+
default_factory=list,
|
38
|
+
description="user-defined quantum structs",
|
39
|
+
)
|
40
|
+
|
41
|
+
constants: list[Constant] = pydantic.Field(
|
69
42
|
default_factory=list,
|
70
43
|
)
|
71
44
|
|
@@ -77,8 +50,9 @@ class ClassiqBaseModel(VersionedModel, ABC):
|
|
77
50
|
default_factory=ExecutionPreferences
|
78
51
|
)
|
79
52
|
|
80
|
-
@pydantic.
|
81
|
-
|
53
|
+
@pydantic.field_validator("types")
|
54
|
+
@classmethod
|
55
|
+
def types_validator(cls, types: list[StructDeclaration]) -> list[StructDeclaration]:
|
82
56
|
if not is_list_unique([struct_type.name for struct_type in types]):
|
83
57
|
raise ClassiqValueError(TYPE_LIBRARY_DUPLICATED_TYPE_NAMES)
|
84
58
|
|
@@ -90,147 +64,10 @@ class ExecutionModel(ClassiqBaseModel):
|
|
90
64
|
description="Mapping between a measured register name and its arithmetic type",
|
91
65
|
default_factory=dict,
|
92
66
|
)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
kind: Literal["synthesis"] = pydantic.Field(default="synthesis")
|
101
|
-
|
102
|
-
# Must be validated before logic_flow
|
103
|
-
functions: List[ConcreteFunctionDefinition] = pydantic.Field(
|
104
|
-
default_factory=_create_default_functions,
|
105
|
-
description="The quantum functions of the model.",
|
67
|
+
circuit_output_types: RegisterQuantumTypeDict = pydantic.Field(
|
68
|
+
description="Mapping between a measured register name and its qmod type",
|
69
|
+
default=dict(),
|
70
|
+
)
|
71
|
+
register_filter_bitstrings: dict[str, list[str]] = pydantic.Field(
|
72
|
+
default_factory=dict,
|
106
73
|
)
|
107
|
-
|
108
|
-
constraints: Constraints = pydantic.Field(default_factory=Constraints)
|
109
|
-
preferences: Preferences = pydantic.Field(default_factory=Preferences)
|
110
|
-
|
111
|
-
def __init__(
|
112
|
-
self,
|
113
|
-
*,
|
114
|
-
body: Optional[List[SynthesisQuantumFunctionCall]] = None,
|
115
|
-
inputs: Optional[WireDict] = None,
|
116
|
-
outputs: Optional[WireDict] = None,
|
117
|
-
**kwargs: Any,
|
118
|
-
) -> None:
|
119
|
-
super().__init__(**kwargs)
|
120
|
-
if body:
|
121
|
-
self.main_func.body.extend(body)
|
122
|
-
if inputs:
|
123
|
-
self.set_inputs(
|
124
|
-
{
|
125
|
-
name: QRegGenericAlias(
|
126
|
-
QReg(DEFAULT_PORT_SIZE), (DEFAULT_PORT_SIZE, 0)
|
127
|
-
)
|
128
|
-
for name in inputs.keys()
|
129
|
-
},
|
130
|
-
inputs,
|
131
|
-
)
|
132
|
-
if outputs:
|
133
|
-
self.set_outputs(
|
134
|
-
{name: QReg(DEFAULT_PORT_SIZE) for name in outputs.keys()}, outputs
|
135
|
-
)
|
136
|
-
|
137
|
-
@property
|
138
|
-
def main_func(self) -> SynthesisNativeFunctionDefinition:
|
139
|
-
return self.function_dict[MAIN_FUNCTION_NAME] # type:ignore[return-value]
|
140
|
-
|
141
|
-
@property
|
142
|
-
def body(self) -> List[SynthesisQuantumFunctionCall]:
|
143
|
-
return self.main_func.body
|
144
|
-
|
145
|
-
@property
|
146
|
-
def inputs(self) -> WireDict:
|
147
|
-
return self.main_func.input_ports_wiring
|
148
|
-
|
149
|
-
def set_inputs(
|
150
|
-
self,
|
151
|
-
inputs: Mapping[IOName, QRegGenericAlias],
|
152
|
-
input_wiring: Mapping[IOName, WireName],
|
153
|
-
) -> None:
|
154
|
-
self._update_main_declarations(inputs, PortDeclarationDirection.Input)
|
155
|
-
self.main_func.input_ports_wiring.update(input_wiring)
|
156
|
-
|
157
|
-
@property
|
158
|
-
def outputs(self) -> WireDict:
|
159
|
-
return self.main_func.output_ports_wiring
|
160
|
-
|
161
|
-
def set_outputs(
|
162
|
-
self, outputs: Mapping[IOName, QReg], output_wiring: Mapping[IOName, WireName]
|
163
|
-
) -> None:
|
164
|
-
self._update_main_declarations(outputs, PortDeclarationDirection.Output)
|
165
|
-
self.main_func.output_ports_wiring.update(output_wiring)
|
166
|
-
|
167
|
-
@pydantic.validator("preferences", always=True)
|
168
|
-
def _seed_suffix_randomizer(cls, preferences: Preferences) -> Preferences:
|
169
|
-
SUFFIX_RANDOMIZER.seed(preferences.random_seed)
|
170
|
-
return preferences
|
171
|
-
|
172
|
-
def _get_qualified_direction(
|
173
|
-
self, port_name: str, direction: PortDeclarationDirection
|
174
|
-
) -> PortDeclarationDirection:
|
175
|
-
if port_name in self.main_func.port_declarations:
|
176
|
-
return PortDeclarationDirection.Inout
|
177
|
-
return direction
|
178
|
-
|
179
|
-
def _update_main_declarations(
|
180
|
-
self,
|
181
|
-
value: Union[Mapping[IOName, QReg], Mapping[IOName, QRegGenericAlias]],
|
182
|
-
direction: PortDeclarationDirection,
|
183
|
-
) -> None:
|
184
|
-
for port_name, register in value.items():
|
185
|
-
if isinstance(register, QReg):
|
186
|
-
size = len(register)
|
187
|
-
is_signed = getattr(register, "is_signed", False) or False
|
188
|
-
fraction_places = getattr(register, "fraction_places", 0) or 0
|
189
|
-
else:
|
190
|
-
size = register.size if register.size is not None else DEFAULT_PORT_SIZE
|
191
|
-
is_signed = False
|
192
|
-
fraction_places = (
|
193
|
-
register.fraction_places
|
194
|
-
if register.fraction_places is not None
|
195
|
-
else 0
|
196
|
-
)
|
197
|
-
|
198
|
-
self.main_func.port_declarations[port_name] = SynthesisPortDeclaration(
|
199
|
-
name=port_name,
|
200
|
-
size=size,
|
201
|
-
direction=self._get_qualified_direction(port_name, direction),
|
202
|
-
is_signed=is_signed,
|
203
|
-
fraction_places=fraction_places,
|
204
|
-
)
|
205
|
-
|
206
|
-
@property
|
207
|
-
def function_dict(self) -> Dict[str, SynthesisQuantumFunctionDeclaration]:
|
208
|
-
return nameables_to_dict(self.functions)
|
209
|
-
|
210
|
-
@pydantic.validator("functions", each_item=True)
|
211
|
-
def validate_static_correctness(
|
212
|
-
cls, func_def: ConcreteFunctionDefinition
|
213
|
-
) -> ConcreteFunctionDefinition:
|
214
|
-
if isinstance(func_def, SynthesisNativeFunctionDefinition):
|
215
|
-
func_def.validate_body()
|
216
|
-
return func_def
|
217
|
-
|
218
|
-
@pydantic.validator("functions")
|
219
|
-
def validate_main_function_exists(
|
220
|
-
cls, func_defs: List[ConcreteFunctionDefinition]
|
221
|
-
) -> List[ConcreteFunctionDefinition]:
|
222
|
-
if MAIN_FUNCTION_NAME not in {func.name for func in func_defs}:
|
223
|
-
raise ClassiqValueError("The model must contain a `main` function")
|
224
|
-
return func_defs
|
225
|
-
|
226
|
-
def get_model(self) -> SerializedModel:
|
227
|
-
return SerializedModel(self.json(exclude_defaults=True, indent=2))
|
228
|
-
|
229
|
-
def classical_model(self) -> ExecutionModel:
|
230
|
-
return ExecutionModel(
|
231
|
-
types=self.types,
|
232
|
-
constants=self.constants,
|
233
|
-
classical_execution_code=self.classical_execution_code,
|
234
|
-
execution_preferences=self.execution_preferences,
|
235
|
-
circuit_outputs=self.main_func.outputs,
|
236
|
-
)
|
@@ -1,17 +1,24 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Sequence
|
2
|
+
from enum import IntEnum
|
3
|
+
from typing import TYPE_CHECKING, Annotated, Any, Optional, Union
|
2
4
|
|
3
5
|
import pydantic
|
4
|
-
from
|
6
|
+
from pydantic import Field
|
7
|
+
from pydantic_core.core_schema import ValidationInfo
|
8
|
+
from typing_extensions import Self, TypeAlias
|
5
9
|
|
6
10
|
from classiq.interface.backend.backend_preferences import (
|
7
11
|
BackendPreferences,
|
8
|
-
validate_backend_service_provider,
|
9
12
|
)
|
10
13
|
from classiq.interface.backend.quantum_backend_providers import (
|
11
14
|
AllBackendsNameByVendor,
|
12
15
|
ProviderVendor,
|
13
16
|
)
|
14
|
-
from classiq.interface.
|
17
|
+
from classiq.interface.enum_utils import StrEnum
|
18
|
+
from classiq.interface.exceptions import ClassiqValueError
|
19
|
+
from classiq.interface.generator.arith.machine_precision import (
|
20
|
+
DEFAULT_MACHINE_PRECISION,
|
21
|
+
)
|
15
22
|
from classiq.interface.generator.hardware.hardware_data import (
|
16
23
|
BACKEND_VALIDATION_ERROR_MESSAGE,
|
17
24
|
CustomHardwareSettings,
|
@@ -20,20 +27,17 @@ from classiq.interface.generator.model.preferences.randomness import create_rand
|
|
20
27
|
from classiq.interface.hardware import Provider
|
21
28
|
from classiq.interface.helpers.custom_pydantic_types import PydanticMachinePrecision
|
22
29
|
|
23
|
-
from classiq._internals.enum_utils import StrEnum
|
24
|
-
from classiq.exceptions import ClassiqValueError
|
25
|
-
|
26
30
|
if TYPE_CHECKING:
|
27
31
|
VisualizationLevel: TypeAlias = Optional[int]
|
28
32
|
else:
|
29
|
-
VisualizationLevel: TypeAlias = Optional[
|
33
|
+
VisualizationLevel: TypeAlias = Optional[Annotated[int, Field(ge=-1)]]
|
30
34
|
|
31
35
|
if TYPE_CHECKING:
|
32
36
|
PydanticBackendName = str
|
33
37
|
else:
|
34
|
-
PydanticBackendName =
|
35
|
-
strict=True, min_length=1,
|
36
|
-
|
38
|
+
PydanticBackendName = Annotated[
|
39
|
+
str, Field(strict=True, min_length=1, pattern="^([.A-Za-z0-9_-]*)$")
|
40
|
+
]
|
37
41
|
|
38
42
|
|
39
43
|
class QuantumFormat(StrEnum):
|
@@ -45,7 +49,7 @@ class QuantumFormat(StrEnum):
|
|
45
49
|
QASM_CIRQ_COMPATIBLE = "qasm_cirq_compatible"
|
46
50
|
|
47
51
|
|
48
|
-
_SERVICE_PROVIDER_TO_FORMAT:
|
52
|
+
_SERVICE_PROVIDER_TO_FORMAT: dict[Provider, QuantumFormat] = {
|
49
53
|
Provider.CLASSIQ: QuantumFormat.QASM,
|
50
54
|
Provider.IONQ: QuantumFormat.IONQ,
|
51
55
|
Provider.AZURE_QUANTUM: QuantumFormat.QSHARP,
|
@@ -54,11 +58,18 @@ _SERVICE_PROVIDER_TO_FORMAT: Dict[Provider, QuantumFormat] = {
|
|
54
58
|
}
|
55
59
|
|
56
60
|
if TYPE_CHECKING:
|
57
|
-
PydanticConstrainedQuantumFormatList =
|
61
|
+
PydanticConstrainedQuantumFormatList = list[QuantumFormat]
|
58
62
|
else:
|
59
|
-
PydanticConstrainedQuantumFormatList =
|
60
|
-
QuantumFormat,
|
61
|
-
|
63
|
+
PydanticConstrainedQuantumFormatList = Annotated[
|
64
|
+
list[QuantumFormat], Field(min_length=1, max_length=len(QuantumFormat))
|
65
|
+
]
|
66
|
+
|
67
|
+
|
68
|
+
class OptimizationLevel(IntEnum):
|
69
|
+
NONE = 0
|
70
|
+
LIGHT = 1
|
71
|
+
MEDIUM = 2
|
72
|
+
HIGH = 3
|
62
73
|
|
63
74
|
|
64
75
|
class TranspilationOption(StrEnum):
|
@@ -74,11 +85,60 @@ class TranspilationOption(StrEnum):
|
|
74
85
|
return self != TranspilationOption.NONE
|
75
86
|
|
76
87
|
|
77
|
-
class Preferences(pydantic.BaseModel, extra=
|
88
|
+
class Preferences(pydantic.BaseModel, extra="forbid"):
|
89
|
+
"""
|
90
|
+
Preferences for synthesizing a quantum circuit.
|
91
|
+
|
92
|
+
Attributes:
|
93
|
+
machine_precision (int): Specifies the precision used for quantum operations.
|
94
|
+
Defaults to `DEFAULT_MACHINE_PRECISION`.
|
95
|
+
backend_service_provider (str): The provider company or cloud service for the
|
96
|
+
requested backend. Defaults to `None`.
|
97
|
+
backend_name (str): The name of the requested backend or target. Defaults to `None`.
|
98
|
+
custom_hardware_settings (CustomHardwareSettings): Defines custom hardware
|
99
|
+
settings for optimization. This field is ignored if backend preferences are
|
100
|
+
specified.
|
101
|
+
debug_mode (bool): If `True`, debug information is added to the
|
102
|
+
synthesized result, potentially slowing down the synthesis. Useful for
|
103
|
+
executing interactive algorithms. Defaults to `True`.
|
104
|
+
output_format (List[QuantumFormat]): Lists the output format(s)
|
105
|
+
for the quantum circuit. Defaults to `[QuantumFormat.QASM]`.
|
106
|
+
`QuantumFormat` Options:
|
107
|
+
- QASM = "qasm"
|
108
|
+
- QSHARP = "qsharp"
|
109
|
+
- QIR = "qir"
|
110
|
+
- IONQ = "ionq"
|
111
|
+
- CIRQ_JSON = "cirq_json"
|
112
|
+
- QASM_CIRQ_COMPATIBLE = "qasm_cirq_compatible"
|
113
|
+
pretty_qasm (bool): If `True`, formats OpenQASM 2 outputs with line breaks
|
114
|
+
inside gate declarations, improving readability. Defaults to `True`.
|
115
|
+
qasm3 (Optional[bool]): If `True`, outputs OpenQASM 3.0 in addition to 2.0,
|
116
|
+
applicable to relevant attributes in `GeneratedCircuit`. Defaults to `None`.
|
117
|
+
transpilation_option (TranspilationOption): Sets the transpilation option to
|
118
|
+
optimize the circuit. Defaults to `AUTO_OPTIMIZE`. See `TranspilationOption`
|
119
|
+
solovay_kitaev_max_iterations (Optional[int]): Specifies the
|
120
|
+
maximum number of iterations for the Solovay-Kitaev algorithm, if used.
|
121
|
+
Defaults to `None`.
|
122
|
+
timeout_seconds (int): Timeout setting for circuit synthesis
|
123
|
+
in seconds. Defaults to `300`.
|
124
|
+
optimization_timeout_seconds (Optional[int]): Specifies the
|
125
|
+
timeout for optimization in seconds, or `None` for no optimization timeout.
|
126
|
+
This will still adhere to the overall synthesis timeout. Defaults to `None`.
|
127
|
+
random_seed (int): Random seed for circuit synthesis.
|
128
|
+
|
129
|
+
Raises:
|
130
|
+
ClassiqValueError:
|
131
|
+
- If the optimization timeout is greater than or equal to the synthesis timeout.
|
132
|
+
- If the `output_format` contains duplicate entries.
|
133
|
+
- If `backend_name` is provided without `backend_service_provider` or vice versa.
|
134
|
+
ValueError:
|
135
|
+
- If `backend_service_provider` is not valid.
|
136
|
+
"""
|
137
|
+
|
78
138
|
_backend_preferences: Optional[BackendPreferences] = pydantic.PrivateAttr(
|
79
139
|
default=None
|
80
140
|
)
|
81
|
-
machine_precision: PydanticMachinePrecision =
|
141
|
+
machine_precision: PydanticMachinePrecision = DEFAULT_MACHINE_PRECISION
|
82
142
|
|
83
143
|
backend_service_provider: Optional[Union[Provider, ProviderVendor, str]] = (
|
84
144
|
pydantic.Field(
|
@@ -102,6 +162,15 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
|
|
102
162
|
"Setting this option to False can potentially speed up the synthesis, and is "
|
103
163
|
"recommended for executing iterative algorithms.",
|
104
164
|
)
|
165
|
+
synthesize_all_separately: bool = pydantic.Field(
|
166
|
+
default=False,
|
167
|
+
description="If true, a heuristic is used to determine if a function should be synthesized separately",
|
168
|
+
deprecated=True,
|
169
|
+
)
|
170
|
+
optimization_level: OptimizationLevel = pydantic.Field(
|
171
|
+
default=OptimizationLevel.HIGH,
|
172
|
+
description="The optimization level used during synthesis; determines the trade-off between synthesis speed and the quality of the results",
|
173
|
+
)
|
105
174
|
output_format: PydanticConstrainedQuantumFormatList = pydantic.Field(
|
106
175
|
default=[QuantumFormat.QASM],
|
107
176
|
description="The quantum circuit output format(s). ",
|
@@ -125,6 +194,11 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
|
|
125
194
|
"transpiled circuit and its depth",
|
126
195
|
)
|
127
196
|
|
197
|
+
solovay_kitaev_max_iterations: Optional[pydantic.PositiveInt] = pydantic.Field(
|
198
|
+
None,
|
199
|
+
description="Maximum iterations for the Solovay-Kitaev algorithm (if applied).",
|
200
|
+
)
|
201
|
+
|
128
202
|
timeout_seconds: pydantic.PositiveInt = pydantic.Field(
|
129
203
|
default=300, description="Generation timeout in seconds"
|
130
204
|
)
|
@@ -134,27 +208,19 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
|
|
134
208
|
description="Optimization timeout in seconds, or None for no "
|
135
209
|
"optimization timeout (will still timeout when the generation timeout is over)",
|
136
210
|
)
|
137
|
-
|
138
211
|
random_seed: int = pydantic.Field(
|
139
212
|
default_factory=create_random_seed,
|
140
213
|
description="The random seed used for the generation",
|
141
214
|
)
|
142
215
|
|
143
|
-
@pydantic.
|
144
|
-
|
145
|
-
cls, backend_service_provider: Any
|
146
|
-
) -> Optional[Provider]:
|
147
|
-
if backend_service_provider is None:
|
148
|
-
return None
|
149
|
-
return validate_backend_service_provider(backend_service_provider)
|
150
|
-
|
151
|
-
@pydantic.validator("optimization_timeout_seconds")
|
216
|
+
@pydantic.field_validator("optimization_timeout_seconds", mode="before")
|
217
|
+
@classmethod
|
152
218
|
def optimization_timeout_less_than_generation_timeout(
|
153
219
|
cls,
|
154
220
|
optimization_timeout_seconds: Optional[pydantic.PositiveInt],
|
155
|
-
|
221
|
+
info: ValidationInfo,
|
156
222
|
) -> Optional[pydantic.PositiveInt]:
|
157
|
-
generation_timeout_seconds =
|
223
|
+
generation_timeout_seconds = info.data.get("timeout_seconds")
|
158
224
|
if generation_timeout_seconds is None or optimization_timeout_seconds is None:
|
159
225
|
return optimization_timeout_seconds
|
160
226
|
if optimization_timeout_seconds >= generation_timeout_seconds:
|
@@ -165,16 +231,20 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
|
|
165
231
|
)
|
166
232
|
return optimization_timeout_seconds
|
167
233
|
|
168
|
-
@pydantic.
|
169
|
-
|
170
|
-
|
234
|
+
@pydantic.field_validator("output_format", mode="before")
|
235
|
+
@classmethod
|
236
|
+
def make_output_format_list(cls, output_format: Any) -> list:
|
237
|
+
if not isinstance(output_format, Sequence) or isinstance(output_format, str):
|
171
238
|
output_format = [output_format]
|
172
239
|
|
173
240
|
return output_format
|
174
241
|
|
175
|
-
@pydantic.
|
242
|
+
@pydantic.field_validator("output_format", mode="before")
|
243
|
+
@classmethod
|
176
244
|
def validate_output_format(
|
177
|
-
cls,
|
245
|
+
cls,
|
246
|
+
output_format: PydanticConstrainedQuantumFormatList,
|
247
|
+
info: ValidationInfo,
|
178
248
|
) -> PydanticConstrainedQuantumFormatList:
|
179
249
|
if len(output_format) != len(set(output_format)):
|
180
250
|
raise ClassiqValueError(
|
@@ -182,7 +252,7 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
|
|
182
252
|
"has at least one format that appears twice or more"
|
183
253
|
)
|
184
254
|
|
185
|
-
service_provider =
|
255
|
+
service_provider = info.data.get("backend_service_provider")
|
186
256
|
if service_provider is None:
|
187
257
|
return output_format
|
188
258
|
|
@@ -192,16 +262,20 @@ class Preferences(pydantic.BaseModel, extra=pydantic.Extra.forbid):
|
|
192
262
|
|
193
263
|
return output_format
|
194
264
|
|
195
|
-
@pydantic.
|
196
|
-
def validate_backend(
|
197
|
-
backend_name =
|
198
|
-
backend_service_provider =
|
265
|
+
@pydantic.model_validator(mode="after")
|
266
|
+
def validate_backend(self) -> Self:
|
267
|
+
backend_name = self.backend_name
|
268
|
+
backend_service_provider = self.backend_service_provider
|
199
269
|
if (backend_name is None) != (backend_service_provider is None):
|
200
270
|
raise ClassiqValueError(BACKEND_VALIDATION_ERROR_MESSAGE)
|
201
|
-
return
|
271
|
+
return self
|
202
272
|
|
203
273
|
@property
|
204
274
|
def backend_preferences(self) -> Optional[BackendPreferences]:
|
275
|
+
"""
|
276
|
+
Returns the backend preferences. If the backend preferences are not provided, the function sets the backend preferences according to backend name and provider.
|
277
|
+
|
278
|
+
"""
|
205
279
|
if self.backend_name is None or self.backend_service_provider is None:
|
206
280
|
return None
|
207
281
|
if self._backend_preferences is None:
|