Skip to content

Deepcopy of Dictionaries in combination with mutating leads to errors. #1233

Open
@ntausend

Description

@ntausend

Hey, I discovered a strange behavior which I am not sure it is intended in that way.

Consider the following example code:

function mutating1(d, a)
	upd = d[1] * a
	d[1] = upd
	return d
end

function mutating2(d,a)
	nd = deepcopy(d)
		
	upd = d[1] * a
	nd[1] = upd
	return nd
end

function mutating3(d,a)
	nd = deepcopy(d)
		
	upd = nd[1] * a
	d[1] = upd
	return d
end

function nrmsq(d)
	res = norm(d[1]*d[2])
	return res
end

d = 3
arry = map(_ -> randn(d,d), 1:2)
dic = Dict{Any, Any}()
for (jj, tm) in enumerate(arry)
    dic[jj] = tm
end

dicco = deepcopy(dic)
f1 = x -> nrmsq(mutating1(x, 5))
f2 = x -> nrmsq(mutating2(x, 5))
f3 = x -> nrmsq(mutating3(x, 5))

# all three are equal, make sure f1 which modifies the input is called last
# same holds for f3, so make sure to call it on an copy.
f2(dic) |> display
f3(dicco) |> display
f1(dic) |> display

# works
g1 = gradient(f1, dic)[1]

# do not work
g2 = gradient(f2, dic)[1]
g3 =gradient(f3, dic)[1]

The versions utilizing f2 and f3 are leading to strange AssertionError: a === b from accum while the version with f1 works flawless.

Actually I have no idea how to deal with this and how to get an workaround.

Thanks for help in advance!

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdictionaryhelp wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions