Comments (5)
Not high priority. We can work around it. It was just unexpected behavior that cause a hard to debug problem and I though I could save other peoples time by reporting...
from pennylane.
While trying to debug the problem that made me notice the behavior above, I also noticed the following unexpected behavior: Some of the asserts in the following code do not work as I/one would expect:
hermitian_obs = qml.PauliZ(0)
assert hermitian_obs.is_hermitian
assert qml.adjoint(hermitian_obs) == hermitian_obs # fails
assert hermitian_obs.adjoint() == hermitian_obs
hermitian_obs2 = 0.2 * qml.PauliZ(0)
assert hermitian_obs2.is_hermitian
assert qml.adjoint(hermitian_obs2) == hermitian_obs2 # fails
assert hermitian_obs2.adjoint() == hermitian_obs2 # fails
non_hermitian_obs = 0.2j * qml.PauliZ(0)
assert qml.adjoint(non_hermitian_obs) != non_hermitian_obs
assert non_hermitian_obs.adjoint() != non_hermitian_obs
assert not non_hermitian_obs.is_hermitian
from pennylane.
The qml.adjoint
function is lazy by default, simply wrapping the target in an Adjoint
class for later handling. You can either specify lazy=False
when constructing the adjoint, or simplify the operators before comparison:
assert qml.adjoint(hermitian_obs, lazy=False) == hermitian_obs
assert qml.simplify(qml.adjoint(hermitian_obs)) == hermitian_obs
As for the error from:
>>> op = 0.2 * qml.PauliZ(0)
>>> qml.equal(qml.adjoint(op, lazy=False), op)
AttributeError: 'PauliZ' object has no attribute 'base'
That does seem to indeed be a bug.
Handling non-hermitian observables has been an ongoing debate. We used to raise a warning when constructing measurments from non-hermitian observables, but found that introduced a substantial performance penalty for a more obscure edge case. The challenge is finding a middle ground between returning always real results for hermitian observables, but also sometimes permitting non-hermitian obs.
from pennylane.
Thanks @cvjjm for reporting this. So far we've not focused too much on taking expectation values of non-Hermitian operators, so it doesn't surprise me too much that we are casting the result to a real value. However, it would be nice to have some limited support for non-Hermitian operators, or to at least not preclude it by casting to reals if otherwise the result would be correct.
We can definitely look into this, how blocking is it for you?
from pennylane.
Thanks for reporting this @cvjjm ! It can surely help others in the future.
from pennylane.
Related Issues (20)
- [BUG] Loading the MQT Bench dataset does not work as expected. HOT 1
- [BUG] Array indexing error when sampling after mid-circuit measurements are performed on other wires HOT 3
- NotImplementedError: VJP of eigvals wrt argnums (0,) not defined[BUG] HOT 2
- Implement `Hermitian.decomposition`
- [BUG] `qml.center` does not work for all linear combinations of Paulis
- [BUG] JAX JIT errors-out when using a tracer-based PRNG key HOT 4
- [BUG] WireError when computing quantum fisher info of mixed state HOT 2
- `qml.lie_closure` often raises `LinAlgError: Singular matrix` HOT 6
- [BUG] Class method hyperlinks don't work in PL docs
- [BUG] TorchLayer doesn't work with diff_method='parameter-shift'
- [Regression] Restore good performance when requesting many individual shots HOT 1
- Add `is_leaf`optional keyword argument to `qml.pytrees.flatten` HOT 4
- specify dtype for "default.qubit" [BUG] HOT 10
- [BUG] qml.shadows.shadow_expval raises an exception HOT 2
- [BUG] `pattern_matching_optimization` eliminates all measurements HOT 2
- [BUG] Incorrect documentation in `mitigate_with_zne`
- Distributive property is not correctly applied without `simplify`
- [BUG] Probabilities not summing to 1 on `default.qubit`
- [BUG] `qml.qsvt` throws `UnboundLocalError` with `convention = Wx` HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pennylane.