Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check for gate parameter #12439

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open

Conversation

MozammilQ
Copy link
Contributor

@MozammilQ MozammilQ commented May 18, 2024

Summary

This PR aims to fix an issue withTarget.has_calibration() and Target.get_calibration() when passed with parameterized gates didn't work as expected.

Refer to issues for more information.
#11658
#11657

Details and comments

To be precise, Target.has_calibration() didn't check if the calibration if present is present for a particular gate with a particular parameter,
and,
Target.get_calibration() didn't get the calibration for the gate if present is present for a particular gate with a particular parameter, when passed as a parameter as args, the method tried to bind this args with a parameter in the schedule, which was not the intention of this particular args.

So, the signature of Target.has_calibration includes a new argument operation_params which has to be passed with the parameter of the Gate if the Gate is parameterized.

Similarly, the signature of Target.get_calibration also includes a new argument operation_params which has to be passed with the parameter of the Gate if the Gate is parameterized. In the case of args argument in this function, it should be passed with the values to be bound with the parameter of the schedule which has been attached to this particular gate as its calibration.

fixes #11658
fixes #11657

@MozammilQ MozammilQ requested a review from a team as a code owner May 18, 2024 01:41
@qiskit-bot qiskit-bot added the Community PR PRs from contributors that are not 'members' of the Qiskit repo label May 18, 2024
@qiskit-bot
Copy link
Collaborator

Thank you for opening a new pull request.

Before your PR can be merged it will first need to pass continuous integration tests and be reviewed. Sometimes the review process can be slow, so please be patient.

While you're waiting, please feel free to review other open PRs. While only a subset of people are authorized to approve pull requests for merging, everyone is encouraged to review open pull requests. Doing reviews helps reduce the burden on the core team and helps make the project's code better for everyone.

One or more of the following people are relevant to this code:

  • @Qiskit/terra-core
  • @nkanazawa1989

@coveralls
Copy link

Pull Request Test Coverage Report for Build 9136334258

Details

  • 6 of 6 (100.0%) changed or added relevant lines in 2 files are covered.
  • 4 unchanged lines in 1 file lost coverage.
  • Overall coverage increased (+0.006%) to 89.607%

Files with Coverage Reduction New Missed Lines %
crates/qasm2/src/lex.rs 4 92.62%
Totals Coverage Status
Change from base Build 9134495129: 0.006%
Covered Lines: 62302
Relevant Lines: 69528

💛 - Coveralls

@@ -95,4 +95,4 @@ def get_calibration(self, node_op: CircuitInst, qubits: List) -> Union[Schedule,
Raises:
TranspilerError: When node is parameterized and calibration is raw schedule object.
"""
return self.target.get_calibration(node_op.name, tuple(qubits), *node_op.params)
return self.target.get_calibration(node_op.name, tuple(qubits), None, *node_op.params)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer's comment anticipated! :)
I am not super satisfied with putting None here.
Here, the parameter node_op.params has the actual list of float parameters to bind with the Gate's parameters stored in the target which is a parameter(variable). That is why I had to put None just to keep the function's behavior similar to its previous version.

)

def test_get_calibration_for_oper_with_param_pulse_with_param(self):
args = {0.23, 0.123, 0.2}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Considering theta maps to amp, sigma, and, beta. The emphasis here is just to prove that multiple *args could be successfully bind if equal number of parameter(variable) present in the actual Schedule

@MozammilQ MozammilQ changed the title [WIP] Check for gate parameter Check for gate parameter May 19, 2024
@MozammilQ
Copy link
Contributor Author

@1ucian0 , pulse features are being deprecated in Qiskit, and being moved to Qiskit Dynamics, is this PR required anymore?
If yes, in what direction the PR should be heading?

Copy link
Contributor

@eliarbel eliarbel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @MozammilQ , thanks for working on this! Yes, although Pulse is being deprecated in Qiskit 1.3 and will be removed in 2.0, it would still be good to have this as part of the extended support window for the 1.x series.

For moving forward please note the following:

  1. Update your branch to include all the recent changes including the move Target to Rust. We still have Target class in target.py with has_calibration and get_calibration there so your changes are still valid.
  2. Once this PR is ready we will want to merge it into the 1.4 branch and not 2.0.

I also left some line comments after partially reviewing this.

) -> bool:
"""Return whether the instruction (operation + qubits) defines a calibration.

Args:
operation_name: The name of the operation for the instruction.
qargs: The tuple of qubit indices for the instruction.
operation_params: The parameters for the Instruction.
Even for a single parameter, provide as a list of float
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can omit this refinement as the type hint explicitly specs a list param and the code converts to list from a scalar anyway.

@@ -907,15 +923,25 @@ def get_calibration(
Args:
operation_name: The name of the operation for the instruction.
qargs: The tuple of qubit indices for the instruction.
operation_name: The parameters for the instruction.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate entry for operation_name, need to be removed

@@ -907,15 +923,25 @@ def get_calibration(
Args:
operation_name: The name of the operation for the instruction.
qargs: The tuple of qubit indices for the instruction.
operation_name: The parameters for the instruction.
operation_params: The parameters for the Instruction.
Even for a single parameter, provide as a list of float
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment as in has_calibration

---
fixes:
- |
Fixes an issue with :func:`Target.has_calibration` and :func:`Target.get_calibration`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Fixes an issue with :func:`Target.has_calibration` and :func:`Target.get_calibration`
Fixed an issue with :func:`Target.has_calibration` and :func:`Target.get_calibration`

- |
Fixes an issue with :func:`Target.has_calibration` and :func:`Target.get_calibration`
when passed with a parameterized Gate doesn't work as expected.
Refer to `qiskit/#11657 <https://github.com/Qiskit/qiskit/issues/11657>` and,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Refer to `qiskit/#11657 <https://github.com/Qiskit/qiskit/issues/11657>` and,
Refer to `qiskit/#11657 <https://github.com/Qiskit/qiskit/issues/11657>`__ and,

Fixes an issue with :func:`Target.has_calibration` and :func:`Target.get_calibration`
when passed with a parameterized Gate doesn't work as expected.
Refer to `qiskit/#11657 <https://github.com/Qiskit/qiskit/issues/11657>` and,
`qiskit/#11658 <https://github.com/Qiskit/qiskit/issues/11658>` for more information.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
`qiskit/#11658 <https://github.com/Qiskit/qiskit/issues/11658>` for more information.
`qiskit/#11658 <https://github.com/Qiskit/qiskit/issues/11658>` __ for more information.

def get_calibration(
self,
operation_name: str,
qargs: tuple[int, ...],
operation_params: list[float] | None = None,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not ordering like this?

    def get_calibration(
        self,
        operation_name: str,
        qargs: tuple[int, ...],
        *args: ParameterValueType,
        operation_params: list[float] | None = None,
        **kwargs: ParameterValueType,
    ) -> Schedule | ScheduleBlock:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Community PR PRs from contributors that are not 'members' of the Qiskit repo
Projects
Status: No status
4 participants