classiq 0.38.0__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 +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.3.dist-info}/METADATA +16 -9
- classiq-0.65.3.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.3.dist-info}/WHEEL +0 -0
@@ -1,44 +1,69 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Mapping
|
2
|
+
from typing import Optional, Union
|
2
3
|
|
3
4
|
from classiq.interface.generator.constant import Constant
|
4
5
|
from classiq.interface.generator.expressions.expression import Expression
|
5
6
|
from classiq.interface.generator.functions.classical_type import (
|
7
|
+
Bool,
|
6
8
|
ClassicalArray,
|
9
|
+
ClassicalList,
|
10
|
+
Integer,
|
11
|
+
Real,
|
12
|
+
)
|
13
|
+
from classiq.interface.generator.functions.concrete_types import (
|
7
14
|
ConcreteClassicalType,
|
15
|
+
ConcreteQuantumType,
|
8
16
|
)
|
9
17
|
from classiq.interface.generator.functions.port_declaration import (
|
10
18
|
PortDeclarationDirection,
|
11
19
|
)
|
20
|
+
from classiq.interface.generator.functions.type_name import TypeName
|
21
|
+
from classiq.interface.generator.types.enum_declaration import EnumDeclaration
|
22
|
+
from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
|
23
|
+
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
12
24
|
from classiq.interface.generator.visitor import NodeType, Visitor
|
25
|
+
from classiq.interface.model.allocate import Allocate
|
13
26
|
from classiq.interface.model.bind_operation import BindOperation
|
27
|
+
from classiq.interface.model.classical_if import ClassicalIf
|
14
28
|
from classiq.interface.model.classical_parameter_declaration import (
|
15
|
-
|
29
|
+
AnonClassicalParameterDeclaration,
|
16
30
|
)
|
31
|
+
from classiq.interface.model.control import Control
|
17
32
|
from classiq.interface.model.handle_binding import (
|
33
|
+
FieldHandleBinding,
|
18
34
|
HandleBinding,
|
19
35
|
SlicedHandleBinding,
|
20
36
|
SubscriptHandleBinding,
|
21
37
|
)
|
22
38
|
from classiq.interface.model.inplace_binary_operation import InplaceBinaryOperation
|
39
|
+
from classiq.interface.model.invert import Invert
|
23
40
|
from classiq.interface.model.model import Model
|
24
41
|
from classiq.interface.model.native_function_definition import NativeFunctionDefinition
|
25
|
-
from classiq.interface.model.
|
42
|
+
from classiq.interface.model.phase_operation import PhaseOperation
|
43
|
+
from classiq.interface.model.port_declaration import (
|
44
|
+
AnonPortDeclaration,
|
45
|
+
)
|
46
|
+
from classiq.interface.model.power import Power
|
26
47
|
from classiq.interface.model.quantum_expressions.amplitude_loading_operation import (
|
27
48
|
AmplitudeLoadingOperation,
|
28
49
|
)
|
29
50
|
from classiq.interface.model.quantum_expressions.arithmetic_operation import (
|
30
51
|
ArithmeticOperation,
|
52
|
+
ArithmeticOperationKind,
|
31
53
|
)
|
32
54
|
from classiq.interface.model.quantum_function_call import (
|
33
|
-
OperandIdentifier,
|
34
55
|
QuantumFunctionCall,
|
35
56
|
)
|
36
57
|
from classiq.interface.model.quantum_function_declaration import (
|
58
|
+
AnonQuantumFunctionDeclaration,
|
59
|
+
AnonQuantumOperandDeclaration,
|
37
60
|
QuantumFunctionDeclaration,
|
38
61
|
QuantumOperandDeclaration,
|
39
62
|
)
|
40
|
-
from classiq.interface.model.
|
41
|
-
|
63
|
+
from classiq.interface.model.quantum_lambda_function import (
|
64
|
+
OperandIdentifier,
|
65
|
+
QuantumLambdaFunction,
|
66
|
+
)
|
42
67
|
from classiq.interface.model.quantum_type import (
|
43
68
|
QuantumBit,
|
44
69
|
QuantumBitvector,
|
@@ -47,21 +72,28 @@ from classiq.interface.model.quantum_type import (
|
|
47
72
|
from classiq.interface.model.quantum_variable_declaration import (
|
48
73
|
QuantumVariableDeclaration,
|
49
74
|
)
|
75
|
+
from classiq.interface.model.repeat import Repeat
|
50
76
|
from classiq.interface.model.statement_block import StatementBlock
|
51
77
|
from classiq.interface.model.variable_declaration_statement import (
|
52
78
|
VariableDeclarationStatement,
|
53
79
|
)
|
54
|
-
from classiq.interface.model.within_apply_operation import
|
80
|
+
from classiq.interface.model.within_apply_operation import WithinApply
|
55
81
|
|
56
|
-
from classiq import
|
82
|
+
from classiq.open_library.functions import OPEN_LIBRARY_FUNCTIONS
|
57
83
|
from classiq.qmod.native.expression_to_qmod import transform_expression
|
84
|
+
from classiq.qmod.semantics.annotation.call_annotation import resolve_function_calls
|
58
85
|
from classiq.qmod.utilities import DEFAULT_DECIMAL_PRECISION
|
59
86
|
|
60
87
|
|
61
88
|
class DSLPrettyPrinter(Visitor):
|
62
|
-
def __init__(
|
89
|
+
def __init__(
|
90
|
+
self,
|
91
|
+
decimal_precision: Optional[int] = DEFAULT_DECIMAL_PRECISION,
|
92
|
+
emit_open_lib_functions: bool = False,
|
93
|
+
) -> None:
|
63
94
|
self._level = 0
|
64
95
|
self._decimal_precision = decimal_precision
|
96
|
+
self._emit_open_lib_functions = emit_open_lib_functions
|
65
97
|
|
66
98
|
def visit(self, node: NodeType) -> str:
|
67
99
|
res = super().visit(node)
|
@@ -70,42 +102,64 @@ class DSLPrettyPrinter(Visitor):
|
|
70
102
|
return res
|
71
103
|
|
72
104
|
def visit_Model(self, model: Model) -> str:
|
105
|
+
# FIXME - CAD-20149: Remove this line once the froggies are removed, and the visit of lambdas can be done without accessing the func_decl property (with rename_params values only).
|
106
|
+
resolve_function_calls(model, model.function_dict)
|
107
|
+
enum_decls = [self.visit(enum_decl) for enum_decl in model.enums]
|
73
108
|
struct_decls = [self.visit(struct_decl) for struct_decl in model.types]
|
109
|
+
qstruct_decls = [self.visit(qstruct_decl) for qstruct_decl in model.qstructs]
|
74
110
|
func_defs = [self.visit(func_def) for func_def in model.functions]
|
75
111
|
constants = [self.visit(constant) for constant in model.constants]
|
76
112
|
classical_code = (
|
77
|
-
f"cscope ```\n{model.classical_execution_code}\n
|
113
|
+
[f"cscope ```\n{model.classical_execution_code}\n```\n"]
|
78
114
|
if model.classical_execution_code
|
79
|
-
else
|
115
|
+
else []
|
80
116
|
)
|
81
|
-
|
117
|
+
|
118
|
+
items = [
|
119
|
+
*constants,
|
120
|
+
*enum_decls,
|
121
|
+
*struct_decls,
|
122
|
+
*qstruct_decls,
|
123
|
+
*func_defs,
|
124
|
+
*classical_code,
|
125
|
+
]
|
126
|
+
return "\n".join([item for item in items if item != ""])
|
82
127
|
|
83
128
|
def visit_Constant(self, constant: Constant) -> str:
|
84
129
|
return f"{self._indent}{self.visit(constant.name)}: {self.visit(constant.const_type)} = {self.visit(constant.value)};\n"
|
85
130
|
|
86
|
-
def _visit_arg_decls(self, func_def:
|
87
|
-
|
88
|
-
self.visit(arg_decl)
|
89
|
-
for arg_decl in func_def.get_positional_arg_decls()
|
90
|
-
if not isinstance(arg_decl, PortDeclaration)
|
91
|
-
)
|
92
|
-
quantum_args = ", ".join(
|
93
|
-
self.visit(arg_decl)
|
94
|
-
for arg_decl in func_def.get_positional_arg_decls()
|
95
|
-
if isinstance(arg_decl, PortDeclaration)
|
131
|
+
def _visit_arg_decls(self, func_def: AnonQuantumFunctionDeclaration) -> str:
|
132
|
+
positional_args = ", ".join(
|
133
|
+
self.visit(arg_decl) for arg_decl in func_def.positional_arg_declarations
|
96
134
|
)
|
97
|
-
|
98
|
-
return f"{gen_time_arg_list}({quantum_args})"
|
135
|
+
return f"({positional_args})"
|
99
136
|
|
100
137
|
def visit_QuantumFunctionDeclaration(
|
101
138
|
self, func_decl: QuantumFunctionDeclaration
|
102
139
|
) -> str:
|
103
140
|
return f"qfunc {func_decl.name}{self._visit_arg_decls(func_decl)}"
|
104
141
|
|
142
|
+
def visit_EnumDeclaration(self, enum_decl: EnumDeclaration) -> str:
|
143
|
+
return f"enum {enum_decl.name} {{\n{self._visit_members(enum_decl.members)}}}\n"
|
144
|
+
|
145
|
+
def _visit_members(self, members: dict[str, int]) -> str:
|
146
|
+
self._level += 1
|
147
|
+
members_str = "".join(
|
148
|
+
f"{self._indent}{self.visit(member_name)} = {member_value};\n"
|
149
|
+
for member_name, member_value in members.items()
|
150
|
+
)
|
151
|
+
self._level -= 1
|
152
|
+
return members_str
|
153
|
+
|
105
154
|
def visit_StructDeclaration(self, struct_decl: StructDeclaration) -> str:
|
106
155
|
return f"struct {struct_decl.name} {{\n{self._visit_variables(struct_decl.variables)}}}\n"
|
107
156
|
|
108
|
-
def
|
157
|
+
def visit_QStructDeclaration(self, qstruct_decl: QStructDeclaration) -> str:
|
158
|
+
return f"qstruct {qstruct_decl.name} {{\n{self._visit_variables(qstruct_decl.fields)}}}\n"
|
159
|
+
|
160
|
+
def _visit_variables(
|
161
|
+
self, variables: Mapping[str, Union[ConcreteClassicalType, ConcreteQuantumType]]
|
162
|
+
) -> str:
|
109
163
|
self._level += 1
|
110
164
|
variables_str = "".join(
|
111
165
|
f"{self._indent}{self.visit(field_name)}: {self.visit(var_decl)};\n"
|
@@ -119,43 +173,42 @@ class DSLPrettyPrinter(Visitor):
|
|
119
173
|
) -> str:
|
120
174
|
return f"{var_decl.name}: {self.visit(var_decl.quantum_type)}"
|
121
175
|
|
122
|
-
def
|
176
|
+
def visit_AnonPortDeclaration(self, port_decl: AnonPortDeclaration) -> str:
|
123
177
|
dir_str = (
|
124
178
|
f"{port_decl.direction} "
|
125
179
|
if port_decl.direction != PortDeclarationDirection.Inout
|
126
180
|
else ""
|
127
181
|
)
|
128
|
-
|
182
|
+
param_name = f"{port_decl.name}: " if port_decl.name is not None else ""
|
183
|
+
return f"{dir_str}{param_name}{self.visit(port_decl.quantum_type)}"
|
129
184
|
|
130
185
|
def visit_QuantumBit(self, qtype: QuantumBit) -> str:
|
131
186
|
return "qbit"
|
132
187
|
|
133
188
|
def visit_QuantumBitvector(self, qtype: QuantumBitvector) -> str:
|
189
|
+
element_type = self.visit(qtype.element_type)
|
134
190
|
if qtype.length is not None:
|
135
|
-
|
136
|
-
|
137
|
-
return f"qbit[{self.visit(qtype.length)}]"
|
138
|
-
return "qbit[]"
|
191
|
+
return f"{element_type}[{self.visit(qtype.length)}]"
|
192
|
+
return f"{element_type}[]"
|
139
193
|
|
140
194
|
def visit_QuantumNumeric(self, qtype: QuantumNumeric) -> str:
|
141
195
|
params = ""
|
142
196
|
if qtype.size is not None:
|
143
|
-
assert qtype.is_signed is not None
|
144
|
-
assert qtype.fraction_digits is not None
|
145
|
-
|
146
197
|
params = "<{}>".format(
|
147
198
|
", ".join(
|
148
199
|
self.visit(param)
|
149
200
|
for param in [qtype.size, qtype.is_signed, qtype.fraction_digits]
|
201
|
+
if param is not None
|
150
202
|
)
|
151
203
|
)
|
152
204
|
|
153
205
|
return f"qnum{params}"
|
154
206
|
|
155
|
-
def
|
156
|
-
self, cparam:
|
207
|
+
def visit_AnonClassicalParameterDeclaration(
|
208
|
+
self, cparam: AnonClassicalParameterDeclaration
|
157
209
|
) -> str:
|
158
|
-
|
210
|
+
param_name = f"{cparam.name}: " if cparam.name is not None else ""
|
211
|
+
return f"{param_name}{self.visit(cparam.classical_type)}"
|
159
212
|
|
160
213
|
def visit_Integer(self, ctint: Integer) -> str:
|
161
214
|
return "int"
|
@@ -166,75 +219,109 @@ class DSLPrettyPrinter(Visitor):
|
|
166
219
|
def visit_Bool(self, ctbool: Bool) -> str:
|
167
220
|
return "bool"
|
168
221
|
|
169
|
-
def visit_Pauli(self, ctbool: Pauli) -> str:
|
170
|
-
return "Pauli"
|
171
|
-
|
172
222
|
def visit_ClassicalList(self, ctlist: ClassicalList) -> str:
|
173
223
|
return f"{self.visit(ctlist.element_type)}[]"
|
174
224
|
|
175
225
|
def visit_ClassicalArray(self, ctarray: ClassicalArray) -> str:
|
176
226
|
return f"{self.visit(ctarray.element_type)}[{ctarray.size}]"
|
177
227
|
|
178
|
-
def
|
179
|
-
return
|
228
|
+
def visit_TypeName(self, type_: TypeName) -> str:
|
229
|
+
return type_.name
|
180
230
|
|
181
231
|
def visit_VariableDeclarationStatement(
|
182
232
|
self, local_decl: VariableDeclarationStatement
|
183
233
|
) -> str:
|
184
234
|
return f"{self._indent}{self.visit_QuantumVariableDeclaration(local_decl)};\n"
|
185
235
|
|
236
|
+
def visit_AnonQuantumOperandDeclaration(
|
237
|
+
self, op_decl: AnonQuantumOperandDeclaration
|
238
|
+
) -> str:
|
239
|
+
param_name = f"{op_decl.name}: " if op_decl.name is not None else ""
|
240
|
+
return f"{param_name}qfunc{[] if op_decl.is_list else ''} {self._visit_arg_decls(op_decl)}"
|
241
|
+
|
186
242
|
def visit_QuantumOperandDeclaration(
|
187
243
|
self, op_decl: QuantumOperandDeclaration
|
188
244
|
) -> str:
|
189
|
-
return
|
245
|
+
return self.visit_AnonQuantumOperandDeclaration(op_decl)
|
190
246
|
|
191
247
|
def visit_NativeFunctionDefinition(self, func_def: NativeFunctionDefinition) -> str:
|
248
|
+
if not self._emit_open_lib_functions and func_def.name in [
|
249
|
+
qfunc_.func_decl.name for qfunc_ in OPEN_LIBRARY_FUNCTIONS
|
250
|
+
]:
|
251
|
+
return ""
|
192
252
|
self._level += 1
|
193
253
|
body = "".join(self.visit(qvar_decl) for qvar_decl in func_def.body)
|
194
254
|
self._level -= 1
|
195
255
|
return f"{self.visit_QuantumFunctionDeclaration(func_def)} {{\n{body}}}\n"
|
196
256
|
|
257
|
+
def visit_Allocate(self, allocate: Allocate) -> str:
|
258
|
+
if allocate.size is not None:
|
259
|
+
size = f"{self.visit(allocate.size)}, "
|
260
|
+
else:
|
261
|
+
size = ""
|
262
|
+
return f"{self._indent}allocate({size}{self.visit(allocate.target)});\n"
|
263
|
+
|
197
264
|
def visit_QuantumFunctionCall(self, func_call: QuantumFunctionCall) -> str:
|
198
|
-
|
199
|
-
self.visit(arg_decl)
|
200
|
-
for arg_decl in func_call.get_positional_args()
|
201
|
-
if not isinstance(arg_decl, HandleBinding)
|
265
|
+
positional_args = ", ".join(
|
266
|
+
self.visit(arg_decl) for arg_decl in func_call.positional_args
|
202
267
|
)
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
268
|
+
return f"{self._indent}{func_call.func_name}{f'[{self.visit(func_call.function.index)}]' if isinstance(func_call.function, OperandIdentifier) else ''}({positional_args});\n"
|
269
|
+
|
270
|
+
def visit_Control(self, op: Control) -> str:
|
271
|
+
control = f"{self._indent}control ({self.visit(op.expression)}) {{\n"
|
272
|
+
control += self._visit_body(op.body)
|
273
|
+
control += f"{self._indent}}}"
|
274
|
+
if op.else_block is not None:
|
275
|
+
control += " else {\n"
|
276
|
+
control += self._visit_body(op.else_block)
|
277
|
+
control += f"{self._indent}}}"
|
278
|
+
control += "\n"
|
279
|
+
return control
|
280
|
+
|
281
|
+
def visit_PhaseOperation(self, op: PhaseOperation) -> str:
|
282
|
+
theta = f", {self.visit(op.theta)}" if op.theta else ""
|
283
|
+
phase = f"{self._indent}phase ({self.visit(op.expression)}{theta});\n"
|
284
|
+
return phase
|
285
|
+
|
286
|
+
def visit_ClassicalIf(self, op: ClassicalIf) -> str:
|
287
|
+
classical_if = f"{self._indent}if ({self.visit(op.condition)}) {{\n"
|
288
|
+
if not op.then:
|
289
|
+
raise AssertionError('Expected non empty "then" block')
|
290
|
+
classical_if += self._visit_body(op.then)
|
291
|
+
|
292
|
+
if op.else_:
|
293
|
+
classical_if += f"{self._indent}}} else {{\n"
|
294
|
+
classical_if += self._visit_body(op.else_)
|
295
|
+
|
296
|
+
classical_if += f"{self._indent}}}\n"
|
297
|
+
return classical_if
|
298
|
+
|
299
|
+
def visit_WithinApply(self, op: WithinApply) -> str:
|
231
300
|
within_apply_code = f"{self._indent}within {{\n"
|
232
|
-
within_apply_code += self._visit_body(compute
|
301
|
+
within_apply_code += self._visit_body(op.compute)
|
233
302
|
within_apply_code += f"{self._indent}}} apply {{\n"
|
234
|
-
within_apply_code += self._visit_body(action
|
303
|
+
within_apply_code += self._visit_body(op.action)
|
235
304
|
within_apply_code += f"{self._indent}}}\n"
|
236
305
|
return within_apply_code
|
237
306
|
|
307
|
+
def visit_Repeat(self, repeat: Repeat) -> str:
|
308
|
+
repeat_code = f"{self._indent}repeat ({self.visit(repeat.iter_var)}: {self.visit(repeat.count)}) {{\n"
|
309
|
+
repeat_code += self._visit_body(repeat.body)
|
310
|
+
repeat_code += f"{self._indent}}}\n"
|
311
|
+
return repeat_code
|
312
|
+
|
313
|
+
def visit_Power(self, power: Power) -> str:
|
314
|
+
power_code = f"{self._indent}power ({self.visit(power.power)}) {{\n"
|
315
|
+
power_code += self._visit_body(power.body)
|
316
|
+
power_code += f"{self._indent}}}\n"
|
317
|
+
return power_code
|
318
|
+
|
319
|
+
def visit_Invert(self, invert: Invert) -> str:
|
320
|
+
invert_code = f"{self._indent}invert {{\n"
|
321
|
+
invert_code += self._visit_body(invert.body)
|
322
|
+
invert_code += f"{self._indent}}}\n"
|
323
|
+
return invert_code
|
324
|
+
|
238
325
|
def _visit_body(self, body: StatementBlock) -> str:
|
239
326
|
code = ""
|
240
327
|
self._level += 1
|
@@ -244,11 +331,9 @@ class DSLPrettyPrinter(Visitor):
|
|
244
331
|
return code
|
245
332
|
|
246
333
|
def visit_InplaceBinaryOperation(self, op: InplaceBinaryOperation) -> str:
|
247
|
-
return (
|
248
|
-
f"{self._indent}{op.operation.value}({op.value.name}, {op.target.name});\n"
|
249
|
-
)
|
334
|
+
return f"{self._indent}{op.operation.value}({self.visit(op.value)}, {self.visit(op.target)});\n"
|
250
335
|
|
251
|
-
def _visit_pack_expr(self, vars:
|
336
|
+
def _visit_pack_expr(self, vars: list[HandleBinding]) -> str:
|
252
337
|
if len(vars) == 1:
|
253
338
|
return self.visit(vars[0])
|
254
339
|
|
@@ -261,32 +346,34 @@ class DSLPrettyPrinter(Visitor):
|
|
261
346
|
)
|
262
347
|
|
263
348
|
def visit_QuantumLambdaFunction(self, qlambda: QuantumLambdaFunction) -> str:
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
)
|
270
|
-
quantum_args = ", ".join(
|
271
|
-
arg_decl.name
|
272
|
-
for arg_decl in qlambda.func_decl.get_positional_arg_decls()
|
273
|
-
if isinstance(arg_decl, PortDeclaration)
|
349
|
+
positional_args = ", ".join(
|
350
|
+
qlambda.pos_rename_params[idx]
|
351
|
+
for idx, arg_decl in enumerate(
|
352
|
+
qlambda.func_decl.positional_arg_declarations
|
353
|
+
)
|
274
354
|
)
|
275
|
-
gen_time_arg_list = f"<{gen_time_args}>" if gen_time_args else ""
|
276
355
|
body = self._visit_body(qlambda.body)
|
277
|
-
return f"lambda
|
356
|
+
return f"lambda({positional_args}) {{\n{body}{self._indent}}}"
|
278
357
|
|
279
358
|
def visit_HandleBinding(self, var_ref: HandleBinding) -> str:
|
280
359
|
return var_ref.name
|
281
360
|
|
282
361
|
def visit_SlicedHandleBinding(self, var_ref: SlicedHandleBinding) -> str:
|
283
|
-
return
|
362
|
+
return f"{self.visit(var_ref.base_handle)}[{self.visit(var_ref.start)}:{self.visit(var_ref.end)}]"
|
284
363
|
|
285
364
|
def visit_SubscriptHandleBinding(self, var_ref: SubscriptHandleBinding) -> str:
|
286
|
-
return
|
365
|
+
return f"{self.visit(var_ref.base_handle)}[{self.visit(var_ref.index)}]"
|
366
|
+
|
367
|
+
def visit_FieldHandleBinding(self, var_ref: FieldHandleBinding) -> str:
|
368
|
+
return f"{self.visit(var_ref.base_handle)}.{self.visit(var_ref.field)}"
|
287
369
|
|
288
370
|
def visit_ArithmeticOperation(self, arith_op: ArithmeticOperation) -> str:
|
289
|
-
|
371
|
+
if arith_op.operation_kind == ArithmeticOperationKind.Assignment:
|
372
|
+
op = "="
|
373
|
+
elif arith_op.operation_kind == ArithmeticOperationKind.InplaceXor:
|
374
|
+
op = "^="
|
375
|
+
else:
|
376
|
+
op = "+="
|
290
377
|
return f"{self._indent}{self.visit(arith_op.result_var)} {op} {self.visit(arith_op.expression)};\n"
|
291
378
|
|
292
379
|
def visit_AmplitudeLoadingOperation(
|
@@ -294,7 +381,7 @@ class DSLPrettyPrinter(Visitor):
|
|
294
381
|
) -> str:
|
295
382
|
return f"{self._indent}{self.visit(amplitude_loading_op.result_var)} *= {self.visit(amplitude_loading_op.expression)};\n"
|
296
383
|
|
297
|
-
def _print_bind_handles(self, handles:
|
384
|
+
def _print_bind_handles(self, handles: list[HandleBinding]) -> str:
|
298
385
|
if len(handles) == 1:
|
299
386
|
return self.visit(handles[0])
|
300
387
|
|
@@ -306,6 +393,9 @@ class DSLPrettyPrinter(Visitor):
|
|
306
393
|
def visit_list(self, node: list) -> str:
|
307
394
|
return "[" + ", ".join(self.visit(elem) for elem in node) + "]"
|
308
395
|
|
396
|
+
def visit_OperandIdentifier(self, op: OperandIdentifier) -> str:
|
397
|
+
return str(op)
|
398
|
+
|
309
399
|
@property
|
310
400
|
def _indent(self) -> str:
|
311
401
|
return " " * self._level
|