Re: [julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-22 Thread Andrew
Ah ok, thanks.

As far as I can tell @anon is doing what it's supposed to do, and there's 
nothing to fix. My approach just has me specifying the contents of the 
built type explicitly, while @anon tries to automatically figure that out 
for you. I think this is more convenient for my purposes. Also, I'm using 
an immutable and @anon makes a mutable type. 

On Tuesday, July 21, 2015 at 6:32:28 AM UTC-4, Tim Holy wrote:

 @anon builds a type for you, creates a field called w, and defines call() 
 for 
 that type. IF you're running julia 0.4, that is. 

 My point was simply, as a busy person I haven't read this long email chain 
 through and might forget about it. If there's something you want fixed, 
 best to 
 file an issue with the appropriate package, with a test case that 
 illustrates 
 the problem you're having. 

 Best, 
 --Tim 

 On Monday, July 20, 2015 09:57:24 PM Andrew wrote: 
  I'm not quite sure what you mean. It looks like I could sort of 
 replicate 
  my approach using @anon by just defining an @anon function right below 
 my 
  initial function definition. Then I can use the @anon version elsewhere. 
  For example, 
  function FOC(x,w) 
   return x*w 
  end 
  p_FOC = @anon x - FOC(x,w) # maybe I should say const p_FOC for 
  performance of global variables? 
  
  
  But this doesn't work because I haven't defined w anywhere. It would 
 work 
  if I set a dummy value for w, like w = 5., but that looks sort of odd. 
 It 
  would basically come down to what I'm doing above anyway. 
  
  Is that what you meant? 
  
  On Monday, July 20, 2015 at 10:01:12 PM UTC-4, Tim Holy wrote: 
   @anon is supposed to work this way for you under the hood; it's a bit 
 of a 
   puzzle if it doesn't. Can you file an issue, with test case, with 
   FastAnonymous? 
   
   --Tim 
   
   On Monday, July 20, 2015 06:14:24 PM Andrew wrote: 
Update: I've found a significantly cleaner way to do this which 
 avoids 
FastAnonymous entirely and runs faster for me. Now in 0.4 arbitrary 
   
   objects 
   
can be overloaded to use the f() syntax using Base.call. I create an 
accessory type for each function that I want to pass to a non-linear 
   
   solver 
   
or optimization routine. This accessory type encapsulates the 
 parameters 
   
   of 
   
the function, Then I define a new method for Base.call which acts 
 like a 
single-variable function, and simply redirects the parameters stored 
 in 
   
   my 
   
type into the function. It looks like this 

function 

 hoursFOC(UF::UtilityFunction,hours,state::State{IdioState1,AggState1}, 
aprime) 

  w = state.as.w 
  consump = budget_consump_givenhours(state, aprime, hours) 
  w*uc(UF,consump,hours) - ul(UF,consump,hours) # Is w*uc = ul 

end 

immutable pars_hoursFOC{TUF : UtilityFunction, TIS:IdioState, 
TAS:AggState} 

  UF::TUF 
  state::State{TIS,TAS} 
  aprime::Float64 

end 
Base.call(f::pars_hoursFOC, h) = hoursFOC(f.UF, h, f.state, 
 f.aprime) 

When I need the nonlinear equation solver, I do 

f = pars_hoursFOC(UF,state,aprime) 
j = pars_JACOBhoursFOC(UF, state, aprime) # jacobian, same idea 
hours = myNewton(f, j, hoursguess) 

f and j are treated like functions, so this works as expected. 

This is much cleaner than my previous method where I was using @anon 
 to 
store an anonymous function, then passing that function around 
   
   everywhere. 
   
Also it's faster for some reason. My new code runs in 14s, the 
 version 
using @anon was about 20s, and a version with nested functions(or 
   
   regular 
   
anonymous functions) would be 30s. 

I see mentioned in #8712 
 https://github.com/JuliaLang/julia/pull/8712 
   
   that 
   
there may be a Callable type. That would be useful, since currently 
   
   these 
   
callable types don't work with the Optim functions or anything else 
 that 
asks for a ::Function argument. 

On Thursday, July 16, 2015 at 9:20:51 PM UTC-4, Andrew wrote: 
 fzero(f, j, guess) works for me when f and j are functions. f(Af, 
   
   guess) 
   
 works for me now when Af is an @anon function. 
 
 On Tuesday, July 7, 2015 at 7:34:39 PM UTC-4, j verzani wrote: 
 Okay, this just got fixed as much as I could with v0.1.15 
 (there is 
   
   no 
   
 fzero(f,j,guess) signature). 
 
 On Tuesday, July 7, 2015 at 4:38:41 PM UTC-4, Andrew wrote: 
 Just checked. So,  Roots.fzero(f, guess) does work. However, 
 Roots.fzero(f, j, guess) doesn't work, and neither does 
   
   Roots.newton(f, 
   
 j, 
 guess). 
 
 I looked at the Roots.jl source and I see ::Function annotations 
 on 
   
   the 
   
 methods with the jacobian, but not the regular one. 
 
 On Tuesday, July 7, 2015 at 4:22:17 PM UTC-4, j verzani wrote: 
 It isn't your first choice, but `Roots.fzero` can have 

Re: [julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-21 Thread Tim Holy
@anon builds a type for you, creates a field called w, and defines call() for 
that type. IF you're running julia 0.4, that is.

My point was simply, as a busy person I haven't read this long email chain 
through and might forget about it. If there's something you want fixed, best to 
file an issue with the appropriate package, with a test case that illustrates 
the problem you're having.

Best,
--Tim

On Monday, July 20, 2015 09:57:24 PM Andrew wrote:
 I'm not quite sure what you mean. It looks like I could sort of replicate
 my approach using @anon by just defining an @anon function right below my
 initial function definition. Then I can use the @anon version elsewhere.
 For example,
 function FOC(x,w)
  return x*w
 end
 p_FOC = @anon x - FOC(x,w) # maybe I should say const p_FOC for
 performance of global variables?
 
 
 But this doesn't work because I haven't defined w anywhere. It would work
 if I set a dummy value for w, like w = 5., but that looks sort of odd. It
 would basically come down to what I'm doing above anyway.
 
 Is that what you meant?
 
 On Monday, July 20, 2015 at 10:01:12 PM UTC-4, Tim Holy wrote:
  @anon is supposed to work this way for you under the hood; it's a bit of a
  puzzle if it doesn't. Can you file an issue, with test case, with
  FastAnonymous?
  
  --Tim
  
  On Monday, July 20, 2015 06:14:24 PM Andrew wrote:
   Update: I've found a significantly cleaner way to do this which avoids
   FastAnonymous entirely and runs faster for me. Now in 0.4 arbitrary
  
  objects
  
   can be overloaded to use the f() syntax using Base.call. I create an
   accessory type for each function that I want to pass to a non-linear
  
  solver
  
   or optimization routine. This accessory type encapsulates the parameters
  
  of
  
   the function, Then I define a new method for Base.call which acts like a
   single-variable function, and simply redirects the parameters stored in
  
  my
  
   type into the function. It looks like this
   
   function
   hoursFOC(UF::UtilityFunction,hours,state::State{IdioState1,AggState1},
   aprime)
   
 w = state.as.w
 consump = budget_consump_givenhours(state, aprime, hours)
 w*uc(UF,consump,hours) - ul(UF,consump,hours) # Is w*uc = ul
   
   end
   
   immutable pars_hoursFOC{TUF : UtilityFunction, TIS:IdioState,
   TAS:AggState}
   
 UF::TUF
 state::State{TIS,TAS}
 aprime::Float64
   
   end
   Base.call(f::pars_hoursFOC, h) = hoursFOC(f.UF, h, f.state, f.aprime)
   
   When I need the nonlinear equation solver, I do
   
   f = pars_hoursFOC(UF,state,aprime)
   j = pars_JACOBhoursFOC(UF, state, aprime) # jacobian, same idea
   hours = myNewton(f, j, hoursguess)
   
   f and j are treated like functions, so this works as expected.
   
   This is much cleaner than my previous method where I was using @anon to
   store an anonymous function, then passing that function around
  
  everywhere.
  
   Also it's faster for some reason. My new code runs in 14s, the version
   using @anon was about 20s, and a version with nested functions(or
  
  regular
  
   anonymous functions) would be 30s.
   
   I see mentioned in #8712 https://github.com/JuliaLang/julia/pull/8712
  
  that
  
   there may be a Callable type. That would be useful, since currently
  
  these
  
   callable types don't work with the Optim functions or anything else that
   asks for a ::Function argument.
   
   On Thursday, July 16, 2015 at 9:20:51 PM UTC-4, Andrew wrote:
fzero(f, j, guess) works for me when f and j are functions. f(Af,
  
  guess)
  
works for me now when Af is an @anon function.

On Tuesday, July 7, 2015 at 7:34:39 PM UTC-4, j verzani wrote:
Okay, this just got fixed as much as I could with v0.1.15 (there is
  
  no
  
fzero(f,j,guess) signature).

On Tuesday, July 7, 2015 at 4:38:41 PM UTC-4, Andrew wrote:
Just checked. So,  Roots.fzero(f, guess) does work. However,
Roots.fzero(f, j, guess) doesn't work, and neither does
  
  Roots.newton(f,
  
j,
guess).

I looked at the Roots.jl source and I see ::Function annotations on
  
  the
  
methods with the jacobian, but not the regular one.

On Tuesday, July 7, 2015 at 4:22:17 PM UTC-4, j verzani wrote:
It isn't your first choice, but `Roots.fzero` can have `@anon`
functions passed to it, unless I forgot to tag a new version after
making
that change on master not so long ago.

On Tuesday, July 7, 2015 at 2:29:51 PM UTC-4, Andrew wrote:
I'm writing this in case other people are trying to do the same
  
  thing
  
I've done, and also to see if anyone has any suggestions.

Recently I have been writing some code that requires solving
  
  lots(tens
  
of thousands) of simple non-linear equations. The application is
economics,
I am solving an intratemporal first order condition for optimal
  
  labor
  
supply given the state and a savings decision. This requires
  
  solving
  
the
   

Re: [julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-20 Thread Tim Holy
@anon is supposed to work this way for you under the hood; it's a bit of a 
puzzle if it doesn't. Can you file an issue, with test case, with 
FastAnonymous?

--Tim

On Monday, July 20, 2015 06:14:24 PM Andrew wrote:
 Update: I've found a significantly cleaner way to do this which avoids
 FastAnonymous entirely and runs faster for me. Now in 0.4 arbitrary objects
 can be overloaded to use the f() syntax using Base.call. I create an
 accessory type for each function that I want to pass to a non-linear solver
 or optimization routine. This accessory type encapsulates the parameters of
 the function, Then I define a new method for Base.call which acts like a
 single-variable function, and simply redirects the parameters stored in my
 type into the function. It looks like this
 
 function
 hoursFOC(UF::UtilityFunction,hours,state::State{IdioState1,AggState1},
 aprime)
   w = state.as.w
   consump = budget_consump_givenhours(state, aprime, hours)
   w*uc(UF,consump,hours) - ul(UF,consump,hours) # Is w*uc = ul
 end
 
 immutable pars_hoursFOC{TUF : UtilityFunction, TIS:IdioState,
 TAS:AggState}
   UF::TUF
   state::State{TIS,TAS}
   aprime::Float64
 end
 Base.call(f::pars_hoursFOC, h) = hoursFOC(f.UF, h, f.state, f.aprime)
 
 When I need the nonlinear equation solver, I do
 
 f = pars_hoursFOC(UF,state,aprime)
 j = pars_JACOBhoursFOC(UF, state, aprime) # jacobian, same idea
 hours = myNewton(f, j, hoursguess)
 
 f and j are treated like functions, so this works as expected.
 
 This is much cleaner than my previous method where I was using @anon to
 store an anonymous function, then passing that function around everywhere.
 Also it's faster for some reason. My new code runs in 14s, the version
 using @anon was about 20s, and a version with nested functions(or regular
 anonymous functions) would be 30s.
 
 I see mentioned in #8712 https://github.com/JuliaLang/julia/pull/8712 that
 there may be a Callable type. That would be useful, since currently these
 callable types don't work with the Optim functions or anything else that
 asks for a ::Function argument.
 
 On Thursday, July 16, 2015 at 9:20:51 PM UTC-4, Andrew wrote:
  fzero(f, j, guess) works for me when f and j are functions. f(Af, guess)
  works for me now when Af is an @anon function.
  
  On Tuesday, July 7, 2015 at 7:34:39 PM UTC-4, j verzani wrote:
  Okay, this just got fixed as much as I could with v0.1.15 (there is no
  fzero(f,j,guess) signature).
  
  On Tuesday, July 7, 2015 at 4:38:41 PM UTC-4, Andrew wrote:
  Just checked. So,  Roots.fzero(f, guess) does work. However,
  Roots.fzero(f, j, guess) doesn't work, and neither does Roots.newton(f,
  j,
  guess).
  
  I looked at the Roots.jl source and I see ::Function annotations on the
  methods with the jacobian, but not the regular one.
  
  On Tuesday, July 7, 2015 at 4:22:17 PM UTC-4, j verzani wrote:
  It isn't your first choice, but `Roots.fzero` can have `@anon`
  functions passed to it, unless I forgot to tag a new version after
  making
  that change on master not so long ago.
  
  On Tuesday, July 7, 2015 at 2:29:51 PM UTC-4, Andrew wrote:
  I'm writing this in case other people are trying to do the same thing
  I've done, and also to see if anyone has any suggestions.
  
  Recently I have been writing some code that requires solving lots(tens
  of thousands) of simple non-linear equations. The application is
  economics,
  I am solving an intratemporal first order condition for optimal labor
  supply given the state and a savings decision. This requires solving
  the
  same equation many times, but with different parameters.
  
  As far as I know, the standard ways to do this are to either define a
  nested function which by the lexical scoping rules inherits the
  parameters
  of the outer function, or use an anonymous function. Both these
  methods are
  slow right now because Julia can't inline those functions. However,
  the
  FastAnonymous package lets you define an anonymous function, which
  behaves exactly like a function but isn't type ::Function, which is
  fast.
  Crucially for me, in Julia 0.4 you can modify the parameters of the
  function you get out of FastAnonymous. I rewrote some code I had which
  depended on solving a lot of non-linear equations, and it's now 3
  times as
  fast, running in 2s instead of 6s.
  
  Here I'll describe a simplified version of my setup and point out a
  few issues.
  
  1. I store the anonymous function in a type that I will pass along to
  the function which needs to solve the nonlinear equation. I use a
  parametric type here since the type of an anonymous function seems to
  vary
  with every instance. For example,
  
  typeof(UF.fhoursFOC)
  FastAnonymous.##Closure#11431{Ptr{Void}
  @0x7f2c2eb26e30,0x10e636ff02d85766,(:h,)}
  
  
  To construct the type,
  
  immutable CRRA_labor{T1, T2} : LaborChoice # : means subtype of
  
  sigmac::Float64
  sigmal::Float64
  psi::Float64
  hoursmax::Float64
  state::State # 

[julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-20 Thread Andrew
Update: I've found a significantly cleaner way to do this which avoids 
FastAnonymous entirely and runs faster for me. Now in 0.4 arbitrary objects 
can be overloaded to use the f() syntax using Base.call. I create an 
accessory type for each function that I want to pass to a non-linear solver 
or optimization routine. This accessory type encapsulates the parameters of 
the function, Then I define a new method for Base.call which acts like a 
single-variable function, and simply redirects the parameters stored in my 
type into the function. It looks like this

function 
hoursFOC(UF::UtilityFunction,hours,state::State{IdioState1,AggState1}, 
aprime)
  w = state.as.w
  consump = budget_consump_givenhours(state, aprime, hours)
  w*uc(UF,consump,hours) - ul(UF,consump,hours) # Is w*uc = ul
end

immutable pars_hoursFOC{TUF : UtilityFunction, TIS:IdioState, 
TAS:AggState}
  UF::TUF
  state::State{TIS,TAS}
  aprime::Float64
end
Base.call(f::pars_hoursFOC, h) = hoursFOC(f.UF, h, f.state, f.aprime)

When I need the nonlinear equation solver, I do 

f = pars_hoursFOC(UF,state,aprime)
j = pars_JACOBhoursFOC(UF, state, aprime) # jacobian, same idea
hours = myNewton(f, j, hoursguess)

f and j are treated like functions, so this works as expected.

This is much cleaner than my previous method where I was using @anon to 
store an anonymous function, then passing that function around everywhere. 
Also it's faster for some reason. My new code runs in 14s, the version 
using @anon was about 20s, and a version with nested functions(or regular 
anonymous functions) would be 30s.

I see mentioned in #8712 https://github.com/JuliaLang/julia/pull/8712 that 
there may be a Callable type. That would be useful, since currently these 
callable types don't work with the Optim functions or anything else that 
asks for a ::Function argument.

On Thursday, July 16, 2015 at 9:20:51 PM UTC-4, Andrew wrote:

 fzero(f, j, guess) works for me when f and j are functions. f(Af, guess) 
 works for me now when Af is an @anon function. 

 On Tuesday, July 7, 2015 at 7:34:39 PM UTC-4, j verzani wrote:

 Okay, this just got fixed as much as I could with v0.1.15 (there is no 
 fzero(f,j,guess) signature).

 On Tuesday, July 7, 2015 at 4:38:41 PM UTC-4, Andrew wrote:

 Just checked. So,  Roots.fzero(f, guess) does work. However, 
 Roots.fzero(f, j, guess) doesn't work, and neither does Roots.newton(f, j, 
 guess). 

 I looked at the Roots.jl source and I see ::Function annotations on the 
 methods with the jacobian, but not the regular one.

 On Tuesday, July 7, 2015 at 4:22:17 PM UTC-4, j verzani wrote:

 It isn't your first choice, but `Roots.fzero` can have `@anon` 
 functions passed to it, unless I forgot to tag a new version after making 
 that change on master not so long ago.

 On Tuesday, July 7, 2015 at 2:29:51 PM UTC-4, Andrew wrote:

 I'm writing this in case other people are trying to do the same thing 
 I've done, and also to see if anyone has any suggestions.

 Recently I have been writing some code that requires solving lots(tens 
 of thousands) of simple non-linear equations. The application is 
 economics, 
 I am solving an intratemporal first order condition for optimal labor 
 supply given the state and a savings decision. This requires solving the 
 same equation many times, but with different parameters.

 As far as I know, the standard ways to do this are to either define a 
 nested function which by the lexical scoping rules inherits the 
 parameters 
 of the outer function, or use an anonymous function. Both these methods 
 are 
 slow right now because Julia can't inline those functions. However, the 
 FastAnonymous package lets you define an anonymous function, which 
 behaves exactly like a function but isn't type ::Function, which is fast. 
 Crucially for me, in Julia 0.4 you can modify the parameters of the 
 function you get out of FastAnonymous. I rewrote some code I had which 
 depended on solving a lot of non-linear equations, and it's now 3 times 
 as 
 fast, running in 2s instead of 6s.

 Here I'll describe a simplified version of my setup and point out a 
 few issues.

 1. I store the anonymous function in a type that I will pass along to 
 the function which needs to solve the nonlinear equation. I use a 
 parametric type here since the type of an anonymous function seems to 
 vary 
 with every instance. For example, 

 typeof(UF.fhoursFOC)
 FastAnonymous.##Closure#11431{Ptr{Void} 
 @0x7f2c2eb26e30,0x10e636ff02d85766,(:h,)}


 To construct the type,

 immutable CRRA_labor{T1, T2} : LaborChoice # : means subtype of
 sigmac::Float64
 sigmal::Float64
 psi::Float64
 hoursmax::Float64
 state::State # Encodes info on how to solve itself
 fhoursFOC::T1
 fJACOBhoursFOC::T2
 end

 To set up the anonymous functions fhoursFOC and fJACOBhoursFOC (the 
 jacobian), I define a constructor 

 function CRRA_labor(sigmac,sigmal,psi,hoursmax,state)
 fhoursFOC = @anon h - 

