diff --git a/binaryc_python_utils/example_perl.pm b/binaryc_python_utils/example_perl.pm new file mode 100644 index 0000000000000000000000000000000000000000..da2aa8c7f6f12e1b32d4803d240f5caa324a4090 --- /dev/null +++ b/binaryc_python_utils/example_perl.pm @@ -0,0 +1,95 @@ +# Autologging +# Perl code for autogeneration +# 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; +# } + +# Which is used in flexi-grid via this: +# $population->set( C_auto_logging => { +# 'MY_STELLAR_DATA' => +# [ +# 'model.time', +# 'star[0].mass', +# 'model.probability', +# 'model.dt' +# ] +# }); + +# binary_c_log_code +# 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\") +# "; +# } + +# 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); +# ' +# ); diff --git a/binaryc_python_utils/logging_functions.py b/binaryc_python_utils/logging_functions.py index c0c3645e973c1bcb7d69009a9174567abc2b8c28..d77eceb8fd30f1b01c0cc9b6b7f184defa19c8bf 100644 --- a/binaryc_python_utils/logging_functions.py +++ b/binaryc_python_utils/logging_functions.py @@ -5,58 +5,14 @@ import textwrap # https://stackoverflow.com/questions/49941617/runtime-generation-and-compilation-of-cython-functions # https://realpython.com/cpython-source-code-guide/ # https://docs.python.org/3.6/c-api/index.html +# https://stackoverflow.com/questions/6626167/build-a-pyobject-from-a-c-function +# https://docs.python.org/3.6/extending/newtypes_tutorial.html?highlight=pointer +# https://realpython.com/cpython-source-code-guide/ +# https://diseraluca.github.io/blog/2019/03/21/wetting-feet-with-python-c-api +# https://docs.python.org/3/c-api/function.html -# Perl code for autogeneration -# 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; -# } - -# Which is used in flexi-grid via this: -# $population->set( C_auto_logging => { -# 'MY_STELLAR_DATA' => -# [ -# 'model.time', -# 'star[0].mass', -# 'model.probability', -# 'model.dt' -# ] -# }); - - - +# See example_perl.pm autologging def autogen_C_logging_code(logging_dict): """ Function that autogenerates PRINTF statements for binaryc @@ -114,53 +70,7 @@ autogen_C_logging_code( #################################################################################### -# 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\") -# "; -# } - -# 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); -# ' -# ); - - +# see example_perl.pm binary_c_log_code def binary_c_log_code(code): """