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
classiq/qmod/builtins/structs.py
CHANGED
@@ -1,128 +1,151 @@
|
|
1
|
-
|
1
|
+
from dataclasses import dataclass, fields, is_dataclass
|
2
2
|
|
3
|
-
from
|
3
|
+
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
4
4
|
|
5
|
-
from classiq.qmod.
|
5
|
+
from classiq.qmod.builtins.enums import LadderOperator, Pauli
|
6
|
+
from classiq.qmod.cparam import CArray, CBool, CInt, CReal
|
7
|
+
from classiq.qmod.python_classical_type import PythonClassicalType
|
6
8
|
|
7
9
|
|
8
|
-
@
|
10
|
+
@dataclass
|
9
11
|
class PauliTerm:
|
10
|
-
|
11
|
-
|
12
|
+
"""
|
13
|
+
A term in a Hamiltonian, represented as a product of Pauli operators.
|
12
14
|
|
15
|
+
Attributes:
|
16
|
+
pauli (CArray[Pauli]): The list of the chosen Pauli operators in the term, corresponds to a product of them.
|
17
|
+
coefficient (CReal): The coefficient of the term (floating number).
|
18
|
+
"""
|
13
19
|
|
14
|
-
|
15
|
-
|
16
|
-
mapping: int
|
17
|
-
z2_symmetries: bool
|
18
|
-
molecule: "Molecule"
|
19
|
-
freeze_core: bool
|
20
|
-
remove_orbitals: List[int]
|
20
|
+
pauli: CArray[Pauli]
|
21
|
+
coefficient: CReal
|
21
22
|
|
22
23
|
|
23
|
-
@
|
24
|
-
class
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
@dataclass
|
25
|
+
class Position:
|
26
|
+
x: CReal
|
27
|
+
y: CReal
|
28
|
+
z: CReal
|
28
29
|
|
29
30
|
|
30
|
-
@
|
31
|
+
@dataclass
|
31
32
|
class ChemistryAtom:
|
32
|
-
element:
|
33
|
-
position:
|
33
|
+
element: CInt
|
34
|
+
position: Position
|
34
35
|
|
35
36
|
|
36
|
-
@
|
37
|
-
class
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
@dataclass
|
38
|
+
class Molecule:
|
39
|
+
atoms: CArray[ChemistryAtom]
|
40
|
+
spin: CInt
|
41
|
+
charge: CInt
|
41
42
|
|
42
43
|
|
43
|
-
@
|
44
|
-
class
|
45
|
-
mapping:
|
46
|
-
z2_symmetries:
|
47
|
-
|
48
|
-
|
44
|
+
@dataclass
|
45
|
+
class MoleculeProblem:
|
46
|
+
mapping: CInt
|
47
|
+
z2_symmetries: CBool
|
48
|
+
molecule: Molecule
|
49
|
+
freeze_core: CBool
|
50
|
+
remove_orbitals: CArray[CInt]
|
49
51
|
|
50
52
|
|
51
|
-
@
|
53
|
+
@dataclass
|
54
|
+
class LadderOp:
|
55
|
+
op: LadderOperator
|
56
|
+
index: CInt
|
57
|
+
|
58
|
+
|
59
|
+
@dataclass
|
52
60
|
class LadderTerm:
|
53
|
-
coefficient:
|
54
|
-
ops:
|
61
|
+
coefficient: CReal
|
62
|
+
ops: CArray[LadderOp]
|
55
63
|
|
56
64
|
|
57
|
-
@
|
58
|
-
class
|
59
|
-
|
60
|
-
|
65
|
+
@dataclass
|
66
|
+
class FockHamiltonianProblem:
|
67
|
+
mapping: CInt
|
68
|
+
z2_symmetries: CBool
|
69
|
+
terms: CArray[LadderTerm]
|
70
|
+
num_particles: CArray[CInt]
|
61
71
|
|
62
72
|
|
63
|
-
@
|
73
|
+
@dataclass
|
64
74
|
class CombinatorialOptimizationSolution:
|
65
|
-
probability:
|
66
|
-
cost:
|
67
|
-
solution:
|
68
|
-
count:
|
75
|
+
probability: CReal
|
76
|
+
cost: CReal
|
77
|
+
solution: CArray[CInt]
|
78
|
+
count: CInt
|
69
79
|
|
70
80
|
|
71
|
-
@
|
81
|
+
@dataclass
|
72
82
|
class GaussianModel:
|
73
|
-
num_qubits:
|
74
|
-
normal_max_value:
|
75
|
-
default_probabilities:
|
76
|
-
rhos:
|
77
|
-
loss:
|
78
|
-
min_loss:
|
83
|
+
num_qubits: CInt
|
84
|
+
normal_max_value: CReal
|
85
|
+
default_probabilities: CArray[CReal]
|
86
|
+
rhos: CArray[CReal]
|
87
|
+
loss: CArray[CInt]
|
88
|
+
min_loss: CInt
|
79
89
|
|
80
90
|
|
81
|
-
@
|
91
|
+
@dataclass
|
82
92
|
class LogNormalModel:
|
83
|
-
num_qubits:
|
84
|
-
mu:
|
85
|
-
sigma:
|
93
|
+
num_qubits: CInt
|
94
|
+
mu: CReal
|
95
|
+
sigma: CReal
|
86
96
|
|
87
97
|
|
88
|
-
@
|
98
|
+
@dataclass
|
89
99
|
class FinanceFunction:
|
90
|
-
f:
|
91
|
-
threshold:
|
92
|
-
larger:
|
93
|
-
polynomial_degree:
|
94
|
-
use_chebyshev_polynomial_approximation:
|
95
|
-
tail_probability:
|
100
|
+
f: CInt
|
101
|
+
threshold: CReal
|
102
|
+
larger: CBool
|
103
|
+
polynomial_degree: CInt
|
104
|
+
use_chebyshev_polynomial_approximation: CBool
|
105
|
+
tail_probability: CReal
|
96
106
|
|
97
107
|
|
98
|
-
@
|
108
|
+
@dataclass
|
99
109
|
class QsvmResult:
|
100
|
-
test_score:
|
101
|
-
predicted_labels:
|
110
|
+
test_score: CReal
|
111
|
+
predicted_labels: CArray[CReal]
|
102
112
|
|
103
113
|
|
104
|
-
@
|
114
|
+
@dataclass
|
105
115
|
class QSVMFeatureMapPauli:
|
106
|
-
feature_dimension:
|
107
|
-
reps:
|
108
|
-
entanglement:
|
109
|
-
alpha:
|
110
|
-
paulis:
|
116
|
+
feature_dimension: CInt
|
117
|
+
reps: CInt
|
118
|
+
entanglement: CInt
|
119
|
+
alpha: CReal
|
120
|
+
paulis: CArray[CArray[Pauli]]
|
121
|
+
|
122
|
+
|
123
|
+
BUILTIN_STRUCT_DECLARATIONS = {
|
124
|
+
struct_decl.__name__: StructDeclaration(
|
125
|
+
name=struct_decl.__name__,
|
126
|
+
variables={
|
127
|
+
field.name: PythonClassicalType().convert(field.type)
|
128
|
+
for field in fields(struct_decl)
|
129
|
+
},
|
130
|
+
)
|
131
|
+
for struct_decl in vars().values()
|
132
|
+
if is_dataclass(struct_decl)
|
133
|
+
}
|
111
134
|
|
112
135
|
|
113
136
|
__all__ = [
|
114
|
-
"PauliTerm",
|
115
|
-
"MoleculeProblem",
|
116
|
-
"Molecule",
|
117
137
|
"ChemistryAtom",
|
118
|
-
"Position",
|
119
|
-
"FockHamiltonianProblem",
|
120
|
-
"LadderTerm",
|
121
|
-
"LadderOp",
|
122
138
|
"CombinatorialOptimizationSolution",
|
139
|
+
"FinanceFunction",
|
140
|
+
"FockHamiltonianProblem",
|
123
141
|
"GaussianModel",
|
142
|
+
"LadderOp",
|
143
|
+
"LadderTerm",
|
124
144
|
"LogNormalModel",
|
125
|
-
"
|
126
|
-
"
|
145
|
+
"Molecule",
|
146
|
+
"MoleculeProblem",
|
147
|
+
"PauliTerm",
|
148
|
+
"Position",
|
127
149
|
"QSVMFeatureMapPauli",
|
150
|
+
"QsvmResult",
|
128
151
|
]
|
classiq/qmod/cfunc.py
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
from typing import Any, Callable,
|
1
|
+
from typing import Any, Callable, Optional, Union, overload
|
2
2
|
|
3
3
|
from classiq.qmod.classical_function import CFunc
|
4
4
|
|
5
5
|
|
6
|
-
def get_caller_locals() ->
|
6
|
+
def get_caller_locals() -> dict[str, Any]:
|
7
7
|
"""Print the local variables in the caller's frame."""
|
8
8
|
import inspect
|
9
9
|
|
@@ -1,10 +1,9 @@
|
|
1
1
|
import ast
|
2
2
|
import inspect
|
3
|
-
import sys
|
4
3
|
from textwrap import dedent
|
5
|
-
from typing import Any, Callable
|
4
|
+
from typing import Any, Callable
|
6
5
|
|
7
|
-
from classiq.exceptions import ClassiqValueError
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
7
|
|
9
8
|
|
10
9
|
def _unparse_function_body(code: str, func: ast.FunctionDef) -> str:
|
@@ -17,16 +16,13 @@ def _unparse_function_body(code: str, func: ast.FunctionDef) -> str:
|
|
17
16
|
|
18
17
|
|
19
18
|
class CFunc:
|
20
|
-
def __init__(self, py_callable: Callable[[], None], caller_locals:
|
19
|
+
def __init__(self, py_callable: Callable[[], None], caller_locals: dict[str, Any]):
|
21
20
|
code = dedent(inspect.getsource(py_callable))
|
22
21
|
func = ast.parse(code).body[0]
|
23
22
|
if not isinstance(func, ast.FunctionDef):
|
24
23
|
raise ClassiqValueError("Use @cfunc to decorate a function")
|
25
24
|
if len(func.args.args) > 0:
|
26
25
|
raise ClassiqValueError("A @cfunc must receive no arguments")
|
27
|
-
|
28
|
-
self.code = "\n".join([ast.unparse(statement) for statement in func.body])
|
29
|
-
else:
|
30
|
-
self.code = _unparse_function_body(code, func)
|
26
|
+
self.code = "\n".join([ast.unparse(statement) for statement in func.body])
|
31
27
|
|
32
28
|
self._caller_constants = caller_locals
|
classiq/qmod/cparam.py
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
import sys
|
2
|
+
from typing import ( # type: ignore[attr-defined]
|
3
|
+
TYPE_CHECKING,
|
4
|
+
Any,
|
5
|
+
Generic,
|
6
|
+
Union,
|
7
|
+
_GenericAlias,
|
8
|
+
)
|
9
|
+
|
10
|
+
from typing_extensions import ParamSpec
|
11
|
+
|
12
|
+
from classiq.qmod.symbolic_expr import Symbolic, SymbolicExpr
|
13
|
+
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from classiq.qmod.qmod_variable import QNum
|
16
|
+
|
17
|
+
SymbolicSuperclass = SymbolicExpr
|
18
|
+
else:
|
19
|
+
SymbolicSuperclass = Symbolic
|
20
|
+
|
21
|
+
|
22
|
+
class CParam(SymbolicSuperclass):
|
23
|
+
def __init__(self, expr: str) -> None:
|
24
|
+
super().__init__(expr, False)
|
25
|
+
|
26
|
+
|
27
|
+
class CInt(CParam):
|
28
|
+
pass
|
29
|
+
|
30
|
+
|
31
|
+
class CReal(CParam):
|
32
|
+
pass
|
33
|
+
|
34
|
+
|
35
|
+
class CBool(CParam):
|
36
|
+
pass
|
37
|
+
|
38
|
+
|
39
|
+
_P = ParamSpec("_P")
|
40
|
+
|
41
|
+
|
42
|
+
class ArrayBase(Generic[_P]):
|
43
|
+
# Support comma-separated generic args in older Python versions
|
44
|
+
if sys.version_info[0:2] < (3, 10):
|
45
|
+
|
46
|
+
def __class_getitem__(cls, args) -> _GenericAlias:
|
47
|
+
return _GenericAlias(cls, args)
|
48
|
+
|
49
|
+
|
50
|
+
class CArray(CParam, ArrayBase[_P]):
|
51
|
+
if TYPE_CHECKING:
|
52
|
+
|
53
|
+
@property
|
54
|
+
def len(self) -> int: ...
|
55
|
+
|
56
|
+
def __getitem__(self, idx: Union[int, CInt, slice, "QNum"]) -> Any: ...
|
57
|
+
|
58
|
+
|
59
|
+
Array = CArray
|
60
|
+
|
61
|
+
|
62
|
+
class CParamScalar(CParam, SymbolicExpr):
|
63
|
+
def __hash__(self) -> int:
|
64
|
+
return hash(str(self))
|
@@ -0,0 +1,56 @@
|
|
1
|
+
from typing import Optional, Union
|
2
|
+
|
3
|
+
from classiq.interface.exceptions import ClassiqError
|
4
|
+
from classiq.interface.executor.execution_preferences import ExecutionPreferences
|
5
|
+
from classiq.interface.generator.model.constraints import Constraints
|
6
|
+
from classiq.interface.generator.model.preferences.preferences import Preferences
|
7
|
+
from classiq.interface.model.model import MAIN_FUNCTION_NAME, SerializedModel
|
8
|
+
|
9
|
+
from classiq.qmod.classical_function import CFunc
|
10
|
+
from classiq.qmod.quantum_function import GenerativeQFunc, QFunc
|
11
|
+
from classiq.qmod.write_qmod import write_qmod
|
12
|
+
|
13
|
+
|
14
|
+
def create_model(
|
15
|
+
entry_point: Union[QFunc, GenerativeQFunc],
|
16
|
+
constraints: Optional[Constraints] = None,
|
17
|
+
execution_preferences: Optional[ExecutionPreferences] = None,
|
18
|
+
preferences: Optional[Preferences] = None,
|
19
|
+
classical_execution_function: Optional[CFunc] = None,
|
20
|
+
out_file: Optional[str] = None,
|
21
|
+
) -> SerializedModel:
|
22
|
+
"""
|
23
|
+
Create a serialized model from a given Qmod entry function and additional parameters.
|
24
|
+
|
25
|
+
Args:
|
26
|
+
entry_point: The entry point function for the model, which must be a QFunc named 'main'.
|
27
|
+
constraints: Constraints for the synthesis of the model. See Constraints (Optional).
|
28
|
+
execution_preferences: Preferences for the execution of the model. See ExecutionPreferences (Optional).
|
29
|
+
preferences: Preferences for the synthesis of the model. See Preferences (Optional).
|
30
|
+
classical_execution_function: A function for the classical execution logic, which must be a CFunc (Optional).
|
31
|
+
out_file: File path to write the Qmod model in native Qmod representation to (Optional).
|
32
|
+
|
33
|
+
Returns:
|
34
|
+
SerializedModel: A serialized model.
|
35
|
+
|
36
|
+
Raises:
|
37
|
+
ClassiqError: If the entry point function is not named 'main'.
|
38
|
+
"""
|
39
|
+
|
40
|
+
if entry_point.func_decl.name != MAIN_FUNCTION_NAME:
|
41
|
+
raise ClassiqError(
|
42
|
+
f"The entry point function must be named 'main', got '{entry_point.func_decl.name}'"
|
43
|
+
)
|
44
|
+
|
45
|
+
model = entry_point.create_model(
|
46
|
+
constraints,
|
47
|
+
execution_preferences,
|
48
|
+
preferences,
|
49
|
+
classical_execution_function,
|
50
|
+
)
|
51
|
+
result = model.get_model()
|
52
|
+
|
53
|
+
if out_file is not None:
|
54
|
+
write_qmod(result, out_file)
|
55
|
+
|
56
|
+
return result
|
@@ -1,151 +1,193 @@
|
|
1
1
|
import dataclasses
|
2
|
-
import
|
3
|
-
from
|
2
|
+
import sys
|
3
|
+
from collections.abc import Sequence
|
4
|
+
from enum import EnumMeta
|
5
|
+
from typing import (
|
6
|
+
Any,
|
7
|
+
Callable,
|
8
|
+
Literal,
|
9
|
+
Optional,
|
10
|
+
get_args,
|
11
|
+
get_origin,
|
12
|
+
overload,
|
13
|
+
)
|
4
14
|
|
5
15
|
from typing_extensions import _AnnotatedAlias
|
6
16
|
|
7
|
-
from classiq.interface.
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
ConcreteClassicalType,
|
12
|
-
Integer,
|
13
|
-
QStructBase,
|
14
|
-
Real,
|
15
|
-
Struct,
|
17
|
+
from classiq.interface.exceptions import ClassiqValueError
|
18
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
|
19
|
+
from classiq.interface.generator.functions.port_declaration import (
|
20
|
+
PortDeclarationDirection,
|
16
21
|
)
|
22
|
+
from classiq.interface.generator.types.enum_declaration import declaration_from_enum
|
23
|
+
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
17
24
|
from classiq.interface.model.classical_parameter_declaration import (
|
18
|
-
|
25
|
+
AnonClassicalParameterDeclaration,
|
19
26
|
)
|
20
|
-
from classiq.interface.model.port_declaration import
|
27
|
+
from classiq.interface.model.port_declaration import AnonPortDeclaration
|
21
28
|
from classiq.interface.model.quantum_function_declaration import (
|
29
|
+
AnonPositionalArg,
|
30
|
+
AnonQuantumOperandDeclaration,
|
31
|
+
NamedParamsQuantumFunctionDeclaration,
|
22
32
|
PositionalArg,
|
23
|
-
QuantumFunctionDeclaration,
|
24
|
-
QuantumOperandDeclaration,
|
25
33
|
)
|
26
34
|
|
27
|
-
from classiq import
|
28
|
-
from classiq.
|
35
|
+
from classiq.qmod.builtins.enums import BUILTIN_ENUM_DECLARATIONS
|
36
|
+
from classiq.qmod.builtins.structs import BUILTIN_STRUCT_DECLARATIONS
|
29
37
|
from classiq.qmod.model_state_container import ModelStateContainer
|
30
|
-
from classiq.qmod.
|
31
|
-
from classiq.qmod.qmod_variable import QVar
|
32
|
-
from classiq.qmod.quantum_callable import
|
38
|
+
from classiq.qmod.python_classical_type import PythonClassicalType
|
39
|
+
from classiq.qmod.qmod_variable import QVar
|
40
|
+
from classiq.qmod.quantum_callable import QCallableList
|
33
41
|
from classiq.qmod.utilities import unmangle_keyword, version_portable_get_args
|
34
42
|
|
35
|
-
|
43
|
+
if sys.version_info[0:2] >= (3, 9):
|
44
|
+
from typing import Annotated
|
45
|
+
|
46
|
+
|
47
|
+
class _PythonClassicalType(PythonClassicalType):
|
48
|
+
def __init__(self, qmodule: Optional[ModelStateContainer]):
|
49
|
+
super().__init__()
|
50
|
+
self.qmodule = qmodule
|
51
|
+
|
52
|
+
def register_enum(self, py_type: EnumMeta) -> None:
|
53
|
+
if (
|
54
|
+
self.qmodule is None
|
55
|
+
or py_type.__name__ in BUILTIN_ENUM_DECLARATIONS
|
56
|
+
or py_type.__name__ in self.qmodule.enum_decls
|
57
|
+
):
|
58
|
+
return
|
59
|
+
|
60
|
+
enum_decl = declaration_from_enum(py_type)
|
61
|
+
self.qmodule.enum_decls[py_type.__name__] = enum_decl
|
62
|
+
|
63
|
+
def register_struct(self, py_type: type) -> None:
|
64
|
+
if (
|
65
|
+
self.qmodule is None
|
66
|
+
or py_type.__name__ in BUILTIN_STRUCT_DECLARATIONS
|
67
|
+
or py_type.__name__ in self.qmodule.type_decls
|
68
|
+
):
|
69
|
+
return
|
70
|
+
|
71
|
+
struct_decl = StructDeclaration(
|
72
|
+
name=py_type.__name__,
|
73
|
+
variables={
|
74
|
+
f.name: self.convert(f.type) for f in dataclasses.fields(py_type)
|
75
|
+
},
|
76
|
+
)
|
77
|
+
self.qmodule.type_decls[py_type.__name__] = struct_decl
|
36
78
|
|
37
79
|
|
38
80
|
def python_type_to_qmod(
|
39
|
-
py_type: type, *, qmodule: ModelStateContainer
|
81
|
+
py_type: type, *, qmodule: Optional[ModelStateContainer]
|
40
82
|
) -> Optional[ConcreteClassicalType]:
|
41
|
-
|
42
|
-
return Integer()
|
43
|
-
elif py_type == float:
|
44
|
-
return Real()
|
45
|
-
elif py_type == bool:
|
46
|
-
return Bool()
|
47
|
-
elif get_origin(py_type) == list:
|
48
|
-
return ClassicalList(
|
49
|
-
element_type=python_type_to_qmod(get_args(py_type)[0], qmodule=qmodule)
|
50
|
-
)
|
51
|
-
elif get_origin(py_type) == Array:
|
52
|
-
array_args = version_portable_get_args(py_type)
|
53
|
-
if len(array_args) != 2:
|
54
|
-
raise ClassiqValueError(
|
55
|
-
"Array accepts two generic parameters in the form 'Array[<element-type>, <size>]'"
|
56
|
-
)
|
57
|
-
return ClassicalArray(
|
58
|
-
element_type=python_type_to_qmod(array_args[0], qmodule=qmodule),
|
59
|
-
size=get_type_hint_expr(array_args[1]),
|
60
|
-
)
|
61
|
-
elif inspect.isclass(py_type) and issubclass(py_type, QStructBase):
|
62
|
-
_add_qmod_struct(py_type, qmodule=qmodule)
|
63
|
-
return Struct(name=py_type.__name__)
|
64
|
-
return None
|
65
|
-
|
66
|
-
|
67
|
-
def _add_qmod_struct(
|
68
|
-
py_type: Type[QStructBase], *, qmodule: ModelStateContainer
|
69
|
-
) -> None:
|
70
|
-
if (
|
71
|
-
py_type.__name__ in StructDeclaration.BUILTIN_STRUCT_DECLARATIONS
|
72
|
-
or py_type.__name__ in qmodule.type_decls
|
73
|
-
):
|
74
|
-
return
|
75
|
-
|
76
|
-
qmodule.type_decls[py_type.__name__] = StructDeclaration(
|
77
|
-
name=py_type.__name__,
|
78
|
-
variables={
|
79
|
-
f.name: python_type_to_qmod(f.type, qmodule=qmodule)
|
80
|
-
for f in dataclasses.fields(py_type)
|
81
|
-
},
|
82
|
-
)
|
83
|
-
|
83
|
+
return _PythonClassicalType(qmodule).convert(py_type)
|
84
84
|
|
85
|
-
def _extract_param_decl(
|
86
|
-
name: str, py_type: Any, *, qmodule: ModelStateContainer
|
87
|
-
) -> ClassicalParameterDeclaration:
|
88
|
-
if len(get_args(py_type)) != 1:
|
89
|
-
raise ClassiqValueError("QParam takes exactly one generic argument")
|
90
|
-
py_type = get_args(py_type)[0]
|
91
|
-
return ClassicalParameterDeclaration(
|
92
|
-
name=name, classical_type=python_type_to_qmod(py_type, qmodule=qmodule)
|
93
|
-
)
|
94
85
|
|
95
|
-
|
96
|
-
def _extract_port_decl(name: str, py_type: Any) -> PortDeclaration:
|
86
|
+
def _extract_port_decl(name: Optional[str], py_type: Any) -> AnonPortDeclaration:
|
97
87
|
# FIXME: CAD-13409
|
98
|
-
qtype:
|
88
|
+
qtype: type[QVar] = QVar.from_type_hint(py_type) # type:ignore[assignment]
|
99
89
|
direction = qtype.port_direction(py_type)
|
100
90
|
if isinstance(py_type, _AnnotatedAlias):
|
101
91
|
py_type = py_type.__args__[0]
|
102
|
-
|
103
|
-
name=
|
92
|
+
param = AnonPortDeclaration(
|
93
|
+
name=None,
|
104
94
|
direction=direction,
|
105
95
|
quantum_type=qtype.to_qmod_quantum_type(py_type),
|
106
96
|
)
|
97
|
+
if name is not None:
|
98
|
+
param = param.rename(name)
|
99
|
+
return param
|
107
100
|
|
108
101
|
|
109
102
|
def _extract_operand_decl(
|
110
|
-
name: str, py_type: Any, qmodule: ModelStateContainer
|
111
|
-
) ->
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
103
|
+
name: Optional[str], py_type: Any, qmodule: Optional[ModelStateContainer]
|
104
|
+
) -> AnonQuantumOperandDeclaration:
|
105
|
+
is_list = (get_origin(py_type) or py_type) is QCallableList
|
106
|
+
if get_origin(py_type) is list:
|
107
|
+
is_list = True
|
108
|
+
py_type = version_portable_get_args(py_type)[0]
|
109
|
+
type_args = version_portable_get_args(py_type)
|
110
|
+
if len(type_args) > 0 and isinstance(type_args[0], list): # Callable support
|
111
|
+
type_args = tuple(type_args[0])
|
112
|
+
param_decls = [_extract_operand_param(arg_type) for arg_type in type_args]
|
113
|
+
param = AnonQuantumOperandDeclaration(
|
117
114
|
name=name,
|
118
|
-
positional_arg_declarations=_extract_positional_args(
|
119
|
-
|
115
|
+
positional_arg_declarations=_extract_positional_args(
|
116
|
+
param_decls, qmodule=qmodule
|
117
|
+
),
|
118
|
+
is_list=is_list,
|
119
|
+
)
|
120
|
+
if name is not None:
|
121
|
+
param = param.rename(name)
|
122
|
+
return param
|
123
|
+
|
124
|
+
|
125
|
+
def _extract_operand_param(py_type: Any) -> tuple[Optional[str], Any]:
|
126
|
+
if sys.version_info[0:2] < (3, 9) or get_origin(py_type) is not Annotated:
|
127
|
+
return None, py_type
|
128
|
+
args = get_args(py_type)
|
129
|
+
if len(args) == 2:
|
130
|
+
if isinstance(args[1], PortDeclarationDirection):
|
131
|
+
return None, py_type
|
132
|
+
elif isinstance(args[1], str):
|
133
|
+
return args[1], args[0]
|
134
|
+
elif get_origin(args[1]) is Literal:
|
135
|
+
return version_portable_get_args(args[1])[0], args[0]
|
136
|
+
elif len(args) == 3 and isinstance(args[1], PortDeclarationDirection):
|
137
|
+
if isinstance(args[2], str):
|
138
|
+
return args[2], Annotated[args[0], args[1]]
|
139
|
+
elif get_origin(args[2]) is Literal:
|
140
|
+
return version_portable_get_args(args[2])[0], Annotated[args[0], args[1]]
|
141
|
+
raise ClassiqValueError(
|
142
|
+
f"Operand parameter declaration must be of the form <param-type> or "
|
143
|
+
f"Annotated[<param-type>, <param-name>]. Got {py_type}"
|
120
144
|
)
|
121
145
|
|
122
146
|
|
147
|
+
@overload
|
148
|
+
def _extract_positional_args(
|
149
|
+
args: Sequence[tuple[str, Any]], qmodule: Optional[ModelStateContainer]
|
150
|
+
) -> Sequence[PositionalArg]:
|
151
|
+
pass
|
152
|
+
|
153
|
+
|
154
|
+
@overload
|
123
155
|
def _extract_positional_args(
|
124
|
-
args:
|
125
|
-
) ->
|
126
|
-
|
127
|
-
|
156
|
+
args: Sequence[tuple[Optional[str], Any]], qmodule: Optional[ModelStateContainer]
|
157
|
+
) -> Sequence[AnonPositionalArg]:
|
158
|
+
pass
|
159
|
+
|
160
|
+
|
161
|
+
def _extract_positional_args(
|
162
|
+
args: Sequence[tuple[Optional[str], Any]], qmodule: Optional[ModelStateContainer]
|
163
|
+
) -> Sequence[AnonPositionalArg]:
|
164
|
+
result: list[AnonPositionalArg] = []
|
165
|
+
for name, py_type in args:
|
128
166
|
if name == "return":
|
129
167
|
continue
|
130
168
|
name = unmangle_keyword(name)
|
131
|
-
|
132
|
-
|
169
|
+
classical_type = python_type_to_qmod(py_type, qmodule=qmodule)
|
170
|
+
if classical_type is not None:
|
171
|
+
param = AnonClassicalParameterDeclaration(
|
172
|
+
name=None,
|
173
|
+
classical_type=classical_type,
|
174
|
+
)
|
175
|
+
if name is not None:
|
176
|
+
param = param.rename(name)
|
177
|
+
result.append(param)
|
133
178
|
elif QVar.from_type_hint(py_type) is not None:
|
134
179
|
result.append(_extract_port_decl(name, py_type))
|
135
180
|
else:
|
136
|
-
assert (get_origin(py_type) or py_type) is QCallable or (
|
137
|
-
get_origin(py_type) or py_type
|
138
|
-
) is QCallableList
|
139
181
|
result.append(_extract_operand_decl(name, py_type, qmodule=qmodule))
|
140
182
|
return result
|
141
183
|
|
142
184
|
|
143
185
|
def infer_func_decl(
|
144
|
-
py_func: Callable, qmodule: ModelStateContainer
|
145
|
-
) ->
|
146
|
-
return
|
186
|
+
py_func: Callable, qmodule: Optional[ModelStateContainer] = None
|
187
|
+
) -> NamedParamsQuantumFunctionDeclaration:
|
188
|
+
return NamedParamsQuantumFunctionDeclaration(
|
147
189
|
name=unmangle_keyword(py_func.__name__),
|
148
190
|
positional_arg_declarations=_extract_positional_args(
|
149
|
-
py_func.__annotations__, qmodule=qmodule
|
191
|
+
list(py_func.__annotations__.items()), qmodule=qmodule
|
150
192
|
),
|
151
193
|
)
|