solver: break board dihedral symmetry

Constrain the unique unit square to a closed D4 fundamental region once its placement is known. This preserves one representative of every board-orientation orbit without assigning identities to repeated squares.

Keep a symmetry-disabled benchmark path, document the proof and measurements, and cover generic, diagonal, midline, corner, and centre orbits.

Tests: Release, Debug, ASan, and UBSan CTest (11 passed each)

Refs: #3
This commit was merged in pull request #25.
This commit is contained in:
Codex instance
2026-07-30 18:18:45 +01:00
parent 74bde266d0
commit f37e08768d
7 changed files with 284 additions and 28 deletions
+19 -2
View File
@@ -79,11 +79,20 @@ def environment(binary):
}
def run_once(binary, order, mode, search_policy, search_route, timeout):
def run_once(
binary, order, mode, search_policy, search_route, symmetry, timeout
):
started = time.monotonic()
try:
process = subprocess.run(
[str(binary), str(order), mode, search_policy, search_route],
[
str(binary),
str(order),
mode,
search_policy,
search_route,
symmetry,
],
check=False,
capture_output=True,
text=True,
@@ -223,6 +232,11 @@ def main():
default="ascending",
)
parser.add_argument("--direct-search", action="store_true")
parser.add_argument(
"--no-symmetry",
action="store_true",
help="disable unique-unit-square D4 symmetry breaking",
)
parser.add_argument(
"--measure-overhead",
action="store_true",
@@ -254,6 +268,7 @@ def main():
mode,
args.search_policy,
"direct" if args.direct_search else "public",
"none" if args.no_symmetry else "d4",
args.timeout,
)
for trial in range(args.repetitions):
@@ -265,6 +280,7 @@ def main():
mode,
args.search_policy,
"direct" if args.direct_search else "public",
"none" if args.no_symmetry else "d4",
args.timeout,
)
)
@@ -293,6 +309,7 @@ def main():
"per_run_timeout_seconds": args.timeout,
"candidate_order": args.search_policy,
"search_route": "direct" if args.direct_search else "public",
"symmetry_breaking": "none" if args.no_symmetry else "d4",
"stdout": "captured; rendered grid suppressed by probe",
},
"cases": cases,