-
David Hendriks authoredDavid Hendriks authored
Todo list for the binary_c-python
Logging functionality:
Idea
Idea is to be able to give a string via python that will be used in the through the libbinary_c.so so that log_every_timestep.c The code below is the piece in log_every_timestep that uses it.
if(stardata->preferences->custom_output_function != NULL) { Dprint(“calling custom output function %p\n”, stardata->preferences->custom_output_function); stardata->preferences->custom_output_function(stardata); }
So the function should recieve ‘stardata’ as input.
We can do that with providing a logging string alltogether, or generate a logging function
In either way, this should be passed to stardata->preferences->custom_output_function as a pointer to that function
Provide string for logging
In perl this is done in the following way:
code to input
And then to use it via $population->set( C_logging_code => ’ PRINTF(“MY_STELLAR_DATA %g %g %g %g\n”, stardata->model.time, stardata->star[0].mass, stardata->model.probability, stardata->model.dt); ’ );
code to handle that input
sub binary_c_log_code { my ($code) = @_; return ” #pragma push_macro("MAX") #pragma push_macro("MIN") #undef MAX #undef MIN #include "binary_c.h"
void custom_output_function(SV * x); SV * custom_output_function_pointer(void);
SV * custom_output_function_pointer() { /*
- use PTR2UV to convert the function pointer
- &custom_output_function to an unsigned int,
- which is then converted to a Perl SV
/ return (SV)newSVuv(PTR2UV(&custom_output_function)); }
void custom_output_function(SV * x) { struct stardata_t * stardata = (struct stardata_t *)x; $code; } #undef MAX #undef MIN #pragma pop_macro("MIN") #pragma pop_macro("MAX") “; } Or use it via:
auto logging
We should also try to be able to have the code autogenerate some logging function via the following:
input in perl
$population->set( C_auto_logging => { ‘MY_STELLAR_DATA’ => [ ‘model.time’, ‘star[0].mass’, ‘model.probability’, ‘model.dt’ ] });
code to handle that input
Which is handled in perl via (see binary_grid2.pm sub autogen_C_logging_code {
my ($self) = @_; my $code = undef; if(defined $self->{_grid_options}->{C_auto_logging} && ref $self->{_grid_options}->{C_auto_logging} eq ‘HASH’ ) { $code = ”;
foreach my $header (keys %{$self->{_grid_options}->{C_auto_logging}}) { if(ref $self->{_grid_options}->{C_auto_logging}->{$header} eq ‘ARRAY’) { $code .= ‘PRINTF(“’.$header.’ ‘; foreach my $x (@{$self->{_grid_options}->{C_auto_logging}->{$header}}) { $code .= ‘%g ‘; } $code .= ‘\n”’;
foreach my $x (@{$self->{_grid_options}->{C_auto_logging}->{$header}}) { $code .= ‘,((double)stardata->’.$x.’)’; } $code .= ‘);’ } } } print “MADE AUTO CODE \n\n************************************************************\n\n$code\n\n************************************************************\n”;
return $code; }
Make function in python that puts code into c function
Make function in python that generates c-function from a list of arguments
Resolve current issue malloc
➜ binary_c-python git:(master) ✗ python python_API_test.py Traceback (most recent call last): File “python_API_test.py”, line 3, in <module> import binary_c ImportError: /home/david/projects/binary_c_root/binary_c-python/libbinary_c_api.so: undefined symbol: MALLOCI get this error when I am using the master version of binary_c with either branches of the python wrapper..
That went very deep haha. alot of memory allocation stuff