On Thursday, October 24, 2013 4:48:36 PM UTC+2, Federico Vaggi wrote:
>
> Got it. Thanks for the suggestion.
>
Great! How did you fix it? Would you mind to place pull request?
>
> As to the second point - is there a way to determine the order in which
> the parameters are referenced in the function?
>
I think you are looking for the 'args' argument of autowrap:
>>> help(autowrap)
Help on function autowrap in module sympy.utilities.autowrap:
autowrap(expr, language='F95', backend='f2py', tempdir=None, args=None,
flags=[], verbose=False, helpers=[])
<snip>
args
Sequence of the formal parameters of the generated code, if ommited
the
function signature is determined by the code generator.
Hope this helps.
Øyvind
>
> 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.