|
4 | 4 |
|
5 | 5 | const BASES_CHECK = Ref(true) |
6 | 6 |
|
7 | | -""" |
8 | | - @samebases |
9 | | -
|
10 | | -Macro to skip checks for same bases. Useful for `*`, `expect` and similar |
11 | | -functions. |
12 | | -""" |
13 | | -macro samebases(ex) |
14 | | - return quote |
15 | | - BASES_CHECK.x = false |
16 | | - local val = $(esc(ex)) |
17 | | - BASES_CHECK.x = true |
18 | | - val |
19 | | - end |
20 | | -end |
21 | | - |
22 | | -""" |
23 | | - samebases(a, b) |
24 | | -
|
25 | | -Test if two objects have the same bases. |
26 | | -""" |
27 | | -samebases(b1::Basis, b2::Basis) = b1==b2 |
28 | | -samebases(b1::Tuple{Basis, Basis}, b2::Tuple{Basis, Basis}) = b1==b2 # for checking superoperators |
29 | | - |
30 | | -""" |
31 | | - check_samebases(a, b) |
32 | | -
|
33 | | -Throw an [`IncompatibleBases`](@ref) error if the objects don't have |
34 | | -the same bases. |
35 | | -""" |
36 | | -function check_samebases(b1, b2) |
37 | | - if BASES_CHECK[] && !samebases(b1, b2) |
38 | | - throw(IncompatibleBases()) |
39 | | - end |
40 | | -end |
41 | | - |
42 | | - |
43 | | -""" |
44 | | - multiplicable(a, b) |
45 | | -
|
46 | | -Check if two objects are multiplicable. |
47 | | -""" |
48 | | -multiplicable(b1::Basis, b2::Basis) = b1==b2 |
49 | | - |
50 | | -function multiplicable(b1::CompositeBasis, b2::CompositeBasis) |
51 | | - if !equal_shape(b1.shape,b2.shape) |
52 | | - return false |
53 | | - end |
54 | | - for i=1:length(b1.shape) |
55 | | - if !multiplicable(b1.bases[i], b2.bases[i]) |
56 | | - return false |
57 | | - end |
58 | | - end |
59 | | - return true |
60 | | -end |
61 | | - |
62 | | -""" |
63 | | - check_multiplicable(a, b) |
64 | | -
|
65 | | -Throw an [`IncompatibleBases`](@ref) error if the objects are |
66 | | -not multiplicable. |
67 | | -""" |
68 | | -function check_multiplicable(b1, b2) |
69 | | - if BASES_CHECK[] && !multiplicable(b1, b2) |
70 | | - throw(IncompatibleBases()) |
71 | | - end |
72 | | -end |
73 | | - |
74 | | -samebases(a::AbstractOperator) = samebases(a.basis_l, a.basis_r)::Bool # FIXME issue #12 |
75 | | -samebases(a::AbstractOperator, b::AbstractOperator) = samebases(a.basis_l, b.basis_l)::Bool && samebases(a.basis_r, b.basis_r)::Bool # FIXME issue #12 |
76 | | -check_samebases(a::Union{AbstractOperator, AbstractSuperOperator}) = check_samebases(a.basis_l, a.basis_r) # FIXME issue #12 |
77 | | -multiplicable(a::AbstractOperator, b::AbstractOperator) = multiplicable(a.basis_r, b.basis_l) # FIXME issue #12 |
78 | | - |
79 | 7 | ## |
80 | 8 | # tensor, reduce, ptrace |
81 | 9 | ## |
|
0 commit comments