Commit ccccb4c7 authored by Bednárek David RNDr. Ph.D.'s avatar Bednárek David RNDr. Ph.D.
Browse files

Merge remote-tracking branch 'remotes/origin/build_test'

parents 5c29739a e5b6793b
......@@ -59,3 +59,28 @@ function(MAKE_TARGET TARGET_MACRO_SUFFIX TARGET)
endif()
target_link_libraries(${TARGET} Threads::Threads)
endfunction()
if(NOT DEFINED GOLD_SUFFIX)
if(DEFINED ENV{SLURM_JOB_PARTITION})
string(REGEX REPLACE "-.*" "" MACHINE_NAME $ENV{SLURM_JOB_PARTITION})
set(GOLD_SUFFIX ${MACHINE_NAME} CACHE STRING "Gold file suffix")
message("Using gold time file suffix ${GOLD_SUFFIX}")
else()
set(GOLD_SUFFIX "" CACHE STRING "Gold file suffix")
message("Unregistered machine")
endif()
endif()
function(TARGET_GOLD_SOURCES TARGET PREFIX)
if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
message("Using gold check file ${PREFIX}debug.cpp")
target_sources(${TARGET} PUBLIC "${PREFIX}debug.cpp")
else()
message("Using gold check file ${PREFIX}.cpp")
target_sources(${TARGET} PUBLIC "${PREFIX}.cpp")
if(${GOLD_SUFFIX} MATCHES "[a-zA-Z0-9]+")
message("Using gold time file ${PREFIX}${GOLD_SUFFIX}.cpp")
target_sources(${TARGET} PUBLIC "${PREFIX}${GOLD_SUFFIX}.cpp")
endif()
endif()
endfunction()
......@@ -2,5 +2,8 @@
target_include_directories(${TARGET_MACRO} PUBLIC ".")
target_include_directories(${TARGET_LEVEN} PUBLIC ".")
target_sources(${TARGET_MACRO} PUBLIC "fmwkng.hpp" "macroasgn.hpp" "macroasgn.cpp" "macromain.cpp" "macrogolddebug.cpp" "macrogold.cpp" "macrogoldbig.cpp" "macrogoldsmall.cpp" "macrogoldphi.cpp")
target_sources(${TARGET_LEVEN} PUBLIC "fmwkng.hpp" "levenasgn.hpp" "levenmain.cpp" "levengolddebug.cpp" "levengold.cpp" "levengoldbig.cpp")
target_sources(${TARGET_MACRO} PUBLIC "fmwkng.hpp" "macroasgn.hpp" "macroasgn.cpp" "macromain.cpp")
TARGET_GOLD_SOURCES(${TARGET_MACRO} "macrogold")
target_sources(${TARGET_LEVEN} PUBLIC "fmwkng.hpp" "levenasgn.hpp" "levenmain.cpp")
TARGET_GOLD_SOURCES(${TARGET_LEVEN} "levengold")
......@@ -526,6 +526,8 @@ namespace fmwkng {
~gold_data() noexcept = default;
void insert(gold_pair p);
void append(gold_data b)
{
dm.merge(b.dm);
......@@ -715,71 +717,84 @@ namespace fmwkng {
}
}
inline void print_node_code(std::ostream& os,
inline void print_node_code(std::ostream& osdecl,
std::ostream& osinit,
const reducer_node& rn,
std::size_t depth,
element_relevance er,
std::size_t i,
const std::string opener_prefix = {},
const element_observer_vector& openers = {},
const element_observer_vector& closers = {})
{
if (depth != 0)
{
if (!(*rn.source_range.begin())->reducible())
auto op2 = opener_prefix;
if (!opener_prefix.empty())
op2 += "_";
op2 += std::to_string(i);
osdecl << " static fmwkng::gold_pair gr_" << op2 << "()" << std::endl;
osdecl << " {" << std::endl;
osdecl << " fmwkng::gold_pair rv;" << std::endl;
if (!opener_prefix.empty())
osdecl << " rv.key = gp_" << opener_prefix << "();" << std::endl;
for (auto&& a : rn.reduced_children)
{
if (a->sense() == element_sense::OPEN && a->relevant(er))
{
auto o2 = openers;
auto c2 = closers;
o2.push_back(&**rn.source_range.begin());
c2.push_back(&**(rn.source_range.end() - 1));
for (auto&& a : rn.children)
{
print_node_code(os, a, depth - 1, er, o2, c2);
}
osdecl << " rv.key.push_back(";
a->make_code(osdecl);
osdecl << ");";
osdecl << std::endl;
}
if (a->sense() == element_sense::CLOSE && a->relevant(er))
{
osdecl << " rv.value.push_back(";
a->make_code(osdecl);
osdecl << ");";
osdecl << std::endl;
}
}
else
osdecl << " return rv;" << std::endl;
osdecl << " }" << std::endl;
if (depth > 1)
{
os << " {";
os << std::endl;
os << " {";
os << std::endl;
for (auto&& a : openers)
osdecl << " static fmwkng::impl::element_list gp_" << op2 << "()" << std::endl;
osdecl << " {" << std::endl;
osdecl << " fmwkng::impl::element_list rv";
if (!opener_prefix.empty())
osdecl << " = gp_" << opener_prefix << "()";
osdecl << ";" << std::endl;
auto&& a = *rn.source_range.begin();
if (!a->reducible())
{
if (a->relevant(er))
{
os << " ";
a->make_code(os);
os << ",";
os << std::endl;
}
}
for (auto&& a : rn.reduced_children)
{
if (a->sense() == element_sense::OPEN && a->relevant(er))
{
os << " ";
a->make_code(os);
os << ",";
os << std::endl;
osdecl << " rv.push_back(";
a->make_code(osdecl);
osdecl << ");";
osdecl << std::endl;
}
}
os << " },";
os << std::endl;
os << " {";
os << std::endl;
for (auto&& a : rn.reduced_children)
osdecl << " return rv;" << std::endl;
osdecl << " }" << std::endl;
if (!(*rn.source_range.begin())->reducible())
{
if (a->sense() == element_sense::CLOSE && a->relevant(er))
auto o2 = openers;
auto c2 = closers;
o2.push_back(&**rn.source_range.begin());
c2.push_back(&**(rn.source_range.end() - 1));
std::size_t j = 0;
for (auto&& a : rn.children)
{
os << " ";
a->make_code(os);
os << ",";
os << std::endl;
++j;
print_node_code(osdecl, osinit, a, depth - 1, er, j, op2, o2, c2);
}
}
os << " }";
os << std::endl;
os << " },";
os << std::endl;
}
{
osinit << " rv.insert(gr_" + op2 + "());" << std::endl;
}
}
......@@ -831,17 +846,15 @@ namespace fmwkng {
print_all(gold_data(), el, prefix);
}
inline void print_all_code(std::ostream & os, element_list_view el, element_relevance er)
inline void print_all_code(std::ostream & osdecl, std::ostream& osinit, element_list_view el, element_relevance er)
{
auto root = reduce_list(el);
auto depth = deepest_reducible(root);
for (auto d = depth; d > 0;)
std::size_t i = 0;
for (auto&& a : root)
{
--d;
for (auto&& a : root)
{
print_node_code(os, a, d, er);
}
++i;
print_node_code(osdecl, osinit, a, depth, er, i);
}
}
......@@ -1946,7 +1959,7 @@ namespace fmwkng {
using self_ = root_data_holder< config_t>;
public:
root_data_holder(int argc, char** argv, const gold_data& gd = gold_data{})
: gd_(gd), direct_print_(true)
: gd_(gd), direct_print_(true), threads_(1)
{
std::fill(platform_enablers_.begin(), platform_enablers_.end(), true);
process_arguments(std::vector< std::string>(argv + 1, argv + argc));
......@@ -2005,17 +2018,25 @@ namespace fmwkng {
std::cout << "Generating C++ code into " << code_fn_[i] << std::endl;
std::ofstream os(code_fn_[i]);
std::ostringstream oss1;
std::ostringstream oss2;
print_all_code(oss1, oss2, all_el_, element_relevance(i));
os << "#include \"fmwkng.hpp\"" << std::endl;
os << "#include \"" << config_t::code_header_name() << "\"" << std::endl;
os << "" << std::endl;
os << "namespace " << config_t::code_namespace_name() << " {" << std::endl;
os << oss1.str();
os << " static fmwkng::gold_data gold_results_()" << std::endl;
os << " {" << std::endl;
os << " return fmwkng::gold_data{" << std::endl;
os << " fmwkng::gold_data rv;" << std::endl;
print_all_code(os, all_el_, element_relevance(i));
os << oss2.str();
os << " };" << std::endl;
os << " return rv;" << std::endl;
os << " }" << std::endl;
os << " static fmwkng::gold_holder gh_(gold_master(), gold_results_);" << std::endl;
os << "}" << std::endl;
......@@ -2101,6 +2122,10 @@ namespace fmwkng {
{
return direct_print_;
}
std::size_t preferred_concurrency() const
{
return threads_;
}
private:
std::array<bool, config_t::platforms::size_v> platform_enablers_;
typename config_t::ranges::tuple_t range_configs_;
......@@ -2111,6 +2136,7 @@ namespace fmwkng {
gold_data gd_;
std::string machine_name_;
bool direct_print_;
std::size_t threads_;
void print_elements() const
{
......@@ -2167,6 +2193,24 @@ namespace fmwkng {
}
}
}
{
threads_ = std::thread::hardware_concurrency();
try {
#pragma warning(push)
#pragma warning(disable: 4996)
auto env1 = std::getenv("SLURM_CPUS_ON_NODE");
#pragma warning(pop)
if (env1)
{
auto num1 = std::stoi(env1);
if (num1 >= 1 && num1 <= 256)
threads_ = num1;
}
}
catch (...)
{
}
}
for (auto it = arg.begin(); it != arg.end(); ++it)
{
auto& a = *it;
......@@ -2193,6 +2237,17 @@ namespace fmwkng {
{
machine_name_ = value;
}
else if (name == "threads")
{
try {
auto num1 = std::stoi(std::string(value));
if (num1 >= 1 && num1 <= 256)
threads_ = num1;
}
catch (...)
{
}
}
else if (name == "direct-print")
{
if (value == "1" || value == "true" || value == "on")
......@@ -3807,30 +3862,9 @@ namespace fmwkng {
using my_data = typename my_tuple_t::my_data;
my_tuple_t dt_;
static std::size_t preferred_concurrency()
std::size_t preferred_concurrency() const
{
static std::size_t pc = compute_preferred_concurrency();
return pc;
}
static std::size_t compute_preferred_concurrency()
{
try {
#pragma warning(push)
#pragma warning(disable: 4996)
auto env1 = std::getenv("SLURM_CPUS_ON_NODE");
#pragma warning(pop)
if (env1)
{
auto num1 = std::stoi(env1);
if ( num1 >= 1 && num1 <= 256 )
return num1;
}
}
catch (...)
{
}
return std::thread::hardware_concurrency();
return my_root_pointer()->preferred_concurrency();
}
};
#pragma endregion
......@@ -4119,6 +4153,8 @@ namespace fmwkng {
};
struct gold_pair {
gold_pair()
{}
gold_pair(gold_element_list&& key, gold_element_list&& value)
: key(std::move(key.el)), value(std::move(value.el))
{}
......@@ -4149,6 +4185,12 @@ namespace fmwkng {
return operator=(gold_data(b));
}
inline void gold_data::insert(gold_pair p)
{
auto rv = dm.emplace(std::move(p.key), std::move(p.value));
assert(rv.second);
}
using gold_fnc_ptr = gold_data(*)();
class gold_holder : impl::immovable {
......
......@@ -92,13 +92,13 @@ namespace levenasgn {
data_element get()
{
return ui_(engine_);
return data_element(ui_(engine_));
}
private:
typedef std::mt19937_64 M;
M engine_;
typedef std::uniform_int_distribution< data_element> D;
typedef fmwkng::well_defined_uniform D;
D ui_;
};
......
This diff is collapsed.
This diff is collapsed.
......@@ -2,91 +2,116 @@
#include "levenasgn.hpp"
namespace levenmain {
static fmwkng::gold_data gold_results_()
{
return fmwkng::gold_data{
{
{
std::make_unique<fmwkng::impl::element_t<levenmain::a_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(128,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::element_t<levenmain::b_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(128,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::config_element<levenmain::repeats,fmwkng::impl::element_sense::OPEN>>(64),
},
{
std::make_unique<fmwkng::impl::element_t<levenmain::output,fmwkng::impl::element_sense::CLOSE>>(128U),
}
},
{
{
std::make_unique<fmwkng::impl::element_t<levenmain::a_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(128,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::element_t<levenmain::b_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::config_element<levenmain::repeats,fmwkng::impl::element_sense::OPEN>>(4),
},
{
std::make_unique<fmwkng::impl::element_t<levenmain::output,fmwkng::impl::element_sense::CLOSE>>(1997U),
}
},
{
{
std::make_unique<fmwkng::impl::element_t<levenmain::a_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::element_t<levenmain::b_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(128,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::config_element<levenmain::repeats,fmwkng::impl::element_sense::OPEN>>(4),
},
{
std::make_unique<fmwkng::impl::element_t<levenmain::output,fmwkng::impl::element_sense::CLOSE>>(1995U),
}
},
{
{
std::make_unique<fmwkng::impl::element_t<levenmain::a_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::element_t<levenmain::b_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::config_element<levenmain::repeats,fmwkng::impl::element_sense::OPEN>>(1),
},
{
std::make_unique<fmwkng::impl::element_t<levenmain::output,fmwkng::impl::element_sense::CLOSE>>(2024U),
}
},
{
{
std::make_unique<fmwkng::impl::element_t<levenmain::a_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(128,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::config_element<levenmain::b_size,fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128,2048,16)),
std::make_unique<fmwkng::impl::config_element<levenmain::repeats,fmwkng::impl::element_sense::OPEN>>(64),
},
{
std::make_unique<fmwkng::impl::element_t<levenmain::output,fmwkng::impl::element_sense::CLOSE>>(128U),
}
},
{
{
std::make_unique<fmwkng::impl::element_t<levenmain::a_size,fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048,fmwkng::logarithmic(128,2048,16))),
std::make_unique<fmwkng::impl::config_element<levenmain::b_size,fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128,2048,16)),
std::make_unique<fmwkng::impl::config_element<levenmain::repeats,fmwkng::impl::element_sense::OPEN>>(4),
},
{
std::make_unique<fmwkng::impl::element_t<levenmain::output,fmwkng::impl::element_sense::CLOSE>>(1995U),
}
},
{
{
std::make_unique<fmwkng::impl::config_element<levenmain::a_size,fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128,2048,16)),
std::make_unique<fmwkng::impl::config_element<levenmain::b_size,fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128,2048,16)),
std::make_unique<fmwkng::impl::config_element<levenmain::repeats,fmwkng::impl::element_sense::OPEN>>(64),
},
{
std::make_unique<fmwkng::impl::element_t<levenmain::output,fmwkng::impl::element_sense::CLOSE>>(128U),
}
},
{
{
std::make_unique<fmwkng::impl::config_element<fmwkng::all_platforms_tag,fmwkng::impl::element_sense::OPEN>>(std::monostate()),
std::make_unique<fmwkng::impl::config_element<levenmain::a_size,fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128,2048,16)),
std::make_unique<fmwkng::impl::config_element<levenmain::b_size,fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128,2048,16)),
std::make_unique<fmwkng::impl::config_element<levenmain::repeats,fmwkng::impl::element_sense::OPEN>>(64),
},
{
std::make_unique<fmwkng::impl::element_t<levenmain::output,fmwkng::impl::element_sense::CLOSE>>(128U),
}
},
};
}
static fmwkng::gold_holder gh_(gold_master(), gold_results_);
static fmwkng::gold_pair gr_1()
{
fmwkng::gold_pair rv;
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<fmwkng::all_platforms_tag, fmwkng::impl::element_sense::OPEN>>(std::monostate()));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::a_size, fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128, 2048, 16)));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::b_size, fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128, 2048, 16)));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::repeats, fmwkng::impl::element_sense::OPEN>>(64));
rv.value.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::output, fmwkng::impl::element_sense::CLOSE>>(128U));
return rv;
}
static fmwkng::impl::element_list gp_1()
{
fmwkng::impl::element_list rv;
return rv;
}
static fmwkng::gold_pair gr_1_1()
{
fmwkng::gold_pair rv;
rv.key = gp_1();
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::a_size, fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128, 2048, 16)));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::b_size, fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128, 2048, 16)));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::repeats, fmwkng::impl::element_sense::OPEN>>(64));
rv.value.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::output, fmwkng::impl::element_sense::CLOSE>>(128U));
return rv;
}
static fmwkng::impl::element_list gp_1_1()
{
fmwkng::impl::element_list rv = gp_1();
return rv;
}
static fmwkng::gold_pair gr_1_1_1()
{
fmwkng::gold_pair rv;
rv.key = gp_1_1();
rv.key.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::a_size, fmwkng::impl::element_sense::OPEN>>(std::make_pair(128, fmwkng::logarithmic(128, 2048, 16))));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::b_size, fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128, 2048, 16)));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::repeats, fmwkng::impl::element_sense::OPEN>>(64));
rv.value.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::output, fmwkng::impl::element_sense::CLOSE>>(128U));
return rv;
}
static fmwkng::impl::element_list gp_1_1_1()
{
fmwkng::impl::element_list rv = gp_1_1();
rv.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::a_size, fmwkng::impl::element_sense::OPEN>>(std::make_pair(128, fmwkng::logarithmic(128, 2048, 16))));
return rv;
}
static fmwkng::gold_pair gr_1_1_1_1()
{
fmwkng::gold_pair rv;
rv.key = gp_1_1_1();
rv.key.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::b_size, fmwkng::impl::element_sense::OPEN>>(std::make_pair(128, fmwkng::logarithmic(128, 2048, 16))));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::repeats, fmwkng::impl::element_sense::OPEN>>(64));
rv.value.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::output, fmwkng::impl::element_sense::CLOSE>>(128U));
return rv;
}
static fmwkng::gold_pair gr_1_1_1_2()
{
fmwkng::gold_pair rv;
rv.key = gp_1_1_1();
rv.key.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::b_size, fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048, fmwkng::logarithmic(128, 2048, 16))));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::repeats, fmwkng::impl::element_sense::OPEN>>(4));
rv.value.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::output, fmwkng::impl::element_sense::CLOSE>>(1997U));
return rv;
}
static fmwkng::gold_pair gr_1_1_2()
{
fmwkng::gold_pair rv;
rv.key = gp_1_1();
rv.key.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::a_size, fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048, fmwkng::logarithmic(128, 2048, 16))));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::b_size, fmwkng::impl::element_sense::OPEN>>(fmwkng::logarithmic(128, 2048, 16)));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::repeats, fmwkng::impl::element_sense::OPEN>>(4));
rv.value.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::output, fmwkng::impl::element_sense::CLOSE>>(1995U));
return rv;
}
static fmwkng::impl::element_list gp_1_1_2()
{
fmwkng::impl::element_list rv = gp_1_1();
rv.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::a_size, fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048, fmwkng::logarithmic(128, 2048, 16))));
return rv;
}
static fmwkng::gold_pair gr_1_1_2_1()
{
fmwkng::gold_pair rv;
rv.key = gp_1_1_2();
rv.key.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::b_size, fmwkng::impl::element_sense::OPEN>>(std::make_pair(128, fmwkng::logarithmic(128, 2048, 16))));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::repeats, fmwkng::impl::element_sense::OPEN>>(4));
rv.value.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::output, fmwkng::impl::element_sense::CLOSE>>(1995U));
return rv;
}
static fmwkng::gold_pair gr_1_1_2_2()
{
fmwkng::gold_pair rv;
rv.key = gp_1_1_2();
rv.key.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::b_size, fmwkng::impl::element_sense::OPEN>>(std::make_pair(2048, fmwkng::logarithmic(128, 2048, 16))));
rv.key.push_back(std::make_unique<fmwkng::impl::config_element<levenmain::repeats, fmwkng::impl::element_sense::OPEN>>(1));
rv.value.push_back(std::make_unique<fmwkng::impl::element_t<levenmain::output, fmwkng::impl::element_sense::CLOSE>>(2024U));
return rv;
}
static fmwkng::gold_data gold_results_()
{
fmwkng::gold_data rv;
rv.insert(gr_1_1_1_1());
rv.insert(gr_1_1_1_2());
rv.insert(gr_1_1_1());
rv.insert(gr_1_1_2_1());
rv.insert(gr_1_1_2_2());
rv.insert(gr_1_1_2());
rv.insert(gr_1_1());
rv.insert(gr_1());
return rv;
}
static fmwkng::gold_holder gh_(gold_master(), gold_results_);
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.