From b70303415e75d0a0025186c6b1ad8a0bf5fde7de Mon Sep 17 00:00:00 2001 From: Adam Wildavsky Date: Mon, 14 Sep 2026 16:26:23 +0200 Subject: [PATCH 1/4] Prefer American spelling in prose, docs, and comments. Leave legacy Analyse* API identifiers and matching filenames unchanged. Co-authored-by: Cursor --- CPPVARIABLES.bzl | 2 +- ChangeLog | 2 +- SECURITY.md | 4 ++-- benchmarks/README.md | 2 +- benchmarks/dds_replay_main.cpp | 2 +- doc/dll-description.html | 4 ++-- doc/dll-description.md | 4 ++-- doc/heuristic-sorting.md | 2 +- docs/dotnet_interface.md | 6 +++--- docs/release_notes/release_v3_1_0.md | 6 +++--- jni/BUILD.bazel | 2 +- jni/java/org/dds/ffm/DdsStatus.java | 2 +- library/src/calc_tables.cpp | 4 ++-- library/src/dds.cpp | 2 +- library/src/par_validate.hpp | 2 +- library/src/solver_context/solver_context.cpp | 2 +- library/src/trans_table/trans_table_p.cpp | 2 +- library/src/trans_table/trans_table_p.hpp | 2 +- library/tests/deal_input_validation_test.cpp | 6 +++--- library/tests/fuzz/findings/README.md | 8 ++++---- library/tests/heuristic_sorting/dispatch_findex_test.cpp | 2 +- library/tests/solve_board/analyse_play_consistency.cpp | 2 +- library/tests/system/configure_tt_api_test.cpp | 4 ++-- library/tests/system/max_threads_equivalence_test.cpp | 2 +- library/tests/trans_table/trans_table_p_test.cpp | 2 +- python/src/bindings.cpp | 4 ++-- python/tests/ci_windows_cppopts_test.py | 4 ++-- specs/_template.md | 4 ++-- specs/ab-stats.md | 2 +- specs/build-system.md | 4 ++-- specs/constants-and-debug.md | 4 ++-- specs/dds-public-api.md | 4 ++-- specs/dotnet-binding.md | 6 +++--- specs/examples-cli.md | 4 ++-- specs/heuristic-sorting.md | 4 ++-- specs/jni-ffm-binding.md | 2 +- specs/lookup-tables.md | 2 +- specs/move-generation.md | 8 ++++---- specs/python-binding.md | 8 ++++---- specs/solver-context.md | 8 ++++---- specs/system-concurrency.md | 4 ++-- specs/transposition-table.md | 4 ++-- specs/wasm-emscripten.md | 2 +- specs/web.md | 2 +- 44 files changed, 79 insertions(+), 79 deletions(-) diff --git a/CPPVARIABLES.bzl b/CPPVARIABLES.bzl index 70c033d26..365b6f6fb 100644 --- a/CPPVARIABLES.bzl +++ b/CPPVARIABLES.bzl @@ -37,7 +37,7 @@ DDS_CPPOPTS = select({ "-Wno-character-conversion", "-Werror", ], - # Optimisation (/O2, /Od) and language standard (/std) come from Bazel's + # Optimization (/O2, /Od) and language standard (/std) come from Bazel's # compilation_mode and the patched MSVC default_cpp_std (/std:c++20). # Restating them here overrides the toolchain and triggers MSVC D9025. # /utf-8 must stay in these arms, not a global --cxxopt: wasm-transition diff --git a/ChangeLog b/ChangeLog index c518c3ff6..3e78b1c59 100644 --- a/ChangeLog +++ b/ChangeLog @@ -618,7 +618,7 @@ The fault has not however yet showed up as far as I know. A survival mechanism has been added to handle the situation if the transposition table becomess full: The transposition table is emptied. -Before this, a full transposition table would in practise lock up +Before this, a full transposition table would in practice lock up the program. Therefore the present size of the transposition table is quite large (393 MB) to handle the most difficult deals. diff --git a/SECURITY.md b/SECURITY.md index 9617886ad..dfe020683 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,6 +1,6 @@ # Security Policy -## What DDS is, for threat-modelling purposes +## What DDS is, for threat-modeling purposes DDS is an **in-process library**, not a service. It opens no sockets and crosses no privilege boundary. In the normal deployment the input is a bridge @@ -71,7 +71,7 @@ is uneven across entry points: array must actually hold that many deals — so a caller exposing these two to untrusted input must bound the count itself, both against a hostile value and against memory exhaustion. -- `convert_from_pbn()` silently ignores characters it does not recognise +- `convert_from_pbn()` silently ignores characters it does not recognize rather than rejecting the string, so a PBN deal with an invalid rank parses one card short. The resulting deal is now rejected downstream, but the error code says `RETURN_CARD_COUNT` rather than `RETURN_PBN_FAULT`. diff --git a/benchmarks/README.md b/benchmarks/README.md index 696399ef1..c53f3e970 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -42,7 +42,7 @@ bazel run -c opt //benchmarks:dds_replay -- /path/to/recording.jsonl Useful options: ```sh ---list summarise the recording without running DDS +--list summarize the recording without running DDS --threads N worker threads; repeat the flag to sweep several --repeat N run N times and report the best --purpose play only one kind of call (bid/lead/play/claimcheck/par) diff --git a/benchmarks/dds_replay_main.cpp b/benchmarks/dds_replay_main.cpp index e2c766682..e9684295c 100644 --- a/benchmarks/dds_replay_main.cpp +++ b/benchmarks/dds_replay_main.cpp @@ -75,7 +75,7 @@ auto usage() -> int " --no-par skip par calculations\n" " --no-verify do not compare results against the recording\n" " --tricks also break the report down by trick number\n" - " --list summarise the recording and exit\n"); + " --list summarize the recording and exit\n"); return 2; } diff --git a/doc/dll-description.html b/doc/dll-description.html index 2348dcf45..d9bb51b00 100644 --- a/doc/dll-description.html +++ b/doc/dll-description.html @@ -36,7 +36,7 @@

The PAR Calculation Functions

The functions SidesParBin and DealerParBin provide binary output of the par results, making it easy to tailor-make the output text format. Two such functions, ConvertToSidesTextFormat and ConvertToDealerTextFormat, are included as examples.

It is possible as an option to perform par calculation in CalcAllTables and CalcAllTablesPBN.

The par calculation is executed using a single thread. But the calculation is very fast and its duration is negligible compared to the double dummy calculation duration.

-

Double Dummy Value Analyser Functions

+

Double Dummy Value Analyzer Functions

The functions AnalysePlayBin, AnalysePlayPBN, AnalyseAllPlaysBin and AnalyseAllPlaysPBN take the played cards in a game or games and calculate and present their double dummy values.

@@ -1126,7 +1126,7 @@

Functions

DDS first detects the number of cores and the available memory. If this doesn't work for some reason, it defaults to 1 thread which is allowed to use the maximum memory size per thread.

DDS then checks whether a number of threads equal to the number of cores will fit within the available memory when each thread may use the maximum memory per thread. If there is not enough memory for this, DDS scales back its ambition. If there is enough memory for the preferred memory size, then DDS still creates a number of threads equal to the number of cores. If there is not even enough memory for this, DDS scales back the number of threads to fit within the memory.

SetMaxThreads no longer influences the thread count: its argument is ignored and internal, global batch threading was removed. To cap workers, pass an explicit maxThreads to the *N or *X entry points, or manage concurrency in the calling application (typically one SolverContext per thread). DDS will otherwise select a suitable number of threads on its own.

-

Calling SetMaxThreads() is harmless but has no effect beyond initialisation; InitializeStaticMemory() is the non-deprecated spelling.

+

Calling SetMaxThreads() is harmless but has no effect beyond initialization; InitializeStaticMemory() is the non-deprecated spelling.

SetMaxThreads can be called multiple times, but it cannot change the number of threads: use the per-call maxThreads argument instead.

It is possible to ask DDS to give up its dynamically allocated memory by calling FreeMemory. This could be useful for instance if there is a long pause where DDS is not used within a session. DDS will free its memory when the DLL detaches from the user program, so there is no need for the user to call this function before detaching.

diff --git a/doc/dll-description.md b/doc/dll-description.md index 50f8e70dd..5973b75f4 100644 --- a/doc/dll-description.md +++ b/doc/dll-description.md @@ -47,7 +47,7 @@ It is possible as an option to perform par calculation in `CalcAllTables` and `C The par calculation is executed using a single thread. But the calculation is very fast and its duration is negligible compared to the double dummy calculation duration. -### Double Dummy Value Analyser Functions +### Double Dummy Value Analyzer Functions The functions `AnalysePlayBin`, `AnalysePlayPBN`, `AnalyseAllPlaysBin` and `AnalyseAllPlaysPBN` take the played cards in a game or games and calculate and present their double dummy values. @@ -1212,7 +1212,7 @@ DDS then checks whether a number of threads equal to the number of cores will fi SetMaxThreads no longer influences the thread count: its argument is ignored and internal batch threading was removed. To cap workers, pass an explicit maxThreads to the *N or *X entry points, or manage concurrency in the calling application (typically one SolverContext per thread). DDS will otherwise select a suitable number of threads on its own. -Calling SetMaxThreads() is harmless but has no effect beyond initialisation; InitializeStaticMemory() is the non-deprecated spelling. +Calling SetMaxThreads() is harmless but has no effect beyond initialization; InitializeStaticMemory() is the non-deprecated spelling. SetMaxThreads can be called multiple times, but it cannot change the number of threads: use the per-call maxThreads argument instead. diff --git a/doc/heuristic-sorting.md b/doc/heuristic-sorting.md index 44ade1ef0..f058bbc3d 100644 --- a/doc/heuristic-sorting.md +++ b/doc/heuristic-sorting.md @@ -39,7 +39,7 @@ LHO is void and LHO has trump card(s), or RHO is void and RHO has trump card(s). If RHO has either the highest rank of the suit played by hand-to-play or the next highest rank, then there is a suitBonus change of –18. -If it is a trump contract, the suit is not trump, the own hand has a singleton, the own hand has at least one trump, partner has the highest rank in the suit and at least a suit length of 2, then there is a suitBonus change of +16. Suits are thus favoured where the opponents have as few move alternatives as possible. +If it is a trump contract, the suit is not trump, the own hand has a singleton, the own hand has at least one trump, partner has the highest rank in the suit and at least a suit length of 2, then there is a suitBonus change of +16. Suits are thus favored where the opponents have as few move alternatives as possible. countLH = (suit length of LHO) * 4, if LHO is not void in the suit, countLH = (depth + 4), if LHO is void in the suit diff --git a/docs/dotnet_interface.md b/docs/dotnet_interface.md index c2b768466..08f78614b 100644 --- a/docs/dotnet_interface.md +++ b/docs/dotnet_interface.md @@ -211,7 +211,7 @@ var ctx = new SolverContext(new SolverConfig { ... }); ### Configuration & Resources - **SetMaxThreads(int userThreads)** - Deprecated, and a no-op beyond initialisation: `userThreads` is ignored and + Deprecated, and a no-op beyond initialization: `userThreads` is ignored and the internal batch threading it once configured has been removed. It is an alias of `InitializeStaticMemory()`. Worker counts are chosen per call by the `maxThreads` argument of the `*N` and `*X` entry points, or by the embedding @@ -286,8 +286,8 @@ and should be used with caution, as they may not manage resources as efficiently ### Configuration & Resources - **SetMaxThreads(int userThreads)** - Deprecated, and a no-op beyond initialisation: `userThreads` is ignored, not - honoured as a thread limit. The modern API manages threading via + Deprecated, and a no-op beyond initialization: `userThreads` is ignored, not + honored as a thread limit. The modern API manages threading via `SolverContext`, and the `*N`/`*X` entry points take a per-call `maxThreads`. - **SetThreading(int code)** diff --git a/docs/release_notes/release_v3_1_0.md b/docs/release_notes/release_v3_1_0.md index 96b5e455d..abac5463f 100644 --- a/docs/release_notes/release_v3_1_0.md +++ b/docs/release_notes/release_v3_1_0.md @@ -81,11 +81,11 @@ TOTAL calc 9.35 123.59 8.42 ### Correctness fixes -- **`AnalysePlay` under-counted tricks** (#156): each card was analysed against +- **`AnalysePlay` under-counted tricks** (#156): each card was analyzed against a cold transposition table, so the hint-bounded search settled on the wrong bound. The play path now reuses the caller's context, matching `SolveBoard`. - **Move ordering and pruning corruption** from signed→unsigned casts (see - above) — search behaviour only, but it cost significant time. + above) — search behavior only, but it cost significant time. - **Heap-use-after-free in `clear_tt`** and a null dereference in `TransTableS::reset_memory` after memory release. - **Par output now names the declaring seat** when successive par contracts @@ -102,7 +102,7 @@ entry points, so callers can size or opt out of the library's parallelism: `CalcAllTablesX`, `CalcAllTablesPBNX`, `SolveAllBoardsN`, `SolveAllBoardsBinN`, `SolveAllBoardsSeq`, `SolveAllBoardsBinSeq`. -`SetMaxThreads` is deprecated in favour of `InitializeStaticMemory`; the old +`SetMaxThreads` is deprecated in favor of `InitializeStaticMemory`; the old name still works and no longer influences batch parallelism. ### Platforms and build diff --git a/jni/BUILD.bazel b/jni/BUILD.bazel index 4ed24980d..aff60e252 100644 --- a/jni/BUILD.bazel +++ b/jni/BUILD.bazel @@ -96,7 +96,7 @@ java_library( # Stage the host shared library under native/-/ for jar embedding. # copy_file outputs are not configurable, so there is one per os+arch triplet -# gated by target_compatible_with; only the host's is analysed, and its output +# gated by target_compatible_with; only the host's is analyzed, and its output # path's arch matches what Dds.loadEmbedded() looks up at runtime. copy_file is # shell-free, so no cp/copy toolchain assumption on any host (incl. Windows). # Host platform only (Phase 1) — a multi-arch fat jar is a separate follow-up. diff --git a/jni/java/org/dds/ffm/DdsStatus.java b/jni/java/org/dds/ffm/DdsStatus.java index 2b5f70340..f4c3a2135 100644 --- a/jni/java/org/dds/ffm/DdsStatus.java +++ b/jni/java/org/dds/ffm/DdsStatus.java @@ -81,7 +81,7 @@ private DdsStatus() { /** * Symbolic name of a status code (e.g. {@code "RETURN_TRUMP_WRONG"}), or - * {@code "RETURN()"} for an unrecognised value. Handy for assertion + * {@code "RETURN()"} for an unrecognized value. Handy for assertion * and log messages. */ public static String name(int code) { diff --git a/library/src/calc_tables.cpp b/library/src/calc_tables.cpp index 6a5be2cdc..67baaa02f 100644 --- a/library/src/calc_tables.cpp +++ b/library/src/calc_tables.cpp @@ -364,7 +364,7 @@ int STDCALL CalcAllTablesN( int ind = 0; resp->no_of_boards = 0; - // With no deals the loop below writes no boards, and bo is an uninitialised + // With no deals the loop below writes no boards, and bo is an uninitialized // local -- solving a board from it reads indeterminate values. Return early, // matching CalcAllTablesX(). if (dealsp->no_of_tables == 0) @@ -398,7 +398,7 @@ int STDCALL CalcAllTablesN( } // ind counts the boards actually written; deriving the count from a - // last-index variable initialised to 0 claimed one board even when none + // last-index variable initialized to 0 claimed one board even when none // had been filled in. bo.no_of_boards = ind; diff --git a/library/src/dds.cpp b/library/src/dds.cpp index 64991270e..f9049d4f9 100644 --- a/library/src/dds.cpp +++ b/library/src/dds.cpp @@ -80,7 +80,7 @@ void DDSFinalize(void) * @brief Library constructor/destructor for Apple platforms. * * Register DDSInitialize/DDSFinalize so the library's static memory is set - * up automatically when the library is loaded, matching the behaviour of the + * up automatically when the library is loaded, matching the behavior of the * Windows (DllMain) and USES_CONSTRUCTOR paths. This frees callers from having * to call InitializeStaticMemory() themselves. */ diff --git a/library/src/par_validate.hpp b/library/src/par_validate.hpp index fd1c58468..1c11bc9c7 100644 --- a/library/src/par_validate.hpp +++ b/library/src/par_validate.hpp @@ -20,7 +20,7 @@ * values and formats them into fixed-size character buffers, so an entry far * outside the legal range overflows those buffers. CalcDDtable() always * produces legal tables, but the par entry points are exported and a caller - * may hand-build or deserialise a table, so the range is checked here rather + * may hand-build or deserialize a table, so the range is checked here rather * than assumed. * * @param tablep Table to validate. May be nullptr. diff --git a/library/src/solver_context/solver_context.cpp b/library/src/solver_context/solver_context.cpp index bca8662d8..893e0fc5f 100644 --- a/library/src/solver_context/solver_context.cpp +++ b/library/src/solver_context/solver_context.cpp @@ -254,7 +254,7 @@ auto SolverContext::clear_tt() const -> void // memory (ASan: heap-use-after-free in TransTable{L,S}::lookup). // // Disposing instead makes the documented "recreates lazily on demand" - // behaviour real: tt_ becomes null, so the next trans_table() rebuilds from + // behavior real: tt_ becomes null, so the next trans_table() rebuilds from // the owner's config. Nothing is lost, because the kind and memory limits // live in SolverContext::cfg_, not in the TT instance. dispose_trans_table(); diff --git a/library/src/trans_table/trans_table_p.cpp b/library/src/trans_table/trans_table_p.cpp index cb5903354..ddff03e8a 100644 --- a/library/src/trans_table/trans_table_p.cpp +++ b/library/src/trans_table/trans_table_p.cpp @@ -30,7 +30,7 @@ Experiments with a subsumption tree (storing more specific patterns beneath more general ones, as bridge-solver does) trimmed the number of patterns visited per lookup by about 15% but made every visit slower, - since skipping a subtree needs its size, a dependent load that serialises + since skipping a subtree needs its size, a dependent load that serializes the scan. The flat array was faster on every workload tried. */ diff --git a/library/src/trans_table/trans_table_p.hpp b/library/src/trans_table/trans_table_p.hpp index c5c9caeb8..aa226c7fc 100644 --- a/library/src/trans_table/trans_table_p.hpp +++ b/library/src/trans_table/trans_table_p.hpp @@ -17,7 +17,7 @@ #include -/// \brief Transposition table organised as shape → relative-rank patterns. +/// \brief Transposition table organized as shape → relative-rank patterns. /// /// This implementation follows the "shape → pattern" cache of macroxue's /// bridge-solver. A position is keyed by its suit-length shape (plus trick diff --git a/library/tests/deal_input_validation_test.cpp b/library/tests/deal_input_validation_test.cpp index 0cf0703ad..2ffaabf2a 100644 --- a/library/tests/deal_input_validation_test.cpp +++ b/library/tests/deal_input_validation_test.cpp @@ -38,7 +38,7 @@ constexpr char kShortOneCard[] = "N:QJ6.K652.J85.T8 873.J97.AT764.Q4 K5.T83.KQ9.A7652 AT942.AQ4.32.KJ3"; /// The same deal with a card replaced by an invalid rank. convert_from_pbn() -/// silently skips unrecognised characters, so this also arrives one card short. +/// silently skips unrecognized characters, so this also arrives one card short. constexpr char kBadRank[] = "N:QJ6.K652.J85.TZ8 873.J97.AT764.Q4 K5.T83.KQ9.A7652 AT942.AQ4.32.KJ3"; @@ -261,8 +261,8 @@ TEST(CalcTableValidation, CalcAllTablesRejectsNegativeTableCount) TEST(CalcTableValidation, CalcAllTablesWithZeroDealsSolvesNothing) { // With no deals the board-building loop writes nothing, but the board count - // was derived from a last-index variable initialised to 0 and so claimed - // one board -- solving an uninitialised entry of a stack-local Boards. + // was derived from a last-index variable initialized to 0 and so claimed + // one board -- solving an uninitialized entry of a stack-local Boards. // MemorySanitizer reports it; found by the calc_all_tables fuzz harness. DdTableDeals deals; std::memset(&deals, 0, sizeof(deals)); diff --git a/library/tests/fuzz/findings/README.md b/library/tests/fuzz/findings/README.md index f18790e64..5baee6ead 100644 --- a/library/tests/fuzz/findings/README.md +++ b/library/tests/fuzz/findings/README.md @@ -102,19 +102,19 @@ validation logic itself. Fixed by range-checking `currentTrickSuit[k]` inside that loop, where it is actually used as a subscript, rather than in `board_range_checks()` — this rejects only inputs that would genuinely have been read out of bounds, and -leaves callers that pass an uninitialised suit alongside a zero rank working +leaves callers that pass an uninitialized suit alongside a zero rank working as before whenever the value is never used. Seed: `corpus/solve_board/regression_unchecked_trick_suit.bin`. Tests: `library/tests/deal_input_validation_test.cpp` (`DumpInputSafety`). -### 05 — `CalcAllTablesN()` solved an uninitialised board when given no deals +### 05 — `CalcAllTablesN()` solved an uninitialized board when given no deals Found by the `calc_all_tables` harness on its first CI run, under MemorySanitizer (`zero_tables.bin`). -`Boards bo;` is an uninitialised stack local. The board count was derived from -a `lastIndex` variable initialised to 0 and only assigned inside the +`Boards bo;` is an uninitialized stack local. The board count was derived from +a `lastIndex` variable initialized to 0 and only assigned inside the board-building loop, so `bo.no_of_boards = lastIndex + 1` claimed **one** board even when `no_of_tables == 0` and the loop had written none. `calc_all_boards_n()` then solved `bo.deals[0]`, `bo.target[0]`, diff --git a/library/tests/heuristic_sorting/dispatch_findex_test.cpp b/library/tests/heuristic_sorting/dispatch_findex_test.cpp index 94bebc010..93e34ad2d 100644 --- a/library/tests/heuristic_sorting/dispatch_findex_test.cpp +++ b/library/tests/heuristic_sorting/dispatch_findex_test.cpp @@ -1,6 +1,6 @@ /** * @file dispatch_findex_test.cpp - * @brief Behaviour of WeightCase-based heuristic dispatch. + * @brief Behavior of WeightCase-based heuristic dispatch. * * Move generation always passes a precomputed WeightCase. This file covers the * dispatcher's fallback when an unrecognized case reaches call_heuristic. diff --git a/library/tests/solve_board/analyse_play_consistency.cpp b/library/tests/solve_board/analyse_play_consistency.cpp index bb7a37ace..14d5f22b6 100644 --- a/library/tests/solve_board/analyse_play_consistency.cpp +++ b/library/tests/solve_board/analyse_play_consistency.cpp @@ -121,7 +121,7 @@ auto solve_max(int trump, int leader, const std::vector& cur, } // Core check: AnalysePlayPBN's per-card trick count must match an independent -// SolveBoardPBN of the reconstructed position at every analysed ply. +// SolveBoardPBN of the reconstructed position at every analyzed ply. auto check_self_consistency(const Hands& hands, int trump, int opening_leader, const std::vector& play) -> void { diff --git a/library/tests/system/configure_tt_api_test.cpp b/library/tests/system/configure_tt_api_test.cpp index 94185cffa..4a36751ef 100644 --- a/library/tests/system/configure_tt_api_test.cpp +++ b/library/tests/system/configure_tt_api_test.cpp @@ -175,7 +175,7 @@ auto solve_known_deal(SolverContext& ctx, FutureTricks& fut) -> int } /// A table recreated between two solves of the same deal has not seen that -/// deal; the next solve must initialise it again rather than run against an +/// deal; the next solve must initialize it again rather than run against an /// inert (never init()-ed) cache. TEST(ConfigureTtApiTest, ATableRecreatedBetweenSolvesOfTheSameDealIsInitialisedAgain) { @@ -305,7 +305,7 @@ TEST(ConfigureTtApiTest, ConfigureTtComparesTheEnvironmentResolvedKind) TEST(ConfigureTtApiTest, SwitchKindRecreatesTable) { - // Default context, isolated from any ambient override (override behaviour + // Default context, isolated from any ambient override (override behavior // is covered by the Environment* tests). ScopedEnv no_override("DDS_TT_KIND", nullptr); SolverContext ctx; diff --git a/library/tests/system/max_threads_equivalence_test.cpp b/library/tests/system/max_threads_equivalence_test.cpp index d2adae8af..bee356caf 100644 --- a/library/tests/system/max_threads_equivalence_test.cpp +++ b/library/tests/system/max_threads_equivalence_test.cpp @@ -1,5 +1,5 @@ /// @file max_threads_equivalence_test.cpp -/// @brief Tests that the *N batch APIs honour maxThreads and stay equivalent to +/// @brief Tests that the *N batch APIs honor maxThreads and stay equivalent to /// the auto path, plus that the rename/alias both initialize the library. #include diff --git a/library/tests/trans_table/trans_table_p_test.cpp b/library/tests/trans_table/trans_table_p_test.cpp index 06f029d38..ed978d782 100644 --- a/library/tests/trans_table/trans_table_p_test.cpp +++ b/library/tests/trans_table/trans_table_p_test.cpp @@ -361,7 +361,7 @@ TEST_F(TransTablePTest, DifferentHandTricksOrShapeDoNotMatch) } // --------------------------------------------------------------------------- -// Relative-rank pattern generalisation +// Relative-rank pattern generalization // --------------------------------------------------------------------------- TEST_F(TransTablePTest, PositionDifferingOnlyInIrrelevantCardsHits) diff --git a/python/src/bindings.cpp b/python/src/bindings.cpp index c009c854a..096016433 100644 --- a/python/src/bindings.cpp +++ b/python/src/bindings.cpp @@ -711,7 +711,7 @@ auto register_analysis_bindings(py::module_& module) -> void py::arg("current_trick_suit") = py::make_tuple(0, 0, 0), py::arg("current_trick_rank") = py::make_tuple(0, 0, 0), py::arg("thread_index") = 0, - "Analyse a played deal: double-dummy trick count after each card played.\n\n" + "Analyze a played deal: double-dummy trick count after each card played.\n\n" "Wraps the DDS AnalysePlayPBN C API.\n\n" "Args:\n" " remain_cards (str): Full deal in PBN format before any card of 'play'.\n" @@ -792,7 +792,7 @@ auto register_analysis_bindings(py::module_& module) -> void return results; }, py::arg("deals"), - "Analyse multiple played deals in one batched call.\n\n" + "Analyze multiple played deals in one batched call.\n\n" "Wraps the DDS AnalyseAllPlaysPBN C API. Note: this batch entry point\n" "currently solves the deals sequentially (one board at a time).\n\n" "Args:\n" diff --git a/python/tests/ci_windows_cppopts_test.py b/python/tests/ci_windows_cppopts_test.py index 5e33da681..8e4560a08 100644 --- a/python/tests/ci_windows_cppopts_test.py +++ b/python/tests/ci_windows_cppopts_test.py @@ -42,7 +42,7 @@ def _debug_windows_cppopts_block(cppvariables: str) -> str: return match.group(1) -# MSVC optimisation-level flags that fight Bazel's compilation_mode (/Od vs /O2 +# MSVC optimization-level flags that fight Bazel's compilation_mode (/Od vs /O2 # D9025). Broader than /Od|/O2 so /O1, /Ox, etc. cannot sneak back in. _MSVC_OPT_LEVEL_COPT = re.compile(r'"/O[0-9a-zA-Z]') @@ -88,7 +88,7 @@ def test_msvc_opt_level_copt_rejects_common_overrides(self) -> None: self.assertRegex( flag, _MSVC_OPT_LEVEL_COPT, - f"expected {flag} to be treated as an optimisation-level override", + f"expected {flag} to be treated as an optimization-level override", ) self.assertNotRegex( '"/W4"', diff --git a/specs/_template.md b/specs/_template.md index 1276e3fb8..c7b774b8b 100644 --- a/specs/_template.md +++ b/specs/_template.md @@ -17,7 +17,7 @@ last-updated: One short paragraph: what this capability provides and to whom. Intent and the "why it exists" framing live here — doxygen has nowhere to put them. -## Behaviour & invariants +## Behavior & invariants > Per-symbol signatures live in doxygen (`.html`). This section > records only facts that span the whole capability or that a reader cannot infer @@ -26,7 +26,7 @@ One short paragraph: what this capability provides and to whom. Intent and the - Cross-cutting guarantees the code upholds today (e.g. "on failure the input is restored", "round-trip: write then read returns the original value"). - Things consumers may rely on; assumptions that must remain true. -- Non-obvious behaviours no single symbol owns (stall guards, void-type gating, +- Non-obvious behaviors no single symbol owns (stall guards, void-type gating, lock-step delegation, error-type conventions). - Keep these current — a change that alters any guarantee here updates this section in the same commit. (Per-API drift is doxygen's job, not yours.) diff --git a/specs/ab-stats.md b/specs/ab-stats.md index 687ad201a..69cf1e7a5 100644 --- a/specs/ab-stats.md +++ b/specs/ab-stats.md @@ -18,7 +18,7 @@ depth. It exists purely for performance tuning and debugging of the solver — i has no effect on results — and is compiled to nothing in normal builds so it never costs the hot path. -## Behaviour & invariants +## Behavior & invariants > Method contracts are in the header doxygen; these are the capability-wide facts. diff --git a/specs/build-system.md b/specs/build-system.md index 77e19497a..8a5c7111d 100644 --- a/specs/build-system.md +++ b/specs/build-system.md @@ -22,7 +22,7 @@ compile/link option sets in `CPPVARIABLES.bzl` / `wasm_compat.bzl` that every consistent — they select a platform's flags and opt into features by name rather than re-encoding toolchain knowledge. -## Behaviour & invariants +## Behavior & invariants > Exact flag lists live in `CPPVARIABLES.bzl`; the point here is the contract, not > the literal strings. @@ -36,7 +36,7 @@ than re-encoding toolchain knowledge. `@platforms//cpu:wasm32` (set by the `wasm_cc_binary` platform transition, not the host OS). Any target that wants per-platform flags does so through the `select()`s in `CPPVARIABLES.bzl` — it should not hand-roll `-O3`/`/O2`. -- **Optimised builds are strict.** Non-debug macOS/Linux/WASM use `-O3` with +- **Optimized builds are strict.** Non-debug macOS/Linux/WASM use `-O3` with `-Wall -Wpedantic -Werror`; Windows uses `/W4 /WX /permissive-` and takes `/O2`/`/Od` from Bazel's `compilation_mode` (do not restate them in `DDS_CPPOPTS` — that triggers MSVC D9025). macOS adds LTO at both compile and diff --git a/specs/constants-and-debug.md b/specs/constants-and-debug.md index 85fe29a06..f8f5f10cf 100644 --- a/specs/constants-and-debug.md +++ b/specs/constants-and-debug.md @@ -21,7 +21,7 @@ way because they all draw those definitions from here. It exists so there is a single, authoritative definition of "how a card/hand/strain is represented" and "how diagnostic output is switched on", rather than each module inventing its own. -## Behaviour & invariants +## Behavior & invariants > Per-symbol values (e.g. the exact contents of `bit_map_rank`) live in doxygen > (`utility_constants` group). Only the cross-cutting conventions are recorded here. @@ -76,6 +76,6 @@ single, authoritative definition of "how a card/hand/strain is represented" and - No runtime configuration of the debug flags — they are compile-time only. The one exception, `ab_stats`, is surfaced through the build system, not this capability. -- This capability defines representations, not behaviour: it computes nothing and +- This capability defines representations, not behavior: it computes nothing and owns no algorithm. Precomputed *derived* tables (bit/rank/trick tables built for the search) live in [lookup-tables](lookup-tables.md), not here. diff --git a/specs/dds-public-api.md b/specs/dds-public-api.md index 9baeeb484..7d7775f84 100644 --- a/specs/dds-public-api.md +++ b/specs/dds-public-api.md @@ -21,7 +21,7 @@ context-aware consumers are served from one library without duplicating the solver. Everything below the API (search, TT, scheduler) is private; this capability defines what crosses the boundary and promises to stay stable. -## Behaviour & invariants +## Behavior & invariants > The exact per-function contracts are in doxygen. These are the whole-surface > facts. @@ -70,7 +70,7 @@ capability defines what crosses the boundary and promises to stay stable. isn't used today since it ships only as non-hermetic early-access binaries (see the header comment in `Dds.java`). - **.NET.** Binds the shim (`dds_c_*`) plus most of the flat `dll.h` API - directly (`SolveBoard`, `CalcDDtable`, `Par`, `Analyse*`, …) — see + directly (`SolveBoard`, `CalcDDtable`, `Par`, `Analyze*`, …) — see [dotnet-binding](dotnet-binding.md). Reaches the shim through `EntryPoint` on its P/Invokes (`dotnet/DDS_Core/Native/DdsNative.cs`), keeping its managed method names. diff --git a/specs/dotnet-binding.md b/specs/dotnet-binding.md index e51b20061..0b7b77ba3 100644 --- a/specs/dotnet-binding.md +++ b/specs/dotnet-binding.md @@ -21,14 +21,14 @@ the solver without building the C++ or writing marshalling code. Like the JVM binding it targets the pure-C shim from [dds-public-api](dds-public-api.md), not the C++ API. -## Behaviour & invariants +## Behavior & invariants > Per-type and per-method detail is in `DDS_Core`'s doc comments and > `docs/dotnet_interface.md`. These are the whole-binding guarantees. - **Two ABI layers, one library.** The modern context entry points bind the `dds_c_*` shim; the legacy flat API (`SolveBoard`, `CalcDDtable`, `Par`, - `Analyse*`, …) binds `dll.h` directly. Both come from the single native + `Analyze*`, …) binds `dll.h` directly. Both come from the single native library built by `//jni:dds_shared`. The binding does **not** use the reference-taking `dds_*` symbols in `dds_api.hpp`: those are not exported on Linux or macOS, so binding them made the wrapper Windows-only. @@ -44,7 +44,7 @@ the C++ API. `libdds.so`, and `dds.dll`. - **Library resolution is overridable.** A resolver registered from `DdsNative`'s static constructor — which the runtime guarantees runs before - that type's first P/Invoke — honours the `DDS_LIBRARY_PATH` environment + that type's first P/Invoke — honors the `DDS_LIBRARY_PATH` environment variable, falling back to default probing when it is unset. When it is set but unusable the failure names the attempted path rather than silently falling through. This is the counterpart of the JVM binding's `-Ddds.library.path` and diff --git a/specs/examples-cli.md b/specs/examples-cli.md index 99ba23fb5..9e5b3a281 100644 --- a/specs/examples-cli.md +++ b/specs/examples-cli.md @@ -17,7 +17,7 @@ API: how to build a deal, call the solver, and read results. They double as reference usage for the bindings and as the C++ programs the [wasm-emscripten](wasm-emscripten.md) build ports to the browser. They are demonstrations, not a supported product CLI. -## Behaviour & invariants +## Behavior & invariants > Per-binary detail lives in the sources; these are the whole-set conventions. @@ -58,6 +58,6 @@ build ports to the browser. They are demonstrations, not a supported product CLI - These are demonstrations and reference code, **not** a supported command-line product; input/output formats may be example-specific. -- They add no solver behaviour of their own — they only exercise +- They add no solver behavior of their own — they only exercise [dds-public-api](dds-public-api.md) / [solver-context](solver-context.md). - Only a subset is compiled to WASM (see [wasm-emscripten](wasm-emscripten.md)). diff --git a/specs/heuristic-sorting.md b/specs/heuristic-sorting.md index d7af3957e..ce3dc4d3b 100644 --- a/specs/heuristic-sorting.md +++ b/specs/heuristic-sorting.md @@ -21,7 +21,7 @@ because the weighting policy is intricate (position-, trump-, and void-situation-dependent) and is the single hottest inner-loop computation in a solve. -## Behaviour & invariants +## Behavior & invariants > The scoring formulas live in `doc/heuristic-sorting.md` and the code; these are > the facts the rest of the system relies on. @@ -48,7 +48,7 @@ solve. and mutates `trackp`; heuristics read the snapshots copied into `HeuristicContext`. - **`testable_heuristic_sorting`** exposes the same sources to the heuristic-sorting - test packages; behaviour matches `heuristic_sorting`. + test packages; behavior matches `heuristic_sorting`. ## Key entry points diff --git a/specs/jni-ffm-binding.md b/specs/jni-ffm-binding.md index 746f8fe55..305ea9197 100644 --- a/specs/jni-ffm-binding.md +++ b/specs/jni-ffm-binding.md @@ -21,7 +21,7 @@ that downcall into it. It exists so JVM consumers get the solver as an ordinary Maven dependency with the native library embedded in the jar. It binds the pure-C shim from [dds-public-api](dds-public-api.md), not the C++ API. -## Behaviour & invariants +## Behavior & invariants > Class/method detail is in `Dds.java` and `docs/jni_interface.md`; these are the > whole-binding guarantees. diff --git a/specs/lookup-tables.md b/specs/lookup-tables.md index 269e032d6..ddc54b351 100644 --- a/specs/lookup-tables.md +++ b/specs/lookup-tables.md @@ -20,7 +20,7 @@ cards", and "decompose this holding into runs of adjacent ranks". Computing thes by table lookup instead of on the fly is a core performance decision — the hot inner loops of [move-generation](move-generation.md) and the search index these arrays directly. -## Behaviour & invariants +## Behavior & invariants > Per-table encodings live in the header doxygen; these are the whole-capability > facts. diff --git a/specs/move-generation.md b/specs/move-generation.md index 584be927a..d8bb484a0 100644 --- a/specs/move-generation.md +++ b/specs/move-generation.md @@ -14,12 +14,12 @@ last-updated: 2026-07-18 The `Moves` class generates and iterates the legal card plays the alpha-beta search explores at each trick, ordered so the most promising moves come first. -Good ordering is what makes the search tractable: it maximises alpha-beta cutoffs +Good ordering is what makes the search tractable: it maximizes alpha-beta cutoffs and transposition-table hits. `Moves` is an internal component — it is not part of [dds-public-api](dds-public-api.md) — consumed by the search through the [solver-context](solver-context.md) `MoveGenContext` facade. -## Behaviour & invariants +## Behavior & invariants > Per-method signatures are in the header doxygen; these are the whole-object > guarantees. @@ -43,7 +43,7 @@ and transposition-table hits. `Moves` is an internal component — it is not par per-suit winning-rank constraint (or `nullptr` when none remains), `MakeNextSimple()` iterates without constraints. `Purge()` removes a set of forbidden moves from a list. -- **`MgType` categorises each generation call** by contract (NT vs trump) and +- **`MgType` categorizes each generation call** by contract (NT vs trump) and void situation (0–3 hands void), 13 categories total. It indexes the statistics tables and the heuristic's per-situation tracking. - **Invariants are assertion-checked.** Public methods assume valid input and @@ -53,7 +53,7 @@ and transposition-table hits. `Moves` is an internal component — it is not par `DDS_MOVES_DETAILS` (see [constants-and-debug](constants-and-debug.md)); they are off the hot path in normal builds. - **`testable_moves`** exposes the same sources to `//library/tests/moves/...` for - white-box testing; behaviour is identical to `moves`. + white-box testing; behavior is identical to `moves`. ## Key entry points diff --git a/specs/python-binding.md b/specs/python-binding.md index 6987b4a51..735e7a2c3 100644 --- a/specs/python-binding.md +++ b/specs/python-binding.md @@ -7,7 +7,7 @@ last-updated: 2026-07-18 # Python Binding > **Specs vs. doxygen / docs.** How to build, import, and call the Python API is -> in `docs/python_interface.md`; per-function behaviour matches the underlying +> in `docs/python_interface.md`; per-function behavior matches the underlying > C++ API. This spec records the packaging model, the type-conversion boundary, > and the context-reuse contract. @@ -19,7 +19,7 @@ pybind11 native extension. It exists so Python users get double-dummy analysis installable wheel, without touching the C ABI directly. It wraps the modern context API and the flat API from [dds-public-api](dds-public-api.md). -## Behaviour & invariants +## Behavior & invariants > Per-function signatures are in `docs/python_interface.md`; these are the > whole-binding facts. @@ -52,9 +52,9 @@ context API and the flat API from [dds-public-api](dds-public-api.md). distribution `dds3`, version `1.0.0`, `strip_path_prefixes = ["python/"]`) packages `dds3_lib` + the staged extension; `dds3_wheel_dist` produces the distributable `dist/`. Requires Python 3.10+. -- **Behaviour tracks the C++ core.** The binding adds no solving logic of its own; +- **Behavior tracks the C++ core.** The binding adds no solving logic of its own; the `py_test` suite exercises the main entry paths (smoke, solve, tables, par, - analyse, convert_pbn, context reuse) against the same core. It is coverage of + analyze, convert_pbn, context reuse) against the same core. It is coverage of the binding surface, not a claimed full parity matrix. ## Key entry points diff --git a/specs/solver-context.md b/specs/solver-context.md index 4a6bfcbeb..05dc9e2c7 100644 --- a/specs/solver-context.md +++ b/specs/solver-context.md @@ -17,11 +17,11 @@ historically global mutable state: the per-thread `ThreadData`, the transpositio table, search state, move generation, and logging/stats. It exists so a caller can create one context at the top of a call stack, drive multiple solves through it, and reuse the (expensive) transposition table across them — instead of relying on -process-global state that forced serialised, non-reentrant use. It is the object +process-global state that forced serialized, non-reentrant use. It is the object the modern C++ API (`dds_api.hpp`) and its C shim (`dds_c_api.h`) hand around as the opaque handle. See [dds-public-api](dds-public-api.md). -## Behaviour & invariants +## Behavior & invariants > Method signatures live in the header's doxygen; these are the whole-context > guarantees. @@ -68,7 +68,7 @@ the opaque handle. See [dds-public-api](dds-public-api.md). the next `SearchContext::trans_table()` rebuilds an empty table lazily. The configured kind and memory limits survive, because they live in `SolverContext::cfg_` and not in the TT instance. Calling `return_all_memory()` - while keeping the object was the earlier behaviour and was **unsafe**: it left + while keeping the object was the earlier behavior and was **unsafe**: it left a husk whose pool pointers dangled, which `trans_table()` handed straight back because it only checks whether `tt_` is non-null — the next `lookup`/`add` read freed memory. `clear_tt()` and `dispose_trans_table()` now differ only in @@ -111,6 +111,6 @@ the opaque handle. See [dds-public-api](dds-public-api.md). - The context does not persist across processes; the TT is in-memory only. - The class header still describes itself as "scaffolding … no-behavior-change adapter" from the migration; the instance-scoped ownership model above is the - current, authoritative behaviour. (A stale comment in + current, authoritative behavior. (A stale comment in `solver_context_adapter.cpp` still refers to a "ThreadData-attached" shared TT; the per-`SearchContext` ownership described here is what the code does.) diff --git a/specs/system-concurrency.md b/specs/system-concurrency.md index 73253c7e1..ca118a115 100644 --- a/specs/system-concurrency.md +++ b/specs/system-concurrency.md @@ -16,11 +16,11 @@ last-updated: 2026-07-24 This capability is the platform and concurrency layer: it decides how many worker threads to use, distributes boards across them, owns per-thread scratch memory, provides file/timer utilities, and carries the logging/stats plumbing -(`Utilities`). It exists to keep system- and threading-dependent behaviour in one +(`Utilities`). It exists to keep system- and threading-dependent behavior in one place so the search and API layers stay portable. It is internal — not part of [dds-public-api](dds-public-api.md). -## Behaviour & invariants +## Behavior & invariants > Signatures live in the headers' doxygen; these are the whole-layer guarantees. diff --git a/specs/transposition-table.md b/specs/transposition-table.md index 4cea11785..c546d7729 100644 --- a/specs/transposition-table.md +++ b/specs/transposition-table.md @@ -20,7 +20,7 @@ consumer in a solve and the main reason reusing a [solver-context](solver-contex solves is worthwhile. This capability provides the abstract table interface and its three concrete strategies, trading memory against speed. -## Behaviour & invariants +## Behavior & invariants > Per-method signatures live in the header doxygen; these are the whole-table > guarantees. @@ -115,7 +115,7 @@ its three concrete strategies, trading memory against speed. by default). TT ownership itself is not build-flag-gated — it is always instance-scoped via `SearchContext`. - **`testable_trans_table`** is the same sources exposed to - `//library/tests/trans_table/...` for white-box testing; behaviour is identical to + `//library/tests/trans_table/...` for white-box testing; behavior is identical to `trans_table`. ## Key entry points diff --git a/specs/wasm-emscripten.md b/specs/wasm-emscripten.md index 1f271ce32..74ecb8ea4 100644 --- a/specs/wasm-emscripten.md +++ b/specs/wasm-emscripten.md @@ -17,7 +17,7 @@ in a browser or Node without a native install. It is the WASM module layer that the [web](web.md) site and the WASM system tests consume. It exists to prove the core solver builds and runs correctly under Emscripten. -## Behaviour & invariants +## Behavior & invariants > Per-target detail is in the BUILD file and `docs/wasm_build.md`; these are the > capability-wide facts. diff --git a/specs/web.md b/specs/web.md index 9b373be30..2e466b05a 100644 --- a/specs/web.md +++ b/specs/web.md @@ -17,7 +17,7 @@ via a purpose-built WASM module. It demonstrates the solver in a browser and holds the line on the browser integration (module loading, memory marshalling, DOM wiring) with an automated test pyramid. -## Behaviour & invariants +## Behavior & invariants > Per-file detail is in the BUILD file and the site sources; these are the > capability-wide facts. From e679a2b54c989cf06f92f2afd7394c6b957f10cb Mon Sep 17 00:00:00 2001 From: Adam Wildavsky Date: Mon, 14 Sep 2026 16:35:55 +0200 Subject: [PATCH 2/4] Restore Analyse* API tokens and keep the old docs anchor. Keep legacy symbol names in the specs and alias the previous analyser heading fragment so bookmarks still resolve. Co-authored-by: Cursor --- doc/dll-description.html | 1 + doc/dll-description.md | 2 ++ specs/dds-public-api.md | 2 +- specs/dotnet-binding.md | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/dll-description.html b/doc/dll-description.html index d9bb51b00..346fe9e3a 100644 --- a/doc/dll-description.html +++ b/doc/dll-description.html @@ -36,6 +36,7 @@

The PAR Calculation Functions

The functions SidesParBin and DealerParBin provide binary output of the par results, making it easy to tailor-make the output text format. Two such functions, ConvertToSidesTextFormat and ConvertToDealerTextFormat, are included as examples.

It is possible as an option to perform par calculation in CalcAllTables and CalcAllTablesPBN.

The par calculation is executed using a single thread. But the calculation is very fast and its duration is negligible compared to the double dummy calculation duration.

+

Double Dummy Value Analyzer Functions

The functions AnalysePlayBin, AnalysePlayPBN, AnalyseAllPlaysBin and AnalyseAllPlaysPBN take the played cards in a game or games and calculate and present their double dummy values.

diff --git a/doc/dll-description.md b/doc/dll-description.md index 5973b75f4..a14941b61 100644 --- a/doc/dll-description.md +++ b/doc/dll-description.md @@ -47,6 +47,8 @@ It is possible as an option to perform par calculation in `CalcAllTables` and `C The par calculation is executed using a single thread. But the calculation is very fast and its duration is negligible compared to the double dummy calculation duration. + + ### Double Dummy Value Analyzer Functions The functions `AnalysePlayBin`, `AnalysePlayPBN`, `AnalyseAllPlaysBin` and `AnalyseAllPlaysPBN` take the played cards in a game or games and calculate and present their double dummy values. diff --git a/specs/dds-public-api.md b/specs/dds-public-api.md index 7d7775f84..ba4e8a56e 100644 --- a/specs/dds-public-api.md +++ b/specs/dds-public-api.md @@ -70,7 +70,7 @@ capability defines what crosses the boundary and promises to stay stable. isn't used today since it ships only as non-hermetic early-access binaries (see the header comment in `Dds.java`). - **.NET.** Binds the shim (`dds_c_*`) plus most of the flat `dll.h` API - directly (`SolveBoard`, `CalcDDtable`, `Par`, `Analyze*`, …) — see + directly (`SolveBoard`, `CalcDDtable`, `Par`, `Analyse*`, …) — see [dotnet-binding](dotnet-binding.md). Reaches the shim through `EntryPoint` on its P/Invokes (`dotnet/DDS_Core/Native/DdsNative.cs`), keeping its managed method names. diff --git a/specs/dotnet-binding.md b/specs/dotnet-binding.md index 0b7b77ba3..4c198b761 100644 --- a/specs/dotnet-binding.md +++ b/specs/dotnet-binding.md @@ -28,7 +28,7 @@ the C++ API. - **Two ABI layers, one library.** The modern context entry points bind the `dds_c_*` shim; the legacy flat API (`SolveBoard`, `CalcDDtable`, `Par`, - `Analyze*`, …) binds `dll.h` directly. Both come from the single native + `Analyse*`, …) binds `dll.h` directly. Both come from the single native library built by `//jni:dds_shared`. The binding does **not** use the reference-taking `dds_*` symbols in `dds_api.hpp`: those are not exported on Linux or macOS, so binding them made the wrapper Windows-only. From 4d3b2652622d04dec1142a2a0832c3c373726e3f Mon Sep 17 00:00:00 2001 From: Adam Wildavsky Date: Mon, 14 Sep 2026 16:44:46 +0200 Subject: [PATCH 3/4] Align mirrored DLL docs with American Analyzer spelling. Keep the published htm/mht heading copies consistent with the markdown and lowercase HTML documentation. Co-authored-by: Cursor --- doc/DLL-dds_x.htm | 2 +- doc/DLL-dds_x.mht | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/DLL-dds_x.htm b/doc/DLL-dds_x.htm index fb3bc21f9..8d672534d 100644 --- a/doc/DLL-dds_x.htm +++ b/doc/DLL-dds_x.htm @@ -1626,7 +1626,7 @@

Double -Dummy Value Analyser Functions

+Dummy Value Analyzer Functions

 

diff --git a/doc/DLL-dds_x.mht b/doc/DLL-dds_x.mht index 75a760b62..6df67417e 100644 --- a/doc/DLL-dds_x.mht +++ b/doc/DLL-dds_x.mht @@ -1905,7 +1905,7 @@ pan>

-style: normal'>Double -Dummy Value Analyser Functions

+Dummy Value Analyzer Functions

  Date: Tue, 15 Sep 2026 05:36:27 +0200 Subject: [PATCH 4/4] Revert "Align mirrored DLL docs with American Analyzer spelling." This reverts commit 4d3b2652622d04dec1142a2a0832c3c373726e3f. --- doc/DLL-dds_x.htm | 2 +- doc/DLL-dds_x.mht | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/DLL-dds_x.htm b/doc/DLL-dds_x.htm index 8d672534d..fb3bc21f9 100644 --- a/doc/DLL-dds_x.htm +++ b/doc/DLL-dds_x.htm @@ -1626,7 +1626,7 @@

Double -Dummy Value Analyzer Functions

+Dummy Value Analyser Functions

 

diff --git a/doc/DLL-dds_x.mht b/doc/DLL-dds_x.mht index 6df67417e..75a760b62 100644 --- a/doc/DLL-dds_x.mht +++ b/doc/DLL-dds_x.mht @@ -1905,7 +1905,7 @@ pan>

-style: normal'>Double -Dummy Value Analyzer Functions

+Dummy Value Analyser Functions