classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +5 -5
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
- classiq/interface/generator/finance.py +3 -3
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -154
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,43 +1,36 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
import abc
|
4
|
-
from typing import Iterable, Optional
|
1
|
+
from collections.abc import Iterable
|
2
|
+
from typing import TYPE_CHECKING, Final, Optional
|
5
3
|
|
6
4
|
import pydantic
|
5
|
+
from pydantic import ConfigDict
|
7
6
|
|
8
|
-
from classiq.interface.
|
7
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
|
+
from classiq.interface.generator.arith import argument_utils, number_utils
|
9
9
|
from classiq.interface.generator.arith.arithmetic_operations import (
|
10
|
+
MODULO_WITH_FRACTION_PLACES_ERROR_MSG,
|
10
11
|
ArithmeticOperationParams,
|
11
12
|
)
|
12
13
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
13
14
|
from classiq.interface.generator.function_params import get_zero_input_name
|
14
15
|
|
15
|
-
UNARY_ARG_NAME: str = "arg"
|
16
|
+
UNARY_ARG_NAME: Final[str] = "arg"
|
16
17
|
|
17
18
|
|
18
19
|
class UnaryOpParams(ArithmeticOperationParams):
|
19
20
|
arg: RegisterArithmeticInfo
|
20
21
|
inplace: bool = False
|
21
22
|
|
22
|
-
@abc.abstractmethod
|
23
|
-
def _expected_result_size(self) -> pydantic.PositiveInt:
|
24
|
-
pass
|
25
|
-
|
26
|
-
def actual_result_size(self) -> int:
|
27
|
-
return self.output_size or self._expected_result_size()
|
28
|
-
|
29
23
|
def garbage_output_size(self) -> pydantic.NonNegativeInt:
|
30
|
-
return int(self.is_inplaced()) *
|
31
|
-
self.arg.
|
24
|
+
return int(self.is_inplaced()) * (
|
25
|
+
max(self.arg.integer_part_size - self.result_register.integer_part_size, 0)
|
26
|
+
+ max(self.arg.fraction_places - self.result_register.fraction_places, 0)
|
32
27
|
)
|
33
28
|
|
34
29
|
def should_add_zero_inputs(self) -> bool:
|
35
|
-
return not self.is_inplaced() or self.
|
30
|
+
return not self.is_inplaced() or self.zero_input_for_extension() > 0
|
36
31
|
|
37
|
-
def
|
38
|
-
|
39
|
-
) -> bool:
|
40
|
-
return (output_size or self.result_register.size) > self.arg.size
|
32
|
+
def zero_input_for_extension(self) -> pydantic.NonNegativeInt:
|
33
|
+
return max(0, self.result_register.size - self.arg.size)
|
41
34
|
|
42
35
|
def _create_ios(self) -> None:
|
43
36
|
self._inputs = {UNARY_ARG_NAME: self.arg}
|
@@ -49,8 +42,8 @@ class UnaryOpParams(ArithmeticOperationParams):
|
|
49
42
|
zero_input_register = self.result_register
|
50
43
|
self._zero_inputs = {zero_input_name: zero_input_register}
|
51
44
|
return
|
52
|
-
if self.
|
53
|
-
output_extension_size = self.
|
45
|
+
if self.zero_input_for_extension() > 0:
|
46
|
+
output_extension_size = self.zero_input_for_extension()
|
54
47
|
self._create_zero_input_registers({zero_input_name: output_extension_size})
|
55
48
|
if self.garbage_output_size() > 0:
|
56
49
|
self._outputs[self.garbage_output_name] = RegisterArithmeticInfo(
|
@@ -60,62 +53,80 @@ class UnaryOpParams(ArithmeticOperationParams):
|
|
60
53
|
def is_inplaced(self) -> bool:
|
61
54
|
return self.inplace
|
62
55
|
|
63
|
-
def get_params_inplace_options(self) -> Iterable[UnaryOpParams]:
|
64
|
-
params_kwargs = self.
|
56
|
+
def get_params_inplace_options(self) -> Iterable["UnaryOpParams"]:
|
57
|
+
params_kwargs = self.model_copy().model_dump()
|
65
58
|
params_kwargs["inplace"] = True
|
66
59
|
yield self.__class__(**params_kwargs)
|
67
60
|
|
68
|
-
|
69
|
-
arbitrary_types_allowed = True
|
61
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
70
62
|
|
71
63
|
|
72
64
|
class BitwiseInvert(UnaryOpParams):
|
73
65
|
output_name = "inverted"
|
74
66
|
|
75
|
-
def _expected_result_size(self) -> pydantic.PositiveInt:
|
76
|
-
return self.arg.size
|
77
|
-
|
78
67
|
def _get_result_register(self) -> RegisterArithmeticInfo:
|
68
|
+
eff_arg = argument_utils.limit_fraction_places(self.arg, self.machine_precision)
|
69
|
+
if TYPE_CHECKING:
|
70
|
+
assert isinstance(eff_arg, RegisterArithmeticInfo)
|
79
71
|
return RegisterArithmeticInfo(
|
80
|
-
size=self.
|
81
|
-
fraction_places=
|
82
|
-
is_signed=
|
72
|
+
size=self.output_size or eff_arg.size,
|
73
|
+
fraction_places=eff_arg.fraction_places,
|
74
|
+
is_signed=eff_arg.is_signed and self._include_sign,
|
83
75
|
)
|
84
76
|
|
85
77
|
|
86
78
|
class Negation(UnaryOpParams):
|
79
|
+
bypass_bounds_validation: bool = pydantic.Field(
|
80
|
+
default=False
|
81
|
+
) # True for efficient subtraction
|
87
82
|
output_name = "negated"
|
88
83
|
|
89
|
-
|
90
|
-
|
84
|
+
@staticmethod
|
85
|
+
def _expected_result_size(arg: RegisterArithmeticInfo) -> pydantic.PositiveInt:
|
86
|
+
if arg.size == 1:
|
91
87
|
return 1
|
92
|
-
return
|
93
|
-
*(-bound for bound in
|
88
|
+
return arg.fraction_places + number_utils.bounds_to_integer_part_size(
|
89
|
+
*(-bound for bound in arg.bounds)
|
94
90
|
)
|
95
91
|
|
96
92
|
def _get_result_register(self) -> RegisterArithmeticInfo:
|
97
|
-
|
98
|
-
|
93
|
+
eff_arg = self.arg.limit_fraction_places(self.machine_precision)
|
94
|
+
is_signed = max(eff_arg.bounds) > 0 and self._include_sign
|
95
|
+
bounds = (-max(eff_arg.bounds), -min(eff_arg.bounds))
|
96
|
+
if self.output_size and not self.bypass_bounds_validation:
|
97
|
+
if eff_arg.fraction_places:
|
98
|
+
raise ValueError(MODULO_WITH_FRACTION_PLACES_ERROR_MSG)
|
99
|
+
max_bounds = RegisterArithmeticInfo.get_maximal_bounds(
|
100
|
+
size=self.output_size, is_signed=False, fraction_places=0
|
101
|
+
)
|
102
|
+
bounds = number_utils.bounds_cut(bounds, max_bounds)
|
99
103
|
return RegisterArithmeticInfo(
|
100
|
-
size=self.
|
101
|
-
fraction_places=
|
104
|
+
size=self.output_size or self._expected_result_size(eff_arg),
|
105
|
+
fraction_places=eff_arg.fraction_places,
|
102
106
|
is_signed=is_signed,
|
103
|
-
|
107
|
+
bypass_bounds_validation=self.bypass_bounds_validation,
|
108
|
+
bounds=bounds,
|
104
109
|
)
|
105
110
|
|
111
|
+
def zero_input_for_extension(self) -> pydantic.NonNegativeInt:
|
112
|
+
eff_arg = self.arg.limit_fraction_places(self.machine_precision)
|
113
|
+
if (self.output_size or eff_arg.size) == 1:
|
114
|
+
return 0
|
115
|
+
return (
|
116
|
+
self.output_size or self._expected_result_size(self.arg)
|
117
|
+
) - self.arg.size
|
118
|
+
|
106
119
|
|
107
120
|
class Sign(UnaryOpParams):
|
108
121
|
output_name = "sign"
|
109
122
|
|
110
|
-
@pydantic.
|
123
|
+
@pydantic.field_validator("output_size")
|
124
|
+
@classmethod
|
111
125
|
def _validate_output_size(
|
112
126
|
cls, output_size: Optional[pydantic.PositiveInt]
|
113
127
|
) -> pydantic.PositiveInt:
|
114
128
|
if output_size is not None and output_size != 1:
|
115
|
-
raise
|
116
|
-
return 1
|
117
|
-
|
118
|
-
def _expected_result_size(self) -> pydantic.PositiveInt:
|
129
|
+
raise ClassiqValueError("Sign output size must be 1")
|
119
130
|
return 1
|
120
131
|
|
121
132
|
def _get_result_register(self) -> RegisterArithmeticInfo:
|
@@ -1,19 +1,12 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Iterable
|
2
|
+
from typing import Any
|
2
3
|
|
3
4
|
from classiq.interface.generator.functions.classical_function_declaration import (
|
4
5
|
ClassicalFunctionDeclaration,
|
5
6
|
)
|
6
|
-
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
7
|
-
from classiq.interface.model.quantum_function_declaration import (
|
8
|
-
QuantumFunctionDeclaration,
|
9
|
-
)
|
10
7
|
|
11
8
|
|
12
9
|
def populate_builtin_declarations(decls: Iterable[Any]) -> None:
|
13
10
|
for decl in decls:
|
14
|
-
if isinstance(decl, QuantumFunctionDeclaration):
|
15
|
-
QuantumFunctionDeclaration.BUILTIN_FUNCTION_DECLARATIONS[decl.name] = decl
|
16
11
|
if isinstance(decl, ClassicalFunctionDeclaration):
|
17
12
|
ClassicalFunctionDeclaration.FOREIGN_FUNCTION_DECLARATIONS[decl.name] = decl
|
18
|
-
if isinstance(decl, StructDeclaration):
|
19
|
-
StructDeclaration.BUILTIN_STRUCT_DECLARATIONS[decl.name] = decl
|
@@ -4,6 +4,7 @@ from classiq.interface.chemistry.ground_state_problem import (
|
|
4
4
|
CHEMISTRY_PROBLEMS_TYPE,
|
5
5
|
GroundStateProblem,
|
6
6
|
)
|
7
|
+
from classiq.interface.exceptions import ClassiqValueError
|
7
8
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
8
9
|
from classiq.interface.generator.function_params import (
|
9
10
|
DEFAULT_INPUT_NAME,
|
@@ -13,16 +14,15 @@ from classiq.interface.generator.function_params import (
|
|
13
14
|
|
14
15
|
|
15
16
|
class ChemistryFunctionParams(FunctionParams):
|
16
|
-
gs_problem: CHEMISTRY_PROBLEMS_TYPE
|
17
|
-
description="Ground state problem object describing the system."
|
18
|
-
)
|
17
|
+
gs_problem: CHEMISTRY_PROBLEMS_TYPE
|
19
18
|
|
20
|
-
@pydantic.
|
19
|
+
@pydantic.field_validator("gs_problem")
|
20
|
+
@classmethod
|
21
21
|
def validate_gs_problem_contains_num_qubits(
|
22
22
|
cls, gs_problem: CHEMISTRY_PROBLEMS_TYPE
|
23
23
|
) -> CHEMISTRY_PROBLEMS_TYPE:
|
24
24
|
if not gs_problem.num_qubits:
|
25
|
-
raise
|
25
|
+
raise ClassiqValueError(
|
26
26
|
"Ground state problem doesn't contain num_qubits. "
|
27
27
|
"Use update_problem method."
|
28
28
|
)
|
@@ -1,7 +1,8 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
|
5
|
+
from classiq.interface.exceptions import ClassiqMissingOutputFormatError
|
5
6
|
from classiq.interface.executor.quantum_instruction_set import QuantumInstructionSet
|
6
7
|
from classiq.interface.generator.circuit_code.types_and_constants import (
|
7
8
|
INSTRUCTION_SET_TO_FORMAT,
|
@@ -12,17 +13,16 @@ from classiq.interface.generator.circuit_code.types_and_constants import (
|
|
12
13
|
)
|
13
14
|
from classiq.interface.generator.model.preferences.preferences import QuantumFormat
|
14
15
|
|
15
|
-
from classiq.exceptions import ClassiqMissingOutputFormatError
|
16
|
-
|
17
16
|
|
18
17
|
class CircuitCodeInterface(pydantic.BaseModel):
|
19
|
-
outputs:
|
18
|
+
outputs: dict[QuantumFormat, Code]
|
20
19
|
qasm_version: QasmVersion
|
21
20
|
|
22
|
-
@pydantic.
|
21
|
+
@pydantic.field_validator("outputs")
|
22
|
+
@classmethod
|
23
23
|
def reformat_long_string_output_formats(
|
24
|
-
cls, outputs:
|
25
|
-
) ->
|
24
|
+
cls, outputs: dict[QuantumFormat, str]
|
25
|
+
) -> dict[QuantumFormat, LongStr]:
|
26
26
|
return {key: LongStr(value) for key, value in outputs.items()}
|
27
27
|
|
28
28
|
@property
|
@@ -1,22 +1,19 @@
|
|
1
|
-
from typing import Dict, Tuple
|
2
|
-
|
3
1
|
from typing_extensions import TypeAlias
|
4
2
|
|
3
|
+
from classiq.interface.enum_utils import StrEnum
|
5
4
|
from classiq.interface.executor.quantum_instruction_set import QuantumInstructionSet
|
6
5
|
from classiq.interface.generator.model.preferences.preferences import QuantumFormat
|
7
6
|
from classiq.interface.hardware import Provider
|
8
7
|
|
9
|
-
from classiq._internals.enum_utils import StrEnum
|
10
|
-
|
11
8
|
Code: TypeAlias = str
|
12
|
-
CodeAndSyntax: TypeAlias =
|
9
|
+
CodeAndSyntax: TypeAlias = tuple[Code, QuantumInstructionSet]
|
13
10
|
|
14
|
-
INSTRUCTION_SET_TO_FORMAT:
|
11
|
+
INSTRUCTION_SET_TO_FORMAT: dict[QuantumInstructionSet, QuantumFormat] = {
|
15
12
|
QuantumInstructionSet.QASM: QuantumFormat.QASM,
|
16
13
|
QuantumInstructionSet.QSHARP: QuantumFormat.QSHARP,
|
17
14
|
QuantumInstructionSet.IONQ: QuantumFormat.IONQ,
|
18
15
|
}
|
19
|
-
VENDOR_TO_INSTRUCTION_SET:
|
16
|
+
VENDOR_TO_INSTRUCTION_SET: dict[Provider, QuantumInstructionSet] = {
|
20
17
|
Provider.CLASSIQ: QuantumInstructionSet.QASM,
|
21
18
|
Provider.IONQ: QuantumInstructionSet.IONQ,
|
22
19
|
Provider.AZURE_QUANTUM: QuantumInstructionSet.QSHARP,
|
@@ -2,13 +2,14 @@ import pydantic
|
|
2
2
|
|
3
3
|
from classiq.interface.chemistry import operator
|
4
4
|
from classiq.interface.chemistry.operator import PauliOperator
|
5
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
6
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
7
|
from classiq.interface.generator.function_params import (
|
7
8
|
DEFAULT_INPUT_NAME,
|
8
9
|
DEFAULT_OUTPUT_NAME,
|
9
10
|
FunctionParams,
|
11
|
+
FunctionParamsNumericParameter,
|
10
12
|
)
|
11
|
-
from classiq.interface.generator.parameters import ParameterFloatType
|
12
13
|
|
13
14
|
|
14
15
|
class CommutingPauliExponentiation(FunctionParams):
|
@@ -19,20 +20,21 @@ class CommutingPauliExponentiation(FunctionParams):
|
|
19
20
|
pauli_operator: PauliOperator = pydantic.Field(
|
20
21
|
description="A weighted sum of Pauli strings."
|
21
22
|
)
|
22
|
-
evolution_coefficient:
|
23
|
+
evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
|
23
24
|
default=1.0,
|
24
25
|
description="A global coefficient multiplying the operator.",
|
25
|
-
is_exec_param=True,
|
26
26
|
)
|
27
27
|
|
28
|
-
@pydantic.
|
28
|
+
@pydantic.field_validator("pauli_operator")
|
29
|
+
@classmethod
|
29
30
|
def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
|
30
31
|
return operator.validate_operator_is_hermitian(pauli_operator)
|
31
32
|
|
32
|
-
@pydantic.
|
33
|
+
@pydantic.field_validator("pauli_operator")
|
34
|
+
@classmethod
|
33
35
|
def _validate_paulis_commute(cls, pauli_operator: PauliOperator) -> PauliOperator:
|
34
36
|
if not pauli_operator.is_commutative:
|
35
|
-
raise
|
37
|
+
raise ClassiqValueError("Pauli strings are not commutative")
|
36
38
|
return pauli_operator
|
37
39
|
|
38
40
|
def _create_ios(self) -> None:
|
@@ -1,30 +1,18 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Annotated, Union
|
2
2
|
|
3
|
-
import
|
4
|
-
from
|
3
|
+
from pydantic import PlainSerializer, PlainValidator
|
4
|
+
from pydantic.json_schema import WithJsonSchema
|
5
5
|
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
yield cls.validate
|
7
|
+
def validate_complex(v: Union[complex, str]) -> complex:
|
8
|
+
if isinstance(v, str):
|
9
|
+
v = "".join(v.split())
|
10
|
+
return complex(v)
|
12
11
|
|
13
|
-
@classmethod
|
14
|
-
def __modify_schema__(cls, field_schema):
|
15
|
-
field_schema.update(
|
16
|
-
pattern=r"[+-]?\d+\.?\d* *[+-] *\d+\.?\d*j",
|
17
|
-
)
|
18
12
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
assert (
|
28
|
-
complex not in pydantic.json.ENCODERS_BY_TYPE
|
29
|
-
), "Is complex type supported on newer version of pydantic?"
|
30
|
-
pydantic.json.ENCODERS_BY_TYPE[complex] = str
|
13
|
+
Complex = Annotated[
|
14
|
+
complex,
|
15
|
+
PlainValidator(validate_complex),
|
16
|
+
PlainSerializer(lambda x: str(x)),
|
17
|
+
WithJsonSchema({"type": "string", "pattern": r"[+-]?\d+\.?\d* *[+-] *\d+\.?\d*j"}),
|
18
|
+
]
|
@@ -1,10 +1,9 @@
|
|
1
|
-
import
|
2
|
-
|
1
|
+
from classiq.interface.ast_node import ASTNode
|
3
2
|
from classiq.interface.generator.expressions.expression import Expression
|
4
|
-
from classiq.interface.generator.functions.
|
3
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
|
5
4
|
|
6
5
|
|
7
|
-
class Constant(
|
6
|
+
class Constant(ASTNode):
|
8
7
|
name: str
|
9
8
|
const_type: ConcreteClassicalType
|
10
9
|
value: Expression
|
@@ -1,10 +1,11 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from typing import Any
|
3
|
+
from typing import Any
|
4
4
|
|
5
5
|
import pydantic
|
6
|
-
from pydantic import BaseModel
|
6
|
+
from pydantic import BaseModel, ConfigDict
|
7
7
|
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
9
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
9
10
|
|
10
11
|
_DEFAULT_CONTROL_NAME: str = "ctrl"
|
@@ -17,45 +18,52 @@ class ControlState(BaseModel):
|
|
17
18
|
default=_DEFAULT_NUM_CONTROL_QUBITS, description="Number of control qubits"
|
18
19
|
)
|
19
20
|
ctrl_state: str = pydantic.Field(
|
20
|
-
default=_INVALID_CONTROL_STATE,
|
21
|
+
default=_INVALID_CONTROL_STATE,
|
22
|
+
description="Control state string",
|
23
|
+
validate_default=True,
|
24
|
+
)
|
25
|
+
name: str = pydantic.Field(
|
26
|
+
default=_DEFAULT_CONTROL_NAME, description="Control name"
|
21
27
|
)
|
22
|
-
name: str = pydantic.Field(default=None, description="Control name")
|
23
28
|
|
24
|
-
@pydantic.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
@pydantic.model_validator(mode="before")
|
30
|
+
@classmethod
|
31
|
+
def _validate_control(cls, values: Any) -> dict[str, Any]:
|
32
|
+
if isinstance(values, dict):
|
33
|
+
num_ctrl_qubits: int = (
|
34
|
+
values.get("num_ctrl_qubits", _DEFAULT_NUM_CONTROL_QUBITS) or 0
|
35
|
+
)
|
30
36
|
|
31
|
-
|
32
|
-
ctrl_state = "1" * num_ctrl_qubits
|
33
|
-
values["ctrl_state"] = ctrl_state
|
37
|
+
ctrl_state: str = values.get("ctrl_state") or _INVALID_CONTROL_STATE
|
34
38
|
|
35
|
-
|
39
|
+
if ctrl_state == _INVALID_CONTROL_STATE:
|
40
|
+
ctrl_state = "1" * num_ctrl_qubits
|
41
|
+
values["ctrl_state"] = ctrl_state
|
36
42
|
|
37
|
-
|
38
|
-
num_ctrl_qubits = len(ctrl_state)
|
39
|
-
values["num_ctrl_qubits"] = num_ctrl_qubits
|
43
|
+
cls.validate_control_string(ctrl_state)
|
40
44
|
|
41
|
-
|
42
|
-
|
43
|
-
"
|
44
|
-
)
|
45
|
+
if num_ctrl_qubits == _DEFAULT_NUM_CONTROL_QUBITS:
|
46
|
+
num_ctrl_qubits = len(ctrl_state)
|
47
|
+
values["num_ctrl_qubits"] = num_ctrl_qubits
|
45
48
|
|
46
|
-
|
47
|
-
|
49
|
+
if len(ctrl_state) != num_ctrl_qubits:
|
50
|
+
raise ClassiqValueError(
|
51
|
+
"Control state length should be equal to the number of control qubits"
|
52
|
+
)
|
53
|
+
|
54
|
+
if "name" not in values or values["name"] is None:
|
55
|
+
values["name"] = f"{_DEFAULT_CONTROL_NAME}_{ctrl_state}"
|
48
56
|
|
49
57
|
return values
|
50
58
|
|
51
59
|
@staticmethod
|
52
60
|
def validate_control_string(ctrl_state: str) -> None:
|
61
|
+
if not ctrl_state:
|
62
|
+
raise ClassiqValueError("Control state cannot be empty")
|
53
63
|
if not set(ctrl_state) <= {"1", "0"}:
|
54
|
-
raise
|
64
|
+
raise ClassiqValueError(
|
55
65
|
f"Control state can only be constructed from 0 and 1, received: {ctrl_state}"
|
56
66
|
)
|
57
|
-
if not ctrl_state:
|
58
|
-
raise ValueError("Control state cannot be empty")
|
59
67
|
|
60
68
|
def __str__(self) -> str:
|
61
69
|
return self.ctrl_state
|
@@ -70,5 +78,4 @@ class ControlState(BaseModel):
|
|
70
78
|
def rename(self, name: str) -> ControlState:
|
71
79
|
return ControlState(ctrl_state=self.ctrl_state, name=name)
|
72
80
|
|
73
|
-
|
74
|
-
frozen = True
|
81
|
+
model_config = ConfigDict(frozen=True)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
import pydantic
|
4
|
+
|
5
|
+
from classiq.interface.generator.arith import argument_utils
|
6
|
+
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
7
|
+
from classiq.interface.generator.function_params import FunctionParams
|
8
|
+
|
9
|
+
|
10
|
+
class Copy(FunctionParams):
|
11
|
+
source: argument_utils.RegisterOrConst
|
12
|
+
target: RegisterArithmeticInfo
|
13
|
+
output_size: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
|
14
|
+
|
15
|
+
@property
|
16
|
+
def source_size(self) -> int:
|
17
|
+
return argument_utils.size(self.source)
|
18
|
+
|
19
|
+
@property
|
20
|
+
def source_reg_size(self) -> int:
|
21
|
+
return (
|
22
|
+
self.source.size if isinstance(self.source, RegisterArithmeticInfo) else 0
|
23
|
+
)
|
24
|
+
|
25
|
+
@property
|
26
|
+
def source_fraction_places(self) -> int:
|
27
|
+
return argument_utils.fraction_places(self.source)
|
28
|
+
|
29
|
+
@property
|
30
|
+
def offset(self) -> int:
|
31
|
+
return self.target.fraction_places - self.source_fraction_places
|
32
|
+
|
33
|
+
@property
|
34
|
+
def source_name(self) -> str:
|
35
|
+
return "source"
|
36
|
+
|
37
|
+
@property
|
38
|
+
def target_name(self) -> str:
|
39
|
+
return "target"
|
40
|
+
|
41
|
+
def _create_ios(self) -> None:
|
42
|
+
self._inputs = {
|
43
|
+
self.target_name: self.target,
|
44
|
+
}
|
45
|
+
if isinstance(self.source, RegisterArithmeticInfo):
|
46
|
+
self._inputs[self.source_name] = self.source
|
47
|
+
self._outputs = {**self._inputs}
|
@@ -1,7 +1,6 @@
|
|
1
|
-
from typing import Dict, Type
|
2
|
-
|
3
1
|
import pydantic
|
4
2
|
|
3
|
+
from classiq.interface.enum_utils import StrEnum
|
5
4
|
from classiq.interface.generator.ansatz_library import (
|
6
5
|
EntanglingLayersArgs,
|
7
6
|
HypercubeArgs,
|
@@ -11,8 +10,6 @@ from classiq.interface.generator.ansatz_library import (
|
|
11
10
|
TwoLocalArgs,
|
12
11
|
)
|
13
12
|
|
14
|
-
from classiq._internals.enum_utils import StrEnum
|
15
|
-
|
16
13
|
|
17
14
|
class CustomAnsatzType(StrEnum):
|
18
15
|
TwoLocal = "TwoLocal"
|
@@ -23,7 +20,7 @@ class CustomAnsatzType(StrEnum):
|
|
23
20
|
RandomTwoQubitGates = "RandomTwoQubitGates"
|
24
21
|
|
25
22
|
|
26
|
-
CUSTOM_ANSATZ_ARGS_MAPPING:
|
23
|
+
CUSTOM_ANSATZ_ARGS_MAPPING: dict[CustomAnsatzType, type[pydantic.BaseModel]] = {
|
27
24
|
CustomAnsatzType.TwoLocal: TwoLocalArgs,
|
28
25
|
CustomAnsatzType.SeparateU3: SeparateU3Args,
|
29
26
|
CustomAnsatzType.Hypercube: HypercubeArgs,
|
@@ -1,5 +1,3 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
import numpy as np
|
4
2
|
|
5
3
|
# Taken and modified from quantum_tsp_tutorials repository of mstechly in github.
|
@@ -10,7 +8,7 @@ def _distance_between_points(point_1: np.ndarray, point_2: np.ndarray) -> float:
|
|
10
8
|
return float(np.linalg.norm(point_1 - point_2))
|
11
9
|
|
12
10
|
|
13
|
-
def get_distance_matrix(cities: np.ndarray) ->
|
11
|
+
def get_distance_matrix(cities: np.ndarray) -> list[list[float]]:
|
14
12
|
number_of_cities = len(cities)
|
15
13
|
matrix = np.zeros((number_of_cities, number_of_cities))
|
16
14
|
for i in range(number_of_cities):
|
@@ -20,14 +18,14 @@ def get_distance_matrix(cities: np.ndarray) -> List[List[float]]:
|
|
20
18
|
return matrix.tolist()
|
21
19
|
|
22
20
|
|
23
|
-
def get_rand_euclidean_distance_matrix(num_points: int) ->
|
21
|
+
def get_rand_euclidean_distance_matrix(num_points: int) -> list[list[float]]:
|
24
22
|
_points_array_dim = 2
|
25
23
|
points = np.random.rand(num_points, _points_array_dim)
|
26
24
|
distance_matrix = get_distance_matrix(points)
|
27
25
|
return distance_matrix
|
28
26
|
|
29
27
|
|
30
|
-
def get_rand_distance_matrix(num_points: int) ->
|
28
|
+
def get_rand_distance_matrix(num_points: int) -> list[list[float]]:
|
31
29
|
distance_matrix = np.random.rand(num_points, num_points)
|
32
30
|
distance_matrix *= 0.5
|
33
31
|
distance_matrix += distance_matrix.T
|
@@ -1,20 +1,38 @@
|
|
1
|
-
|
1
|
+
from classiq.interface.generator.functions.classical_type import CLASSICAL_ATTRIBUTES
|
2
2
|
|
3
|
-
|
3
|
+
SUPPORTED_PYTHON_BUILTIN_FUNCTIONS = {"len", "sum", "print"}
|
4
|
+
|
5
|
+
SUPPORTED_CLASSIQ_BUILTIN_FUNCTIONS = {
|
6
|
+
"do_div",
|
7
|
+
"do_slice",
|
8
|
+
"do_subscript",
|
4
9
|
"hypercube_entangler_graph",
|
5
10
|
"grid_entangler_graph",
|
6
|
-
"
|
7
|
-
"compute_qaoa_initial_point",
|
8
|
-
"get_optimization_solution",
|
11
|
+
"qft_const_adder_phase",
|
9
12
|
"log_normal_finance_post_process",
|
10
13
|
"gaussian_finance_post_process",
|
11
14
|
"get_type",
|
12
15
|
"struct_literal",
|
13
16
|
"get_field",
|
14
|
-
"fraction_digits",
|
15
|
-
"is_signed",
|
16
17
|
"molecule_problem_to_hamiltonian",
|
17
18
|
"fock_hamiltonian_problem_to_hamiltonian",
|
18
19
|
"molecule_ground_state_solution_post_process",
|
19
|
-
*SUPPORTED_BUILTIN_FUNCTIONS,
|
20
20
|
}
|
21
|
+
|
22
|
+
SUPPORTED_CLASSIQ_SYMPY_WRAPPERS = {
|
23
|
+
"BitwiseAnd",
|
24
|
+
"BitwiseXor",
|
25
|
+
"BitwiseNot",
|
26
|
+
"BitwiseOr",
|
27
|
+
"LogicalXor",
|
28
|
+
}
|
29
|
+
|
30
|
+
SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS = {
|
31
|
+
*SUPPORTED_CLASSIQ_BUILTIN_FUNCTIONS,
|
32
|
+
*SUPPORTED_CLASSIQ_SYMPY_WRAPPERS,
|
33
|
+
*SUPPORTED_PYTHON_BUILTIN_FUNCTIONS,
|
34
|
+
}
|
35
|
+
|
36
|
+
SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS_QMOD = (
|
37
|
+
SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS - CLASSICAL_ATTRIBUTES
|
38
|
+
)
|