From bcb232b191543dd9e5990c8bcc65a3ada16ad95e Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 11 May 2025 12:03:45 +0200 Subject: [PATCH] more stable rulegen params --- config.cpp | 6 ++- rulegen.cpp | 119 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 80 insertions(+), 45 deletions(-) diff --git a/config.cpp b/config.cpp index 0f8f1033..8c7d72c9 100644 --- a/config.cpp +++ b/config.cpp @@ -1125,9 +1125,11 @@ EX void initConfig() { -> editable("simplified display of apeirogons", 'f') -> help("Connect the ends of the apeirogon segment with the boundary point using straight lines. This should be faster and, in most cases, actually more correct."); param_b(arb::convert::minimize_on_convert, "tes_minimize_on_convert", false) - -> editable("consider all symmetries when converting", 'm'); + -> editable("consider all symmetries when converting", 'm') + -> set_reaction(rulegen::change_minimize_on_convert); param_b(arb::convert::reverse_order, "tes_reverse_order", false) - -> editable("tes reverse order on convert", 'r'); + -> editable("tes reverse order on convert", 'r') + -> set_reaction(rulegen::change_rulegen_params); param_b(display_yasc_codes, "yasc", false) -> editable("YASC codes", 'Y') diff --git a/rulegen.cpp b/rulegen.cpp index 0b4e1387..c5850034 100644 --- a/rulegen.cpp +++ b/rulegen.cpp @@ -2539,16 +2539,25 @@ auto hooks_arg = #endif auto hooks = addHook(hooks_configfile, 100, [] { - param_i(max_retries, "max_retries"); + param_i(max_retries, "max_retries") + ->set_reaction(change_rulegen_params); param_i(max_tcellcount, "max_tcellcount") - ->editable(0, 16000000, 100000, "maximum cellcount", "controls the max memory usage of conversion algorithm -- the algorithm fails if exceeded", 'c'); - param_i(max_adv_steps, "max_adv_steps"); - param_i(max_examine_branch, "max_examine_branch"); - param_i(max_getside, "max_getside"); - param_i(max_bdata, "max_bdata"); - param_i(max_shortcut_length, "max_shortcut_length"); - param_i(rulegen_timeout, "rulegen_timeout"); - param_i(first_restart_on, "first_restart_on"); + ->editable(0, 16000000, 100000, "maximum cellcount", "controls the max memory usage of conversion algorithm -- the algorithm fails if exceeded", 'c') + ->set_reaction(change_rulegen_params); + param_i(max_adv_steps, "max_adv_steps") + ->set_reaction(change_rulegen_params); + param_i(max_examine_branch, "max_examine_branch") + ->set_reaction(change_rulegen_params); + param_i(max_getside, "max_getside") + ->set_reaction(change_rulegen_params); + param_i(max_bdata, "max_bdata") + ->set_reaction(change_rulegen_params); + param_i(max_shortcut_length, "max_shortcut_length") + ->set_reaction(change_rulegen_params); + param_i(rulegen_timeout, "rulegen_timeout") + ->set_reaction(change_rulegen_params); + param_i(first_restart_on, "first_restart_on") + ->set_reaction(change_rulegen_params); #if MAXMDIM >= 4 param_i(max_ignore_level_pre, "max_ignore_level_pre"); param_i(max_ignore_level_post, "max_ignore_level_post"); @@ -2608,6 +2617,41 @@ EX void verify_parsed_treestates(arb::arbi_tiling& c) { find_possible_parents(); } +EX void prepare_rules_and_restart() { + if(!prepare_rules()) return; + println(hlog, "prepare_rules returned true"); + stop_game(); + arb::convert::activate(); + start_game(); + delete_tmap(); + } + +EX void switch_tes_internal_format() { + if(!arb::in()) { + try { + arb::convert::convert(); + arb::convert::activate(); + start_game(); + rule_status = XLAT("converted successfully -- %1 cell types", its(isize(arb::current.shapes))); + rules_known_for = "unknown"; + } + catch(hr_parse_exception& ex) { + println(hlog, "failed: ", ex.s); + rule_status = XLAT("failed to convert: ") + ex.s; + rules_known_for = "unknown"; + } + } + else if(arb::convert::in()) { + stop_game(); + geometry = arb::convert::base_geometry; + variation = arb::convert::base_variation; + start_game(); + } + else { + addMessage(XLAT("cannot be disabled for this tiling")); + } + } + EX void show() { cmode = sm::SIDE | sm::MAYDARK; gamescreen(); @@ -2655,31 +2699,7 @@ EX void show() { } dialog::addBoolItem(XLAT("in tes internal format"), arb::in(), 't'); - dialog::add_action([] { - if(!arb::in()) { - try { - arb::convert::convert(); - arb::convert::activate(); - start_game(); - rule_status = XLAT("converted successfully -- %1 cell types", its(isize(arb::current.shapes))); - rules_known_for = "unknown"; - } - catch(hr_parse_exception& ex) { - println(hlog, "failed: ", ex.s); - rule_status = XLAT("failed to convert: ") + ex.s; - rules_known_for = "unknown"; - } - } - else if(arb::convert::in()) { - stop_game(); - geometry = arb::convert::base_geometry; - variation = arb::convert::base_variation; - start_game(); - } - else { - addMessage(XLAT("cannot be disabled for this tiling")); - } - }); + dialog::add_action(switch_tes_internal_format); dialog::addBoolItem(XLAT("extended football colorability"), arb::extended_football, 'f'); dialog::add_action([] { @@ -2688,6 +2708,8 @@ EX void show() { rule_status = "manually disabled"; if(arb::convert::in()) { stop_game(); + geometry = arb::convert::base_geometry; + variation = arb::convert::base_variation; arb::convert::convert(); arb::convert::activate(); start_game(); @@ -2706,15 +2728,7 @@ EX void show() { add_edit(arb::convert::minimize_on_convert); dialog::addBoolItem(XLAT("strict tree maps"), currentmap->strict_tree_rules(), 's'); dialog::add_action([] { - if(!currentmap->strict_tree_rules()) { - if(prepare_rules()) { - println(hlog, "prepare_rules returned true"); - stop_game(); - arb::convert::activate(); - start_game(); - delete_tmap(); - } - } + if(!currentmap->strict_tree_rules()) prepare_rules_and_restart(); else if(arb::current.have_tree) { addMessage(XLAT("cannot be disabled for this tiling")); } @@ -2738,6 +2752,25 @@ EX void show() { dialog::display(); } +EX void change_rulegen_params() { + bool b = currentmap->strict_tree_rules(); + if(b) { + rulegen::rules_known_for = "unknown"; + prepare_rules_and_restart(); + } + else rulegen::rules_known_for = "unknown"; + } + +EX void change_minimize_on_convert() { + bool s = currentmap->strict_tree_rules(); + if(arb::convert::in()) { + rules_known_for = "unknown"; + switch_tes_internal_format(); + switch_tes_internal_format(); + if(s) prepare_rules_and_restart(); + } + } + #if CAP_COMMANDLINE int readRuleArgs() { using namespace arg;