diff --git a/CMakeLists.txt b/CMakeLists.txt index 936c206c..e1447e62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,21 +128,23 @@ endif() #instead of using target_sources libpressio_plugin_source to gather the list of plugin files #in order to generate a source file for static linking of libpressio set(LIBPRESSIO_BUILT_PLUGINS "") -macro(libpressio_plugin_file file_name) +macro(libpressio_plugin_file_aux file_name) target_sources(libpressio PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/${file_name} ) +endmacro() +macro(libpressio_plugin_file file_name) + libpressio_plugin_file_aux("${file_name}") list(APPEND LIBPRESSIO_BUILT_PLUGINS "${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/${file_name}") + set(LIBPRESSIO_BUILT_PLUGINS "${LIBPRESSIO_BUILT_PLUGINS}" PARENT_SCOPE) endmacro() #REQUIRED CORE plugins included in every build of libpressio libpressio_plugin_file(domains_metrics/print.cc) libpressio_plugin_file(compressors/noop.cc) libpressio_plugin_file(compressors/pressio.cc) libpressio_plugin_file(metrics/composite.cc) -libpressio_plugin_file(metrics/external.cc) libpressio_plugin_file(metrics/error_stat.cc) -libpressio_plugin_file(launch/external_forkexec.cc) libpressio_plugin_file(launch_metrics/noop.cc) libpressio_plugin_file(launch_metrics/print.cc) libpressio_plugin_file(metrics/noop.cc) @@ -152,6 +154,15 @@ libpressio_plugin_file(io/posix.cc) libpressio_plugin_file(domains/malloc.cc) libpressio_plugin_file(domains/nonowning.cc) +#RECOMMENDED plugins that should be included when building libpressio +option(LIBPRESSIO_WITH_EXTERNAL "Support external plugins" ON) +if(LIBPRESSIO_WITH_EXTERNAL) + libpressio_plugin_file(metrics/external.cc) + libpressio_plugin_file(launch/external_forkexec.cc) +endif() + +message("STATUS" "LIBPRESSIO_BUILD_MODE = ${LIBPRESSIO_BUILD_MODE}") + #optional components created with libpressio_optional_component don't require dependencies #they can be enabled in two (non-exclusive) ways: # 1 by 1 using -DLIBPRESSIO_HAS_${NAME}=ON @@ -162,9 +173,20 @@ function(libpressio_optional_component name description file_names) string(TOUPPER "${name}" name_upper) cmake_dependent_option(LIBPRESSIO_HAS_${name_upper} ${description} OFF "LIBPRESSIO_BUILD_MODE STREQUAL CORE" OFF) if(LIBPRESSIO_HAS_${name_upper} OR LIBPRESSIO_BUILD_MODE STREQUAL FULL) - foreach(file_name IN LISTS file_names) - libpressio_plugin_file(/${file_name}) - endforeach() + message("STATUS" "LIBPRESSIO_HAS_${name_upper} = ON") + list(LENGTH file_names LIBPRESSIO_OPTIONAL_COMPONENT_NFILES) + if("${LIBPRESSIO_OPTIONAL_COMPONENT_NFILES}" GREATER 0) + list(GET file_names 0 LIBPRESSIO_OPTIONAL_COMPONENT_FILE) + libpressio_plugin_file(/${LIBPRESSIO_OPTIONAL_COMPONENT_FILE}) + if("${LIBPRESSIO_OPTIONAL_COMPONENT_NFILES}" GREATER 1) + list(SUBLIST file_names 1 -1 LIBPRESSIO_OPTIONAL_COMPONENT_FILES_AUX) + foreach(file_name IN LISTS LIBPRESSIO_OPTIONAL_COMPONENT_FILES_AUX) + libpressio_plugin_file_aux(/${file_name}) + endforeach() + endif() + endif() + else() + message("STATUS" "LIBPRESSIO_HAS_${name_upper} = OFF") endif() endfunction() @@ -189,7 +211,7 @@ libpressio_optional_component(entropy "build the entropy metrics plugin" /metric libpressio_optional_component(historian "build the historian metrics plugin" /metrics/historian.cc) libpressio_optional_component(input_stats "build the input_stats metrics plugin" /metrics/input_stats.cc) libpressio_optional_component(iota "build the iota io plugin" /io/iota.cc) -libpressio_optional_component(kl_divergance "build the kl_divergance plugin" /metrics/kl_divergance.cc) +libpressio_optional_component(kl_divergence "build the kl_divergence plugin" /metrics/kl_divergence.cc) libpressio_optional_component(ks_test "build the KS test metrics plugin" /metrics/ks_test.cc) libpressio_optional_component(kth_error "build the kth error metrics plugin" /metrics/kth_error.cc) libpressio_optional_component(linear_quantizer "build the linear quantizer compressor plugin" /compressors/linear_quantizer.cc) @@ -211,8 +233,9 @@ libpressio_optional_component(sobolev "computes the sobolev norm" /metrics/sobol libpressio_optional_component(gradient "computes the gradient length" /metrics/gradlength.cc) libpressio_optional_component(out_of_bounds "computes the gradient length" /metrics/out_of_bounds.cc) libpressio_optional_component(write_debug_inputs "metric that writes output buffers for testing" /metrics/write_debug_inputs.cc) -set(roibin_sources /compressors/roibin.cc /compressors/binning.cc /compressors/masked_binning.cc) -libpressio_optional_component(roibin "build the roibin metacompressor" "${roibin_sources}") +libpressio_optional_component(roibin "build the roibin metacompressor" /compressors/roibin.cc) +libpressio_optional_component(binning "build the binning metacompressor" /compressors/binning.cc) +libpressio_optional_component(masked_binning "build the masked binning metacompressor" /compressors/masked_binning.cc) libpressio_optional_component(pipeline "build the pipeline metacompressor" /compressors/pipeline.cc) option(LIBPRESSIO_INTERPROCEDURAL_OPTIMIZATION "Use interprocedural optimization (LTO)" OFF) @@ -607,6 +630,7 @@ option(LIBPRESSIO_HAS_LUA "build multi-objective code" OFF) if(LIBPRESSIO_HAS_LUA) set(LIBPRESSIO_FEATURES "${LIBPRESSIO_FEATURES} lua") find_package(sol2 REQUIRED) + target_include_directories(libpressio PRIVATE ${SOL2_INCLUDE_DIRS}) if(LIBPRESSIO_LUA_PKGCONFIG) find_package(PkgConfig REQUIRED) pkg_search_module(Lua IMPORTED_TARGET lua luajit) @@ -696,15 +720,7 @@ endif() # static libraries and some system linkers will strip the registration classes # causing nothing to be registered -add_executable(pressio_register_generator src/pressio_register_generator.cc) -target_compile_features(pressio_register_generator PRIVATE cxx_std_11) -add_custom_command( - OUTPUT pressio_manual_register.cc - COMMAND "${CMAKE_CURRENT_BINARY_DIR}/pressio_register_generator" -c "${LIBPRESSIO_BUILT_PLUGINS}" -o "${CMAKE_CURRENT_BINARY_DIR}/pressio_manual_register.cc" - COMMENT "generating registration source file" - DEPENDS pressio_register_generator ${LIBPRESSIO_BUILT_PLUGINS} src/pressio_register_generator.cc - VERBATIM -) +include(${CMAKE_CURRENT_SOURCE_DIR}/tools/pressio_manual_register.cmake) target_sources(libpressio PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/pressio_manual_register.cc) configure_file( diff --git a/docs/WritingACompressorPlugin.md b/docs/WritingACompressorPlugin.md index de20e62f..db0c2e5e 100644 --- a/docs/WritingACompressorPlugin.md +++ b/docs/WritingACompressorPlugin.md @@ -136,7 +136,7 @@ We finally register the library with libpressio: ```cpp -static pressio_register X(compressor_plugins(), "log", [](){ return std::make_unique();}); +static pressio_register registration(compressor_plugins(), "log", [](){ return std::make_unique();}); ``` High quality compressor modules may be accepted into libpressio. Contributed modules should be placed in to diff --git a/docs/WritingAMetricsPlugin.md b/docs/WritingAMetricsPlugin.md index dac5f3fe..6a822534 100644 --- a/docs/WritingAMetricsPlugin.md +++ b/docs/WritingAMetricsPlugin.md @@ -75,7 +75,7 @@ class counting_metric: public libpressio_metrics_plugin { Finally, we will register the plugin in the under the names "counts" in the metrics plugging registry ```cpp -static pressio_register X(metrics_plugins(), "counts", [](){ return std::make_unique(); }); +static pressio_register registration(metrics_plugins(), "counts", [](){ return std::make_unique(); }); ``` Then a user of the library can then ask libpressio to construct their new plugin as normal. diff --git a/include/pressio_data.h b/include/pressio_data.h index 509fd021..a2e42416 100644 --- a/include/pressio_data.h +++ b/include/pressio_data.h @@ -98,7 +98,7 @@ struct pressio_data* pressio_data_new_clone(const struct pressio_data* src); * \param[in] num_dimensions the number of dimensions; must match the length of dimensions * \param[in] dimensions an array corresponding to the dimensions of the data, a copy is made of this on construction */ -struct pressio_data* pressio_data_new_copy(const enum pressio_dtype dtype, void* src, size_t const num_dimensions, size_t const dimensions[]); +struct pressio_data* pressio_data_new_copy(const enum pressio_dtype dtype, const void* src, size_t const num_dimensions, size_t const dimensions[]); /** * allocates a new pressio_data structure and corresponding data. The corresponding data is uninitialized * diff --git a/src/plugins/compressors/MGARDx.cc b/src/plugins/compressors/MGARDx.cc index f2c07cf4..2f6cbeb9 100644 --- a/src/plugins/compressors/MGARDx.cc +++ b/src/plugins/compressors/MGARDx.cc @@ -132,7 +132,7 @@ class mgardx_compressor_plugin : public libpressio_compressor_plugin { double eb = 1e-5; }; -pressio_register plugin(compressor_plugins(), "mgardx", []() { +pressio_register registration(compressor_plugins(), "mgardx", []() { return compat::make_unique(); }); diff --git a/src/plugins/compressors/bzip2.cc b/src/plugins/compressors/bzip2.cc index 4e4a8264..9a236632 100644 --- a/src/plugins/compressors/bzip2.cc +++ b/src/plugins/compressors/bzip2.cc @@ -27,8 +27,8 @@ class bzip2_compressor_plugin : public libpressio_compressor_plugin { struct pressio_options options; set(options, "pressio:thread_safe", pressio_thread_safety_multiple); set(options, "pressio:stability", "experimental"); - set(options, "pressio:lossless:min", 0); - set(options, "pressio:lossless:max", 250); + set(options, "pressio:lossless:min", 1); + set(options, "pressio:lossless:max", 9); set(options, "bzip2:block_size_100k:min", 1); set(options, "bzip2:block_size_100k:max", 9); set(options, "bzip2:work_factor:min", 0); @@ -67,7 +67,7 @@ class bzip2_compressor_plugin : public libpressio_compressor_plugin { get(options, "bzip2:small", &small); int temp = 0; if(get(options, "pressio:lossless", &temp) == pressio_options_key_set) { - if(temp >= 0 && temp <= 250) { + if(temp >= 1 && temp <= 9) { blockSize100k = temp; } else { set_error(1, "lossless out of range"); diff --git a/src/plugins/compressors/chunking.cc b/src/plugins/compressors/chunking.cc index 30e4e7b8..f6ec8a2f 100644 --- a/src/plugins/compressors/chunking.cc +++ b/src/plugins/compressors/chunking.cc @@ -13,7 +13,7 @@ #include "std_compat/numeric.h" #include "std_compat/functional.h" -namespace libpressio { namespace compressors { namespace chunking { +namespace libpressio { namespace compressors { namespace chunking_ns { class chunking_plugin: public libpressio_compressor_plugin { public: @@ -133,7 +133,7 @@ class chunking_plugin: public libpressio_compressor_plugin { } else { //non-contigious, need to copy pressio_data input = domain_manager().make_readable(domain_plugins().build("malloc"), *real_input); - tmp = libpressio::compressors::chunking::chunk_data(input, chunk_size, {{"nthreads", nthreads}}); + tmp = libpressio::compressors::chunking_ns::chunk_data(input, chunk_size, {{"nthreads", nthreads}}); auto ptr = static_cast(tmp.data()); for (size_t i = 0; i < num_chunks; ++i) { inputs.emplace_back(pressio_data::nonowning(real_input->dtype(), ptr+(i*stride), chunk_size, "malloc")); @@ -211,7 +211,15 @@ class chunking_plugin: public libpressio_compressor_plugin { uint64_t* inptr64 = reinterpret_cast(input->data()); size_t n_buffers = *inptr64; const size_t header_size = sizeof(uint64_t) *(n_buffers+1); - std::vector sizes(inptr64+1, inptr64+(1+n_buffers)); + std::vector sizes64(inptr64+1, inptr64+(1+n_buffers)); + std::vector sizes(sizes64.size()); + std::transform( + std::begin(sizes64), + std::end(sizes64), + std::begin(sizes), + [](const uint64_t x) { + return static_cast(x); + }); //create the buffers to decompress std::vector inputs; @@ -265,7 +273,7 @@ class chunking_plugin: public libpressio_compressor_plugin { memcpy(outptr+accum_size_out, outputs[i].data(), stride_in_bytes); accum_size_out += stride_in_bytes; } - libpressio::compressors::chunking::restore_data(*output, combined, chunk_size, {{"nthreads", nthreads}}); + libpressio::compressors::chunking_ns::restore_data(*output, combined, chunk_size, {{"nthreads", nthreads}}); } auto dechunk_end = std::chrono::steady_clock::now(); dechunk_time = std::chrono::duration_cast(dechunk_end-dechunk_begin).count(); diff --git a/src/plugins/compressors/chunking_impl.cc b/src/plugins/compressors/chunking_impl.cc index 4ccfd5b2..99a551ab 100644 --- a/src/plugins/compressors/chunking_impl.cc +++ b/src/plugins/compressors/chunking_impl.cc @@ -11,7 +11,7 @@ namespace libpressio { namespace compressors { -namespace chunking { +namespace chunking_ns { namespace detail { struct copy_from_blocks { diff --git a/src/plugins/compressors/chunking_impl.h b/src/plugins/compressors/chunking_impl.h index f5b42cd8..d2b06085 100644 --- a/src/plugins/compressors/chunking_impl.h +++ b/src/plugins/compressors/chunking_impl.h @@ -9,7 +9,7 @@ struct pressio_options; namespace libpressio { namespace compressors { -namespace chunking { +namespace chunking_ns { /** * preform the chunking as optimal-ally we know how to diff --git a/src/plugins/compressors/delta_encoding.cc b/src/plugins/compressors/delta_encoding.cc index b462a344..0b07e338 100644 --- a/src/plugins/compressors/delta_encoding.cc +++ b/src/plugins/compressors/delta_encoding.cc @@ -4,7 +4,7 @@ #include #include -namespace libpressio { namespace compressors { namespace delta_encoder { +namespace libpressio { namespace compressors { namespace delta_encoding_ns { struct delta_encoder { template diff --git a/src/plugins/compressors/digit_rounding.cc b/src/plugins/compressors/digit_rounding.cc index b74cdd45..0821fcc7 100644 --- a/src/plugins/compressors/digit_rounding.cc +++ b/src/plugins/compressors/digit_rounding.cc @@ -11,7 +11,7 @@ #include "pressio_compressor.h" #include "std_compat/memory.h" -namespace libpressio { namespace compressors { namespace digit_rounding { +namespace libpressio { namespace compressors { namespace digit_rounding_ns { #define INVALID_TYPE -1 diff --git a/src/plugins/compressors/linear_quantizer.cc b/src/plugins/compressors/linear_quantizer.cc index ee51a734..18b8673a 100644 --- a/src/plugins/compressors/linear_quantizer.cc +++ b/src/plugins/compressors/linear_quantizer.cc @@ -4,7 +4,7 @@ #include #include -namespace libpressio { namespace compressors { namespace linear_quantizer { +namespace libpressio { namespace compressors { namespace linear_quantizer_ns { struct linear_quantizer_step_finder { template @@ -121,7 +121,7 @@ applies linear_quantizer encoding to prior to compression and reverses it post d } else if(ret < 0) { set_error(meta->error_code(), meta->error_msg()); } - *output = domain_manager().make_readable(domain_plugins().build("malloc"), std::move(*output)); + *output = domain_manager().make_writeable(domain_plugins().build("malloc"), std::move(*output)); pressio_data_for_each(quantized_output, *output, linear_quantizer_decoder{step}); return ret; } diff --git a/src/plugins/compressors/log_transform.cc b/src/plugins/compressors/log_transform.cc index 83040a8e..eeecb100 100644 --- a/src/plugins/compressors/log_transform.cc +++ b/src/plugins/compressors/log_transform.cc @@ -5,7 +5,7 @@ #include #include -namespace libpressio { namespace compressors { namespace log_transform { +namespace libpressio { namespace compressors { namespace log_transform_ns { struct log_encoder { template diff --git a/src/plugins/compressors/masked_binning.cc b/src/plugins/compressors/masked_binning.cc index 99be1e24..7866634f 100644 --- a/src/plugins/compressors/masked_binning.cc +++ b/src/plugins/compressors/masked_binning.cc @@ -6,7 +6,7 @@ #include "libpressio_ext/cpp/domain_manager.h" #include "roibin_impl.h" -namespace libpressio { namespace compressors { namespace mask_binning_ns { +namespace libpressio { namespace compressors { namespace masked_binning_ns { using namespace utilities; diff --git a/src/plugins/compressors/pipeline.cc b/src/plugins/compressors/pipeline.cc index 8ad010e8..17f48874 100644 --- a/src/plugins/compressors/pipeline.cc +++ b/src/plugins/compressors/pipeline.cc @@ -92,7 +92,7 @@ class pipeline_compressor_plugin : public libpressio_compressor_plugin { //output needs to be on the host to add the header *output = pressio_data::owning( pressio_byte_dtype, - {tmp_in.size_in_bytes() + header_size} + {tmp_in.size_in_bytes() + static_cast(header_size)} ); uint64_t* metadata_ptr = static_cast(output->data()); metadata_ptr[0] = 1; /*version*/ diff --git a/src/plugins/compressors/resize.cc b/src/plugins/compressors/resize.cc index 048825a5..a57982f3 100644 --- a/src/plugins/compressors/resize.cc +++ b/src/plugins/compressors/resize.cc @@ -11,7 +11,7 @@ #include "pressio_compressor.h" #include "std_compat/memory.h" -namespace libpressio { namespace compressors { namespace resize { +namespace libpressio { namespace compressors { namespace resize_ns { class resize_meta_compressor_plugin : public libpressio_compressor_plugin { diff --git a/src/plugins/compressors/roibin_impl.h b/src/plugins/compressors/roibin_impl.h index 1fbf9ab5..160b8af2 100644 --- a/src/plugins/compressors/roibin_impl.h +++ b/src/plugins/compressors/roibin_impl.h @@ -24,13 +24,12 @@ void copy_center( indexer<1> const &id, indexer<1> const &roi_size, indexer<2> const &roi, - uint64_t const* center_ptr, + std::array const center, std::size_t const center_idx, T const* origin, T * roi_mem) { auto s_roi = as(roi); auto s_roi_size = as(roi_size); - std::array center{center_ptr[0]}; auto s_center = as(center); auto s_id = as(id); @@ -50,13 +49,12 @@ void copy_center( indexer<2> const &id, indexer<2> const &roi_size, indexer<3> const &roi, - uint64_t const* center_ptr, + std::array const center, std::size_t const center_idx, T const* origin, T * roi_mem) { auto s_roi = as(roi); auto s_roi_size = as(roi_size); - std::array center{center_ptr[0], center_ptr[1]}; auto s_center = as(center); auto s_id = as(id); @@ -85,13 +83,12 @@ void copy_center( indexer<3> const &id, indexer<3> const &roi_size, indexer<4> const &roi, - uint64_t const* center_ptr, + std::array const center, std::size_t const center_idx, T const* origin, T * roi_mem) { auto s_roi = as(roi); auto s_roi_size = as(roi_size); - std::array center{center_ptr[0], center_ptr[1], center_ptr[2]}; auto s_center = as(center); auto s_id = as(id); @@ -131,13 +128,12 @@ void copy_center( indexer<4> const &id, indexer<4> const &roi_size, indexer<5> const &roi, - uint64_t const* center_ptr, + std::array const center, std::size_t const center_idx, T const* origin, T * roi_mem) { auto s_roi = as(roi); auto s_roi_size = as(roi_size); - std::array center{center_ptr[0], center_ptr[1], center_ptr[2], center_ptr[3]}; auto s_center = as(center); auto s_id = as(id); @@ -198,7 +194,13 @@ void roi_save(indexer const &id, #pragma omp parallel for num_threads(n_threads) for (size_t i = 0; i < centers_size; ++i) { - copy_center(id, roi_size, roi, static_cast(centers_range.data()) + i*centers_width, i, origin, roi_mem); + std::array center64; + std::copy_n( + static_cast(centers_range.data()) + i*centers_width, + N, + std::begin(center64)); + auto center = as(center64); + copy_center(id, roi_size, roi, center, i, origin, roi_mem); } } @@ -218,13 +220,12 @@ void restore_center( indexer<1> const &id, indexer<1> const &roi_size, indexer<2> const &roi, - size_t const* center_ptr, + std::array const center, std::size_t const center_idx, T * origin, T const* roi_mem) { auto s_roi = as(roi); auto s_roi_size = as(roi_size); - std::array center{center_ptr[0]}; auto s_center = as(center); auto s_id = as(id); @@ -241,13 +242,12 @@ void restore_center( indexer<2> const &id, indexer<2> const &roi_size, indexer<3> const &roi, - size_t const* center_ptr, + std::array const center, std::size_t const center_idx, T * origin, T const* roi_mem) { auto s_roi = as(roi); auto s_roi_size = as(roi_size); - std::array center{center_ptr[0], center_ptr[1]}; auto s_center = as(center); auto s_id = as(id); @@ -268,13 +268,12 @@ void restore_center( indexer<3> const &id, indexer<3> const &roi_size, indexer<4> const &roi, - std::size_t const* center_ptr, + std::array const center, std::size_t const center_idx, T * origin, T const* roi_mem) { auto s_roi = as(roi); auto s_roi_size = as(roi_size); - std::array center{center_ptr[0], center_ptr[1], center_ptr[2]}; auto s_center = as(center); auto s_id = as(id); @@ -300,13 +299,12 @@ void restore_center( indexer<4> const &id, indexer<4> const &roi_size, indexer<5> const &roi, - std::size_t const* center_ptr, + std::array const center, std::size_t const center_idx, T * origin, T const* roi_mem) { auto s_roi = as(roi); auto s_roi_size = as(roi_size); - std::array center{center_ptr[0], center_ptr[1], center_ptr[2], center_ptr[3]}; auto s_center = as(center); auto s_id = as(id); @@ -348,7 +346,13 @@ void roi_restore(indexer const &id, #pragma omp parallel for num_threads(n_threads) for (size_t i = 0; i < centers_size; ++i) { - restore_center(id, roi_size, roi, static_cast(centers_range.data()) + centers_width*i, i, restored, roi_mem); + std::array center64; + std::copy_n( + static_cast(centers_range.data()) + i*centers_width, + N, + std::begin(center64)); + auto center = as(center64); + restore_center(id, roi_size, roi, center, i, restored, roi_mem); } } diff --git a/src/plugins/compressors/sampling.cc b/src/plugins/compressors/sampling.cc index 0964d84b..a5b935e5 100644 --- a/src/plugins/compressors/sampling.cc +++ b/src/plugins/compressors/sampling.cc @@ -12,7 +12,7 @@ #include "pressio_compressor.h" #include "std_compat/memory.h" -namespace libpressio { namespace compressors { namespace sampling { +namespace libpressio { namespace compressors { namespace sampling_ns { class sample_compressor_plugin: public libpressio_compressor_plugin { public: diff --git a/src/plugins/compressors/switch.cc b/src/plugins/compressors/switch.cc index 9b828f1d..7598fa3f 100644 --- a/src/plugins/compressors/switch.cc +++ b/src/plugins/compressors/switch.cc @@ -3,7 +3,7 @@ #include #include -namespace libpressio { namespace compressors { namespace switch_plugin { +namespace libpressio { namespace compressors { namespace switch_ns { class switch_compressor: public libpressio_compressor_plugin { pressio_options get_options_impl() const override { diff --git a/src/plugins/compressors/sz_auto.cc b/src/plugins/compressors/sz_auto.cc index 3b181543..e9a15ce1 100644 --- a/src/plugins/compressors/sz_auto.cc +++ b/src/plugins/compressors/sz_auto.cc @@ -12,7 +12,7 @@ #include "pressio_compressor.h" #include "std_compat/memory.h" -namespace libpressio { namespace compressor { namespace sz_auto { +namespace libpressio { namespace compressor { namespace sz_auto_ns { class sz_auto_plugin: public libpressio_compressor_plugin { public: diff --git a/src/plugins/compressors/sz_common.cc b/src/plugins/compressors/sz_common.cc index 75cb26fb..e40fbd46 100644 --- a/src/plugins/compressors/sz_common.cc +++ b/src/plugins/compressors/sz_common.cc @@ -9,7 +9,7 @@ #include "pressio_option.h" #include "sz_common.h" -namespace libpressio { namespace compressors { namespace sz_common { +namespace libpressio { namespace compressors { namespace sz_common_ns { int libpressio_type_to_sz_type(pressio_dtype type) { switch(type) diff --git a/src/plugins/compressors/sz_common.h b/src/plugins/compressors/sz_common.h index 09a8cdba..ddadb09f 100644 --- a/src/plugins/compressors/sz_common.h +++ b/src/plugins/compressors/sz_common.h @@ -15,7 +15,7 @@ (SZ_VER_MAJOR == major && SZ_VER_MINOR == minor && SZ_VER_BUILD > build) || \ (SZ_VER_MAJOR == major && SZ_VER_MINOR == minor && SZ_VER_BUILD == build && SZ_VER_REVISION >= revision)) -namespace libpressio { namespace compressors { namespace sz_common { +namespace libpressio { namespace compressors { namespace sz_common_ns { int libpressio_type_to_sz_type(pressio_dtype type); struct sz_init_handle { diff --git a/src/plugins/compressors/transpose.cc b/src/plugins/compressors/transpose.cc index dee90aba..8dc36686 100644 --- a/src/plugins/compressors/transpose.cc +++ b/src/plugins/compressors/transpose.cc @@ -10,7 +10,7 @@ #include "pressio_compressor.h" #include "std_compat/memory.h" -namespace libpressio { namespace compressors { namespace transpose { +namespace libpressio { namespace compressors { namespace transpose_ns { class transpose_meta_compressor_plugin : public libpressio_compressor_plugin { diff --git a/src/plugins/metrics/autocorr.cc b/src/plugins/metrics/autocorr.cc index 8bd52230..8cbe31cc 100644 --- a/src/plugins/metrics/autocorr.cc +++ b/src/plugins/metrics/autocorr.cc @@ -10,7 +10,7 @@ #include "std_compat/memory.h" namespace libpressio { namespace metrics { -namespace autocorr { +namespace autocorr_ns { struct metrics { pressio_data autocorr; }; @@ -130,7 +130,7 @@ class autocorr_plugin : public libpressio_metrics_plugin { } int end_decompress_impl(struct pressio_data const*, struct pressio_data const* output, int ) override { if(!output || !output->has_data() || !input_data.has_data()) return 0; - err_metrics = pressio_data_for_each(input_data, domain_manager().make_readable(domain_plugins().build("malloc"), *output), autocorr::compute_metrics{autocorr_lags}); + err_metrics = pressio_data_for_each(input_data, domain_manager().make_readable(domain_plugins().build("malloc"), *output), autocorr_ns::compute_metrics{autocorr_lags}); return 0; } @@ -181,7 +181,7 @@ class autocorr_plugin : public libpressio_metrics_plugin { private: uint64_t autocorr_lags = 100; pressio_data input_data = pressio_data::empty(pressio_byte_dtype, {}); - compat::optional err_metrics; + compat::optional err_metrics; }; pressio_register registration(metrics_plugins(), "autocorr", [](){ return compat::make_unique(); }); diff --git a/src/plugins/metrics/clipping.cc b/src/plugins/metrics/clipping.cc index 6daca007..c7f9c5a1 100644 --- a/src/plugins/metrics/clipping.cc +++ b/src/plugins/metrics/clipping.cc @@ -7,7 +7,7 @@ #include "libpressio_ext/cpp/domain_manager.h" #include "std_compat/memory.h" -namespace libpressio { namespace metrics { namespace clipping_metrics_ns { +namespace libpressio { namespace metrics { namespace clipping_ns { class clipping_plugin : public libpressio_metrics_plugin { public: diff --git a/src/plugins/metrics/diff_pdf.cc b/src/plugins/metrics/diff_pdf.cc index f35920b0..83c53e51 100644 --- a/src/plugins/metrics/diff_pdf.cc +++ b/src/plugins/metrics/diff_pdf.cc @@ -9,7 +9,7 @@ #include "std_compat/memory.h" namespace libpressio { namespace metrics { -namespace diff_pdf { +namespace diff_pdf_ns { static const uint64_t zero = 0; struct metrics { pressio_data histogram = pressio_data::copy(pressio_uint64_dtype, &zero, {1}); @@ -67,7 +67,7 @@ class diff_pdf_plugin : public libpressio_metrics_plugin { } int end_decompress_impl(struct pressio_data const*, struct pressio_data const* output, int ) override { if(!output || !output->has_data() || !input_data.has_data()) return 0; - err_metrics = pressio_data_for_each(input_data, domain_manager().make_readable(domain_plugins().build("malloc"), *output), diff_pdf::compute_metrics{pdf_intervals}); + err_metrics = pressio_data_for_each(input_data, domain_manager().make_readable(domain_plugins().build("malloc"), *output), diff_pdf_ns::compute_metrics{pdf_intervals}); return 0; } @@ -129,7 +129,7 @@ class diff_pdf_plugin : public libpressio_metrics_plugin { private: uint64_t pdf_intervals = 2000; pressio_data input_data = pressio_data::empty(pressio_byte_dtype, {}); - compat::optional err_metrics; + compat::optional err_metrics; }; pressio_register registration(metrics_plugins(), "diff_pdf", [](){ return compat::make_unique(); }); diff --git a/src/plugins/metrics/entropy.cc b/src/plugins/metrics/entropy.cc index d02528dd..0aecc8a5 100644 --- a/src/plugins/metrics/entropy.cc +++ b/src/plugins/metrics/entropy.cc @@ -13,7 +13,7 @@ #include namespace libpressio { namespace metrics { -namespace entropy { +namespace entropy_ns { struct compute_metrics{ template double operator()(ForwardIt1 input_begin, ForwardIt1 input_end) @@ -46,13 +46,13 @@ class entropy_plugin : public libpressio_metrics_plugin int begin_compress_impl(const struct pressio_data* input, struct pressio_data const*) override { if(!input || !input->has_data()) return 0; - input_entropy = pressio_data_for_each(domain_manager().make_readable(domain_plugins().build("malloc"), *input), entropy::compute_metrics{}); + input_entropy = pressio_data_for_each(domain_manager().make_readable(domain_plugins().build("malloc"), *input), entropy_ns::compute_metrics{}); return 0; } int end_decompress_impl(struct pressio_data const*, struct pressio_data const* output, int) override { if(!output || !output->has_data()) return 0; - dec_entropy = pressio_data_for_each(domain_manager().make_readable(domain_plugins().build("malloc"), *output), entropy::compute_metrics{}); + dec_entropy = pressio_data_for_each(domain_manager().make_readable(domain_plugins().build("malloc"), *output), entropy_ns::compute_metrics{}); return 0; } diff --git a/src/plugins/metrics/gradlength.cc b/src/plugins/metrics/gradlength.cc index 0908b745..4b4367f2 100644 --- a/src/plugins/metrics/gradlength.cc +++ b/src/plugins/metrics/gradlength.cc @@ -9,7 +9,7 @@ #include "libpressio_ext/cpp/domain_manager.h" #include -namespace libpressio { namespace metrics { namespace gradlength_metrics_ns { +namespace libpressio { namespace metrics { namespace gradlength_ns { #define QCAT_FLOAT 0 #define QCAT_DOUBLE 1 #define QCAT_INT32 2 diff --git a/src/plugins/metrics/historian.cc b/src/plugins/metrics/historian.cc index d9c9c868..53bf92bf 100644 --- a/src/plugins/metrics/historian.cc +++ b/src/plugins/metrics/historian.cc @@ -5,7 +5,7 @@ #include "std_compat/memory.h" #include "std_compat/string_view.h" -namespace libpressio { namespace metrics { namespace historian { +namespace libpressio { namespace metrics { namespace historian_ns { class pressio_historian_metric: public libpressio_metrics_plugin { diff --git a/src/plugins/metrics/input_stats.cc b/src/plugins/metrics/input_stats.cc index 8e5f7759..fde418de 100644 --- a/src/plugins/metrics/input_stats.cc +++ b/src/plugins/metrics/input_stats.cc @@ -7,7 +7,7 @@ #include "libpressio_ext/cpp/options.h" #include "std_compat/memory.h" -namespace libpressio { namespace metrics { namespace input_stats_metrics_ns { +namespace libpressio { namespace metrics { namespace input_stats_ns { struct input_stat{ input_stat(compat::span const& inputs, diff --git a/src/plugins/metrics/kl_divergance.cc b/src/plugins/metrics/kl_divergence.cc similarity index 90% rename from src/plugins/metrics/kl_divergance.cc rename to src/plugins/metrics/kl_divergence.cc index f8c3489a..598471c9 100644 --- a/src/plugins/metrics/kl_divergance.cc +++ b/src/plugins/metrics/kl_divergence.cc @@ -13,7 +13,7 @@ #include "libpressio_ext/cpp/domain_manager.h" namespace libpressio { namespace metrics { -namespace kl_divergence{ +namespace kl_divergence_ns { struct kl_metrics { double p_q=0; double q_p=0; @@ -45,7 +45,7 @@ namespace kl_divergence{ } }; -class kl_divergance_plugin : public libpressio_metrics_plugin { +class kl_divergence_plugin : public libpressio_metrics_plugin { public: int begin_compress_impl(const struct pressio_data* input, @@ -59,8 +59,8 @@ class kl_divergance_plugin : public libpressio_metrics_plugin { struct pressio_data const* output, int) override { if(!output || !output->has_data() || !input_data.has_data()) return 0; - err_metrics = pressio_data_for_each(input_data, domain_manager().make_readable(domain_plugins().build("malloc"), *output), - kl_divergence::compute_metrics{}); + err_metrics = pressio_data_for_each(input_data, domain_manager().make_readable(domain_plugins().build("malloc"), *output), + kl_divergence_ns::compute_metrics{}); return 0; } @@ -94,7 +94,7 @@ class kl_divergance_plugin : public libpressio_metrics_plugin { } std::unique_ptr clone() override { - return compat::make_unique(*this); + return compat::make_unique(*this); } const char* prefix() const override { @@ -103,10 +103,10 @@ class kl_divergance_plugin : public libpressio_metrics_plugin { private: pressio_data input_data = pressio_data::empty(pressio_byte_dtype, {}); - compat::optional err_metrics; + compat::optional err_metrics; }; pressio_register registration(metrics_plugins(), "kl_divergence", - []() { return compat::make_unique(); }); + []() { return compat::make_unique(); }); } }} diff --git a/src/plugins/metrics/ks_test.cc b/src/plugins/metrics/ks_test.cc index 754cf05f..52d99dd1 100644 --- a/src/plugins/metrics/ks_test.cc +++ b/src/plugins/metrics/ks_test.cc @@ -47,7 +47,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -namespace libpressio { namespace metrics { namespace ks_test { +namespace libpressio { namespace metrics { namespace ks_test_ns { template void cdf(ForwardItItems items_begin, ForwardItItems items_end, ForwardItValues values_begin, ForwardItValues values_end, diff --git a/src/plugins/metrics/kth_error.cc b/src/plugins/metrics/kth_error.cc index b26d2616..ff1b589b 100644 --- a/src/plugins/metrics/kth_error.cc +++ b/src/plugins/metrics/kth_error.cc @@ -12,7 +12,7 @@ #include "libpressio_ext/cpp/domain_manager.h" namespace libpressio { namespace metrics { - namespace kth_error { + namespace kth_error_ns { struct kth_error{ template double operator()(ForwardIt1 input_begin, ForwardIt1 input_end, diff --git a/src/plugins/metrics/mask1d.cc b/src/plugins/metrics/mask1d.cc index e819ab65..5a6cf50c 100644 --- a/src/plugins/metrics/mask1d.cc +++ b/src/plugins/metrics/mask1d.cc @@ -2,7 +2,7 @@ #include #include "libpressio_ext/cpp/domain_manager.h" -namespace libpressio { namespace metrics { namespace mask1d { +namespace libpressio { namespace metrics { namespace mask1d_ns { struct apply_mask{ template diff --git a/src/plugins/metrics/max_error.cc b/src/plugins/metrics/max_error.cc index b02ffd5d..f98236d5 100644 --- a/src/plugins/metrics/max_error.cc +++ b/src/plugins/metrics/max_error.cc @@ -9,7 +9,7 @@ #include "std_compat/optional.h" #include -namespace libpressio { namespace metrics { namespace max_error_metrics_ns { +namespace libpressio { namespace metrics { namespace max_error_ns { class max_error_plugin : public libpressio_metrics_plugin { struct max_error_info { diff --git a/src/plugins/metrics/out_of_bounds.cc b/src/plugins/metrics/out_of_bounds.cc index 90856b64..50e89f3a 100644 --- a/src/plugins/metrics/out_of_bounds.cc +++ b/src/plugins/metrics/out_of_bounds.cc @@ -11,7 +11,7 @@ #include "libpressio_ext/cpp/domain_manager.h" #include "std_compat/memory.h" -namespace libpressio { namespace metrics { namespace out_of_bounds_metrics_ns { +namespace libpressio { namespace metrics { namespace out_of_bounds_ns { class out_of_bounds_plugin : public libpressio_metrics_plugin { public: diff --git a/src/plugins/metrics/pearsons.cc b/src/plugins/metrics/pearsons.cc index b65a14ab..bae438d4 100644 --- a/src/plugins/metrics/pearsons.cc +++ b/src/plugins/metrics/pearsons.cc @@ -11,7 +11,7 @@ namespace libpressio { namespace metrics { -namespace pearson { +namespace pearsons_ns { struct pearson_metrics { double r = 0.0; double r2 = 0.0; @@ -83,8 +83,8 @@ class pearsons_plugin : public libpressio_metrics_plugin struct pressio_data const* output, int) override { if(!output || !output->has_data() || !input_data.has_data()) return 0; - err_metrics = pressio_data_for_each(input_data, domain_manager().make_readable(domain_plugins().build("malloc"), *output), - pearson::compute_metrics{}); + err_metrics = pressio_data_for_each(input_data, domain_manager().make_readable(domain_plugins().build("malloc"), *output), + pearsons_ns::compute_metrics{}); return 0; } @@ -129,7 +129,7 @@ class pearsons_plugin : public libpressio_metrics_plugin private: pressio_data input_data = pressio_data::empty(pressio_byte_dtype, {}); - compat::optional err_metrics; + compat::optional err_metrics; }; pressio_register registration(metrics_plugins(), "pearson", []() { diff --git a/src/plugins/metrics/print_options.cc b/src/plugins/metrics/print_options.cc index 2fe084ea..5d920b8d 100644 --- a/src/plugins/metrics/print_options.cc +++ b/src/plugins/metrics/print_options.cc @@ -8,7 +8,7 @@ #include "std_compat/memory.h" #include -namespace libpressio { namespace metrics { namespace print_options_metrics_ns { +namespace libpressio { namespace metrics { namespace print_options_ns { class print_options_plugin : public libpressio_metrics_plugin { public: @@ -50,6 +50,6 @@ class print_options_plugin : public libpressio_metrics_plugin { }; -pressio_register metrics_print_options_plugin(metrics_plugins(), "print_options", [](){ return compat::make_unique(); }); +pressio_register registration(metrics_plugins(), "print_options", [](){ return compat::make_unique(); }); }} } diff --git a/src/plugins/metrics/printer.cc b/src/plugins/metrics/printer.cc index 30bc3fd5..1f60cc96 100644 --- a/src/plugins/metrics/printer.cc +++ b/src/plugins/metrics/printer.cc @@ -6,7 +6,7 @@ #include "std_compat/memory.h" #include -namespace libpressio { namespace metrics { namespace printer { +namespace libpressio { namespace metrics { namespace printer_ns { class printer_plugin : public libpressio_metrics_plugin { std::string maybe_name() { if(get_name().empty()) return ""; diff --git a/src/plugins/metrics/region_of_interest.cc b/src/plugins/metrics/region_of_interest.cc index cf29d366..bc8b36a2 100644 --- a/src/plugins/metrics/region_of_interest.cc +++ b/src/plugins/metrics/region_of_interest.cc @@ -12,7 +12,7 @@ namespace libpressio { namespace metrics { -namespace region_of_interest { +namespace region_of_interest_ns { struct region_of_interest_metrics { compat::optional input_avg; compat::optional input_sum; diff --git a/src/plugins/metrics/write_debug_inputs.cc b/src/plugins/metrics/write_debug_inputs.cc index d5a2f897..06c2fdd8 100644 --- a/src/plugins/metrics/write_debug_inputs.cc +++ b/src/plugins/metrics/write_debug_inputs.cc @@ -11,7 +11,7 @@ #include #include -namespace libpressio { namespace metrics { namespace write_debug_inputs_metrics_ns { +namespace libpressio { namespace metrics { namespace write_debug_inputs_ns { std::mutex idx_mutex; uint64_t input_write_idx = 0; diff --git a/src/pressio_data.cc b/src/pressio_data.cc index ddac6d76..f7642f8f 100644 --- a/src/pressio_data.cc +++ b/src/pressio_data.cc @@ -459,7 +459,7 @@ struct pressio_data* pressio_data_new_move(const enum pressio_dtype dtype, void* return new pressio_data(pressio_data::move(dtype, data, num_dimensions, dimensions, deleter, metadata)); } -struct pressio_data* pressio_data_new_copy(const enum pressio_dtype dtype, void* src, size_t const num_dimensions, size_t const dimensions[]) { +struct pressio_data* pressio_data_new_copy(const enum pressio_dtype dtype, const void* src, size_t const num_dimensions, size_t const dimensions[]) { return new pressio_data(pressio_data::copy(dtype, src, num_dimensions, dimensions)); } diff --git a/src/pressio_posix.cc b/src/pressio_posix.cc index 77898148..90fe78ba 100644 --- a/src/pressio_posix.cc +++ b/src/pressio_posix.cc @@ -14,7 +14,7 @@ std::string errno_to_error() { auto ec = errno; char err_buf[1024]; std::fill(err_buf, err_buf+1024, '\0'); -#if _GNU_SOURCE +#if _GNU_SOURCE && not(defined(__wasm__)) //assume gnu version char* rc = strerror_r(ec, err_buf, 1024); return rc; diff --git a/src/pressio_register_generator.cc b/src/pressio_register_generator.cc deleted file mode 100644 index 1d8cdbf8..00000000 --- a/src/pressio_register_generator.cc +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -struct cli_args { - std::string config; - std::string output_path; -}; -template -std::basic_ostream& operator<<(std::basic_ostream& out, cli_args const& args) { - return out << "{.path=" << std::quoted(args.output_path) << ", .config=" << std::quoted(args.config.substr(0,50) + "...") << "}"; -} - -struct plugin { - std::string type; - std::string name; - std::string path; -}; -template -std::basic_ostream& operator<<(std::basic_ostream& out, plugin const& args) { - return out << "{.path=" << std::quoted(args.path) << ", .name=" << std::quoted(args.name) << ", .type=" << std::quoted(args.type) << "}"; -} - -int main(int argc, char* argv[]) { - cli_args args; - int opt = 0; - while((opt = getopt(argc, argv, "o:c:")) != -1) { - switch(opt) { - case 'o': - args.output_path = optarg; - break; - case 'c': - args.config = optarg; - break; - default: - std::cerr << "unknown argument \"" << opt << "\"" << std::endl; - return 1; - } - } - std::cerr << args << std::endl; - - - std::vector plugins; - std::stringstream ss(args.config); - std::string item; - while(std::getline(ss, item, ';')) { - std::string name,type; - auto extension_pos = item.find_last_of("."); - auto suffix_pos = item.find_last_of("/"); - auto parent_pos = item.find_last_of("/", suffix_pos - 1); - if (extension_pos == std::string::npos || suffix_pos == std::string::npos || - parent_pos == std::string::npos) { - std::cout << "unable to parse path " << std::quoted(item); - return 1; - } - name = item.substr(suffix_pos+1, extension_pos - suffix_pos - 1); - type = item.substr(parent_pos+1, suffix_pos - parent_pos - 1); - plugins.emplace_back(plugin{type, name, item}); - std::cerr << plugins.back() << std::endl; - } - - std::sort(plugins.begin(), plugins.end(), [](plugin const& lhs, plugin const& rhs) { - if(lhs.type == rhs.type) return lhs.name < rhs.name; - else return lhs.type < rhs.type; - }); - - std::string header = R"( - #include - #include "libpressio_ext/cpp/registry.h" - - - )"; - std::stringstream fwd_decl; - std::stringstream body; - body << R"(extern "C" void pressio_register_all() {)" <(); }); diff --git a/tools/pressio_manual_register.cmake b/tools/pressio_manual_register.cmake new file mode 100644 index 00000000..7f321e0a --- /dev/null +++ b/tools/pressio_manual_register.cmake @@ -0,0 +1,34 @@ +# static libraries and some system linkers will strip the registration classes +# causing nothing to be registered +message("STATUS" "LIBPRESSIO_BUILT_PLUGINS = ${LIBPRESSIO_BUILT_PLUGINS}") + +# extract the plugin types and names and sort them +list(TRANSFORM LIBPRESSIO_BUILT_PLUGINS REPLACE ".*\\/([a-zA-Z0-9_]*)\\/([a-zA-Z0-9_]*)\.[a-zA-Z0-9_]*\$" "\\1/\\2" OUTPUT_VARIABLE LIBPRESSIO_REGISTRATION_PLUGINS) +list(SORT LIBPRESSIO_REGISTRATION_PLUGINS) + +# compute the per-plugin extern registrations +list(TRANSFORM LIBPRESSIO_REGISTRATION_PLUGINS REPLACE "([a-zA-Z0-9_]*)\\/([a-zA-Z0-9_]*)\$" " namespace \\1 { namespace \\2_ns { extern pressio_register registration! } }" OUTPUT_VARIABLE LIBPRESSIO_REGISTRATION_EXTERNS) +string(REPLACE ";" "\n" LIBPRESSIO_REGISTRATION_EXTERNS "${LIBPRESSIO_REGISTRATION_EXTERNS}") +string(REPLACE "!" ";" LIBPRESSIO_REGISTRATION_EXTERNS "${LIBPRESSIO_REGISTRATION_EXTERNS}") + +# compute the per-plugin registration calls +list(TRANSFORM LIBPRESSIO_REGISTRATION_PLUGINS REPLACE "([a-zA-Z0-9_]*)\\/([a-zA-Z0-9_]*)\$" " libpressio::\\1::\\2_ns::registration.ensure_registered()!" OUTPUT_VARIABLE LIBPRESSIO_REGISTRATION_CALLS) +string(REPLACE ";" "\n" LIBPRESSIO_REGISTRATION_CALLS "${LIBPRESSIO_REGISTRATION_CALLS}") +string(REPLACE "!" ";" LIBPRESSIO_REGISTRATION_CALLS "${LIBPRESSIO_REGISTRATION_CALLS}") + +# interpolate the manual plugin registration code +set(LIBPRESSIO_REGISTRATIONS " +#include +#include \"libpressio_ext/cpp/registry.h\" + +namespace libpressio { +${LIBPRESSIO_REGISTRATION_EXTERNS} +} /*namespace libpressio*/ + +extern \"C\" void pressio_register_all() { +${LIBPRESSIO_REGISTRATION_CALLS} +} +") + +# write out the plugin registration code +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/pressio_manual_register.cc "${LIBPRESSIO_REGISTRATIONS}") diff --git a/tools/swig/pypressio.h b/tools/swig/pypressio.h index faeca854..db39265e 100644 --- a/tools/swig/pypressio.h +++ b/tools/swig/pypressio.h @@ -187,7 +187,7 @@ std::string io_data_to_bytes(pressio_data* data) { } pressio_data* io_data_from_bytes(const char* buffer, size_t buffer_size) { - return pressio_data_new_copy(pressio_byte_dtype, (void*)buffer, 1, &buffer_size); + return pressio_data_new_copy(pressio_byte_dtype, (const void*)buffer, 1, &buffer_size); } std::vector option_get_strings(pressio_option const* options) {