qojulia / QuantumOpticsBase.jl

Base functionality library for QuantumOptics.jl
Other
61 stars 32 forks source link

Less eagerly transform `FillArray` data (e.g. `identityoperator()`) into sparse arrays (e.g. `2*identityoperator()` should be FillArray, not sparse) #109

Open Krastanov opened 1 year ago

Krastanov commented 1 year ago

Since 0.4 we have Eye+sparse=dense. We should keep the sparsity in situations like this.

Regression reported over slack by Satya Bade:

Hi Stefan, Thanks, I think the problem is with the addition between Eye and a sparse operator, it gives a dense operator! For example, the following code gives an out of memory error (depending on the available RAM)

using QuantumOpticsBase
bs = SpinBasis(1//2)
op = identityoperator(bs) + sigmaz(bs)
tensor([op for _ in 1:16]...)

this is possible with the older versions

Krastanov commented 1 year ago

This is fixed in https://github.com/qojulia/QuantumOpticsBase.jl/pull/110, but there are still things that can be improved. Namely, the large block of methods with a TODO left in it can be improved by leaning a bit harder into using FillArray and lazy embeds, for scaled identities and for tensor products with identities. Leaving open but renaming

amilsted commented 1 year ago

Noting here that FillArrays 1.3 improves on this: https://github.com/JuliaArrays/FillArrays.jl/issues/265

kron is fixed upstream, but addition still gives us dense.