diff --git a/cmake/link_vt.cmake b/cmake/link_vt.cmake index 80d9574582..ccffd7e2b0 100644 --- a/cmake/link_vt.cmake +++ b/cmake/link_vt.cmake @@ -39,7 +39,6 @@ function(link_target_with_vt) multiValueArg CUSTOM_LINK_ARGS ) - set(allKeywords ${noValOption} ${singleValArg} ${multiValueArg}) cmake_parse_arguments( ARG "${noValOption}" "${singleValArg}" "${multiValueArg}" ${ARGN} diff --git a/lib/yaml-cpp/.clang-format b/lib/yaml-cpp/.clang-format deleted file mode 100644 index f3eac28a6b..0000000000 --- a/lib/yaml-cpp/.clang-format +++ /dev/null @@ -1,46 +0,0 @@ ---- -# BasedOnStyle: Google -AccessModifierOffset: -1 -ConstructorInitializerIndentWidth: 4 -AlignEscapedNewlinesLeft: true -AlignTrailingComments: true -AllowAllParametersOfDeclarationOnNextLine: true -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AlwaysBreakTemplateDeclarations: true -AlwaysBreakBeforeMultilineStrings: true -BreakBeforeBinaryOperators: false -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: false -BinPackParameters: true -ColumnLimit: 80 -ConstructorInitializerAllOnOneLineOrOnePerLine: true -DerivePointerBinding: true -ExperimentalAutoDetectBinPacking: false -IndentCaseLabels: true -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: None -ObjCSpaceBeforeProtocolList: false -PenaltyBreakBeforeFirstCallParameter: 1 -PenaltyBreakComment: 60 -PenaltyBreakString: 1000 -PenaltyBreakFirstLessLess: 120 -PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 200 -PointerBindsToType: true -SpacesBeforeTrailingComments: 2 -Cpp11BracedListStyle: true -Standard: Cpp11 -IndentWidth: 2 -TabWidth: 8 -UseTab: Never -BreakBeforeBraces: Attach -IndentFunctionDeclarationAfterType: true -SpacesInParentheses: false -SpacesInAngles: false -SpaceInEmptyParentheses: false -SpacesInCStyleCastParentheses: false -SpaceAfterControlStatementKeyword: true -SpaceBeforeAssignmentOperators: true -ContinuationIndentWidth: 4 -... diff --git a/lib/yaml-cpp/.codedocs b/lib/yaml-cpp/.codedocs deleted file mode 100644 index 02e438213a..0000000000 --- a/lib/yaml-cpp/.codedocs +++ /dev/null @@ -1,50 +0,0 @@ -# CodeDocs.xyz Configuration File - -# Optional project name, if left empty the GitHub repository name will be used. -PROJECT_NAME = - -# One or more directories and files that contain example code to be included. -EXAMPLE_PATH = - -# One or more directories and files to exclude from documentation generation. -# Use relative paths with respect to the repository root directory. -EXCLUDE = test/gtest-1.8.0/ - -# One or more wildcard patterns to exclude files and directories from document -# generation. -EXCLUDE_PATTERNS = - -# One or more symbols to exclude from document generation. Symbols can be -# namespaces, classes, or functions. -EXCLUDE_SYMBOLS = - -# Override the default parser (language) used for each file extension. -EXTENSION_MAPPING = - -# Set the wildcard patterns used to filter out the source-files. -# If left blank the default is: -# *.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, -# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, -# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox, *.py, -# *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. -FILE_PATTERNS = - -# Hide undocumented class members. -HIDE_UNDOC_MEMBERS = - -# Hide undocumented classes. -HIDE_UNDOC_CLASSES = - -# Specify a markdown page whose contents should be used as the main page -# (index.html). This will override a page marked as \mainpage. For example, a -# README.md file usually serves as a useful main page. -USE_MDFILE_AS_MAINPAGE = README.md - -# Specify external repository to link documentation with. -# This is similar to Doxygen's TAGFILES option, but will automatically link to -# tags of other repositories already using CodeDocs. List each repository to -# link with by giving its location in the form of owner/repository. -# For example: -# TAGLINKS = doxygen/doxygen CodeDocs/osg -# Note: these repositories must already be built on CodeDocs. -TAGLINKS = diff --git a/lib/yaml-cpp/.gitignore b/lib/yaml-cpp/.gitignore deleted file mode 100644 index 2f9d10f069..0000000000 --- a/lib/yaml-cpp/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build/ -/tags -/bazel-* diff --git a/lib/yaml-cpp/.travis.yml b/lib/yaml-cpp/.travis.yml deleted file mode 100644 index 46beb1d129..0000000000 --- a/lib/yaml-cpp/.travis.yml +++ /dev/null @@ -1,37 +0,0 @@ -language: c++ - -matrix: - include: - - os: linux - compiler: gcc - - os: osx - compiler: clang - - os: osx - compiler: gcc -env: - - CTEST_OUTPUT_ON_FAILURE=1 - -before_script: - - mkdir build - - cd build - - cmake .. - - cd .. -script: - - cmake --build build - - cmake --build build --target test - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - - llvm-toolchain-precise-3.9 - packages: - - g++-4.9 - - clang-3.9 - update: true - homebrew: - packages: - - ccache - - gcc@4.9 - - llvm@4 - update: true diff --git a/src/vt/configs/arguments/app_config.h b/src/vt/configs/arguments/app_config.h index 9eb6ac3f4d..91fa9e2e99 100644 --- a/src/vt/configs/arguments/app_config.h +++ b/src/vt/configs/arguments/app_config.h @@ -45,7 +45,6 @@ #define INCLUDED_VT_CONFIGS_ARGUMENTS_APP_CONFIG_H // do not pull in any VT dependencies here -#include #include #include #include @@ -261,6 +260,7 @@ struct AppConfig { bool vt_output_config = false; std::string vt_output_config_file = "vt_config.ini"; std::string vt_output_config_str = ""; + std::string vt_output_config_yaml = ""; /// Name of the program launched (excluding any path!) std::string prog_name {"vt_unknown"}; @@ -431,240 +431,9 @@ struct AppConfig { | passthru_args; } - using variantArg_t = std::variant; - - std::vector splitString(std::string input_str) { - std::vector splits; - long unsigned int pos = 0; - while (input_str.find("/") != input_str.npos) { - pos = input_str.find("/"); - splits.push_back(input_str.substr(0, pos)); - input_str.erase(0, pos + 1); - } - splits.push_back(input_str); - return splits; - } - - void addVariantToNode(YAML::Node& node, std::string key, variantArg_t variant_val) { - // Get the yaml_val from the variant - if (std::holds_alternative(variant_val)) { - node[key] = std::get(variant_val); - } else if (std::holds_alternative(variant_val)) { - node[key] = std::get(variant_val); - } else if (std::holds_alternative(variant_val)) { - node[key] = std::get(variant_val); - } else if (std::holds_alternative(variant_val)) { - node[key] = std::get(variant_val); - } else if (std::holds_alternative(variant_val)) { - node[key] = std::get(variant_val); - } else if (std::holds_alternative(variant_val)) { - node[key] = std::get(variant_val); - } else { - throw std::runtime_error("Argument type not recognized."); - } - } - - YAML::Node convertConfigToYaml() { - - // First, create a converter vector of tuples {Node(s), Key, Value} - std::vector< std::tuple > cli_to_yaml_args = - { - // Output Control - {"Output Control", "Color", static_cast(vt_color)}, - {"Output Control", "Color", static_cast(not vt_no_color)}, // overwrites vt_color - {"Output Control", "Quiet", static_cast(vt_quiet)}, - - // Signal Handling - {"Signal Handling", "Disable SIGINT", static_cast(vt_no_sigint)}, - {"Signal Handling", "Disable SIGSEGV", static_cast(vt_no_sigsegv)}, - {"Signal Handling", "Disable SIGBUS", static_cast(vt_no_sigbus)}, - {"Signal Handling", "Disable Terminate Signal", static_cast(vt_no_terminate)}, - - // Memory Usage Reporting - {"Memory Usage Reporting", "Memory Reporters", static_cast(vt_memory_reporters)}, - {"Memory Usage Reporting", "Print Memory Each Phase", static_cast(vt_print_memory_each_phase)}, - {"Memory Usage Reporting", "Print Memory On Node", static_cast(vt_print_memory_node)}, - {"Memory Usage Reporting", "Allow Memory Report With ps", static_cast(vt_allow_memory_report_with_ps)}, - {"Memory Usage Reporting", "Print Memory Threshold", static_cast(vt_print_memory_threshold)}, - {"Memory Usage Reporting", "Print Memory Scheduler Poll", static_cast(vt_print_memory_sched_poll)}, - {"Memory Usage Reporting", "Print Memory Footprint", static_cast(vt_print_memory_footprint)}, - - // Dump Stack Backtrace - {"Dump Stack Backtrace", "Enable Stack Output on Warning", static_cast(vt_no_warn_stack)}, - {"Dump Stack Backtrace", "Enable Stack Output on Assert", static_cast(vt_no_assert_stack)}, - {"Dump Stack Backtrace", "Enable Stack Output on Abort", static_cast(vt_no_abort_stack)}, - {"Dump Stack Backtrace", "Enable Stack Output", static_cast(vt_no_stack)}, - {"Dump Stack Backtrace", "File", static_cast(vt_stack_file)}, - {"Dump Stack Backtrace", "Directory", static_cast(vt_stack_dir)}, - {"Dump Stack Backtrace", "Output Rank Mod", static_cast(vt_stack_mod)}, - - // Tracing Configuration - {"Tracing Configuration", "Enabled", static_cast(vt_trace)}, - {"Tracing Configuration", "MPI Type Events", static_cast(vt_trace_mpi)}, - {"Tracing Configuration", "MPI Type Events", static_cast(vt_trace_pmpi)}, - {"Tracing Configuration", "File", static_cast(vt_trace_file)}, - {"Tracing Configuration", "Directory", static_cast(vt_trace_dir)}, - {"Tracing Configuration", "Output Rank Mod", static_cast(vt_trace_mod)}, - {"Tracing Configuration", "Flush Size", static_cast(vt_trace_flush_size)}, - {"Tracing Configuration", "GZip Finish Flush", static_cast(vt_trace_gzip_finish_flush)}, - {"Tracing Configuration", "Include All System Events", static_cast(vt_trace_sys_all)}, - {"Tracing Configuration", "Include Termination Events", static_cast(vt_trace_sys_term)}, - {"Tracing Configuration", "Include Location Events", static_cast(vt_trace_sys_location)}, - {"Tracing Configuration", "Include Collection Events", static_cast(vt_trace_sys_collection)}, - {"Tracing Configuration", "Include Message Serialization Events", static_cast(vt_trace_sys_serial_msg)}, - {"Tracing Configuration", "Specification Enabled", static_cast(vt_trace_spec)}, - {"Tracing Configuration", "Spec File", static_cast(vt_trace_spec_file)}, - {"Tracing Configuration", "Memory Usage", static_cast(vt_trace_memory_usage)}, - {"Tracing Configuration", "Event Polling", static_cast(vt_trace_event_polling)}, - {"Tracing Configuration", "IRecv Polling", static_cast(vt_trace_irecv_polling)}, - - // Debug Print Configuration - {"Debug Print Configuration", "Level", static_cast(vt_debug_level)}, - {"Debug Print Configuration", "Enable All", static_cast(vt_debug_all)}, - {"Debug Print Configuration", "Disable All", static_cast(vt_debug_none)}, - {"Debug Print Configuration", "Debug Print Flush", static_cast(vt_debug_print_flush)}, - {"Debug Print Configuration/Enable", "gen", static_cast(vt_debug_gen)}, - {"Debug Print Configuration/Enable", "runtime", static_cast(vt_debug_runtime)}, - {"Debug Print Configuration/Enable", "active", static_cast(vt_debug_active)}, - {"Debug Print Configuration/Enable", "term", static_cast(vt_debug_term)}, - {"Debug Print Configuration/Enable", "termds", static_cast(vt_debug_termds)}, - {"Debug Print Configuration/Enable", "barrier", static_cast(vt_debug_barrier)}, - {"Debug Print Configuration/Enable", "event", static_cast(vt_debug_event)}, - {"Debug Print Configuration/Enable", "pipe", static_cast(vt_debug_pipe)}, - {"Debug Print Configuration/Enable", "pool", static_cast(vt_debug_pool)}, - {"Debug Print Configuration/Enable", "reduce", static_cast(vt_debug_reduce)}, - {"Debug Print Configuration/Enable", "rdma", static_cast(vt_debug_rdma)}, - {"Debug Print Configuration/Enable", "rdma_channel", static_cast(vt_debug_rdma_channel)}, - {"Debug Print Configuration/Enable", "rdma_state", static_cast(vt_debug_rdma_state)}, - {"Debug Print Configuration/Enable", "handler", static_cast(vt_debug_handler)}, - {"Debug Print Configuration/Enable", "hierlb", static_cast(vt_debug_hierlb)}, - {"Debug Print Configuration/Enable", "temperedlb", static_cast(vt_debug_temperedlb)}, - {"Debug Print Configuration/Enable", "temperedwmin", static_cast(vt_debug_temperedwmin)}, - {"Debug Print Configuration/Enable", "scatter", static_cast(vt_debug_scatter)}, - {"Debug Print Configuration/Enable", "serial_msg", static_cast(vt_debug_serial_msg)}, - {"Debug Print Configuration/Enable", "trace", static_cast(vt_debug_trace)}, - {"Debug Print Configuration/Enable", "location", static_cast(vt_debug_location)}, - {"Debug Print Configuration/Enable", "lb", static_cast(vt_debug_lb)}, - {"Debug Print Configuration/Enable", "vrt", static_cast(vt_debug_vrt)}, - {"Debug Print Configuration/Enable", "vrt_coll", static_cast(vt_debug_vrt_coll)}, - {"Debug Print Configuration/Enable", "worker", static_cast(vt_debug_worker)}, - {"Debug Print Configuration/Enable", "group", static_cast(vt_debug_group)}, - {"Debug Print Configuration/Enable", "broadcast", static_cast(vt_debug_broadcast)}, - {"Debug Print Configuration/Enable", "objgroup", static_cast(vt_debug_objgroup)}, - {"Debug Print Configuration/Enable", "phase", static_cast(vt_debug_phase)}, - {"Debug Print Configuration/Enable", "context", static_cast(vt_debug_context)}, - {"Debug Print Configuration/Enable", "epoch", static_cast(vt_debug_epoch)}, - - // Load Balancing - {"Load Balancing", "Enabled", static_cast(vt_lb)}, - {"Load Balancing", "Quiet", static_cast(vt_lb_quiet)}, - {"Load Balancing", "File", static_cast(vt_lb_file_name)}, - {"Load Balancing", "Show Configuration", static_cast(vt_lb_show_config)}, - {"Load Balancing", "Name", static_cast(vt_lb_name)}, - {"Load Balancing", "Arguments", static_cast(vt_lb_args)}, - {"Load Balancing", "Interval", static_cast(vt_lb_interval)}, - {"Load Balancing", "Keep Last Element", static_cast(vt_lb_keep_last_elm)}, - {"Load Balancing/LB Data Output", "Enabled", static_cast(vt_lb_data)}, - {"Load Balancing/LB Data Output", "Directory", static_cast(vt_lb_data_dir)}, - {"Load Balancing/LB Data Output", "File", static_cast(vt_lb_data_file)}, - {"Load Balancing/LB Data Input", "Enabled", static_cast(vt_lb_data_in)}, - {"Load Balancing/LB Data Input", "Enable Compression", static_cast(vt_lb_data_compress)}, - {"Load Balancing/LB Data Input", "Directory", static_cast(vt_lb_data_dir_in)}, - {"Load Balancing/LB Data Input", "File", static_cast(vt_lb_data_file_in)}, - {"Load Balancing/LB Statistics", "Enabled", static_cast(vt_lb_statistics)}, - {"Load Balancing/LB Statistics", "Enable Compression", static_cast(vt_lb_statistics_compress)}, - {"Load Balancing/LB Statistics", "File", static_cast(vt_lb_statistics_file)}, - {"Load Balancing/LB Statistics", "Directory", static_cast(vt_lb_statistics_dir)}, - {"Load Balancing", "Enable Self Migration", static_cast(vt_lb_self_migration)}, - {"Load Balancing", "Enable Specification", static_cast(vt_lb_spec)}, - {"Load Balancing", "Specification File", static_cast(vt_lb_spec_file)}, - - // Diagnostics - {"Diagnostics", "Enabled", static_cast(vt_diag_enable)}, - {"Diagnostics", "Enable Print Summary", static_cast(vt_diag_print_summary)}, - {"Diagnostics", "Summary File", static_cast(vt_diag_summary_file)}, - {"Diagnostics", "Summary CSV File", static_cast(vt_diag_summary_csv_file)}, - {"Diagnostics", "Use CSV Base Units", static_cast(vt_diag_csv_base_units)}, - - // Termination - {"Termination", "Detect Hangs", static_cast(not vt_no_detect_hang)}, - {"Termination", "Use DS for Rooted", static_cast(vt_term_rooted_use_ds)}, - {"Termination", "Use Wave for Rooted", static_cast(vt_term_rooted_use_wave)}, - {"Termination", "Output Epoch Graph on Hang", static_cast(vt_epoch_graph_on_hang)}, - {"Termination", "Terse Epoch Graph Output", static_cast(vt_epoch_graph_terse)}, - {"Termination", "Print No Progress", static_cast(vt_print_no_progress)}, - {"Termination", "Hang Check Frequency", static_cast(vt_hang_freq)}, - - // Debugging/Launch - {"Launch", "Pause", static_cast(vt_pause)}, - - // User Options - {"User Options", user_args["vt_user_1"], static_cast(vt_user_1)}, - {"User Options", user_args["vt_user_2"], static_cast(vt_user_2)}, - {"User Options", user_args["vt_user_3"], static_cast(vt_user_3)}, - {"User Options", user_args["vt_user_int_1"], static_cast(vt_user_int_1)}, - {"User Options", user_args["vt_user_int_2"], static_cast(vt_user_int_2)}, - {"User Options", user_args["vt_user_int_3"], static_cast(vt_user_int_3)}, - {"User Options", user_args["vt_user_str_1"], static_cast(vt_user_str_1)}, - {"User Options", user_args["vt_user_str_2"], static_cast(vt_user_str_2)}, - {"User Options", user_args["vt_user_str_3"], static_cast(vt_user_str_3)}, - - // Scheduler Configuration - {"Scheduler Configuration", "Num Progress Times", static_cast(vt_sched_num_progress)}, - {"Scheduler Configuration", "Progress Handlers", static_cast(vt_sched_progress_han)}, - {"Scheduler Configuration", "Progress Seconds", static_cast(vt_sched_progress_sec)}, - - // Configuration File - {"Configuration File", "Enable Output Config", static_cast(vt_output_config)}, - {"Configuration File", "File", static_cast(vt_output_config_file)}, - - // Runtime - {"Runtime", "Max MPI Send Size", static_cast(vt_max_mpi_send_size)}, - {"Runtime", "Disable Assert Failure", static_cast(vt_no_assert_fail)}, - {"Runtime", "Throw on Abort", static_cast(vt_throw_on_abort)} - }; - - // Create an empty node that we will populate - YAML::Node output_config_yaml; - - // Then convert to YAML - for (const auto& yaml_data : cli_to_yaml_args) { - - // Unpack the yaml data - auto yaml_node = std::get<0>(yaml_data); - auto yaml_key = std::get<1>(yaml_data); - auto yaml_val = std::get<2>(yaml_data); - - // First, explicitly handle the Debug Print Configuration list - if (yaml_node == "Debug Print Configuration/Enable") { - if (std::get(yaml_val)) { - output_config_yaml["Debug Print Configuration"]["Enable"].push_back(yaml_key); - } - } - // Then handle the User Defined parameters - else if (yaml_node == "User Options" and yaml_key != "unused_user_param") { - auto current_node = output_config_yaml["User Options"]; - addVariantToNode(current_node, yaml_key, yaml_val); - } - // Then handle any nested nodes (with "/" in them) - else if (yaml_node.find("/") != yaml_node.npos) { - auto nodes = splitString(yaml_node); - auto current_node = output_config_yaml[nodes[0]][nodes[1]]; // TODO: generalize this - addVariantToNode(current_node, yaml_key, yaml_val); - } - // The rest are straightforward - else { - auto current_node = output_config_yaml[yaml_node]; - addVariantToNode(current_node, yaml_key, yaml_val); - } - } - return output_config_yaml; - } - void writeConfigToYaml() { - auto output_config_yaml = convertConfigToYaml(); std::ofstream fout(vt_output_config_file); - fout << output_config_yaml; + fout << vt_output_config_yaml; } }; diff --git a/src/vt/configs/arguments/args.cc b/src/vt/configs/arguments/args.cc index 016d1901ba..94b6629a57 100644 --- a/src/vt/configs/arguments/args.cc +++ b/src/vt/configs/arguments/args.cc @@ -44,6 +44,7 @@ #include "vt/config.h" #include "vt/configs/arguments/args.h" #include "vt/context/context.h" +#include "vt/utils/demangle/demangle.h" #include #include @@ -89,6 +90,7 @@ void postParseTransform(AppConfig& appConfig) { } void parseYaml(AppConfig& appConfig, std::string inputFile); +std::string convertConfigToYamlString(AppConfig& appConfig); std::tuple parseArguments( CLI::App& app, int& argc, char**& argv, AppConfig& appConfig @@ -153,7 +155,13 @@ std::tuple parseArguments( // If the user specified to output the full configuration, save it in a string // so node 0 can output in the runtime once MPI is init'ed if (appConfig.vt_output_config) { - appConfig.vt_output_config_str = app.config_to_str(true, true); + auto output_file = appConfig.vt_output_config_file; + auto config_file_ending = output_file.substr(output_file.size()-4); + if (config_file_ending == ".yml" || config_file_ending == "yaml") { + appConfig.vt_output_config_yaml = convertConfigToYamlString(appConfig); + } else { + appConfig.vt_output_config_str = app.config_to_str(true, true); + } } // Get the clean prog name; don't allow path bleed in usages. @@ -195,7 +203,7 @@ std::tuple parseArguments( } void addYamlConfig(CLI::App& app, AppConfig& appConfig) { - auto yaml_description = "Read in a yaml config file for VT"; + auto yaml_description = "Read in a YAML config file for VT"; app.add_option("--vt_input_config_yaml", appConfig.vt_input_config_yaml, yaml_description); } @@ -205,16 +213,16 @@ void parseYaml(AppConfig& appConfig, std::string inputFile) { // Output control YAML::Node output_control = yaml_input["Output Control"]; - appConfig.vt_color = output_control["Color"].as(true); - appConfig.vt_no_color = not output_control["Color"].as(true); - appConfig.vt_quiet = output_control["Quiet"].as(false); + appConfig.vt_color = output_control["Color"].as(appConfig.vt_color); + appConfig.vt_no_color = not output_control["Color"].as(not appConfig.vt_no_color); + appConfig.vt_quiet = output_control["Quiet"].as(appConfig.vt_quiet); // Signal handling YAML::Node signal_handling = yaml_input["Signal Handling"]; - appConfig.vt_no_sigint = signal_handling["Disable SIGINT"].as(false); - appConfig.vt_no_sigsegv = signal_handling["Disable SIGSEGV"].as(false); - appConfig.vt_no_sigbus = signal_handling["Disable SIGBUS"].as(false); - appConfig.vt_no_terminate = signal_handling["Disable Terminate Signal"].as(false); + appConfig.vt_no_sigint = signal_handling["Disable SIGINT"].as(appConfig.vt_no_sigint); + appConfig.vt_no_sigsegv = signal_handling["Disable SIGSEGV"].as(appConfig.vt_no_sigsegv); + appConfig.vt_no_sigbus = signal_handling["Disable SIGBUS"].as(appConfig.vt_no_sigbus); + appConfig.vt_no_terminate = signal_handling["Disable Terminate Signal"].as(appConfig.vt_no_terminate); // Memory Usage Reporting YAML::Node memory_usage_reporting = yaml_input["Memory Usage Reporting"]; @@ -224,125 +232,129 @@ void parseYaml(AppConfig& appConfig, std::string inputFile) { # endif "mstats,machinfo,selfstat,selfstatm,sbrk,mallinfo,getrusage,ps"; appConfig.vt_memory_reporters = memory_usage_reporting["Memory Reporters"].as(default_vt_memory_reporters); - appConfig.vt_print_memory_each_phase = memory_usage_reporting["Print Memory Each Phase"].as(false); - appConfig.vt_print_memory_node = memory_usage_reporting["Print Memory On Node"].as("0"); - appConfig.vt_allow_memory_report_with_ps = memory_usage_reporting["Allow Memory Report With ps"].as(false); + appConfig.vt_print_memory_each_phase = memory_usage_reporting["Print Memory Each Phase"].as(appConfig.vt_print_memory_each_phase); + appConfig.vt_print_memory_node = memory_usage_reporting["Print Memory On Node"].as(appConfig.vt_print_memory_node); + appConfig.vt_allow_memory_report_with_ps = memory_usage_reporting["Allow Memory Report With ps"].as(appConfig.vt_allow_memory_report_with_ps); if (memory_usage_reporting["Print Memory Threshold"]) { appConfig.vt_print_memory_at_threshold = true; - appConfig.vt_print_memory_threshold = memory_usage_reporting["Print Memory Threshold"].as("1 GiB"); + appConfig.vt_print_memory_threshold = memory_usage_reporting["Print Memory Threshold"].as(appConfig.vt_print_memory_threshold); } else { appConfig.vt_print_memory_at_threshold = false; } - appConfig.vt_print_memory_sched_poll = memory_usage_reporting["Print Memory Scheduler Poll"].as(100); - appConfig.vt_print_memory_footprint = memory_usage_reporting["Print Memory Footprint"].as(false); + appConfig.vt_print_memory_sched_poll = memory_usage_reporting["Print Memory Scheduler Poll"].as(appConfig.vt_print_memory_sched_poll); + appConfig.vt_print_memory_footprint = memory_usage_reporting["Print Memory Footprint"].as(appConfig.vt_print_memory_footprint); // Dump Stack Backtrace YAML::Node dump_stack_backtrace = yaml_input["Dump Stack Backtrace"]; - appConfig.vt_no_warn_stack = not dump_stack_backtrace["Enable Stack Output on Warning"].as(true); - appConfig.vt_no_assert_stack = not dump_stack_backtrace["Enable Stack Output on Assert"].as(true); - appConfig.vt_no_abort_stack = not dump_stack_backtrace["Enable Stack Output on Abort"].as(true); - appConfig.vt_no_stack = not dump_stack_backtrace["Enable Stack Output"].as(true); - appConfig.vt_stack_file = dump_stack_backtrace["File"].as(""); - appConfig.vt_stack_dir = dump_stack_backtrace["Directory"].as(""); - appConfig.vt_stack_mod = dump_stack_backtrace["Output Rank Mod"].as(0); + appConfig.vt_no_warn_stack = not dump_stack_backtrace["Enable Stack Output on Warning"].as(not appConfig.vt_no_warn_stack); + appConfig.vt_no_assert_stack = not dump_stack_backtrace["Enable Stack Output on Assert"].as(not appConfig.vt_no_assert_stack); + appConfig.vt_no_abort_stack = not dump_stack_backtrace["Enable Stack Output on Abort"].as(not appConfig.vt_no_abort_stack); + appConfig.vt_no_stack = not dump_stack_backtrace["Enable Stack Output"].as(not appConfig.vt_no_stack); + appConfig.vt_stack_file = dump_stack_backtrace["File"].as(appConfig.vt_stack_file); + appConfig.vt_stack_dir = dump_stack_backtrace["Directory"].as(appConfig.vt_stack_dir); + appConfig.vt_stack_mod = dump_stack_backtrace["Output Rank Mod"].as(appConfig.vt_stack_mod); // Tracing Configuration YAML::Node tracing_configuration = yaml_input["Tracing Configuration"]; - appConfig.vt_trace = tracing_configuration["Enabled"].as(false); + appConfig.vt_trace = tracing_configuration["Enabled"].as(appConfig.vt_trace); appConfig.vt_trace_mpi = tracing_configuration["MPI Type Events"].as("").find("internal") != std::string::npos; appConfig.vt_trace_pmpi = tracing_configuration["MPI Type Events"].as("").find("external") != std::string::npos; - appConfig.vt_trace_file = tracing_configuration["File"].as(""); - appConfig.vt_trace_dir = tracing_configuration["Directory"].as(""); - appConfig.vt_trace_mod = tracing_configuration["Output Rank Mod"].as(0); - appConfig.vt_trace_flush_size = tracing_configuration["Flush Size"].as(0); - appConfig.vt_trace_gzip_finish_flush = tracing_configuration["GZip Finish Flush"].as(false); - appConfig.vt_trace_sys_all = tracing_configuration["Include All System Events"].as(false); - appConfig.vt_trace_sys_term = tracing_configuration["Include Termination Events"].as(false); - appConfig.vt_trace_sys_location = tracing_configuration["Include Location Events"].as(false); - appConfig.vt_trace_sys_collection = tracing_configuration["Include Collection Events"].as(false); - appConfig.vt_trace_sys_serial_msg = tracing_configuration["Include Message Serialization Events"].as(false); - appConfig.vt_trace_spec = tracing_configuration["Specification Enabled"].as(false); - appConfig.vt_trace_spec_file = tracing_configuration["Spec File"].as(""); - appConfig.vt_trace_memory_usage = tracing_configuration["Memory Usage"].as(false); - appConfig.vt_trace_event_polling = tracing_configuration["Event Polling"].as(false); - appConfig.vt_trace_irecv_polling = tracing_configuration["IRecv Polling"].as(false); + appConfig.vt_trace_file = tracing_configuration["File"].as(appConfig.vt_trace_file); + appConfig.vt_trace_dir = tracing_configuration["Directory"].as(appConfig.vt_trace_dir); + appConfig.vt_trace_mod = tracing_configuration["Output Rank Mod"].as(appConfig.vt_trace_mod); + appConfig.vt_trace_flush_size = tracing_configuration["Flush Size"].as(appConfig.vt_trace_flush_size); + appConfig.vt_trace_gzip_finish_flush = tracing_configuration["GZip Finish Flush"].as(appConfig.vt_trace_gzip_finish_flush); + appConfig.vt_trace_sys_all = tracing_configuration["Include All System Events"].as(appConfig.vt_trace_sys_all); + appConfig.vt_trace_sys_term = tracing_configuration["Include Termination Events"].as(appConfig.vt_trace_sys_term); + appConfig.vt_trace_sys_location = tracing_configuration["Include Location Events"].as(appConfig.vt_trace_sys_location); + appConfig.vt_trace_sys_collection = tracing_configuration["Include Collection Events"].as(appConfig.vt_trace_sys_collection); + appConfig.vt_trace_sys_serial_msg = tracing_configuration["Include Message Serialization Events"].as(appConfig.vt_trace_sys_serial_msg); + appConfig.vt_trace_spec = tracing_configuration["Specification Enabled"].as(appConfig.vt_trace_spec); + appConfig.vt_trace_spec_file = tracing_configuration["Spec File"].as(appConfig.vt_trace_spec_file); + appConfig.vt_trace_memory_usage = tracing_configuration["Memory Usage"].as(appConfig.vt_trace_memory_usage); + appConfig.vt_trace_event_polling = tracing_configuration["Event Polling"].as(appConfig.vt_trace_event_polling); + appConfig.vt_trace_irecv_polling = tracing_configuration["IRecv Polling"].as(appConfig.vt_trace_irecv_polling); // Debug Print Configuration YAML::Node debug_print_configuration = yaml_input["Debug Print Configuration"]; - appConfig.vt_debug_level = debug_print_configuration["Level"].as("terse"); - appConfig.vt_debug_all = debug_print_configuration["Enable All"].as(false); - appConfig.vt_debug_none = debug_print_configuration["Disable All"].as(false); + appConfig.vt_debug_level = debug_print_configuration["Level"].as(appConfig.vt_debug_level); + appConfig.vt_debug_all = debug_print_configuration["Enable All"].as(appConfig.vt_debug_all); + appConfig.vt_debug_none = debug_print_configuration["Disable All"].as(appConfig.vt_debug_none); std::vector debug_enables; if (debug_print_configuration["Enable"]) { debug_enables = debug_print_configuration["Enable"].as>(); } - appConfig.vt_debug_gen = (std::find(debug_enables.begin(), debug_enables.end(), "gen") != debug_enables.end()); - appConfig.vt_debug_runtime = (std::find(debug_enables.begin(), debug_enables.end(), "runtime") != debug_enables.end()); - appConfig.vt_debug_active = (std::find(debug_enables.begin(), debug_enables.end(), "active") != debug_enables.end()); - appConfig.vt_debug_term = (std::find(debug_enables.begin(), debug_enables.end(), "term") != debug_enables.end()); - appConfig.vt_debug_termds = (std::find(debug_enables.begin(), debug_enables.end(), "termds") != debug_enables.end()); - appConfig.vt_debug_barrier = (std::find(debug_enables.begin(), debug_enables.end(), "barrier") != debug_enables.end()); - appConfig.vt_debug_event = (std::find(debug_enables.begin(), debug_enables.end(), "event") != debug_enables.end()); - appConfig.vt_debug_pipe = (std::find(debug_enables.begin(), debug_enables.end(), "pipe") != debug_enables.end()); - appConfig.vt_debug_pool = (std::find(debug_enables.begin(), debug_enables.end(), "pool") != debug_enables.end()); - appConfig.vt_debug_reduce = (std::find(debug_enables.begin(), debug_enables.end(), "reduce") != debug_enables.end()); - appConfig.vt_debug_rdma = (std::find(debug_enables.begin(), debug_enables.end(), "rdma") != debug_enables.end()); - appConfig.vt_debug_rdma_channel = (std::find(debug_enables.begin(), debug_enables.end(), "rdma_channel") != debug_enables.end()); - appConfig.vt_debug_rdma_state = (std::find(debug_enables.begin(), debug_enables.end(), "rdma_state") != debug_enables.end()); - appConfig.vt_debug_handler = (std::find(debug_enables.begin(), debug_enables.end(), "handler") != debug_enables.end()); - appConfig.vt_debug_hierlb = (std::find(debug_enables.begin(), debug_enables.end(), "hierlb") != debug_enables.end()); - appConfig.vt_debug_temperedlb = (std::find(debug_enables.begin(), debug_enables.end(), "temperedlb") != debug_enables.end()); - appConfig.vt_debug_temperedwmin = (std::find(debug_enables.begin(), debug_enables.end(), "temperedwmin") != debug_enables.end()); - appConfig.vt_debug_scatter = (std::find(debug_enables.begin(), debug_enables.end(), "scatter") != debug_enables.end()); - appConfig.vt_debug_serial_msg = (std::find(debug_enables.begin(), debug_enables.end(), "serial_msg") != debug_enables.end()); - appConfig.vt_debug_trace = (std::find(debug_enables.begin(), debug_enables.end(), "trace") != debug_enables.end()); - appConfig.vt_debug_location = (std::find(debug_enables.begin(), debug_enables.end(), "location") != debug_enables.end()); - appConfig.vt_debug_lb = (std::find(debug_enables.begin(), debug_enables.end(), "lb") != debug_enables.end()); - appConfig.vt_debug_vrt = (std::find(debug_enables.begin(), debug_enables.end(), "vrt") != debug_enables.end()); - appConfig.vt_debug_vrt_coll = (std::find(debug_enables.begin(), debug_enables.end(), "vrt_coll") != debug_enables.end()); - appConfig.vt_debug_worker = (std::find(debug_enables.begin(), debug_enables.end(), "worker") != debug_enables.end()); - appConfig.vt_debug_group = (std::find(debug_enables.begin(), debug_enables.end(), "group") != debug_enables.end()); - appConfig.vt_debug_broadcast = (std::find(debug_enables.begin(), debug_enables.end(), "broadcast") != debug_enables.end()); - appConfig.vt_debug_objgroup = (std::find(debug_enables.begin(), debug_enables.end(), "objgroup") != debug_enables.end()); - appConfig.vt_debug_phase = (std::find(debug_enables.begin(), debug_enables.end(), "phase") != debug_enables.end()); - appConfig.vt_debug_context = (std::find(debug_enables.begin(), debug_enables.end(), "context") != debug_enables.end()); - appConfig.vt_debug_epoch = (std::find(debug_enables.begin(), debug_enables.end(), "epoch") != debug_enables.end()); - appConfig.vt_debug_print_flush = debug_print_configuration["Enable Print Flushing"].as(false); + auto is_debug_enabled = [&debug_enables](const std::string& debug_type) { + return std::find(debug_enables.begin(), debug_enables.end(), debug_type) != debug_enables.end(); + }; + + appConfig.vt_debug_gen = is_debug_enabled("gen"); + appConfig.vt_debug_runtime = is_debug_enabled("runtime"); + appConfig.vt_debug_active = is_debug_enabled("active"); + appConfig.vt_debug_term = is_debug_enabled("term"); + appConfig.vt_debug_termds = is_debug_enabled("termds"); + appConfig.vt_debug_barrier = is_debug_enabled("barrier"); + appConfig.vt_debug_event = is_debug_enabled("event"); + appConfig.vt_debug_pipe = is_debug_enabled("pipe"); + appConfig.vt_debug_pool = is_debug_enabled("pool"); + appConfig.vt_debug_reduce = is_debug_enabled("reduce"); + appConfig.vt_debug_rdma = is_debug_enabled("rdma"); + appConfig.vt_debug_rdma_channel = is_debug_enabled("rdma_channel"); + appConfig.vt_debug_rdma_state = is_debug_enabled("rdma_state"); + appConfig.vt_debug_handler = is_debug_enabled("handler"); + appConfig.vt_debug_hierlb = is_debug_enabled("hierlb"); + appConfig.vt_debug_temperedlb = is_debug_enabled("temperedlb"); + appConfig.vt_debug_temperedwmin = is_debug_enabled("temperedwmin"); + appConfig.vt_debug_scatter = is_debug_enabled("scatter"); + appConfig.vt_debug_serial_msg = is_debug_enabled("serial_msg"); + appConfig.vt_debug_trace = is_debug_enabled("trace"); + appConfig.vt_debug_location = is_debug_enabled("location"); + appConfig.vt_debug_lb = is_debug_enabled("lb"); + appConfig.vt_debug_vrt = is_debug_enabled("vrt"); + appConfig.vt_debug_vrt_coll = is_debug_enabled("vrt_coll"); + appConfig.vt_debug_worker = is_debug_enabled("worker"); + appConfig.vt_debug_group = is_debug_enabled("group"); + appConfig.vt_debug_broadcast = is_debug_enabled("broadcast"); + appConfig.vt_debug_objgroup = is_debug_enabled("objgroup"); + appConfig.vt_debug_phase = is_debug_enabled("phase"); + appConfig.vt_debug_context = is_debug_enabled("context"); + appConfig.vt_debug_epoch = is_debug_enabled("epoch"); + appConfig.vt_debug_print_flush = debug_print_configuration["Enable Print Flushing"].as(appConfig.vt_debug_print_flush); // appConfig.vt_debug_replay = debug_print_configuration["Enable replay"].as(false); // Load Balancing YAML::Node load_balancing = yaml_input["Load Balancing"]; - appConfig.vt_lb = load_balancing["Enabled"].as(false); - appConfig.vt_lb_quiet = load_balancing["Quiet"].as(false); - appConfig.vt_lb_file_name = load_balancing["File"].as(""); - appConfig.vt_lb_show_config = load_balancing["Show Configuration"].as(false); - appConfig.vt_lb_name = load_balancing["Name"].as("NoLB"); - appConfig.vt_lb_args = load_balancing["Arguments"].as(""); - appConfig.vt_lb_interval = load_balancing["Interval"].as(1); - appConfig.vt_lb_keep_last_elm = load_balancing["Keep Last Element"].as(false); + appConfig.vt_lb = load_balancing["Enabled"].as(appConfig.vt_lb); + appConfig.vt_lb_quiet = load_balancing["Quiet"].as(appConfig.vt_lb_quiet); + appConfig.vt_lb_file_name = load_balancing["File"].as(appConfig.vt_lb_file_name); + appConfig.vt_lb_show_config = load_balancing["Show Configuration"].as(appConfig.vt_lb_show_config); + appConfig.vt_lb_name = load_balancing["Name"].as(appConfig.vt_lb_name); + appConfig.vt_lb_args = load_balancing["Arguments"].as(appConfig.vt_lb_args); + appConfig.vt_lb_interval = load_balancing["Interval"].as(appConfig.vt_lb_interval); + appConfig.vt_lb_keep_last_elm = load_balancing["Keep Last Element"].as(appConfig.vt_lb_keep_last_elm); YAML::Node lb_output = load_balancing["LB Data Output"]; - appConfig.vt_lb_data = lb_output["Enabled"].as(false); - appConfig.vt_lb_data_dir = lb_output["Directory"].as("vt_lb_data"); - appConfig.vt_lb_data_file = lb_output["File"].as("data.%p.json"); + appConfig.vt_lb_data = lb_output["Enabled"].as(appConfig.vt_lb_data); + appConfig.vt_lb_data_dir = lb_output["Directory"].as(appConfig.vt_lb_data_dir); + appConfig.vt_lb_data_file = lb_output["File"].as(appConfig.vt_lb_data_file); YAML::Node lb_input = load_balancing["LB Data Input"]; - appConfig.vt_lb_data_in = lb_input["Enabled"].as(false); - appConfig.vt_lb_data_compress = lb_input["Enable Compression"].as(false); - appConfig.vt_lb_data_dir_in = lb_input["Directory"].as("vt_lb_data_in"); - appConfig.vt_lb_data_file_in = lb_input["File"].as("data.%p.json"); + appConfig.vt_lb_data_in = lb_input["Enabled"].as(appConfig.vt_lb_data_in); + appConfig.vt_lb_data_compress = lb_input["Enable Compression"].as(appConfig.vt_lb_data_compress); + appConfig.vt_lb_data_dir_in = lb_input["Directory"].as(appConfig.vt_lb_data_dir_in); + appConfig.vt_lb_data_file_in = lb_input["File"].as(appConfig.vt_lb_data_file_in); YAML::Node lb_stats = load_balancing["LB Statistics"]; - appConfig.vt_lb_statistics = lb_stats["Enabled"].as(false); - appConfig.vt_lb_statistics_compress = lb_stats["Enable Compression"].as(false); - appConfig.vt_lb_statistics_file = lb_stats["File"].as("vt_lb_statistics.%t.json"); - appConfig.vt_lb_statistics_dir = lb_stats["Directory"].as(""); - - appConfig.vt_lb_self_migration = load_balancing["Enable Self Migration"].as(false); - appConfig.vt_lb_spec = load_balancing["Enable Specification"].as(false); - appConfig.vt_lb_spec_file = load_balancing["Specification File"].as(""); + appConfig.vt_lb_statistics = lb_stats["Enabled"].as(appConfig.vt_lb_statistics); + appConfig.vt_lb_statistics_compress = lb_stats["Enable Compression"].as(appConfig.vt_lb_statistics_compress); + appConfig.vt_lb_statistics_file = lb_stats["File"].as(appConfig.vt_lb_statistics_file); + appConfig.vt_lb_statistics_dir = lb_stats["Directory"].as(appConfig.vt_lb_statistics_dir); + + appConfig.vt_lb_self_migration = load_balancing["Enable Self Migration"].as(appConfig.vt_lb_self_migration); + appConfig.vt_lb_spec = load_balancing["Enable Specification"].as(appConfig.vt_lb_spec); + appConfig.vt_lb_spec_file = load_balancing["Specification File"].as(appConfig.vt_lb_spec_file); // appConfig.vt_lb_run_lb_first_phase = load_balancing["vt_lb_run_lb_first_phase"].as(false); // Diagnostics @@ -354,24 +366,24 @@ void parseYaml(AppConfig& appConfig, std::string inputFile) { default_diag_enable = false; #endif appConfig.vt_diag_enable = diagnostics["Enabled"].as(default_diag_enable); - appConfig.vt_diag_print_summary = diagnostics["Enable Print Summary"].as(false); - appConfig.vt_diag_summary_file = diagnostics["Summary File"].as("vtdiag.txt"); - appConfig.vt_diag_summary_csv_file = diagnostics["Summary CSV File"].as(""); - appConfig.vt_diag_csv_base_units = diagnostics["Use CSV Base Units"].as(false); + appConfig.vt_diag_print_summary = diagnostics["Enable Print Summary"].as(appConfig.vt_diag_print_summary); + appConfig.vt_diag_summary_file = diagnostics["Summary File"].as(appConfig.vt_diag_summary_file); + appConfig.vt_diag_summary_csv_file = diagnostics["Summary CSV File"].as(appConfig.vt_diag_summary_csv_file); + appConfig.vt_diag_csv_base_units = diagnostics["Use CSV Base Units"].as(appConfig.vt_diag_csv_base_units); // Termination YAML::Node termination = yaml_input["Termination"]; - appConfig.vt_no_detect_hang = not termination["Detect Hangs"].as(true); - appConfig.vt_term_rooted_use_ds = termination["Use DS for Rooted"].as(false); - appConfig.vt_term_rooted_use_wave = termination["Use Wave for Rooted"].as(false); - appConfig.vt_epoch_graph_on_hang = termination["Output Epoch Graph on Hang"].as(true); - appConfig.vt_epoch_graph_terse = termination["Terse Epoch Graph Output"].as(false); - appConfig.vt_print_no_progress = termination["Print No Progress"].as(true); - appConfig.vt_hang_freq = termination["Hang Check Frequency"].as(1024); + appConfig.vt_no_detect_hang = not termination["Detect Hangs"].as(not appConfig.vt_no_detect_hang); + appConfig.vt_term_rooted_use_ds = termination["Use DS for Rooted"].as(appConfig.vt_term_rooted_use_ds); + appConfig.vt_term_rooted_use_wave = termination["Use Wave for Rooted"].as(appConfig.vt_term_rooted_use_wave); + appConfig.vt_epoch_graph_on_hang = termination["Output Epoch Graph on Hang"].as(appConfig.vt_epoch_graph_on_hang); + appConfig.vt_epoch_graph_terse = termination["Terse Epoch Graph Output"].as(appConfig.vt_epoch_graph_terse); + appConfig.vt_print_no_progress = termination["Print No Progress"].as(appConfig.vt_print_no_progress); + appConfig.vt_hang_freq = termination["Hang Check Frequency"].as(appConfig.vt_hang_freq); // Debugging/Launch YAML::Node launch = yaml_input["Launch"]; - appConfig.vt_pause = launch["Pause"].as(false); + appConfig.vt_pause = launch["Pause"].as(appConfig.vt_pause); // User Options YAML::Node user_options = yaml_input["User Options"]; @@ -381,52 +393,61 @@ void parseYaml(AppConfig& appConfig, std::string inputFile) { const std::string& key = it->first.as(); try { bool user_input = user_options[key].as(); - if (bool_iter == 1) appConfig.vt_user_1 = user_input; - else if (bool_iter == 2) appConfig.vt_user_2 = user_input; - else if (bool_iter == 3) appConfig.vt_user_3 = user_input; + if (bool_iter == 1) + appConfig.vt_user_1 = user_input; + else if (bool_iter == 2) + appConfig.vt_user_2 = user_input; + else if (bool_iter == 3) + appConfig.vt_user_3 = user_input; else too_many_user_args = true; appConfig.user_args["vt_user_" + std::to_string(bool_iter)] = key; bool_iter++; - } catch(...) { + } catch (const YAML::RepresentationException&) { try { int user_input = user_options[key].as(); - if (int_iter == 1) appConfig.vt_user_int_1 = user_input; - else if (int_iter == 2) appConfig.vt_user_int_2 = user_input; - else if (int_iter == 3) appConfig.vt_user_int_3 = user_input; - else too_many_user_args = true; + if (int_iter == 1) + appConfig.vt_user_int_1 = user_input; + else if (int_iter == 2) + appConfig.vt_user_int_2 = user_input; + else if (int_iter == 3) + appConfig.vt_user_int_3 = user_input; + else + too_many_user_args = true; appConfig.user_args["vt_user_int_" + std::to_string(int_iter)] = key; int_iter++; - } catch(...) { + } catch (const YAML::RepresentationException&) { std::string user_input = user_options[key].as(); - if (str_iter == 1) appConfig.vt_user_str_1 = user_input; - else if (str_iter == 2) appConfig.vt_user_str_2 = user_input; - else if (str_iter == 3) appConfig.vt_user_str_3 = user_input; + if (str_iter == 1) + appConfig.vt_user_str_1 = user_input; + else if (str_iter == 2) + appConfig.vt_user_str_2 = user_input; + else if (str_iter == 3) + appConfig.vt_user_str_3 = user_input; else too_many_user_args = true; appConfig.user_args["vt_user_str_" + std::to_string(str_iter)] = key; str_iter++; } } } - if (too_many_user_args) { - throw std::runtime_error("Only three user-defined arguments of each type (bool, int, or string) are supported."); - } + + vtAbortIf(too_many_user_args, "Only three user-defined arguments of each type (bool, int, or string) are supported."); // Scheduler Configuration YAML::Node scheduler_configuration = yaml_input["Scheduler Configuration"]; - appConfig.vt_sched_num_progress = scheduler_configuration["Num Progress Times"].as(2); - appConfig.vt_sched_progress_han = scheduler_configuration["Progress Handlers"].as(0); - appConfig.vt_sched_progress_sec = scheduler_configuration["Progress Seconds"].as(0.0); + appConfig.vt_sched_num_progress = scheduler_configuration["Num Progress Times"].as(appConfig.vt_sched_num_progress); + appConfig.vt_sched_progress_han = scheduler_configuration["Progress Handlers"].as(appConfig.vt_sched_progress_han); + appConfig.vt_sched_progress_sec = scheduler_configuration["Progress Seconds"].as(appConfig.vt_sched_progress_sec); // Configuration File YAML::Node configuration_file = yaml_input["Configuration File"]; - appConfig.vt_output_config = configuration_file["Enable Output Config"].as(false); - appConfig.vt_output_config_file = configuration_file["File"].as("vt_config.ini"); + appConfig.vt_output_config = configuration_file["Enable Output Config"].as(appConfig.vt_output_config); + appConfig.vt_output_config_file = configuration_file["File"].as(appConfig.vt_output_config_file); // Runtime YAML::Node runtime = yaml_input["Runtime"]; - appConfig.vt_max_mpi_send_size = runtime["Max MPI Send Size"].as(1ull << 30); - appConfig.vt_no_assert_fail = runtime["Disable Assert Failure"].as(false); - appConfig.vt_throw_on_abort = runtime["Throw on Abort"].as(false); + appConfig.vt_max_mpi_send_size = runtime["Max MPI Send Size"].as(appConfig.vt_max_mpi_send_size); + appConfig.vt_no_assert_fail = runtime["Disable Assert Failure"].as(appConfig.vt_no_assert_fail); + appConfig.vt_throw_on_abort = runtime["Throw on Abort"].as(appConfig.vt_throw_on_abort); } void addColorArgs(CLI::App& app, AppConfig& appConfig) { @@ -939,6 +960,227 @@ void addThreadingArgs( #endif } +using variantArg_t = std::variant; + +void addVariantToNode(YAML::Node& node, std::string key, variantArg_t variant_val) { + // Get the yaml_val from the variant + if (std::holds_alternative(variant_val)) { + node[key] = std::get(variant_val); + } else if (std::holds_alternative(variant_val)) { + node[key] = std::get(variant_val); + } else if (std::holds_alternative(variant_val)) { + node[key] = std::get(variant_val); + } else if (std::holds_alternative(variant_val)) { + node[key] = std::get(variant_val); + } else if (std::holds_alternative(variant_val)) { + node[key] = std::get(variant_val); + } else if (std::holds_alternative(variant_val)) { + node[key] = std::get(variant_val); + } else { + throw std::runtime_error("Argument type not recognized."); + } +} + +std::string convertConfigToYamlString(AppConfig& appConfig) { + // First, create a converter vector of tuples {Node(s), Key, Value} + std::vector< std::tuple > cli_to_yaml_args = + { + // Output Control + {"Output Control", "Color", static_cast(appConfig.vt_color)}, + {"Output Control", "Color", static_cast(not appConfig.vt_no_color)}, // overwrites vt_color + {"Output Control", "Quiet", static_cast(appConfig.vt_quiet)}, + + // Signal Handling + {"Signal Handling", "Disable SIGINT", static_cast(appConfig.vt_no_sigint)}, + {"Signal Handling", "Disable SIGSEGV", static_cast(appConfig.vt_no_sigsegv)}, + {"Signal Handling", "Disable SIGBUS", static_cast(appConfig.vt_no_sigbus)}, + {"Signal Handling", "Disable Terminate Signal", static_cast(appConfig.vt_no_terminate)}, + + // Memory Usage Reporting + {"Memory Usage Reporting", "Memory Reporters", static_cast(appConfig.vt_memory_reporters)}, + {"Memory Usage Reporting", "Print Memory Each Phase", static_cast(appConfig.vt_print_memory_each_phase)}, + {"Memory Usage Reporting", "Print Memory On Node", static_cast(appConfig.vt_print_memory_node)}, + {"Memory Usage Reporting", "Allow Memory Report With ps", static_cast(appConfig.vt_allow_memory_report_with_ps)}, + {"Memory Usage Reporting", "Print Memory Threshold", static_cast(appConfig.vt_print_memory_threshold)}, + {"Memory Usage Reporting", "Print Memory Scheduler Poll", static_cast(appConfig.vt_print_memory_sched_poll)}, + {"Memory Usage Reporting", "Print Memory Footprint", static_cast(appConfig.vt_print_memory_footprint)}, + + // Dump Stack Backtrace + {"Dump Stack Backtrace", "Enable Stack Output on Warning", static_cast(appConfig.vt_no_warn_stack)}, + {"Dump Stack Backtrace", "Enable Stack Output on Assert", static_cast(appConfig.vt_no_assert_stack)}, + {"Dump Stack Backtrace", "Enable Stack Output on Abort", static_cast(appConfig.vt_no_abort_stack)}, + {"Dump Stack Backtrace", "Enable Stack Output", static_cast(appConfig.vt_no_stack)}, + {"Dump Stack Backtrace", "File", static_cast(appConfig.vt_stack_file)}, + {"Dump Stack Backtrace", "Directory", static_cast(appConfig.vt_stack_dir)}, + {"Dump Stack Backtrace", "Output Rank Mod", static_cast(appConfig.vt_stack_mod)}, + + // Tracing Configuration + {"Tracing Configuration", "Enabled", static_cast(appConfig.vt_trace)}, + {"Tracing Configuration", "MPI Type Events", static_cast(appConfig.vt_trace_mpi)}, + {"Tracing Configuration", "MPI Type Events", static_cast(appConfig.vt_trace_pmpi)}, + {"Tracing Configuration", "File", static_cast(appConfig.vt_trace_file)}, + {"Tracing Configuration", "Directory", static_cast(appConfig.vt_trace_dir)}, + {"Tracing Configuration", "Output Rank Mod", static_cast(appConfig.vt_trace_mod)}, + {"Tracing Configuration", "Flush Size", static_cast(appConfig.vt_trace_flush_size)}, + {"Tracing Configuration", "GZip Finish Flush", static_cast(appConfig.vt_trace_gzip_finish_flush)}, + {"Tracing Configuration", "Include All System Events", static_cast(appConfig.vt_trace_sys_all)}, + {"Tracing Configuration", "Include Termination Events", static_cast(appConfig.vt_trace_sys_term)}, + {"Tracing Configuration", "Include Location Events", static_cast(appConfig.vt_trace_sys_location)}, + {"Tracing Configuration", "Include Collection Events", static_cast(appConfig.vt_trace_sys_collection)}, + {"Tracing Configuration", "Include Message Serialization Events", static_cast(appConfig.vt_trace_sys_serial_msg)}, + {"Tracing Configuration", "Specification Enabled", static_cast(appConfig.vt_trace_spec)}, + {"Tracing Configuration", "Spec File", static_cast(appConfig.vt_trace_spec_file)}, + {"Tracing Configuration", "Memory Usage", static_cast(appConfig.vt_trace_memory_usage)}, + {"Tracing Configuration", "Event Polling", static_cast(appConfig.vt_trace_event_polling)}, + {"Tracing Configuration", "IRecv Polling", static_cast(appConfig.vt_trace_irecv_polling)}, + + // Debug Print Configuration + {"Debug Print Configuration", "Level", static_cast(appConfig.vt_debug_level)}, + {"Debug Print Configuration", "Enable All", static_cast(appConfig.vt_debug_all)}, + {"Debug Print Configuration", "Disable All", static_cast(appConfig.vt_debug_none)}, + {"Debug Print Configuration", "Debug Print Flush", static_cast(appConfig.vt_debug_print_flush)}, + {"Debug Print Configuration/Enable", "gen", static_cast(appConfig.vt_debug_gen)}, + {"Debug Print Configuration/Enable", "runtime", static_cast(appConfig.vt_debug_runtime)}, + {"Debug Print Configuration/Enable", "active", static_cast(appConfig.vt_debug_active)}, + {"Debug Print Configuration/Enable", "term", static_cast(appConfig.vt_debug_term)}, + {"Debug Print Configuration/Enable", "termds", static_cast(appConfig.vt_debug_termds)}, + {"Debug Print Configuration/Enable", "barrier", static_cast(appConfig.vt_debug_barrier)}, + {"Debug Print Configuration/Enable", "event", static_cast(appConfig.vt_debug_event)}, + {"Debug Print Configuration/Enable", "pipe", static_cast(appConfig.vt_debug_pipe)}, + {"Debug Print Configuration/Enable", "pool", static_cast(appConfig.vt_debug_pool)}, + {"Debug Print Configuration/Enable", "reduce", static_cast(appConfig.vt_debug_reduce)}, + {"Debug Print Configuration/Enable", "rdma", static_cast(appConfig.vt_debug_rdma)}, + {"Debug Print Configuration/Enable", "rdma_channel", static_cast(appConfig.vt_debug_rdma_channel)}, + {"Debug Print Configuration/Enable", "rdma_state", static_cast(appConfig.vt_debug_rdma_state)}, + {"Debug Print Configuration/Enable", "handler", static_cast(appConfig.vt_debug_handler)}, + {"Debug Print Configuration/Enable", "hierlb", static_cast(appConfig.vt_debug_hierlb)}, + {"Debug Print Configuration/Enable", "temperedlb", static_cast(appConfig.vt_debug_temperedlb)}, + {"Debug Print Configuration/Enable", "temperedwmin", static_cast(appConfig.vt_debug_temperedwmin)}, + {"Debug Print Configuration/Enable", "scatter", static_cast(appConfig.vt_debug_scatter)}, + {"Debug Print Configuration/Enable", "serial_msg", static_cast(appConfig.vt_debug_serial_msg)}, + {"Debug Print Configuration/Enable", "trace", static_cast(appConfig.vt_debug_trace)}, + {"Debug Print Configuration/Enable", "location", static_cast(appConfig.vt_debug_location)}, + {"Debug Print Configuration/Enable", "lb", static_cast(appConfig.vt_debug_lb)}, + {"Debug Print Configuration/Enable", "vrt", static_cast(appConfig.vt_debug_vrt)}, + {"Debug Print Configuration/Enable", "vrt_coll", static_cast(appConfig.vt_debug_vrt_coll)}, + {"Debug Print Configuration/Enable", "worker", static_cast(appConfig.vt_debug_worker)}, + {"Debug Print Configuration/Enable", "group", static_cast(appConfig.vt_debug_group)}, + {"Debug Print Configuration/Enable", "broadcast", static_cast(appConfig.vt_debug_broadcast)}, + {"Debug Print Configuration/Enable", "objgroup", static_cast(appConfig.vt_debug_objgroup)}, + {"Debug Print Configuration/Enable", "phase", static_cast(appConfig.vt_debug_phase)}, + {"Debug Print Configuration/Enable", "context", static_cast(appConfig.vt_debug_context)}, + {"Debug Print Configuration/Enable", "epoch", static_cast(appConfig.vt_debug_epoch)}, + + // Load Balancing + {"Load Balancing", "Enabled", static_cast(appConfig.vt_lb)}, + {"Load Balancing", "Quiet", static_cast(appConfig.vt_lb_quiet)}, + {"Load Balancing", "File", static_cast(appConfig.vt_lb_file_name)}, + {"Load Balancing", "Show Configuration", static_cast(appConfig.vt_lb_show_config)}, + {"Load Balancing", "Name", static_cast(appConfig.vt_lb_name)}, + {"Load Balancing", "Arguments", static_cast(appConfig.vt_lb_args)}, + {"Load Balancing", "Interval", static_cast(appConfig.vt_lb_interval)}, + {"Load Balancing", "Keep Last Element", static_cast(appConfig.vt_lb_keep_last_elm)}, + {"Load Balancing/LB Data Output", "Enabled", static_cast(appConfig.vt_lb_data)}, + {"Load Balancing/LB Data Output", "Directory", static_cast(appConfig.vt_lb_data_dir)}, + {"Load Balancing/LB Data Output", "File", static_cast(appConfig.vt_lb_data_file)}, + {"Load Balancing/LB Data Input", "Enabled", static_cast(appConfig.vt_lb_data_in)}, + {"Load Balancing/LB Data Input", "Enable Compression", static_cast(appConfig.vt_lb_data_compress)}, + {"Load Balancing/LB Data Input", "Directory", static_cast(appConfig.vt_lb_data_dir_in)}, + {"Load Balancing/LB Data Input", "File", static_cast(appConfig.vt_lb_data_file_in)}, + {"Load Balancing/LB Statistics", "Enabled", static_cast(appConfig.vt_lb_statistics)}, + {"Load Balancing/LB Statistics", "Enable Compression", static_cast(appConfig.vt_lb_statistics_compress)}, + {"Load Balancing/LB Statistics", "File", static_cast(appConfig.vt_lb_statistics_file)}, + {"Load Balancing/LB Statistics", "Directory", static_cast(appConfig.vt_lb_statistics_dir)}, + {"Load Balancing", "Enable Self Migration", static_cast(appConfig.vt_lb_self_migration)}, + {"Load Balancing", "Enable Specification", static_cast(appConfig.vt_lb_spec)}, + {"Load Balancing", "Specification File", static_cast(appConfig.vt_lb_spec_file)}, + + // Diagnostics + {"Diagnostics", "Enabled", static_cast(appConfig.vt_diag_enable)}, + {"Diagnostics", "Enable Print Summary", static_cast(appConfig.vt_diag_print_summary)}, + {"Diagnostics", "Summary File", static_cast(appConfig.vt_diag_summary_file)}, + {"Diagnostics", "Summary CSV File", static_cast(appConfig.vt_diag_summary_csv_file)}, + {"Diagnostics", "Use CSV Base Units", static_cast(appConfig.vt_diag_csv_base_units)}, + + // Termination + {"Termination", "Detect Hangs", static_cast(not appConfig.vt_no_detect_hang)}, + {"Termination", "Use DS for Rooted", static_cast(appConfig.vt_term_rooted_use_ds)}, + {"Termination", "Use Wave for Rooted", static_cast(appConfig.vt_term_rooted_use_wave)}, + {"Termination", "Output Epoch Graph on Hang", static_cast(appConfig.vt_epoch_graph_on_hang)}, + {"Termination", "Terse Epoch Graph Output", static_cast(appConfig.vt_epoch_graph_terse)}, + {"Termination", "Print No Progress", static_cast(appConfig.vt_print_no_progress)}, + {"Termination", "Hang Check Frequency", static_cast(appConfig.vt_hang_freq)}, + + // Debugging/Launch + {"Launch", "Pause", static_cast(appConfig.vt_pause)}, + + // User Options + {"User Options", appConfig.user_args["vt_user_1"], static_cast(appConfig.vt_user_1)}, + {"User Options", appConfig.user_args["vt_user_2"], static_cast(appConfig.vt_user_2)}, + {"User Options", appConfig.user_args["vt_user_3"], static_cast(appConfig.vt_user_3)}, + {"User Options", appConfig.user_args["vt_user_int_1"], static_cast(appConfig.vt_user_int_1)}, + {"User Options", appConfig.user_args["vt_user_int_2"], static_cast(appConfig.vt_user_int_2)}, + {"User Options", appConfig.user_args["vt_user_int_3"], static_cast(appConfig.vt_user_int_3)}, + {"User Options", appConfig.user_args["vt_user_str_1"], static_cast(appConfig.vt_user_str_1)}, + {"User Options", appConfig.user_args["vt_user_str_2"], static_cast(appConfig.vt_user_str_2)}, + {"User Options", appConfig.user_args["vt_user_str_3"], static_cast(appConfig.vt_user_str_3)}, + + // Scheduler Configuration + {"Scheduler Configuration", "Num Progress Times", static_cast(appConfig.vt_sched_num_progress)}, + {"Scheduler Configuration", "Progress Handlers", static_cast(appConfig.vt_sched_progress_han)}, + {"Scheduler Configuration", "Progress Seconds", static_cast(appConfig.vt_sched_progress_sec)}, + + // Configuration File + {"Configuration File", "Enable Output Config", static_cast(appConfig.vt_output_config)}, + {"Configuration File", "File", static_cast(appConfig.vt_output_config_file)}, + + // Runtime + {"Runtime", "Max MPI Send Size", static_cast(appConfig.vt_max_mpi_send_size)}, + {"Runtime", "Disable Assert Failure", static_cast(appConfig.vt_no_assert_fail)}, + {"Runtime", "Throw on Abort", static_cast(appConfig.vt_throw_on_abort)} + }; + + // Create an empty node that we will populate + YAML::Node output_config_yaml; + + // Then convert to YAML + for (const auto& yaml_data : cli_to_yaml_args) { + + // Unpack the yaml data + auto yaml_node = std::get<0>(yaml_data); + auto yaml_key = std::get<1>(yaml_data); + auto yaml_val = std::get<2>(yaml_data); + + // First, explicitly handle the Debug Print Configuration list + if (yaml_node == "Debug Print Configuration/Enable") { + if (std::get(yaml_val)) { + output_config_yaml["Debug Print Configuration"]["Enable"].push_back(yaml_key); + } + } + // Then handle the User Defined parameters + else if (yaml_node == "User Options" and yaml_key != "unused_user_param") { + auto current_node = output_config_yaml["User Options"]; + addVariantToNode(current_node, yaml_key, yaml_val); + } + // Then handle any nested nodes (with "/" in them) + else if (yaml_node.find("/") != yaml_node.npos) { + auto nodes = util::demangle::DemanglerUtils::splitString(yaml_node, '/'); + // auto nodes = splitString(yaml_node); + auto current_node = output_config_yaml[nodes[0]][nodes[1]]; // TODO: generalize this + addVariantToNode(current_node, yaml_key, yaml_val); + } + // The rest are straightforward + else { + auto current_node = output_config_yaml[yaml_node]; + addVariantToNode(current_node, yaml_key, yaml_val); + } + } +std::ostringstream yaml_stream; +yaml_stream << output_config_yaml; +std::string output_config_string = yaml_stream.str(); +return output_config_string; +} + } /* end anon namespace */ /*static*/ std::unique_ptr diff --git a/tests/unit/runtime/test_initialization.cc b/tests/unit/runtime/test_initialization.cc index 2071a918b6..0881c015cd 100644 --- a/tests/unit/runtime/test_initialization.cc +++ b/tests/unit/runtime/test_initialization.cc @@ -288,51 +288,56 @@ TEST_F(TestInitialization, test_initialize_with_yaml) { MPI_Comm_rank(comm, &this_rank); if (this_rank == 0) { std::ofstream cfg_file_{config_file.c_str(), std::ofstream::out | std::ofstream::trunc}; - cfg_file_ << "Output Control:\n" - << " Color: False\n" - << " Quiet: True\n" - << "Signal Handling:\n" - << " Disable SIGINT: True\n" - << " Disable SIGSEGV: True\n" - << " Disable SIGBUS: True\n" - << " Disable Terminate Signal: True\n" - << "Memory Usage Reporting:\n" - << " Print Memory Each Phase: True\n" - << " Print Memory On Node: '1'\n" - << " Allow Memory Report With ps: True\n" - << "Tracing Configuration:\n" - << " Enabled: False\n" - << "Debug Print Configuration:\n" - << " Level: normal\n" - << " Enable:\n" - << " - gen\n" - << " - term\n" - << " - pool\n" - << " - group\n" - << "Load Balancing:\n" - << " Enabled: False\n" - << " LB Data Output:\n" - << " Enabled: False\n" - << " LB Data Input:\n" - << " Enabled: False\n" - << " LB Statistics:\n" - << " Enabled: False\n" - << "Diagnostics:\n" - << " Enabled: True\n" - << " Enable Print Summary: True\n" - << "Termination:\n" - << " Detect Hangs: True\n" - << " Terse Epoch Graph Output: True\n" - << "Launch:\n" - << " Pause: False\n" - << "User Options:\n" - << " Test bool: True\n" - << " Test int: 45\n" - << " Test string: test_string\n" - << "Scheduler Configuration:\n" - << " Num Progress Times: 3\n" - << "Runtime:\n" - << " Throw on Abort: True\n"; + cfg_file_ << R"( + Output Control: + Color: False + Quiet: True + Signal Handling: + Disable SIGINT: True + Disable SIGSEGV: True + Disable SIGBUS: True + Disable Terminate Signal: True + Memory Usage Reporting: + Print Memory Each Phase: True + Print Memory On Node: '1' + Allow Memory Report With ps: True + Tracing Configuration: + Enabled: False + Debug Print Configuration: + Level: normal + Enable: + - gen + - term + - pool + - group + Load Balancing: + Enabled: False + LB Data Output: + Enabled: False + LB Data Input: + Enabled: False + LB Statistics: + Enabled: False + Diagnostics: + Enabled: True + Enable Print Summary: True + Termination: + Detect Hangs: True + Terse Epoch Graph Output: True + Launch: + Pause: False + User Options: + Test bool: True + Test int: 45 + Test string: test_string + Scheduler Configuration: + Num Progress Times: 3 + Runtime: + Throw on Abort: True + Configuration File: + Enable Output Config: True + File: test_config.yaml + )"; cfg_file_.close(); } @@ -439,11 +444,11 @@ TEST_F(TestInitialization, test_initialize_with_yaml) { EXPECT_EQ(theConfig()->vt_lb_data_dir, "vt_lb_data"); EXPECT_EQ(theConfig()->vt_lb_data_file, "data.%p.json"); EXPECT_EQ(theConfig()->vt_lb_data_in, false); - EXPECT_EQ(theConfig()->vt_lb_data_compress, false); + EXPECT_EQ(theConfig()->vt_lb_data_compress, true); EXPECT_EQ(theConfig()->vt_lb_data_dir_in, "vt_lb_data_in"); EXPECT_EQ(theConfig()->vt_lb_data_file_in, "data.%p.json"); EXPECT_EQ(theConfig()->vt_lb_statistics, false); - EXPECT_EQ(theConfig()->vt_lb_statistics_compress, false); + EXPECT_EQ(theConfig()->vt_lb_statistics_compress, true); EXPECT_EQ(theConfig()->vt_lb_statistics_file, "vt_lb_statistics.%t.json"); EXPECT_EQ(theConfig()->vt_lb_statistics_dir, ""); EXPECT_EQ(theConfig()->vt_lb_self_migration, false); @@ -492,7 +497,7 @@ TEST_F(TestInitialization, test_initialize_with_yaml) { // TEST THAT THE CONFIGURATION FILE WAS WRITTEN OUT CORRECTLY YAML::Node input_config = YAML::LoadFile(config_file); - YAML::Node output_config = theConfig()->convertConfigToYaml(); + YAML::Node output_config = YAML::Load(theConfig()->vt_output_config_yaml); assertYamlNodesHaveIdenticalEntries(input_config, output_config); } @@ -770,4 +775,70 @@ TEST_F(TestInitialization, test_initialize_with_lb_data_and_config_no_lb) { EXPECT_TRUE(theLBDataReader() == nullptr); } +TEST_F(TestInitialization, test_initialize_with_yaml_toml_and_args) { + MPI_Comm comm = MPI_COMM_WORLD; + + // Set command line arguments + static char prog_name[]{"vt_program"}; + static char vt_color[]{"--vt_color"}; + static char vt_no_terminate[]{"--vt_no_terminate"}; + static char vt_lb_name[]{"--vt_lb_name=RotateLB"}; + + std::vector custom_args; + custom_args.emplace_back(prog_name); + custom_args.emplace_back(vt_color); + custom_args.emplace_back(vt_lb_name); + custom_args.emplace_back(vt_no_terminate); + + // Set TOML config file + std::string toml_config_file(getUniqueFilenameWithRanks(".toml")); + std::string toml_config_flag("--vt_input_config="); + std::string vt_input_config_toml = toml_config_flag + toml_config_file; + + custom_args.emplace_back(strdup(vt_input_config_toml.c_str())); + + int this_rank; + MPI_Comm_rank(comm, &this_rank); + + if (this_rank == 0) { + std::ofstream toml_cfg_file_{toml_config_file.c_str(), std::ofstream::out | std::ofstream::trunc}; + toml_cfg_file_ << "vt_lb_name = RandomLB\n" + << "vt_color = False\n" + << "vt_quiet = True"; + toml_cfg_file_.close(); + } + MPI_Barrier(comm); + + // Set YAML config file + std::string yaml_config_file(getUniqueFilenameWithRanks(".yaml")); + std::string yaml_config_flag("--vt_input_config_yaml="); + std::string vt_input_config_yaml = yaml_config_flag + yaml_config_file; + + custom_args.emplace_back(strdup(vt_input_config_yaml.c_str())); + custom_args.emplace_back(nullptr); + + int custom_argc = custom_args.size() - 1; + char** custom_argv = custom_args.data(); + + if (this_rank == 0) { + std::ofstream yaml_cfg_file_{yaml_config_file.c_str(), std::ofstream::out | std::ofstream::trunc}; + yaml_cfg_file_ << R"( + Load Balancing: + Name: NoLB + )"; + yaml_cfg_file_.close(); + } + + MPI_Barrier(comm); + + vt::initialize(custom_argc, custom_argv, &comm); + + // Test that everything was read in correctly + EXPECT_EQ(theConfig()->prog_name, "vt_program"); + + EXPECT_EQ(theConfig()->vt_quiet, true); // Original TOML + EXPECT_EQ(theConfig()->vt_color, true); // CLI overwrote TOML + EXPECT_EQ(theConfig()->vt_lb_name, "NoLB"); // YAML overwrote everything +} + }}} // end namespace vt::tests::unit diff --git a/tests/unit/test_helpers.h b/tests/unit/test_helpers.h index f230bef0ca..88d882a90f 100644 --- a/tests/unit/test_helpers.h +++ b/tests/unit/test_helpers.h @@ -130,16 +130,16 @@ inline void assertYamlNodesHaveIdenticalEntries(const YAML::Node& yaml_1, const else if (yaml_1_val.IsScalar()) { try { EXPECT_EQ(yaml_1_val.as(), yaml_2_val.as()); - } catch(...) { + } catch (const YAML::RepresentationException&) { try { EXPECT_EQ(yaml_1_val.as(), yaml_2_val.as()); - } catch(...) { + } catch (const YAML::RepresentationException&) { EXPECT_EQ(yaml_1_val.as(), yaml_2_val.as()); } } } else { - EXPECT_TRUE(false); + vtAbort("YAML::Node type not recognized (must be Map, Sequence, or Scalar)"); } } }