# cirq.commutes

Determines whether two values commute.

This is determined by any one of the following techniques:

• Either value has a `_commutes_` method that returns 'True', 'False', or 'None' (meaning indeterminate). If both methods either don't exist or return `NotImplemented` then another strategy is tried. `v1._commutes_` is tried before `v2._commutes_`.
• Both values are matrices. The return value is determined by checking if v1 @ v2 - v2 @ v1 is sufficiently close to zero.
• Both values are `cirq.Operation` instances. If the operations apply to disjoint qubit sets then they commute. Otherwise, if they have unitary matrices, those matrices are checked for commutativity (while accounting for the fact that the operations may have different qubit orders or only partially overlap).

If none of these techniques succeeds, the commutativity is assumed to be indeterminate.

`v1` One of the values to check for commutativity. Can be a cirq object such as an operation, or a numpy matrix.
`v2` The other value to check for commutativity. Can be a cirq object such as an operation, or a numpy matrix.
`default` A fallback value to return, instead of raising a ValueError, if it is indeterminate whether or not the two values commute.
`atol` Absolute error tolerance. If all entries in v1@v2 - v2@v1 have a magnitude less than this tolerance, v1 and v2 can be reported as commuting. Defaults to 1e-8.

`True` `v1` and `v2` commute (or approximately commute).
`False` `v1` and `v2` don't commute.
`default` The commutativity of `v1` and `v2` is indeterminate, or could not be determined, and the `default` argument was specified.

`TypeError` The commutativity of `v1` and `v2` is indeterminate, or could not be determined, and the `default` argument was not specified.

[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Missing the information I need" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Too complicated / too many steps" },{ "type": "thumb-down", "id": "outOfDate", "label":"Out of date" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Samples / code issue" },{ "type": "thumb-down", "id": "otherDown", "label":"Other" }]
[{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Easy to understand" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Solved my problem" },{ "type": "thumb-up", "id": "otherUp", "label":"Other" }]