Skip to content

Camera ready - #4

Merged
sergirovira merged 30 commits into
masterfrom
camera-ready
Oct 9, 2026
Merged

sergirovira merged 30 commits into
masterfrom
camera-ready

Conversation

@sergirovira

Copy link
Copy Markdown
Collaborator

No description provided.

sergirovira and others added 30 commits September 22, 2026 14:51
- Import UniformMod from nd directly; it is no longer an attribute of
  NoiseDistribution, which made every --fit invocation fail
- Split the duplicated LWE_NUM key into LWE_USVP_NUM and LWE_BDD_NUM so the
  uSVP numerical estimate is no longer overwritten by the BDD one
- Seed the randomised solvers so repeated runs agree
- Register --s-std, --s-a, --s-b, --s-eta and --q with getopt; they were read
  but never accepted, making four distributions unreachable
- Drop the unimplemented --file option
- Label the log q columns correctly in --param logq --table
- Cap correction_logic at MAX_CORRECTION_CALLS
- Use float() in delta_exact instead of Sage's RR(), which was never imported
- Verify --param n candidates against the requested error distribution
- Exit non-zero on failure
- Add lmfit to requirements.txt
- Ignore output.csv, compiled_output.csv and debug_log.txt
- Point docker-compose at directories that exist
- Remove the --file examples from the README
- Correct n_tables.txt to match Tables 7 and 9
- Renumber equation references in formulas.py to the JoC version
Maps each table of the paper to the commands that produce it, seeded for
reproducibility. Replaces create_table.sh and the loose command lists.
Maps each regenerated CSV and column to the paper table it feeds.
A larger modulus is weaker, so the binding constraint is the attack tolerating
the smallest one. Taking the maximum returned a modulus the other attack
already broke: at lambda=110, n=512, ternary it gave 16, measuring 109 bits.

Changes the output column of Tables 12, 16 and 20.
The files under tables/ predated 53ca0cc and matched neither the paper nor the
code. Regenerated files are named after the tables they feed; comp_*.py now
read those names.
Produced by regenerate_tables.sh at SEED=0. Tables 2, 3, 6, 7, 10 and 11 match
the paper exactly; 4, 8, 9 and 13 differ in a few Estimator cells.
Re-run after the log q aggregation fix. Confirms that the ternary log q columns
of Tables 12 and 16 are swapped in the paper.
Seeding the global random module once per process made a row's result depend on
how many rows preceded it. Each call now derives its own generator from the base
seed and its own arguments.
- Resolve the vendored estimator from __file__ rather than the working directory
- Return [] from process_est; the previous ([], []) crashed export_to_csv
- Remove the unused second copy of coreSVP_models
- Document --seed, --q and the --s-* options; -v is not --verify
- Replace a bare except in parse_logq and an uncaught ValueError in
  closest_power_of_2
- Remove test_estimator.py
66 tests pinning values printed in the paper, the per-call generators, the
Section 6 examples, and the refitting of all 16 constant sets. Tests needing
SageMath skip themselves when it is absent.
Three sites keyed a dict on each formula's output, so two formulas agreeing on
the same number silently discarded one verdict. Candidates are now kept as
pairs.
- Apply warnings-as-errors to the solver entry points rather than the whole
  process, which had imposed it on the Lattice Estimator
- Reject fsolve roots at beta = 2*pi*e, where the residual vanishes for any
  standard deviation
- Add cost_bits() so an infinite estimator cost no longer raises OverflowError

Tables 2, 4, 12, 13, 16, 17 and 20 regenerate unchanged.
Replaces the dict literals in process_n_param and create_data_point, six
branches each. build_row() raises on a repeated column, which is how the
duplicated LWE_NUM key went unnoticed.

Tables 2-12 and 20 regenerate unchanged.
No dict literals left, down from 26. Keeps the pre-correction snapshots in
process_std_e_param, which are not aliases: the correction branch substitutes a
failed solver's value before using them.

Tables 12, 13, 16, 17 and 20 regenerate unchanged.
Matches the paper on both columns in 8 of 12 rows.
- Regenerate every tutorial's output; all of it predated master, and
  tutorial_stde had its uSVP and BDD columns swapped
- Remove --file, ./examples/ and --verify, none of which exist
- Document the real distribution options in tutorial_non_fhe
- Fold modules.rst into api.rst and delete tutorial_ntru.rst, a duplicate
- Remove the duplicate python: key from .readthedocs.yaml
- Add a Reproducibility page

Sphinx builds with no warnings, down from ten.
- overview.rst: what the tool computes and how the columns relate
- limitations.rst: no dual or quantum attacks, the fitted range, the hybrid
  log q weakness, the broken --ntru
- options.rst: all twenty command line options

Rewrites introduction.rst as a landing page rather than a copy of the README,
and splits the index into Getting started, Tutorials and Reference.
- Add pyproject.toml with a fastparams console script
- Convert 18 intra-project imports to relative
- Invoke as python3 -m fastparameterselection.estimate; the file can no longer
  be run by path
- Use the vendored estimator when present, else a normally importable one

SageMath still cannot be installed by pip; the README says so. Building needs
setuptools >= 61, or the wheel is silently empty.
- Regenerate all four examples; they printed "Uniform (-1 0)" and two had wrong
  numbers
- Fix --error "3.19", which exited with "Error distribution not supported"
- Fix sage-python3, which is not a command
- Unescape the log q separators in the Docker examples; docker-compose uses no
  shell, so parse_logq rejected them
- Remove the duplicated "Common errors" section
- Put installation before usage and add a section on what the tool does not
  cover
- Right align numeric columns so digits line up; text columns stay left
- Use box-drawing characters on an interactive terminal, ASCII when the output
  is piped, so redirected results keep a stable plain-text form
- Strip trailing whitespace from every row
- Print the column legend after the table, one line per column, instead of a
  block above it that pushed the result off the screen
Installing from a copy loses the vendored Lattice Estimator, which is resolved
relative to the package, so -v silently stops working. Recommend an editable
install from a checkout instead.

- Note that editable installs need setuptools >= 64, not 61, and that an older
  pip resolves its isolated build environment to the system setuptools, which
  builds an empty UNKNOWN wheel and exits 0
- Replace "python3 src/estimate.py" in the usage line; src/ no longer exists
- Replace the --fit examples, which named a fit_formula.py that does not exist
  and a --dist option that is not the one the fit reads
- The tutorials and reference pages invoked the tool as python3 -m
  fastparameterselection.estimate; after a pip install the console script is
  available, so use it throughout
- Keep the module form only in the example that shows running from a checkout
  without installing
- Import fit_formula inside the --fit branch; at module level it pulled in
  lmfit, which a SageMath install does not provide, so the container failed
  with ModuleNotFoundError before printing anything
- Install lmfit in the image and correct the stale src/nd.py path in
  requirements.txt
- actions/checkout failed with EACCES inside the job-level container: the image
  runs as the unprivileged sage user while the runner owns its workspace as
  root, and running the container as root makes Sage ignore --python3
- Check out on the host and mount the tree read-only into a per-step container,
  copying it inside so writes land where the sage user has permission
- Run pytest with -v in both CI jobs, so a green run names the tests it ran
- Add a script that regroups the regenerated CSVs by dimension and security
  level, and order the log q files the same way
- Stop describing --ntru as broken; document it as an option instead
- They reproduce const.py here and in sagemath/sagemath:10.3, but land in a
  different minimum on the CI runner, about 1% low on the leading constant
- Non-strict xfail, so a platform that does reproduce them still passes
@sergirovira
sergirovira merged commit 4f0f5d9 into master Oct 9, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants