Skip to content

scaled_column_sums: der Band-Rueckfall braucht einen Akkumulator, der Partialsummen ueber Bandgrenzen haelt #151

Description

@marcohost33-maker

Stand

numerics/norms.py summiert die Spurgleichungen ueber scaled_column_sums. Der Aufbau wurde in PR #139 zweimal ersetzt und ist jetzt: erst blankes math.fsum (exakt, kein Unterlauf), und nur bei OverflowError ein Rueckfall auf zwei Exponentenbaender bei 2^512.

Dieser Rueckfall hat eine bekannte, gemessene Grenze.

Der Befund (Review an PR #139, norms.py:173)

"When math.fsum overflows, independently rounding the high and low bands before adding them can still erase cross-band cancellation residuals. Fresh evidence: [7e307]*3 + [-7e307]*3 + [2**513] + [-2**511]*4 + [1e-300] — its exact sum is 1e-300, but this path returns 0.0 because the low-band sum rounds away the tiny addend before recombination. Used as the 12 trace-row coefficients of a finite 144×144 operator, both trace-preservation readings become zero and restrict_to_traceless(..., tp_rtol=0) accepts the non-trace-preserving operator, so the fallback needs an accumulator that preserves partials across bands until the final rounding."

Warum zwei unabhaengig gerundete Baender das nicht koennen: jedes Band wird fuer sich auf ein float64 gerundet, bevor addiert wird. Ein Rest, der im unteren Band unter dessen eigener Rundung liegt, ist zum Zeitpunkt der Rekombination bereits weg — die Auskunft, dass da noch etwas war, existiert nicht mehr. Das ist keine Toleranzfrage, sondern Informationsverlust vor der letzten Rundung.

Dazu die bereits dokumentierte 1-ulp-Grenze

Unabhaengig davon wurde im selben PR gemessen: im Bandpfad 3 Abweichungen von 1 ulp bei 20000 Faellen (Ergebnisse ab 1e182, doppelte Rundung bei der Rekombination). Dabei 0 faelschliche Nullen und 0 Vorzeichenfehler bei 19965 gezielt ausloeschenden Faellen. Beides — die 1-ulp-Ungenauigkeit und der Kreuz-Band-Verlust oben — hat dieselbe Wurzel und faellt mit derselben Loesung weg.

Was traegt

Ein Akkumulator, der die Partialsummen ueber Bandgrenzen hinweg haelt und erst am Ende ein einziges Mal rundet — also Shewchuk-artig (wie math.fsum intern), aber mit einer Ueberlauf-Behandlung, die die Partialsummen nicht vorzeitig zusammenfaltet. Das ist eine eigene Konstruktion mit eigenem Review, nicht ein weiterer Patch auf dem bestehenden Rueckfall.

Bemerkenswert an der Vorgeschichte, weil es die Prioritaet mitbestimmt: an dieser Funktion wurden fuenf Ebenen derselben Klasse gefunden (Verduennung zwischen Spalten, Ueberlauf, geteilte Real/Imag-Skala, Unterlauf unter der gemeinsamen Skala, jetzt Kreuz-Band-Verlust). Vier davon in fail-open-Richtung. Die dritte hat der Bauende selbst gefunden, indem er die Klasse auf die eigene Arbeit anwandte. Wer hier weiterbaut, sollte dieselbe Probe fahren.

Erreichbarkeit — ehrlich

Der Bandpfad wird nur von Eingaben betreten, die math.fsum zum Ueberlaufen bringen. Fuer Spurgleichungen physikalischer Generatoren ist das praktisch unerreichbar; die Belege oben sind konstruiert. Das senkt die Dringlichkeit, nicht die Richtigkeit: die Richtung ist fail-open, und ein Gate, das in einer erreichbaren Ecke etwas durchlaesst, ist die Klasse, gegen die dieses Modul gebaut wurde.

Vorschlag fuer die Zwischenzeit

Bis die exakte Loesung steht: den Rueckfallpfad fail-closed machen. Kann die Funktion die Genauigkeit nicht garantieren, meldet sie unbekannt (nicht-finit) statt 0.0, und das nachgelagerte Gate lehnt ab. Unmessbar ist nicht bestanden — genau die Unterscheidung, wegen der PR #139 ueberhaupt existiert. Das war fuer heute vorbereitet und ist nicht mehr umgesetzt worden.

Pflicht bei der Umsetzung

  • Reproduktion des 11-Werte-Falls vor der Aenderung, plus die 144x144-Verwendung.
  • Die vier bestehenden Gegenrichtungs-Nodes muessen gruen bleiben: ..._is_no_longer_refused, ..._does_not_reopen_the_diluted_defect, ..._real_and_imaginary_parts_separately, ..._keep_an_addend_below_the_dominant_scale.
  • Positiv-Kontrolle mit gemessener Pfad-Trefferquote: eine Stichprobe, die den Bandpfad nur 1 von 6000 Mal betritt, misst nichts. Genau das ist im Vorlauf einmal passiert und wurde nur durch Nachzaehlen bemerkt.
  • Diskriminierung beide Richtungen, Ziel ein pytest-Node, und die Wirksamkeit jeder Mutation vorab pruefen.

Herkunft der Zahlen

Alle Messwerte stammen aus den Bau- und Prueflaeufen zu PR #139 und sind nicht eigenhaendig nachgerechnet; die Reproduktionen sind im PR-Verlauf dokumentiert.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VG6CeFJVgem6n4Tsam1onb

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions