Ah! Thank you. I had not heard of closure before. Now, I have heard of it, but am not sure if I can completely understand it! I guess this might be worth being explained in the manual. One thing that is still kind of confusing is that in your example, z is defined after the closure is created until the end of that iteration. So, z is printed once below, but not the second time in the beginning of the second iteration!
julia> for i=1:10 if i>=2; println(z); end z=2 g()=2z println(z) end 2 ERROR: z not defined in anonymous at no file:2 On Tuesday, April 28, 2015 at 10:17:17 PM UTC-4, Avik Sengupta wrote: > Yes, sorry I jumped the gun. Thanks for clarifying. > > But it still does not have anything to do with Optim :) > > The problem is due to defining an inline function (line 43) that creates > closure over the "x_previous" variable. To test this, just comment that > line (and adjust the Optim.optimize call), the problem goes away. > > A simpler version of the code that fails is as follows: > > julia> function f() > for i=1:10 > if i>2; println(z); end > z=2 > g() = 2z > end > end > f (generic function with 1 method) > > julia> f() > ERROR: z not defined > in f at none:3 > > A fix to get it to work is to declare the variable at the start of your > function. Similarly, adding a "local x_previous" at the top of your > function makes it work correctly. Remember, variables in Julia are lexical > in scope. > > julia> function f() > local z > for i=1:10 > if i>2; println(z); end > z=2 > g()=2z > end > end > f (generic function with 1 method) > > julia> f() > 2 > 2 > 2 > 2 > 2 > 2 > 2 > 2 > > > On Wednesday, 29 April 2015 02:23:28 UTC+1, Pooya wrote: >> >> If you comment out lines 42-49, you will see that it works fine! >> >> On Tuesday, April 28, 2015 at 9:20:49 PM UTC-4, Pooya wrote: >>> >>> Thanks, but I think "if iter > 2" (line 21) makes sure that x_previous >>> is defined in the previous iteration. Just to be clear, the condition to >>> check here was "g_norm > g_norm_old", but I changed it to get there as >>> early as the second iteration. >>> >>> On Tuesday, April 28, 2015 at 9:13:49 PM UTC-4, Avik Sengupta wrote: >>>> >>>> I'm seeing the error in line 22 of your gist where you are trying to >>>> print the current value of "x_previous". However, x_previous is first >>>> defined in line 38 of your gist, and so the error is correct and doesnt >>>> have anything to do with Optim, as far as I can see. >>>> >>>> On Wednesday, 29 April 2015 01:39:02 UTC+1, Pooya wrote: >>>>> >>>>> Hi all, >>>>> >>>>> I have a problem that has made me scratch my head for many hours now! >>>>> It might be something obvious that I am missing. I have a Newton-Raphson >>>>> code to solve a system of nonlinear equations. The error that I get here >>>>> does not have anything to do with the algorithm, but just to be clear, I >>>>> need to find the best possible solution if the equations are not >>>>> solvable, >>>>> so I am trying to stop simulation when the direction found by >>>>> Newton-Raphson is not correct! In order to do that I put an if-loop in >>>>> the >>>>> beginning of the main loop to take x from the previous iteration >>>>> (x_previous), but I get x_previous not defined! I am using the Optim >>>>> package to do a line search after the direction has been found by >>>>> Newton-Raphson. If Optim is not used, things work perfectly (I tried by >>>>> commenting out those lines of code). Otherwise I get the error I >>>>> mentioned. >>>>> My code is here: >>>>> https://gist.github.com/prezaei85/372bde76012472865a94, which solves >>>>> a simple one-variable quadratic equation. Any thoughts are very much >>>>> appreciated. >>>>> >>>>> Thanks, >>>>> Pooya >>>>> >>>>