[bug?] TypeError MD0017 Invalid operands given opcode

33 views
Skip to first unread message

Ray Song

unread,
Apr 17, 2012, 9:47:12 PM4/17/12
to falc...@googlegroups.com
Hi all, I'm working on an implementation of Kuhn-Munkres algorithm when come cross this issue.

falcon: FATAL - Program terminated with error.
TypeError MD0017 at a._lambda#_id_5:11: Invalid operands given opcode
Traceback:
a._lambda#_id_5:11(PC:0)
"/home/ray/a.fal" a._lambda#_id_5:16(PC:232)
"/home/ray/a.fal" a.KuhnMunkres:30(PC:440)
"/home/ray/a.fal" a.__main__:55(PC:168)


The source code in question:

function KuhnMunkres(a)
lx = [].comp(a, {s => reduce({a,b => max(a, b)}, s)})
ly = [].comp(a, {=> 0})
mate = [].comp(a, {=> nil})
fx = nil
fy = nil

n = a.len()

augment = function(x)
fx[x] = true
for y in [0:n]: if not fy[y]
t = lx[x] + ly[y] - a[x][y]
if t == 0
fy[y] = true
if mate[y] == nil or fself(mate[y])
mate[y] = x
return true
end
end
end
return false
end

for x in [0:n]
loop
fx = [].comp(a, {=> false})
fy = [].comp(a, {=> false})
delta = nil
if augment(x): break
for xx in [0:n]: if fx[xx]
for yy in [0:n]: if not fy[yy]
t = lx[xx] + ly[yy] - a[xx][yy]
if delta == nil or t < delta: delta, optx, opty = t, xx, yy
end
end

for i in [0:n]
if fx[i]: lx[i] -= delta
if fy[i]: ly[i] += delta
end
> fx.describe(), fy.describe()
input()
end
end

sum = {s => reduce({a,b => a+b}, s)}
return sum(lx) + sum(ly)
end

a = .[ .[1 2 3]
.[5 0 2]
.[3 2 1] ]

> KuhnMunkres(a)


Thanks in advance for any suggestions.

Giancarlo Niccolai

unread,
Apr 18, 2012, 9:01:45 AM4/18/12
to falc...@googlegroups.com
I didn't run it, but isn't ...

function ...

fx = nil
fy = nil

n = a.len()

function ...
fx[ ... ]

closing a nil in fx? -- if so, fx[...] will always be invalid, as the value it had when closed was a nil (invalid operands can refer to a nil[x] accessor).

Gian.


Ray Song

unread,
Apr 18, 2012, 9:13:50 AM4/18/12
to falc...@googlegroups.com

This issue is triggered when the function `augment' is called by `fself(mate[y])' . The most reliable guess I come up with is that a nested called inner function does not have access to variables in the outer function, which a directly called inner function has.

Is there any other approach to circumvent this issue?

Giancarlo Niccolai

unread,
Apr 18, 2012, 9:32:23 AM4/18/12
to falc...@googlegroups.com

Uhm, tested the program; it seems there's something wrong with fself:
it calls the function, but not the closure. A working workaround is:

augment = function(x, func)
...
if mate[y] == nil or func(mate[y],func)
....

if augment(x, augment): break

Gian.

Giancarlo Niccolai

unread,
Apr 18, 2012, 12:03:44 PM4/18/12
to falc...@googlegroups.com

Just committed a patch on the main git branch where fself points to the
actual closure. This requries a bit of extra time at call frame, but
since we're nearing an alpha release in the new engine (which deals with
performance of call frames), the performance issue is not very relevant.

Gian.

Reply all
Reply to author
Forward
0 new messages