JuliaPhysics / JuliaPhysics/Unitful.jl

Equality between `Gain`s is not transitive, prevents correct hashing

Open
#402 2 comments 0 reactions 0 assignees View on GitHub
logarithmic v2.0
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.