* 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 { # given a hash of arrays of variable names, where the hash # key is the header, autogenerate PRINTF statements 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; } *** DONE Make function in python that puts code into c function CLOSED: [2019-10-31 Thu 11:13] *** DONE Make function in python that generates c-function from a list of arguments CLOSED: [2019-10-29 Tue 23:52] *** DONE Resolve current issue malloc CLOSED: [2019-11-08 Fri 11:12] ➜ 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: MALLOC I 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 *** TODO Make sure this works with the last major release of binaryc *** DONE Finish testing a simpler case (see other repo) CLOSED: [2019-11-08 Fri 09:37] *** TODO Make master master work *** TODO Sync master with david_branch *** TODO make tag of old master branch for future reference *** TODO finish today ** General: *** DONE Get a more reliable way of loading the default values (running a ./tbse echo or something?) CLOSED: [2019-10-29 Tue 17:44] *** DONE make routine that reads out all the lines, splits them into pieces and reads out the correct key CLOSED: [2019-10-29 Tue 17:43] *** TODO Put header and other source files in a dedicated directory *** TODO Use sphinx or read the docs for auto generation of documentation *** TODO Have the compiled files put into a build directory *** TODO add pythonpath thing to readme *** TODO make script that will set up binaryc automatically so that this can become an out of the box thing *** TODO Test the importing of this code from different places ** Population ideas *** TODO Queuing system and some multiprocessing to run many systems *** TODO Consider rewriting the work that perl does