Re: [julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-20 Thread Andrew
I'm not quite sure what you mean. It looks like I could sort of replicate 
my approach using @anon by just defining an @anon function right below my 
initial function definition. Then I can use the @anon version elsewhere. 
For example,
function FOC(x,w)
 return x*w
end
p_FOC = @anon x - FOC(x,w) # maybe I should say const p_FOC for 
performance of global variables?


But this doesn't work because I haven't defined w anywhere. It would work 
if I set a dummy value for w, like w = 5., but that looks sort of odd. It 
would basically come down to what I'm doing above anyway.

Is that what you meant?




On Monday, July 20, 2015 at 10:01:12 PM UTC-4, Tim Holy wrote:

 @anon is supposed to work this way for you under the hood; it's a bit of a 
 puzzle if it doesn't. Can you file an issue, with test case, with 
 FastAnonymous? 

 --Tim 

 On Monday, July 20, 2015 06:14:24 PM Andrew wrote: 
  Update: I've found a significantly cleaner way to do this which avoids 
  FastAnonymous entirely and runs faster for me. Now in 0.4 arbitrary 
 objects 
  can be overloaded to use the f() syntax using Base.call. I create an 
  accessory type for each function that I want to pass to a non-linear 
 solver 
  or optimization routine. This accessory type encapsulates the parameters 
 of 
  the function, Then I define a new method for Base.call which acts like a 
  single-variable function, and simply redirects the parameters stored in 
 my 
  type into the function. It looks like this 
  
  function 
  hoursFOC(UF::UtilityFunction,hours,state::State{IdioState1,AggState1}, 
  aprime) 
w = state.as.w 
consump = budget_consump_givenhours(state, aprime, hours) 
w*uc(UF,consump,hours) - ul(UF,consump,hours) # Is w*uc = ul 
  end 
  
  immutable pars_hoursFOC{TUF : UtilityFunction, TIS:IdioState, 
  TAS:AggState} 
UF::TUF 
state::State{TIS,TAS} 
aprime::Float64 
  end 
  Base.call(f::pars_hoursFOC, h) = hoursFOC(f.UF, h, f.state, f.aprime) 
  
  When I need the nonlinear equation solver, I do 
  
  f = pars_hoursFOC(UF,state,aprime) 
  j = pars_JACOBhoursFOC(UF, state, aprime) # jacobian, same idea 
  hours = myNewton(f, j, hoursguess) 
  
  f and j are treated like functions, so this works as expected. 
  
  This is much cleaner than my previous method where I was using @anon to 
  store an anonymous function, then passing that function around 
 everywhere. 
  Also it's faster for some reason. My new code runs in 14s, the version 
  using @anon was about 20s, and a version with nested functions(or 
 regular 
  anonymous functions) would be 30s. 
  
  I see mentioned in #8712 https://github.com/JuliaLang/julia/pull/8712 
 that 
  there may be a Callable type. That would be useful, since currently 
 these 
  callable types don't work with the Optim functions or anything else that 
  asks for a ::Function argument. 
  
  On Thursday, July 16, 2015 at 9:20:51 PM UTC-4, Andrew wrote: 
   fzero(f, j, guess) works for me when f and j are functions. f(Af, 
 guess) 
   works for me now when Af is an @anon function. 
   
   On Tuesday, July 7, 2015 at 7:34:39 PM UTC-4, j verzani wrote: 
   Okay, this just got fixed as much as I could with v0.1.15 (there is 
 no 
   fzero(f,j,guess) signature). 
   
   On Tuesday, July 7, 2015 at 4:38:41 PM UTC-4, Andrew wrote: 
   Just checked. So,  Roots.fzero(f, guess) does work. However, 
   Roots.fzero(f, j, guess) doesn't work, and neither does 
 Roots.newton(f, 
   j, 
   guess). 
   
   I looked at the Roots.jl source and I see ::Function annotations on 
 the 
   methods with the jacobian, but not the regular one. 
   
   On Tuesday, July 7, 2015 at 4:22:17 PM UTC-4, j verzani wrote: 
   It isn't your first choice, but `Roots.fzero` can have `@anon` 
   functions passed to it, unless I forgot to tag a new version after 
   making 
   that change on master not so long ago. 
   
   On Tuesday, July 7, 2015 at 2:29:51 PM UTC-4, Andrew wrote: 
   I'm writing this in case other people are trying to do the same 
 thing 
   I've done, and also to see if anyone has any suggestions. 
   
   Recently I have been writing some code that requires solving 
 lots(tens 
   of thousands) of simple non-linear equations. The application is 
   economics, 
   I am solving an intratemporal first order condition for optimal 
 labor 
   supply given the state and a savings decision. This requires 
 solving 
   the 
   same equation many times, but with different parameters. 
   
   As far as I know, the standard ways to do this are to either 
 define a 
   nested function which by the lexical scoping rules inherits the 
   parameters 
   of the outer function, or use an anonymous function. Both these 
   methods are 
   slow right now because Julia can't inline those functions. 
 However, 
   the 
   FastAnonymous package lets you define an anonymous function, 
 which 
   behaves exactly like a function but isn't type ::Function, which 
 is 
   fast. 
   Crucially for me, in Julia 0.4 you can modify 

[julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-16 Thread Andrew
fzero(f, j, guess) works for me when f and j are functions. f(Af, guess) 
works for me now when Af is an @anon function. 

On Tuesday, July 7, 2015 at 7:34:39 PM UTC-4, j verzani wrote:

 Okay, this just got fixed as much as I could with v0.1.15 (there is no 
 fzero(f,j,guess) signature).

 On Tuesday, July 7, 2015 at 4:38:41 PM UTC-4, Andrew wrote:

 Just checked. So,  Roots.fzero(f, guess) does work. However, 
 Roots.fzero(f, j, guess) doesn't work, and neither does Roots.newton(f, j, 
 guess). 

 I looked at the Roots.jl source and I see ::Function annotations on the 
 methods with the jacobian, but not the regular one.

 On Tuesday, July 7, 2015 at 4:22:17 PM UTC-4, j verzani wrote:

 It isn't your first choice, but `Roots.fzero` can have `@anon` functions 
 passed to it, unless I forgot to tag a new version after making that change 
 on master not so long ago.

 On Tuesday, July 7, 2015 at 2:29:51 PM UTC-4, Andrew wrote:

 I'm writing this in case other people are trying to do the same thing 
 I've done, and also to see if anyone has any suggestions.

 Recently I have been writing some code that requires solving lots(tens 
 of thousands) of simple non-linear equations. The application is 
 economics, 
 I am solving an intratemporal first order condition for optimal labor 
 supply given the state and a savings decision. This requires solving the 
 same equation many times, but with different parameters.

 As far as I know, the standard ways to do this are to either define a 
 nested function which by the lexical scoping rules inherits the parameters 
 of the outer function, or use an anonymous function. Both these methods 
 are 
 slow right now because Julia can't inline those functions. However, the 
 FastAnonymous package lets you define an anonymous function, which 
 behaves exactly like a function but isn't type ::Function, which is fast. 
 Crucially for me, in Julia 0.4 you can modify the parameters of the 
 function you get out of FastAnonymous. I rewrote some code I had which 
 depended on solving a lot of non-linear equations, and it's now 3 times as 
 fast, running in 2s instead of 6s.

 Here I'll describe a simplified version of my setup and point out a few 
 issues.

 1. I store the anonymous function in a type that I will pass along to 
 the function which needs to solve the nonlinear equation. I use a 
 parametric type here since the type of an anonymous function seems to vary 
 with every instance. For example, 

 typeof(UF.fhoursFOC)
 FastAnonymous.##Closure#11431{Ptr{Void} 
 @0x7f2c2eb26e30,0x10e636ff02d85766,(:h,)}


 To construct the type,

 immutable CRRA_labor{T1, T2} : LaborChoice # : means subtype of
 sigmac::Float64
 sigmal::Float64
 psi::Float64
 hoursmax::Float64
 state::State # Encodes info on how to solve itself
 fhoursFOC::T1
 fJACOBhoursFOC::T2
 end

 To set up the anonymous functions fhoursFOC and fJACOBhoursFOC (the 
 jacobian), I define a constructor 

 function CRRA_labor(sigmac,sigmal,psi,hoursmax,state)
 fhoursFOC = @anon h - hoursFOC(CRRA_labor(sigmac,sigmal,psi,
 hoursmax,state,0., 0.) , h, state)
 fJACOBhoursFOC = @anon jh - JACOBhoursFOC(CRRA_labor(sigmac,sigmal
 ,psi,hoursmax,state,0., 0.) , jh, state)
 CRRA_labor(sigmac,sigmal,psi,hoursmax,state,fhoursFOC, 
 fJACOBhoursFOC)
 end

 This looks a bit complicated because the nonlinear equation I need to 
 solve, hoursFOC, relies on the type CRRA_labor, as well as some aggregate 
 and idiosyncratic state info, to set up the problem. To encode this 
 information, I define a dummy instance of CRRA_labor, where I supply 0's 
 in 
 place of the anonymous functions. I tried to make a self-referential type 
 here as described in the documentation, but I couldn't get it to work, so 
 I 
 went with the dummy instance instead.

 @anon sets up the anonymous function. This means that code like 
 fhoursFOC(0.5) will return a value.

 2. Now that I have my anonymous function taking only 1 variable, I can 
 use the nonlinear equation solver. Unfortunately, the existing nonlinear 
 equation solvers like Roots.fzero and NLsolve ask the argument to be of 
 type ::Function. Since anonymous functions work like functions but are 
 actually some different type, they wouldn't accept my argument. Instead, I 
 wrote my own Newton method, which is like 5 lines of code, where I don't 
 restrict the argument type.

 I think it would be very straightforward to make this a multivariate 
 Newton method.

 function myNewton(f, j, x)
 for n = 1:100
 fx , jx = f(x), j(x)
 abs(fx)  1e-6  return x
 d = fx/jx
 x = x - d
 end
 println(Too many iterations)
 return NaN
 end

 3. The useful thing here in 0.4 is that you can edit the parameters of 
 the anonymous function. The parameters are encoded in a custom type 
 state::State, and I update the state. Then I call my nonlinear equation 
 solver

 UF.fhoursFOC.state, UF.fJACOBhoursFOC.state = state, state
 

[julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-07 Thread j verzani
It isn't your first choice, but `Roots.fzero` can have `@anon` functions 
passed to it, unless I forgot to tag a new version after making that change 
on master not so long ago.

On Tuesday, July 7, 2015 at 2:29:51 PM UTC-4, Andrew wrote:

 I'm writing this in case other people are trying to do the same thing I've 
 done, and also to see if anyone has any suggestions.

 Recently I have been writing some code that requires solving lots(tens of 
 thousands) of simple non-linear equations. The application is economics, I 
 am solving an intratemporal first order condition for optimal labor supply 
 given the state and a savings decision. This requires solving the same 
 equation many times, but with different parameters.

 As far as I know, the standard ways to do this are to either define a 
 nested function which by the lexical scoping rules inherits the parameters 
 of the outer function, or use an anonymous function. Both these methods are 
 slow right now because Julia can't inline those functions. However, the 
 FastAnonymous package lets you define an anonymous function, which 
 behaves exactly like a function but isn't type ::Function, which is fast. 
 Crucially for me, in Julia 0.4 you can modify the parameters of the 
 function you get out of FastAnonymous. I rewrote some code I had which 
 depended on solving a lot of non-linear equations, and it's now 3 times as 
 fast, running in 2s instead of 6s.

 Here I'll describe a simplified version of my setup and point out a few 
 issues.

 1. I store the anonymous function in a type that I will pass along to the 
 function which needs to solve the nonlinear equation. I use a parametric 
 type here since the type of an anonymous function seems to vary with every 
 instance. For example, 

 typeof(UF.fhoursFOC)
 FastAnonymous.##Closure#11431{Ptr{Void} 
 @0x7f2c2eb26e30,0x10e636ff02d85766,(:h,)}


 To construct the type,

 immutable CRRA_labor{T1, T2} : LaborChoice # : means subtype of
 sigmac::Float64
 sigmal::Float64
 psi::Float64
 hoursmax::Float64
 state::State # Encodes info on how to solve itself
 fhoursFOC::T1
 fJACOBhoursFOC::T2
 end

 To set up the anonymous functions fhoursFOC and fJACOBhoursFOC (the 
 jacobian), I define a constructor 

 function CRRA_labor(sigmac,sigmal,psi,hoursmax,state)
 fhoursFOC = @anon h - hoursFOC(CRRA_labor(sigmac,sigmal,psi,hoursmax,
 state,0., 0.) , h, state)
 fJACOBhoursFOC = @anon jh - JACOBhoursFOC(CRRA_labor(sigmac,sigmal,
 psi,hoursmax,state,0., 0.) , jh, state)
 CRRA_labor(sigmac,sigmal,psi,hoursmax,state,fhoursFOC, fJACOBhoursFOC)
 end

 This looks a bit complicated because the nonlinear equation I need to 
 solve, hoursFOC, relies on the type CRRA_labor, as well as some aggregate 
 and idiosyncratic state info, to set up the problem. To encode this 
 information, I define a dummy instance of CRRA_labor, where I supply 0's in 
 place of the anonymous functions. I tried to make a self-referential type 
 here as described in the documentation, but I couldn't get it to work, so I 
 went with the dummy instance instead.

 @anon sets up the anonymous function. This means that code like 
 fhoursFOC(0.5) will return a value.

 2. Now that I have my anonymous function taking only 1 variable, I can use 
 the nonlinear equation solver. Unfortunately, the existing nonlinear 
 equation solvers like Roots.fzero and NLsolve ask the argument to be of 
 type ::Function. Since anonymous functions work like functions but are 
 actually some different type, they wouldn't accept my argument. Instead, I 
 wrote my own Newton method, which is like 5 lines of code, where I don't 
 restrict the argument type.

 I think it would be very straightforward to make this a multivariate 
 Newton method.

 function myNewton(f, j, x)
 for n = 1:100
 fx , jx = f(x), j(x)
 abs(fx)  1e-6  return x
 d = fx/jx
 x = x - d
 end
 println(Too many iterations)
 return NaN
 end

 3. The useful thing here in 0.4 is that you can edit the parameters of the 
 anonymous function. The parameters are encoded in a custom type 
 state::State, and I update the state. Then I call my nonlinear equation 
 solver

 UF.fhoursFOC.state, UF.fJACOBhoursFOC.state = state, state
 f = UF.fhoursFOC
 j = UF.fJACOBhoursFOC
 hours = myNewton(f, j, hoursguess)

 This runs much faster than my old version which used NLsolve, which itself 
 ran faster than a version using Roots.fzero.

 Issues:

 1. Since the type of the anonymous function isn't ::Function, I had to 
 write my own solver. I'm pretty sure a 1-line edit to Roots.fzero where I 
 just remove the ::Function type annotation would let it work there, but I'm 
 not aware of another workaround.

 2. I would rather use NLsolve, which uses in-place updating of its 
 arguments ( f!(input::Array, output::Array) ), but I've tried constructing 
 an anonymous function that does that, and @anon didn't work. 

[julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-07 Thread j verzani
Okay, this just got fixed as much as I could with v0.1.15 (there is no 
fzero(f,j,guess) signature).

On Tuesday, July 7, 2015 at 4:38:41 PM UTC-4, Andrew wrote:

 Just checked. So,  Roots.fzero(f, guess) does work. However, 
 Roots.fzero(f, j, guess) doesn't work, and neither does Roots.newton(f, j, 
 guess). 

 I looked at the Roots.jl source and I see ::Function annotations on the 
 methods with the jacobian, but not the regular one.

 On Tuesday, July 7, 2015 at 4:22:17 PM UTC-4, j verzani wrote:

 It isn't your first choice, but `Roots.fzero` can have `@anon` functions 
 passed to it, unless I forgot to tag a new version after making that change 
 on master not so long ago.

 On Tuesday, July 7, 2015 at 2:29:51 PM UTC-4, Andrew wrote:

 I'm writing this in case other people are trying to do the same thing 
 I've done, and also to see if anyone has any suggestions.

 Recently I have been writing some code that requires solving lots(tens 
 of thousands) of simple non-linear equations. The application is economics, 
 I am solving an intratemporal first order condition for optimal labor 
 supply given the state and a savings decision. This requires solving the 
 same equation many times, but with different parameters.

 As far as I know, the standard ways to do this are to either define a 
 nested function which by the lexical scoping rules inherits the parameters 
 of the outer function, or use an anonymous function. Both these methods are 
 slow right now because Julia can't inline those functions. However, the 
 FastAnonymous package lets you define an anonymous function, which 
 behaves exactly like a function but isn't type ::Function, which is fast. 
 Crucially for me, in Julia 0.4 you can modify the parameters of the 
 function you get out of FastAnonymous. I rewrote some code I had which 
 depended on solving a lot of non-linear equations, and it's now 3 times as 
 fast, running in 2s instead of 6s.

 Here I'll describe a simplified version of my setup and point out a few 
 issues.

 1. I store the anonymous function in a type that I will pass along to 
 the function which needs to solve the nonlinear equation. I use a 
 parametric type here since the type of an anonymous function seems to vary 
 with every instance. For example, 

 typeof(UF.fhoursFOC)
 FastAnonymous.##Closure#11431{Ptr{Void} 
 @0x7f2c2eb26e30,0x10e636ff02d85766,(:h,)}


 To construct the type,

 immutable CRRA_labor{T1, T2} : LaborChoice # : means subtype of
 sigmac::Float64
 sigmal::Float64
 psi::Float64
 hoursmax::Float64
 state::State # Encodes info on how to solve itself
 fhoursFOC::T1
 fJACOBhoursFOC::T2
 end

 To set up the anonymous functions fhoursFOC and fJACOBhoursFOC (the 
 jacobian), I define a constructor 

 function CRRA_labor(sigmac,sigmal,psi,hoursmax,state)
 fhoursFOC = @anon h - hoursFOC(CRRA_labor(sigmac,sigmal,psi,
 hoursmax,state,0., 0.) , h, state)
 fJACOBhoursFOC = @anon jh - JACOBhoursFOC(CRRA_labor(sigmac,sigmal,
 psi,hoursmax,state,0., 0.) , jh, state)
 CRRA_labor(sigmac,sigmal,psi,hoursmax,state,fhoursFOC, 
 fJACOBhoursFOC)
 end

 This looks a bit complicated because the nonlinear equation I need to 
 solve, hoursFOC, relies on the type CRRA_labor, as well as some aggregate 
 and idiosyncratic state info, to set up the problem. To encode this 
 information, I define a dummy instance of CRRA_labor, where I supply 0's in 
 place of the anonymous functions. I tried to make a self-referential type 
 here as described in the documentation, but I couldn't get it to work, so I 
 went with the dummy instance instead.

 @anon sets up the anonymous function. This means that code like 
 fhoursFOC(0.5) will return a value.

 2. Now that I have my anonymous function taking only 1 variable, I can 
 use the nonlinear equation solver. Unfortunately, the existing nonlinear 
 equation solvers like Roots.fzero and NLsolve ask the argument to be of 
 type ::Function. Since anonymous functions work like functions but are 
 actually some different type, they wouldn't accept my argument. Instead, I 
 wrote my own Newton method, which is like 5 lines of code, where I don't 
 restrict the argument type.

 I think it would be very straightforward to make this a multivariate 
 Newton method.

 function myNewton(f, j, x)
 for n = 1:100
 fx , jx = f(x), j(x)
 abs(fx)  1e-6  return x
 d = fx/jx
 x = x - d
 end
 println(Too many iterations)
 return NaN
 end

 3. The useful thing here in 0.4 is that you can edit the parameters of 
 the anonymous function. The parameters are encoded in a custom type 
 state::State, and I update the state. Then I call my nonlinear equation 
 solver

 UF.fhoursFOC.state, UF.fJACOBhoursFOC.state = state, state
 f = UF.fhoursFOC
 j = UF.fJACOBhoursFOC
 hours = myNewton(f, j, hoursguess)

 This runs much faster than my old version which used NLsolve, which 
 itself ran faster than a 

