Got it.  Thanks for the suggestion.

As to the second point - is there a way to determine the order in which the 
parameters are referenced in the function?

The problem I'm dealing with is something like this:

where sympy_equations are a series of symbolic sympy expressions, that have 
a number of parameters and variables.  At each loop iteration, the 
underlying optimization routine passes a new parameter vector to the 
objective function, so I have to bind the new parameter values to the 
equation, create a new lambda, and then pass that to the scipy.odeint 
routine 

Pseudocode 1:

def objective_function(parameter_values):
   bound_equations = sympy_equation.subs(parameter_names, parameter_values)
   binary_equations = lambdify(variables, bound_equations)
   timeseries_data = scipy.odeint(binary_equations, y0, timesteps)         
     # binary equation gets called at least 1000 times here
   error = calculate_leastsquares(timeseries_data, experimental_data)
return error

The issue I ran into is that lambdifying at every cycle iteration is a huge 
performance overhead, so it's more efficient to create an executable 
function outside of the loop, which takes as input all the variable and 
parameters.
Pseudocode 2:

pars_vars = parameters + variables
binary_equation = lambdify(pars_vars, bound_equations) # Binary function 
with all parameters and variables open

def objective_function(parameter_values):
   partial_bound_fcn = lambda x : binary_equation(*(parameter_vector+x))   
  # The binary equation called with the parameter vector values for the 
parameters
   timeseries_data = scipy.odeint(partial_bound_fcn, y0, timesteps)         
     # binary equation gets called at least 1000 times here
   error = calculate_leastsquares(timeseries_data, experimental_data)
return error

This is much faster - but it has obvious speed improvements, since the 
parameter values could be bound prior to evaluating the function 1000 
values or so within the integration routine.

If anyone has advice to speed it up, it's very welcome.

Did that make much sense?



On Thursday, 24 October 2013 15:14:02 UTC+2, Øyvind Jensen wrote:
>
>
> On Thursday, October 24, 2013 9:45:43 AM UTC+2, Federico Vaggi wrote:
>>
>> https://gist.github.com/FedericoV/7132880 here you go.
>>
>
> It looks like the function statment line needs to be continued on several 
> lines, and it should be quite easy to fix.
>
> If you look at line 693 of the file sympy/utilities/codegen.py, you'll see 
> the method that generates the function/subroutine declaration.
> The fortran printer in sympy/printers/fcode.py has some functionality for 
> line wrapping. I'd suggest that you see if you can wrap
> the line by a inserting a function call somewhere in FCodeGen.
>
> Øyvind
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to