Unfortunately, this is a known issue. Part of the problem is that we don't
currently do a very good job keeping track of source line transitions when
doing macro expansion and function inlining (see e.g. issue #1334 on the
github issue tracker). However, I get slightly more useful output on a
build using a recent LLVM version where we are able to generate somewhat
better debug location information (we haven't bumped to the newer version
by default due to other major TODOs):
julia> include("/tmp/test.jl")
0 ERROR: LoadError: TypeError: non-boolean (Array{Bool,2}) used in
boolean context
in tvd at ./printf.jl:145
in tvd at /tmp/test.jl:4
in include at ./boot.jl:254
in include_from_node1 at ./loading.jl:184
while loading /tmp/test.jl, in expression starting on line 114
Poking around a bit more (with a debugger), it looks like the issue is that
your 'gap` variable on line 56 is an array. So, the @printf fails. If
`display=false` then the error is instead on 63 when comparing the scalar
'stoptol' to the 'gap' variable.
On Sat, Aug 1, 2015 at 6:20 PM, 'Ben Crowell' via julia-users <
[email protected]> wrote:
> Hi, all,
>
> I'm a brand-new julia user trying to convert some matlab code to julia.
> When I run the code, I am currently getting a stack trace that looks like
> this:
>
> 0 ERROR: LoadError: TypeError: non-boolean (Array{Bool,2}) used in
> boolean context
> in tvd at /home/bcrowell/tvd/tvd.jl:145
> in tvd at /home/bcrowell/tvd/tvd.jl:53
> in include at ./boot.jl:254
> in include_from_node1 at loading.jl:133
> in process_options at ./client.jl:306
> in _start at ./client.jl:406
> while loading /home/bcrowell/tvd/test.jl, in expression starting on line 3
>
> Am I correct in assuming that in output like "...tvd.jl:145", the 145 is
> supposed to be a line number in tvd.jl? I couldn't figure out what was
> wrong, but I noticed that when I fiddled with the code in attempts to fix
> or track down the error, the 145 was always 145, even when it seemed like
> it should have changed. I then started trying to make a minimal example,
> and I ended up with code that was only 114 lines long, but the error was
> still claimed to be at line 145 -- a line that doesn't exist. This is with
> julia 0.4.0-dev.
>
> Normally I would not post a question on a newsgroup like this without
> first whittling my problem down to a minimal example, but this seeming
> inaccuracy of the line numbers is making it hard for me to do so. I've
> therefore posted the 114-line version of the code below, just so people can
> see what I'm talking about and try to reproduce the behavior if they wish.
>
> Without expecting anyone to debug my whole program for me ...
>
> ...am I correct that the 145 is supposed to be a line number?
> ...is this a known issue?
>
> Thanks in advance,
>
> Ben
>
>
> ===============================================================================================================
>
> # converted from the matlab function tvdip() at
> http://www.maxlittle.net/software/ , GPL v2
> function tvd(y, lambda, display=true, stoptol=1e-3, maxiter=60)
> # Search tuning parameters
> ALPHA = 0.01 # Backtracking linesearch parameter (0,0.5]
> BETA = 0.5 # Backtracking linesearch parameter (0,1)
> MAXLSITER = 20 # Max iterations of backtracking linesearch
> MU = 2 # t update
>
> N = length(y) # Length of input signal y
> M = N-1 # Size of Dx
>
> # Construct sparse operator matrices
> I1 = speye(M,M) # sparse identity matrix
> O1 = spzeros(M,1) # column vector initialized with zero
> D = [I1 O1]-[O1 I1] # negative differentiation operator, 1 on main diag,
> -1 to right
>
> DDT = D*D' # second derivative operator, 2 on main diag, -1 on diagonals
> two steps above and below it
> Dy = D*y
>
> # Find max value of lambda
> lambdamax = maximum(abs(DDT\Dy)) # x=A\B ... solves Ax=B
>
> L = length(lambda)
> x = zeros(N, L)
> s = zeros(L, 1)
> E = zeros(L, 1)
>
> # Optimization variables set up once at the start
> z = zeros(M,1) # Dual variable
> mu1 = ones(M,1) # Dual of dual variable
> mu2 = ones(M,1) # Dual of dual variable
>
> # Work through each value of lambda, with hot-restart on optimization
> # variables
> for l = 1:L
>
> t = 1e-10
> step = Inf
> f1 = z-lambda[l]
> f2 = -z-lambda[l]
>
> # Main optimization loop
> s[l] = 1
>
> for iters = 0:maxiter
>
> DTz = (z'*D)'
> DDTz = D*DTz
> w = Dy-(mu1-mu2)
>
> # Calculate objectives and primal-dual gap
> pobj1 = 0.5*w'*(DDT\w)+lambda[l]*sum(mu1+mu2)
> pobj2 = 0.5*DTz'*DTz+lambda[l]*sum(abs(Dy-DDTz))
> pobj = min(pobj1,pobj2)
> dobj = -0.5*DTz'*DTz+Dy'*z
> gap = pobj - dobj
>
> if display
> @printf("%5d %7.2e %7.2e %7.2e\n", iters, pobj, dobj, gap)
> end
>
> # Test duality gap stopping criterion
> if gap <= stoptol
> s(l) = 1
> break
> end
>
> if step >= 0.2
> t = max(2*M*MU/gap, 1.2*t)
> end
>
> dmu1 = mu1
> dmu2 = mu1
>
> resDual = rz
> resCent = [-mu1.*f1-1/t; -mu2.*f2-1/t]
> residual= [resDual; resCent]
>
> # Perform backtracking linesearch
> step = 1
> for i = 1:length(dmu1)
> if dmu1[i]<0
> step = minimum( step, 0.99*min(-mu1[i]./dmu1[i]) ) # I get an
> error on this line, even if I comment it out!?
> end
> end
> for i = 1:length(dmu2)
> if dmu2[i]<0
> step = minimum( step, 0.99*min(-mu2[i]./dmu2[i]) )
> end
> end
>
> end
>
> x(:,l) = y-D'*z
> E(l) = 0.5*sum((y-x(:,l)).^2)+lambda[l]*sum(abs(D*x(:,l)))
>
> # We may have a close solution that does not satisfy the duality gap
> if iters >= maxiter
> s(l) = 0
> end
>
> if display
> if s(l)
> @printf("Solved to precision of duality gap %5.2e\n", gap)
> else
> @printf("Max iterations exceeded - solution may be
> inaccurate\n")
> end
> end
>
> end
>
> end
>
> (x,E,s,lambdamax) = tvd([10, 11, 9, 10],1)
>