* 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