[julia-users] Re: Solving nonlinear equations quickly using FastAnonymous @anon and Julia 0.4

2015-07-07 Thread Andrew
Just checked. So,  Roots.fzero(f, guess) does work. However, Roots.fzero(f, 
j, guess) doesn't work, and neither does Roots.newton(f, j, guess). 

I looked at the Roots.jl source and I see ::Function annotations on the 
methods with the jacobian, but not the regular one.

On Tuesday, July 7, 2015 at 4:22:17 PM UTC-4, j verzani wrote:

 It isn't your first choice, but `Roots.fzero` can have `@anon` functions 
 passed to it, unless I forgot to tag a new version after making that change 
 on master not so long ago.

 On Tuesday, July 7, 2015 at 2:29:51 PM UTC-4, Andrew wrote:

 I'm writing this in case other people are trying to do the same thing 
 I've done, and also to see if anyone has any suggestions.

 Recently I have been writing some code that requires solving lots(tens of 
 thousands) of simple non-linear equations. The application is economics, I 
 am solving an intratemporal first order condition for optimal labor supply 
 given the state and a savings decision. This requires solving the same 
 equation many times, but with different parameters.

 As far as I know, the standard ways to do this are to either define a 
 nested function which by the lexical scoping rules inherits the parameters 
 of the outer function, or use an anonymous function. Both these methods are 
 slow right now because Julia can't inline those functions. However, the 
 FastAnonymous package lets you define an anonymous function, which 
 behaves exactly like a function but isn't type ::Function, which is fast. 
 Crucially for me, in Julia 0.4 you can modify the parameters of the 
 function you get out of FastAnonymous. I rewrote some code I had which 
 depended on solving a lot of non-linear equations, and it's now 3 times as 
 fast, running in 2s instead of 6s.

 Here I'll describe a simplified version of my setup and point out a few 
 issues.

 1. I store the anonymous function in a type that I will pass along to the 
 function which needs to solve the nonlinear equation. I use a parametric 
 type here since the type of an anonymous function seems to vary with every 
 instance. For example, 

 typeof(UF.fhoursFOC)
 FastAnonymous.##Closure#11431{Ptr{Void} 
 @0x7f2c2eb26e30,0x10e636ff02d85766,(:h,)}


 To construct the type,

 immutable CRRA_labor{T1, T2} : LaborChoice # : means subtype of
 sigmac::Float64
 sigmal::Float64
 psi::Float64
 hoursmax::Float64
 state::State # Encodes info on how to solve itself
 fhoursFOC::T1
 fJACOBhoursFOC::T2
 end

 To set up the anonymous functions fhoursFOC and fJACOBhoursFOC (the 
 jacobian), I define a constructor 

 function CRRA_labor(sigmac,sigmal,psi,hoursmax,state)
 fhoursFOC = @anon h - hoursFOC(CRRA_labor(sigmac,sigmal,psi,hoursmax
 ,state,0., 0.) , h, state)
 fJACOBhoursFOC = @anon jh - JACOBhoursFOC(CRRA_labor(sigmac,sigmal,
 psi,hoursmax,state,0., 0.) , jh, state)
 CRRA_labor(sigmac,sigmal,psi,hoursmax,state,fhoursFOC, fJACOBhoursFOC
 )
 end

 This looks a bit complicated because the nonlinear equation I need to 
 solve, hoursFOC, relies on the type CRRA_labor, as well as some aggregate 
 and idiosyncratic state info, to set up the problem. To encode this 
 information, I define a dummy instance of CRRA_labor, where I supply 0's in 
 place of the anonymous functions. I tried to make a self-referential type 
 here as described in the documentation, but I couldn't get it to work, so I 
 went with the dummy instance instead.

 @anon sets up the anonymous function. This means that code like 
 fhoursFOC(0.5) will return a value.

 2. Now that I have my anonymous function taking only 1 variable, I can 
 use the nonlinear equation solver. Unfortunately, the existing nonlinear 
 equation solvers like Roots.fzero and NLsolve ask the argument to be of 
 type ::Function. Since anonymous functions work like functions but are 
 actually some different type, they wouldn't accept my argument. Instead, I 
 wrote my own Newton method, which is like 5 lines of code, where I don't 
 restrict the argument type.

 I think it would be very straightforward to make this a multivariate 
 Newton method.

 function myNewton(f, j, x)
 for n = 1:100
 fx , jx = f(x), j(x)
 abs(fx)  1e-6  return x
 d = fx/jx
 x = x - d
 end
 println(Too many iterations)
 return NaN
 end

 3. The useful thing here in 0.4 is that you can edit the parameters of 
 the anonymous function. The parameters are encoded in a custom type 
 state::State, and I update the state. Then I call my nonlinear equation 
 solver

 UF.fhoursFOC.state, UF.fJACOBhoursFOC.state = state, state
 f = UF.fhoursFOC
 j = UF.fJACOBhoursFOC
 hours = myNewton(f, j, hoursguess)

 This runs much faster than my old version which used NLsolve, which 
 itself ran faster than a version using Roots.fzero.

 Issues:

 1. Since the type of the anonymous function isn't ::Function, I had to 
 write my own solver. I'm pretty sure a 1-line edit to