JuliaPhysics / JuliaPhysics/Unitful.jl
Equality between `Gain`s is not transitive, prevents correct hashing
- Dominant language
- Julia
- Stars
- 675
- Forks
- 124
- Avg merge
- 3h 38m
- Merged PRs (30d)
- 1
Description
When comparing a power gain `Gain{L, :p}` and a root-power gain `Gain{L, :rp}` with the same `L`, they get promoted to `Gain{L, :?}` without changing their numerical values. This breaks the transitivity of `==`:
```julia
julia> a = Gain{Unitful.Decibel, :rp}(20) # 20 dB (root-power) == factor 10
20 dB
julia> b = Gain{Unitful.Decibel, :p}(20) # 20 dB (power) == factor 100
20 dB
julia> c = Gain{Unitful.Bel, :p}(2) # 2 B (power) == factor 100
2 B
julia> a == b == c
true
julia> a == c
false
```
Comparison involving numbers is intransitive as well:
```julia
julia> a = Gain{Unitful.Decibel, :rp}(20) # 20 dB (root-power) == factor 10
20 dB
julia> b = Gain{Unitful.Decibel, :p}(10) # 10 dB (power) == factor 10
10 dB
julia> c = Gain{Unitful.Decibel, :p}(20) # 20 dB (power) == factor 100
20 dB
julia> a == 10 == b
true
julia> a == b
false
julia> 10 == a == c
true
julia> 10 == c
false
```
To obtain a consistent behavior for `==`, the promotion rules for `Gain` would have to be changed. It might be difficult to figure out a set of rules that is both practical and consistent, unless one gets rid of `Gain{L, :?}` altogether.
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by tracing Gain equality and the promotion rules for power and root-power gains, including comparisons with numbers. Define and test behavior for the examples in the issue, including transitivity and hashing; done means equality and hashing are consistent across these cases without relying on an unresolved promotion design.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- julia
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100