Skip to content

Commit 44581de

Browse files
authored
Merge pull request #117 from JuliaAI/dev
For a 1.3.1 release
2 parents 05091c5 + eaa93b0 commit 44581de

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "MLJModelInterface"
22
uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea"
33
authors = ["Thibaut Lienart and Anthony Blaom"]
4-
version = "1.3.0"
4+
version = "1.3.1"
55

66
[deps]
77
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

src/equality.jl

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
# to ensure that propertynames that aren't fieldnames are always viewed as
2+
# "defined", in MLJType objects. See #115.
3+
function _isdefined(object, name)
4+
pnames = propertynames(object)
5+
fnames = fieldnames(typeof(object))
6+
name in pnames && !(name in fnames) && return true
7+
isdefined(object, name)
8+
end
9+
110
function _equal_to_depth_one(x1, x2)
211
names = propertynames(x1)
312
names === propertynames(x2) || return false
@@ -68,7 +77,8 @@ following conditions all hold, and `false` otherwise:
6877
6978
- with the exception of properties listed as `exceptions` or bound to
7079
an `AbstractRNG`, each pair of corresponding property values is
71-
either "equal" or both undefined.
80+
either "equal" or both undefined. (If a property appears as a
81+
`propertyname` but not a `fieldname`, it is deemed as always defined.)
7282
7383
The meaining of "equal" depends on the type of the property value:
7484
@@ -93,9 +103,9 @@ function is_same_except(m1::M1,
93103

94104
for name in names
95105
if !(name in exceptions)
96-
if !isdefined(m1, name)
97-
!isdefined(m2, name) || return false
98-
elseif isdefined(m2, name)
106+
if !_isdefined(m1, name)
107+
!_isdefined(m2, name) || return false
108+
elseif _isdefined(m2, name)
99109
if name in deep_properties(M1)
100110
_equal_to_depth_one(getproperty(m1,name),
101111
getproperty(m2, name)) || return false

test/equality.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ function Base.getproperty(b::Bar{names}, name::Symbol) where names
2727
name === names[1] && return v[1]
2828
return v[2]
2929
end
30+
function Base.setproperty!(b::Bar{names}, name::Symbol, value) where names
31+
name === :rng && return setfield!(b, :rng, value)
32+
v = getfield(b, :v)
33+
if name === names[1]
34+
setfield!(b, :v, (value, v[2]))
35+
return value
36+
end
37+
setfield!(b, :v, (v[1], value))
38+
value
39+
end
3040

3141
mutable struct Super <: MLJType
3242
sub::Foo
@@ -53,8 +63,15 @@ mutable struct Super2 <: MLJType
5363
z::Int
5464
end
5565

66+
5667
MLJModelInterface.deep_properties(::Type{<:Super2}) = (:sub,)
5768

69+
@testset "_isdefined" begin
70+
b = Bar(MersenneTwister(), 2, 3)
71+
@test MLJModelInterface._isdefined(b, :x)
72+
end
73+
74+
5875
@testset "_equal_to_depth_one" begin
5976
d1 = Deep(1, 2)
6077
d2 = Deep(1, 2)
@@ -108,6 +125,11 @@ end
108125
s2 = Super2(Sub(1), 2)
109126
@test s1 == s2
110127

128+
# replacing value of a "strap-on" property is detected:
129+
b = Bar(MersenneTwister(), 1, 2)
130+
b1 = deepcopy(b)
131+
b.x = 42
132+
@test b != b1
111133
end
112134

113135
@testset "in(x, collection) for MLJType" begin

0 commit comments

Comments
 (0)