Short of better line numbers (which we all want), a useful trick that often 
works is to put `@show L` at the top of your loop; this will reveal which L is 
causing the problem. Then, comment out the loop and just set L to this value.

More generally, you're doing a lot of computation at the global scope, and 
this is going to be slow. Put things in functions: 
http://docs.julialang.org/en/release-0.3/manual/performance-tips/

Best,
--Tim

On Saturday, August 01, 2015 10:02:31 PM Isaiah Norton wrote:
> 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)

Reply via email to