@cachly-dev/mcp-server 0.10.127 → 0.10.129
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/aussetzer.d.ts +89 -0
- package/dist/src/aussetzer.js +143 -0
- package/dist/src/aussetzer.js.map +1 -1
- package/dist/src/bauabdruck-daten.generiert.json +3 -3
- package/dist/src/bedeutung.d.ts +0 -7
- package/dist/src/bedeutung.js +72 -3
- package/dist/src/bedeutung.js.map +1 -1
- package/dist/src/bench/cachly-bench.d.ts +15 -0
- package/dist/src/bench/cachly-bench.js +15 -0
- package/dist/src/bench/cachly-bench.js.map +1 -1
- package/dist/src/eingaenge.d.ts +24 -0
- package/dist/src/eingaenge.js +32 -0
- package/dist/src/eingaenge.js.map +1 -1
- package/dist/src/feldreparatur.d.ts +58 -0
- package/dist/src/feldreparatur.js +113 -0
- package/dist/src/feldreparatur.js.map +1 -0
- package/dist/src/handlers/advanced.js +3 -3
- package/dist/src/handlers/advanced.js.map +1 -1
- package/dist/src/handlers/brain.js +252 -36
- package/dist/src/handlers/brain.js.map +1 -1
- package/dist/src/handlers/team.js +60 -4
- package/dist/src/handlers/team.js.map +1 -1
- package/dist/src/interferenz.d.ts +111 -0
- package/dist/src/interferenz.js +141 -0
- package/dist/src/interferenz.js.map +1 -0
- package/dist/src/rangfolge.d.ts +36 -0
- package/dist/src/rangfolge.js +35 -0
- package/dist/src/rangfolge.js.map +1 -1
- package/dist/src/resonanz.d.ts +85 -0
- package/dist/src/resonanz.js +140 -0
- package/dist/src/resonanz.js.map +1 -0
- package/dist/src/speicherlage.d.ts +51 -0
- package/dist/src/speicherlage.js +84 -0
- package/dist/src/speicherlage.js.map +1 -0
- package/dist/src/versuch.d.ts +9 -1
- package/dist/src/versuch.js +17 -3
- package/dist/src/versuch.js.map +1 -1
- package/dist/src/wartung/vektoren-verdichten.d.ts +50 -0
- package/dist/src/wartung/vektoren-verdichten.js +200 -0
- package/dist/src/wartung/vektoren-verdichten.js.map +1 -0
- package/dist/src/wertbeitrag.d.ts +95 -4
- package/dist/src/wertbeitrag.js +135 -5
- package/dist/src/wertbeitrag.js.map +1 -1
- package/glama.json +1 -1
- package/package.json +3 -2
- package/server.json +2 -2
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Varianten-Interferenz — die Frage einmal stellen, viele Wege gehen.
|
|
3
|
+
*
|
|
4
|
+
* ╔══════════════════════════════════════════════════════════════════════════╗
|
|
5
|
+
* ║ GEMESSEN UND NICHT VERDRAHTET (21.08.2026). ║
|
|
6
|
+
* ║ ║
|
|
7
|
+
* ║ Am eingefrorenen Korpus, alle Kombinationen aus K=3/5/9 und Staerke ║
|
|
8
|
+
* ║ 0,3/0,5/0,8 (src/bench/interferenz-vergleich.ts): ║
|
|
9
|
+
* ║ ║
|
|
10
|
+
* ║ Bauform Platz 1 @3 Top 10 Topf ║
|
|
11
|
+
* ║ heute 39,0 51,0 71,0 90,0 ║
|
|
12
|
+
* ║ K=5 staerke=0,5 39,0 51,0 72,0 90,0 ║
|
|
13
|
+
* ║ (alle uebrigen: gleich oder schlechter) ║
|
|
14
|
+
* ║ ║
|
|
15
|
+
* ║ Von den 10 Fragen, die gar nicht in den Topf kamen, wurde KEINE einzige ║
|
|
16
|
+
* ║ gerettet. ║
|
|
17
|
+
* ║ ║
|
|
18
|
+
* ║ Der Grund steht in der Diagnose (src/bench/warum-durchgefallen.ts): ║
|
|
19
|
+
* ║ bge-m3-Vektoren sind DICHT. Bedeutung liegt ueber alle 1024 Dimensionen ║
|
|
20
|
+
* ║ verteilt, nicht in Abschnitten. Einen Abschnitt zu daempfen ist deshalb ║
|
|
21
|
+
* ║ keine "lass ein Wort weg"-Operation, sondern eine Drehung, die alle ║
|
|
22
|
+
* ║ Kandidaten aehnlich trifft — gemessen: Kosinus zur Ausgangsfrage 0,99 ║
|
|
23
|
+
* ║ bei Staerke 0,3 und noch 0,89 bei 0,8. Die Rangfolge bewegt sich nicht. ║
|
|
24
|
+
* ║ ║
|
|
25
|
+
* ║ Die Analogie war falsch, nicht die Umsetzung: Interferenz braucht Wege, ║
|
|
26
|
+
* ║ die sich WIRKLICH unterscheiden. Im Vektorraum eines dichten Modells ║
|
|
27
|
+
* ║ gibt es die nicht zum Nulltarif — echte Textvarianten kosten je einen ║
|
|
28
|
+
* ║ Einbettungsaufruf, und genau den sollte diese Idee sparen. ║
|
|
29
|
+
* ║ ║
|
|
30
|
+
* ║ Was die Messung stattdessen fand, steht in src/bench/topfgroesse.ts: ║
|
|
31
|
+
* ║ der Topf war mit 25 zu klein. 75 hebt die Decke von 90 auf 97 Prozent. ║
|
|
32
|
+
* ║ ║
|
|
33
|
+
* ║ Die Datei bleibt mitsamt Proben, damit der naechste Anlauf die Messung ║
|
|
34
|
+
* ║ vorfindet statt sie zu wiederholen. ║
|
|
35
|
+
* ╚══════════════════════════════════════════════════════════════════════════╝
|
|
36
|
+
*
|
|
37
|
+
* ── Das Vorbild ─────────────────────────────────────────────────────────────
|
|
38
|
+
*
|
|
39
|
+
* Feynmans Pfadintegral: Licht probiert alle Wege gleichzeitig. Die Phasen der
|
|
40
|
+
* falschen Wege loeschen sich gegenseitig aus, uebrig bleibt der richtige.
|
|
41
|
+
* Nicht weil einer ausgewaehlt wurde — weil die anderen einander aufheben.
|
|
42
|
+
*
|
|
43
|
+
* ── Das Problem, gegen das es antritt ───────────────────────────────────────
|
|
44
|
+
*
|
|
45
|
+
* Gemessen am 21.08.2026 am eingefrorenen Korpus: von 100 Fragen kommen 10 gar
|
|
46
|
+
* nicht erst in den Topf. Diese zehn sind fuer JEDE spaetere Stufe verloren —
|
|
47
|
+
* die beste Sortierung der Welt kann nichts sortieren, was nicht da ist.
|
|
48
|
+
*
|
|
49
|
+
* Die Vorauswahl haengt heute an EINER Zahl je Lektion: der Naehe zu EINEM
|
|
50
|
+
* Fragevektor. Eine ungluecklich formulierte Frage zeigt in eine leicht
|
|
51
|
+
* falsche Richtung, und die richtige Lektion faellt aus den Top 25. Es gibt
|
|
52
|
+
* keinen zweiten Versuch.
|
|
53
|
+
*
|
|
54
|
+
* ── Was hier passiert ───────────────────────────────────────────────────────
|
|
55
|
+
*
|
|
56
|
+
* Aus dem einen Fragevektor werden K leicht verschobene Varianten erzeugt.
|
|
57
|
+
* Jede nominiert ihre eigene Top-Liste. Wer in vielen Varianten weit vorne
|
|
58
|
+
* steht, ist stabil gemeint; wer nur in einer auftaucht, war der Zufallstreffer
|
|
59
|
+
* einer bestimmten Formulierung.
|
|
60
|
+
*
|
|
61
|
+
* WICHTIG, und der ganze Grund, warum das billig ist: die Varianten entstehen
|
|
62
|
+
* IM VEKTORRAUM, nicht im Text. Kein einziger zusaetzlicher Einbettungsaufruf,
|
|
63
|
+
* kein Netz, keine Latenz von Belang — nur Arithmetik auf 1024 Zahlen.
|
|
64
|
+
*
|
|
65
|
+
* ── Warum deterministisch und nicht zufaellig ───────────────────────────────
|
|
66
|
+
*
|
|
67
|
+
* Zwei Laeufe auf derselben Frage MUESSEN dieselbe Antwort geben. Ein
|
|
68
|
+
* Suchergebnis, das bei jedem Aufruf leicht anders ist, ist nicht
|
|
69
|
+
* reproduzierbar — und ein Messstand darauf misst sein eigenes Rauschen.
|
|
70
|
+
* Die Streuung kommt deshalb aus einer festen Achsenwahl je Variantenindex,
|
|
71
|
+
* nicht aus einem Zufallsgenerator.
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* Erzeugt K Varianten eines Fragevektors.
|
|
75
|
+
*
|
|
76
|
+
* Variante 0 ist IMMER die unveraenderte Frage. Damit kann die Interferenz im
|
|
77
|
+
* schlimmsten Fall nur so gut sein wie vorher plus Zusatzstimmen — sie kann
|
|
78
|
+
* die Ausgangslage nicht verlieren.
|
|
79
|
+
*
|
|
80
|
+
* Die uebrigen K-1 daempfen jeweils einen anderen Abschnitt des Vektors. Das
|
|
81
|
+
* ist die Vektorraum-Entsprechung zu "lass ein paar Woerter weg": ein Teil der
|
|
82
|
+
* Bedeutung wird leiser gedreht, der Rest bleibt. Faellt eine Lektion dadurch
|
|
83
|
+
* heraus, hing sie an genau diesem Abschnitt.
|
|
84
|
+
*
|
|
85
|
+
* @param fv der Fragevektor
|
|
86
|
+
* @param k wie viele Varianten insgesamt (inklusive der unveraenderten)
|
|
87
|
+
* @param staerke wie stark gedaempft wird (0 = gar nicht, 1 = Abschnitt aus)
|
|
88
|
+
*/
|
|
89
|
+
export function varianten(fv, k = 5, staerke = 0.5) {
|
|
90
|
+
if (k <= 1 || fv.length === 0)
|
|
91
|
+
return [fv];
|
|
92
|
+
const aus = [fv];
|
|
93
|
+
const abschnitte = k - 1;
|
|
94
|
+
const breite = Math.max(1, Math.floor(fv.length / abschnitte));
|
|
95
|
+
for (let i = 0; i < abschnitte; i++) {
|
|
96
|
+
const von = i * breite;
|
|
97
|
+
const bis = i === abschnitte - 1 ? fv.length : von + breite;
|
|
98
|
+
const v = fv.slice();
|
|
99
|
+
for (let j = von; j < bis; j++)
|
|
100
|
+
v[j] *= (1 - staerke);
|
|
101
|
+
aus.push(v);
|
|
102
|
+
}
|
|
103
|
+
return aus;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Ueberlagert die Nominierungen mehrerer Varianten.
|
|
107
|
+
*
|
|
108
|
+
* Das Gewicht einer Stimme faellt mit dem Platz (1/(platz+1)) — wie bei
|
|
109
|
+
* Reciprocal Rank Fusion, aber MIT einem Zusatz, der hier den Unterschied
|
|
110
|
+
* macht: die Naehe geht mit ein. Reine Platz-Fusion kann nicht unterscheiden,
|
|
111
|
+
* ob Platz 1 knapp oder deutlich gewonnen hat; genau daran ist am 20.08. die
|
|
112
|
+
* erste Eingangs-Verdrahtung gescheitert.
|
|
113
|
+
*
|
|
114
|
+
* Variante 0 (die unveraenderte Frage) zaehlt doppelt: sie ist die Frage, die
|
|
115
|
+
* der Nutzer wirklich gestellt hat. Die anderen sind Hypothesen darueber, was
|
|
116
|
+
* er gemeint haben koennte.
|
|
117
|
+
*
|
|
118
|
+
* @param listen je Variante eine nach Naehe absteigend sortierte Kandidatenliste
|
|
119
|
+
* @param wieViele wie viele Themen am Ende nominiert werden
|
|
120
|
+
*/
|
|
121
|
+
export function ueberlagere(listen, wieViele) {
|
|
122
|
+
const punkte = new Map();
|
|
123
|
+
for (const [vi, liste] of listen.entries()) {
|
|
124
|
+
const gewicht = vi === 0 ? 2 : 1;
|
|
125
|
+
for (const [platz, kandidat] of liste.entries()) {
|
|
126
|
+
// Negative Naehe heisst "kein Vektor" (-2) oder "zeigt weg" — solche
|
|
127
|
+
// Stimmen werden nicht gezaehlt, statt die Summe nach unten zu ziehen.
|
|
128
|
+
if (kandidat.naehe <= 0)
|
|
129
|
+
continue;
|
|
130
|
+
const stimme = gewicht * (kandidat.naehe / (platz + 1));
|
|
131
|
+
punkte.set(kandidat.topic, (punkte.get(kandidat.topic) ?? 0) + stimme);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return [...punkte.entries()]
|
|
135
|
+
// Bei Gleichstand entscheidet der Name — zwei Laeufe muessen dieselbe
|
|
136
|
+
// Reihenfolge geben, sonst misst der Messstand sein eigenes Rauschen.
|
|
137
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
138
|
+
.slice(0, wieViele)
|
|
139
|
+
.map(([topic]) => topic);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=interferenz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interferenz.js","sourceRoot":"","sources":["../../src/interferenz.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AAKH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS,CAAC,EAAY,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG;IAC1D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAe,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;YAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QACtD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,QAAgB;IAChE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,qEAAqE;YACrE,uEAAuE;YACvE,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC;gBAAE,SAAS;YAClC,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1B,sEAAsE;QACtE,sEAAsE;SACrE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvD,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;SAClB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/src/rangfolge.d.ts
CHANGED
|
@@ -165,5 +165,41 @@ export declare function bewerteTopf(topf: Bewertbar[], gewichte?: {
|
|
|
165
165
|
/** Anteil der seltenen Fragewörter im Text. 1,0 bis 1,6 — Mitte genommen. */
|
|
166
166
|
readonly seltenheit: 1.3;
|
|
167
167
|
}): number[];
|
|
168
|
+
/**
|
|
169
|
+
* Punktzahl je Kandidat — STRENGE Fassung: Merkmale multiplizieren statt addieren.
|
|
170
|
+
*
|
|
171
|
+
* ── Das Vorbild ─────────────────────────────────────────────────────────────
|
|
172
|
+
*
|
|
173
|
+
* Kinetisches Korrekturlesen (Hopfield 1974, T-Zell-Rezeptoren): Biochemie
|
|
174
|
+
* erreicht Fehlerraten weit unter dem, was ein einzelner Bindungsschritt
|
|
175
|
+
* hergibt, indem sie Kandidaten durch eine KETTE von Pruefschritten schickt.
|
|
176
|
+
* Bei jedem Schritt kann der Kandidat abfallen; die Trennschaerfe der Schritte
|
|
177
|
+
* MULTIPLIZIERT sich, statt sich zu mitteln.
|
|
178
|
+
*
|
|
179
|
+
* ── Der Unterschied zur Addition ────────────────────────────────────────────
|
|
180
|
+
*
|
|
181
|
+
* In der Summe (bewerteTopf) kann ein Kandidat totale Schwaeche in einem
|
|
182
|
+
* Merkmal mit Staerke in einem anderen voll ausgleichen. Im Produkt nicht:
|
|
183
|
+
* eine Null in einem Merkmal drueckt die Gesamtnote, egal wie gut der Rest
|
|
184
|
+
* ist. Das Produkt verlangt STIMMIGKEIT ueber alle Merkmale — die Summe
|
|
185
|
+
* verlangt nur Masse.
|
|
186
|
+
*
|
|
187
|
+
* `basis` stellt die Strenge ein: grosse Basis naehert sich der Summe an,
|
|
188
|
+
* kleine Basis macht eine Null toedlich. Rechnerisch ist das eine gewichtete
|
|
189
|
+
* Summe im Logarithmus — der Unterschied zur Addition ist die begrenzte
|
|
190
|
+
* Ausgleichbarkeit, nicht die Buchhaltung.
|
|
191
|
+
*
|
|
192
|
+
* Ergebnis der Messung vom 21.08.2026 steht in src/bench/fusion-vergleich.ts.
|
|
193
|
+
*/
|
|
194
|
+
export declare function bewerteTopfStreng(topf: Bewertbar[], gewichte?: {
|
|
195
|
+
/** Nähe zum ganzen Text. Der Grundstock, deshalb 1. */
|
|
196
|
+
readonly text: 1;
|
|
197
|
+
/** Nähe zum Themennamen. In beiden Richtungen 0,6. */
|
|
198
|
+
readonly thema: 0.6;
|
|
199
|
+
/** Angereicherte Frage gegen den ganzen Text. In beiden Richtungen 0,3. */
|
|
200
|
+
readonly rueckkopplung: 0.3;
|
|
201
|
+
/** Anteil der seltenen Fragewörter im Text. 1,0 bis 1,6 — Mitte genommen. */
|
|
202
|
+
readonly seltenheit: 1.3;
|
|
203
|
+
}, basis?: number): number[];
|
|
168
204
|
/** Bequemlichkeit: Kosinus mit Lücken-Behandlung. */
|
|
169
205
|
export declare function naeheOderLuecke(frage: number[] | null, vektor: number[] | null | undefined): number;
|
package/dist/src/rangfolge.js
CHANGED
|
@@ -207,6 +207,41 @@ export function bewerteTopf(topf, gewichte = GEWICHTE) {
|
|
|
207
207
|
+ gewichte.rueckkopplung * r[i]
|
|
208
208
|
+ gewichte.seltenheit * k.seltenheitsDeckung);
|
|
209
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* Punktzahl je Kandidat — STRENGE Fassung: Merkmale multiplizieren statt addieren.
|
|
212
|
+
*
|
|
213
|
+
* ── Das Vorbild ─────────────────────────────────────────────────────────────
|
|
214
|
+
*
|
|
215
|
+
* Kinetisches Korrekturlesen (Hopfield 1974, T-Zell-Rezeptoren): Biochemie
|
|
216
|
+
* erreicht Fehlerraten weit unter dem, was ein einzelner Bindungsschritt
|
|
217
|
+
* hergibt, indem sie Kandidaten durch eine KETTE von Pruefschritten schickt.
|
|
218
|
+
* Bei jedem Schritt kann der Kandidat abfallen; die Trennschaerfe der Schritte
|
|
219
|
+
* MULTIPLIZIERT sich, statt sich zu mitteln.
|
|
220
|
+
*
|
|
221
|
+
* ── Der Unterschied zur Addition ────────────────────────────────────────────
|
|
222
|
+
*
|
|
223
|
+
* In der Summe (bewerteTopf) kann ein Kandidat totale Schwaeche in einem
|
|
224
|
+
* Merkmal mit Staerke in einem anderen voll ausgleichen. Im Produkt nicht:
|
|
225
|
+
* eine Null in einem Merkmal drueckt die Gesamtnote, egal wie gut der Rest
|
|
226
|
+
* ist. Das Produkt verlangt STIMMIGKEIT ueber alle Merkmale — die Summe
|
|
227
|
+
* verlangt nur Masse.
|
|
228
|
+
*
|
|
229
|
+
* `basis` stellt die Strenge ein: grosse Basis naehert sich der Summe an,
|
|
230
|
+
* kleine Basis macht eine Null toedlich. Rechnerisch ist das eine gewichtete
|
|
231
|
+
* Summe im Logarithmus — der Unterschied zur Addition ist die begrenzte
|
|
232
|
+
* Ausgleichbarkeit, nicht die Buchhaltung.
|
|
233
|
+
*
|
|
234
|
+
* Ergebnis der Messung vom 21.08.2026 steht in src/bench/fusion-vergleich.ts.
|
|
235
|
+
*/
|
|
236
|
+
export function bewerteTopfStreng(topf, gewichte = GEWICHTE, basis = 0.3) {
|
|
237
|
+
const t = spreizeImTopf(topf.map((k) => k.naeheText));
|
|
238
|
+
const th = spreizeImTopf(topf.map((k) => k.naeheThema));
|
|
239
|
+
const r = spreizeImTopf(topf.map((k) => k.naeheRueckkopplung));
|
|
240
|
+
return topf.map((k, i) => gewichte.text * Math.log(basis + t[i])
|
|
241
|
+
+ gewichte.thema * Math.log(basis + th[i])
|
|
242
|
+
+ gewichte.rueckkopplung * Math.log(basis + r[i])
|
|
243
|
+
+ gewichte.seltenheit * Math.log(basis + k.seltenheitsDeckung));
|
|
244
|
+
}
|
|
210
245
|
/** Bequemlichkeit: Kosinus mit Lücken-Behandlung. */
|
|
211
246
|
export function naeheOderLuecke(frage, vektor) {
|
|
212
247
|
return frage && vektor && vektor.length > 0 ? kosinus(frage, vektor) : -2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rangfolge.js","sourceRoot":"","sources":["../../src/rangfolge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rangfolge.js","sourceRoot":"","sources":["../../src/rangfolge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resonanz — eine Lektion wird durch die Fragen adressiert, die zu ihr fuehrten.
|
|
3
|
+
*
|
|
4
|
+
* ── Das Vorbild ─────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* Das Hologramm speichert nicht das Bild, sondern das Interferenzmuster des
|
|
7
|
+
* Lichts, das es beleuchtet hat. Beleuchtet man es spaeter wieder, entsteht
|
|
8
|
+
* das Bild aus dem Muster — und jeder Splitter traegt das Ganze, nur unschaerfer.
|
|
9
|
+
*
|
|
10
|
+
* ── Das Problem, gegen das es antritt ───────────────────────────────────────
|
|
11
|
+
*
|
|
12
|
+
* Jeder Index in diesem Haus beschreibt, was eine Lektion SAGT: ihr Volltext,
|
|
13
|
+
* ihr Themenname. Gesucht wird aber mit dem, was jemand FRAGT — und die beiden
|
|
14
|
+
* Sprachen fallen auseinander. Gemessen am 21.08.2026: von 100 Fragen liegen
|
|
15
|
+
* 11 auf Platz 100+ der Bedeutungsrangfolge. Fuer die ist die richtige Lektion
|
|
16
|
+
* semantisch nicht "in der Naehe" — keine Vektorrechnung ueber ihren Text holt
|
|
17
|
+
* sie naeher heran.
|
|
18
|
+
*
|
|
19
|
+
* Diese Datei fuehrt deshalb eine dritte Sicht: je Lektion die laufende
|
|
20
|
+
* Ueberlagerung aller Fragevektoren, die nachweislich zu ihr gefuehrt haben.
|
|
21
|
+
* Der Vergleich laeuft dann Frage-gegen-Frage statt Frage-gegen-Text.
|
|
22
|
+
*
|
|
23
|
+
* ── Warum wir das koennen und andere nicht ──────────────────────────────────
|
|
24
|
+
*
|
|
25
|
+
* Es braucht die geschlossene Schleife: von der Frage ueber den Treffer bis zu
|
|
26
|
+
* der Bestaetigung, dass der Treffer richtig war. Ein Suchindex, der nur
|
|
27
|
+
* Dokumente kennt, hat diese Daten nicht.
|
|
28
|
+
*
|
|
29
|
+
* ── Die ehrliche Grenze ─────────────────────────────────────────────────────
|
|
30
|
+
*
|
|
31
|
+
* Der Index ist am Anfang leer. Eine Lektion, die noch nie gefunden wurde, hat
|
|
32
|
+
* keine Resonanz — und ausgerechnet die braeuchte sie am dringendsten. Das ist
|
|
33
|
+
* kein Fehler der Idee, sondern ihre Bauart: sie wird mit der Zeit besser und
|
|
34
|
+
* am ersten Tag gar nicht. Deshalb ist sie ein ZUSATZ und ersetzt keine Sicht.
|
|
35
|
+
*/
|
|
36
|
+
import type { Redis } from 'ioredis';
|
|
37
|
+
/** Schluessel-Vorsatz der Resonanzvektoren. */
|
|
38
|
+
export declare const RESONANZ_PRAEFIX = "cachly:lesson:res:";
|
|
39
|
+
/**
|
|
40
|
+
* Fuegt einen Fragevektor zur Resonanz einer Lektion.
|
|
41
|
+
*
|
|
42
|
+
* Die Ueberlagerung ist eine gleitende Summe mit Normierung: der neue Vektor
|
|
43
|
+
* zieht die Resonanz um `anteil` in seine Richtung. Ohne Normierung waeren
|
|
44
|
+
* haeufig gefundene Lektionen einfach laenger und wuerden jeden Kosinus
|
|
45
|
+
* gewinnen — die Naehe misst dann Beliebtheit statt Passung.
|
|
46
|
+
*
|
|
47
|
+
* `anteil` bewusst klein: eine einzelne Frage darf die Adresse einer Lektion
|
|
48
|
+
* nicht umschreiben. Zehn aehnliche Fragen sollen sie praegen, eine schraege
|
|
49
|
+
* nicht.
|
|
50
|
+
*
|
|
51
|
+
* @param bisher die bisherige Resonanz oder null
|
|
52
|
+
* @param frage der Fragevektor, der zu einem bestaetigten Treffer fuehrte
|
|
53
|
+
* @param anteil wie stark die neue Frage zieht
|
|
54
|
+
*/
|
|
55
|
+
export declare function ueberlagere(bisher: number[] | null, frage: number[], anteil?: number): number[];
|
|
56
|
+
/** Auf Laenge 1. Ein Nullvektor bleibt ein Nullvektor. */
|
|
57
|
+
export declare function normiere(v: number[]): number[];
|
|
58
|
+
/**
|
|
59
|
+
* Der Resonanzbestand — dieselbe Mechanik wie Vektorbestand, andere Sicht.
|
|
60
|
+
*
|
|
61
|
+
* Bewusst eine eigene kleine Klasse statt eines vierten Vektorbestand-Praefix:
|
|
62
|
+
* dieser Bestand wird auch GESCHRIEBEN (im Recall-Pfad, nach einem Treffer),
|
|
63
|
+
* und Schreiben gehoert nicht in eine Klasse, die sonst nur laedt.
|
|
64
|
+
*/
|
|
65
|
+
export declare class Resonanzbestand {
|
|
66
|
+
private readonly frischeMs;
|
|
67
|
+
private vektoren;
|
|
68
|
+
private geladen;
|
|
69
|
+
constructor(frischeMs?: number);
|
|
70
|
+
/** Die Naehe einer Frage zur Resonanz EINER Lektion. -2, wenn keine da ist. */
|
|
71
|
+
naehe(frage: number[], topic: string): number;
|
|
72
|
+
get groesse(): number;
|
|
73
|
+
/** Nur fuer Messungen: Resonanz ohne Speicher setzen. */
|
|
74
|
+
setzeDirekt(topic: string, v: number[]): void;
|
|
75
|
+
/** Laedt fehlende Resonanzvektoren nach. */
|
|
76
|
+
aktualisiere(redis: Redis, jetzt?: number): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Schreibt die neue Resonanz einer Lektion.
|
|
79
|
+
*
|
|
80
|
+
* Faengt jeden Fehler ab: eine Suche darf nie daran scheitern, dass sie sich
|
|
81
|
+
* nicht merken konnte, was sie gefunden hat. Der Aufrufer bekommt `false`
|
|
82
|
+
* und kann es melden.
|
|
83
|
+
*/
|
|
84
|
+
schreibe(redis: Redis, topic: string, frage: number[], anteil?: number): Promise<boolean>;
|
|
85
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resonanz — eine Lektion wird durch die Fragen adressiert, die zu ihr fuehrten.
|
|
3
|
+
*
|
|
4
|
+
* ── Das Vorbild ─────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* Das Hologramm speichert nicht das Bild, sondern das Interferenzmuster des
|
|
7
|
+
* Lichts, das es beleuchtet hat. Beleuchtet man es spaeter wieder, entsteht
|
|
8
|
+
* das Bild aus dem Muster — und jeder Splitter traegt das Ganze, nur unschaerfer.
|
|
9
|
+
*
|
|
10
|
+
* ── Das Problem, gegen das es antritt ───────────────────────────────────────
|
|
11
|
+
*
|
|
12
|
+
* Jeder Index in diesem Haus beschreibt, was eine Lektion SAGT: ihr Volltext,
|
|
13
|
+
* ihr Themenname. Gesucht wird aber mit dem, was jemand FRAGT — und die beiden
|
|
14
|
+
* Sprachen fallen auseinander. Gemessen am 21.08.2026: von 100 Fragen liegen
|
|
15
|
+
* 11 auf Platz 100+ der Bedeutungsrangfolge. Fuer die ist die richtige Lektion
|
|
16
|
+
* semantisch nicht "in der Naehe" — keine Vektorrechnung ueber ihren Text holt
|
|
17
|
+
* sie naeher heran.
|
|
18
|
+
*
|
|
19
|
+
* Diese Datei fuehrt deshalb eine dritte Sicht: je Lektion die laufende
|
|
20
|
+
* Ueberlagerung aller Fragevektoren, die nachweislich zu ihr gefuehrt haben.
|
|
21
|
+
* Der Vergleich laeuft dann Frage-gegen-Frage statt Frage-gegen-Text.
|
|
22
|
+
*
|
|
23
|
+
* ── Warum wir das koennen und andere nicht ──────────────────────────────────
|
|
24
|
+
*
|
|
25
|
+
* Es braucht die geschlossene Schleife: von der Frage ueber den Treffer bis zu
|
|
26
|
+
* der Bestaetigung, dass der Treffer richtig war. Ein Suchindex, der nur
|
|
27
|
+
* Dokumente kennt, hat diese Daten nicht.
|
|
28
|
+
*
|
|
29
|
+
* ── Die ehrliche Grenze ─────────────────────────────────────────────────────
|
|
30
|
+
*
|
|
31
|
+
* Der Index ist am Anfang leer. Eine Lektion, die noch nie gefunden wurde, hat
|
|
32
|
+
* keine Resonanz — und ausgerechnet die braeuchte sie am dringendsten. Das ist
|
|
33
|
+
* kein Fehler der Idee, sondern ihre Bauart: sie wird mit der Zeit besser und
|
|
34
|
+
* am ersten Tag gar nicht. Deshalb ist sie ein ZUSATZ und ersetzt keine Sicht.
|
|
35
|
+
*/
|
|
36
|
+
import { packe, entpacke, kosinus } from './bedeutung.js';
|
|
37
|
+
/** Schluessel-Vorsatz der Resonanzvektoren. */
|
|
38
|
+
export const RESONANZ_PRAEFIX = 'cachly:lesson:res:';
|
|
39
|
+
/**
|
|
40
|
+
* Fuegt einen Fragevektor zur Resonanz einer Lektion.
|
|
41
|
+
*
|
|
42
|
+
* Die Ueberlagerung ist eine gleitende Summe mit Normierung: der neue Vektor
|
|
43
|
+
* zieht die Resonanz um `anteil` in seine Richtung. Ohne Normierung waeren
|
|
44
|
+
* haeufig gefundene Lektionen einfach laenger und wuerden jeden Kosinus
|
|
45
|
+
* gewinnen — die Naehe misst dann Beliebtheit statt Passung.
|
|
46
|
+
*
|
|
47
|
+
* `anteil` bewusst klein: eine einzelne Frage darf die Adresse einer Lektion
|
|
48
|
+
* nicht umschreiben. Zehn aehnliche Fragen sollen sie praegen, eine schraege
|
|
49
|
+
* nicht.
|
|
50
|
+
*
|
|
51
|
+
* @param bisher die bisherige Resonanz oder null
|
|
52
|
+
* @param frage der Fragevektor, der zu einem bestaetigten Treffer fuehrte
|
|
53
|
+
* @param anteil wie stark die neue Frage zieht
|
|
54
|
+
*/
|
|
55
|
+
export function ueberlagere(bisher, frage, anteil = 0.3) {
|
|
56
|
+
if (!bisher || bisher.length !== frage.length)
|
|
57
|
+
return normiere(frage);
|
|
58
|
+
const neu = bisher.map((x, i) => (1 - anteil) * x + anteil * frage[i]);
|
|
59
|
+
return normiere(neu);
|
|
60
|
+
}
|
|
61
|
+
/** Auf Laenge 1. Ein Nullvektor bleibt ein Nullvektor. */
|
|
62
|
+
export function normiere(v) {
|
|
63
|
+
let q = 0;
|
|
64
|
+
for (const x of v)
|
|
65
|
+
q += x * x;
|
|
66
|
+
const l = Math.sqrt(q);
|
|
67
|
+
return l > 0 ? v.map((x) => x / l) : v;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Der Resonanzbestand — dieselbe Mechanik wie Vektorbestand, andere Sicht.
|
|
71
|
+
*
|
|
72
|
+
* Bewusst eine eigene kleine Klasse statt eines vierten Vektorbestand-Praefix:
|
|
73
|
+
* dieser Bestand wird auch GESCHRIEBEN (im Recall-Pfad, nach einem Treffer),
|
|
74
|
+
* und Schreiben gehoert nicht in eine Klasse, die sonst nur laedt.
|
|
75
|
+
*/
|
|
76
|
+
export class Resonanzbestand {
|
|
77
|
+
frischeMs;
|
|
78
|
+
vektoren = new Map();
|
|
79
|
+
geladen = 0;
|
|
80
|
+
constructor(frischeMs = 60_000) {
|
|
81
|
+
this.frischeMs = frischeMs;
|
|
82
|
+
}
|
|
83
|
+
/** Die Naehe einer Frage zur Resonanz EINER Lektion. -2, wenn keine da ist. */
|
|
84
|
+
naehe(frage, topic) {
|
|
85
|
+
const v = this.vektoren.get(topic);
|
|
86
|
+
return v ? kosinus(frage, v) : -2;
|
|
87
|
+
}
|
|
88
|
+
get groesse() { return this.vektoren.size; }
|
|
89
|
+
/** Nur fuer Messungen: Resonanz ohne Speicher setzen. */
|
|
90
|
+
setzeDirekt(topic, v) {
|
|
91
|
+
this.vektoren.set(topic, v);
|
|
92
|
+
}
|
|
93
|
+
/** Laedt fehlende Resonanzvektoren nach. */
|
|
94
|
+
async aktualisiere(redis, jetzt = Date.now()) {
|
|
95
|
+
if (this.vektoren.size > 0 && jetzt - this.geladen < this.frischeMs)
|
|
96
|
+
return;
|
|
97
|
+
const schluessel = [];
|
|
98
|
+
let cursor = '0';
|
|
99
|
+
do {
|
|
100
|
+
const [next, gefunden] = await redis.scan(cursor, 'MATCH', `${RESONANZ_PRAEFIX}*`, 'COUNT', 500);
|
|
101
|
+
cursor = next;
|
|
102
|
+
schluessel.push(...gefunden);
|
|
103
|
+
} while (cursor !== '0');
|
|
104
|
+
if (schluessel.length === 0) {
|
|
105
|
+
this.geladen = jetzt;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const werte = await redis.mget(...schluessel);
|
|
109
|
+
const frisch = new Map();
|
|
110
|
+
for (const [i, s] of schluessel.entries()) {
|
|
111
|
+
const roh = werte[i];
|
|
112
|
+
if (!roh)
|
|
113
|
+
continue;
|
|
114
|
+
const v = entpacke(roh);
|
|
115
|
+
if (v)
|
|
116
|
+
frisch.set(s.slice(RESONANZ_PRAEFIX.length), v);
|
|
117
|
+
}
|
|
118
|
+
this.vektoren = frisch;
|
|
119
|
+
this.geladen = jetzt;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Schreibt die neue Resonanz einer Lektion.
|
|
123
|
+
*
|
|
124
|
+
* Faengt jeden Fehler ab: eine Suche darf nie daran scheitern, dass sie sich
|
|
125
|
+
* nicht merken konnte, was sie gefunden hat. Der Aufrufer bekommt `false`
|
|
126
|
+
* und kann es melden.
|
|
127
|
+
*/
|
|
128
|
+
async schreibe(redis, topic, frage, anteil = 0.3) {
|
|
129
|
+
try {
|
|
130
|
+
const neu = ueberlagere(this.vektoren.get(topic) ?? null, frage, anteil);
|
|
131
|
+
this.vektoren.set(topic, neu);
|
|
132
|
+
await redis.set(`${RESONANZ_PRAEFIX}${topic}`, packe(neu));
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=resonanz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resonanz.js","sourceRoot":"","sources":["../../src/resonanz.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Was tut der Speicher WIRKLICH — nicht, was für ihn vorgesehen war.
|
|
3
|
+
*
|
|
4
|
+
* ── Warum es das gibt ───────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* Am 20.08.2026 stand ein Bestand bei 23,6 MB von 25 MB Tarifgrenze und lief
|
|
7
|
+
* dabei auf der Räumungsregel `allkeys-lru`. Diese Regel löscht bei Platzmangel
|
|
8
|
+
* die am längsten ungenutzte Lektion — ohne Meldung, ohne Fehler, ohne Spur.
|
|
9
|
+
* Genau die alten, selten gebrauchten Lektionen sind aber oft die wertvollen.
|
|
10
|
+
*
|
|
11
|
+
* Das Ärgerliche daran: der Code war seit April richtig. `evictionPolicy` gibt
|
|
12
|
+
* für jeden Tarif `volatile-lru` zurück, und ein Test bewacht das seither. Die
|
|
13
|
+
* laufende Instanz hatte trotzdem `allkeys-lru`, weil ein Container den
|
|
14
|
+
* Startbefehl behält, mit dem er erzeugt wurde. Eine Regeländerung im Code
|
|
15
|
+
* erreicht bestehende Instanzen NICHT.
|
|
16
|
+
*
|
|
17
|
+
* Ein Test beweist die Absicht. Diese Prüfung misst den Zustand. Das ist nicht
|
|
18
|
+
* dieselbe Frage, und die zweite hat monatelang niemand gestellt.
|
|
19
|
+
*
|
|
20
|
+
* ── Warum "nicht gemessen" ein eigenes Urteil ist ──────────────────────────
|
|
21
|
+
*
|
|
22
|
+
* `CONFIG GET` ist auf manchen verwalteten Speichern gesperrt. Wer das als
|
|
23
|
+
* "in Ordnung" verbucht, baut genau den Fehler wieder ein: Stille als grün.
|
|
24
|
+
* Deshalb hat diese Prüfung drei Ausgänge, nicht zwei — gut, Hinweis, und
|
|
25
|
+
* "konnte nicht nachsehen".
|
|
26
|
+
*/
|
|
27
|
+
/** Was vom laufenden Speicher abgelesen wurde. `null` = nicht ablesbar. */
|
|
28
|
+
export interface Speicherlage {
|
|
29
|
+
/** Belegte Bytes. */
|
|
30
|
+
benutzt: number | null;
|
|
31
|
+
/** Obergrenze in Bytes. 0 bedeutet: keine gesetzt. */
|
|
32
|
+
grenze: number | null;
|
|
33
|
+
/** Die Räumungsregel, z. B. `volatile-lru`. */
|
|
34
|
+
richtlinie: string | null;
|
|
35
|
+
}
|
|
36
|
+
export interface Urteil {
|
|
37
|
+
art: 'gut' | 'hinweis' | 'fehler' | 'ungemessen';
|
|
38
|
+
text: string;
|
|
39
|
+
}
|
|
40
|
+
/** Anteil der Belegung, 0 bis 1. `null`, wenn es keine Grenze gibt oder nichts ablesbar ist. */
|
|
41
|
+
export declare function anteil(l: Speicherlage): number | null;
|
|
42
|
+
/**
|
|
43
|
+
* Das Urteil über eine Speicherlage.
|
|
44
|
+
*
|
|
45
|
+
* Die Reihenfolge ist Absicht: die stille Löschung steht vor der Füllung. Eine
|
|
46
|
+
* halbvolle Instanz, die still löscht, ist gefährlicher als eine volle, die
|
|
47
|
+
* laut scheitert.
|
|
48
|
+
*/
|
|
49
|
+
export declare function beurteileSpeicher(l: Speicherlage): Urteil[];
|
|
50
|
+
/** Eine Zahl aus einem INFO-Block, z. B. `used_memory`. `null`, wenn sie fehlt. */
|
|
51
|
+
export declare function zahlAusInfo(info: string, name: string): number | null;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Was tut der Speicher WIRKLICH — nicht, was für ihn vorgesehen war.
|
|
3
|
+
*
|
|
4
|
+
* ── Warum es das gibt ───────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* Am 20.08.2026 stand ein Bestand bei 23,6 MB von 25 MB Tarifgrenze und lief
|
|
7
|
+
* dabei auf der Räumungsregel `allkeys-lru`. Diese Regel löscht bei Platzmangel
|
|
8
|
+
* die am längsten ungenutzte Lektion — ohne Meldung, ohne Fehler, ohne Spur.
|
|
9
|
+
* Genau die alten, selten gebrauchten Lektionen sind aber oft die wertvollen.
|
|
10
|
+
*
|
|
11
|
+
* Das Ärgerliche daran: der Code war seit April richtig. `evictionPolicy` gibt
|
|
12
|
+
* für jeden Tarif `volatile-lru` zurück, und ein Test bewacht das seither. Die
|
|
13
|
+
* laufende Instanz hatte trotzdem `allkeys-lru`, weil ein Container den
|
|
14
|
+
* Startbefehl behält, mit dem er erzeugt wurde. Eine Regeländerung im Code
|
|
15
|
+
* erreicht bestehende Instanzen NICHT.
|
|
16
|
+
*
|
|
17
|
+
* Ein Test beweist die Absicht. Diese Prüfung misst den Zustand. Das ist nicht
|
|
18
|
+
* dieselbe Frage, und die zweite hat monatelang niemand gestellt.
|
|
19
|
+
*
|
|
20
|
+
* ── Warum "nicht gemessen" ein eigenes Urteil ist ──────────────────────────
|
|
21
|
+
*
|
|
22
|
+
* `CONFIG GET` ist auf manchen verwalteten Speichern gesperrt. Wer das als
|
|
23
|
+
* "in Ordnung" verbucht, baut genau den Fehler wieder ein: Stille als grün.
|
|
24
|
+
* Deshalb hat diese Prüfung drei Ausgänge, nicht zwei — gut, Hinweis, und
|
|
25
|
+
* "konnte nicht nachsehen".
|
|
26
|
+
*/
|
|
27
|
+
/** Anteil der Belegung, 0 bis 1. `null`, wenn es keine Grenze gibt oder nichts ablesbar ist. */
|
|
28
|
+
export function anteil(l) {
|
|
29
|
+
if (l.benutzt === null || l.grenze === null || l.grenze <= 0)
|
|
30
|
+
return null;
|
|
31
|
+
return l.benutzt / l.grenze;
|
|
32
|
+
}
|
|
33
|
+
const mb = (b) => `${(b / 1024 / 1024).toFixed(1)} MB`;
|
|
34
|
+
/**
|
|
35
|
+
* Das Urteil über eine Speicherlage.
|
|
36
|
+
*
|
|
37
|
+
* Die Reihenfolge ist Absicht: die stille Löschung steht vor der Füllung. Eine
|
|
38
|
+
* halbvolle Instanz, die still löscht, ist gefährlicher als eine volle, die
|
|
39
|
+
* laut scheitert.
|
|
40
|
+
*/
|
|
41
|
+
export function beurteileSpeicher(l) {
|
|
42
|
+
const aus = [];
|
|
43
|
+
if (l.richtlinie === null) {
|
|
44
|
+
aus.push({
|
|
45
|
+
art: 'ungemessen',
|
|
46
|
+
text: 'Raeumungsregel nicht ablesbar (CONFIG GET gesperrt) — unbekannt, ob dieser Speicher bei Platzmangel still loescht.',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
else if (l.richtlinie.startsWith('allkeys')) {
|
|
50
|
+
aus.push({
|
|
51
|
+
art: 'fehler',
|
|
52
|
+
text: `Raeumungsregel ist \`${l.richtlinie}\`: bei Platzmangel wird die am laengsten ungenutzte Lektion GELOESCHT, ohne Meldung. Ein Gedaechtnis darf nicht raeumen wie ein Zwischenspeicher. Richtig waere \`volatile-lru\` (raeumt nur, was ohnehin ablaeuft) oder \`noeviction\` (scheitert laut).`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else if (l.richtlinie === 'volatile-lru' || l.richtlinie === 'noeviction') {
|
|
56
|
+
aus.push({ art: 'gut', text: `Raeumungsregel \`${l.richtlinie}\` — Lektionen ohne Ablaufdatum sind sicher.` });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
aus.push({ art: 'hinweis', text: `Raeumungsregel \`${l.richtlinie}\` — ungeprueft fuer diesen Zweck.` });
|
|
60
|
+
}
|
|
61
|
+
const a = anteil(l);
|
|
62
|
+
if (l.benutzt === null) {
|
|
63
|
+
aus.push({ art: 'ungemessen', text: 'Belegung nicht ablesbar.' });
|
|
64
|
+
}
|
|
65
|
+
else if (a === null) {
|
|
66
|
+
aus.push({ art: 'hinweis', text: `${mb(l.benutzt)} belegt, keine Obergrenze gesetzt — dieser Speicher waechst, bis der Rechner voll ist.` });
|
|
67
|
+
}
|
|
68
|
+
else if (a >= 0.9) {
|
|
69
|
+
aus.push({ art: 'fehler', text: `${mb(l.benutzt)} von ${mb(l.grenze)} belegt (${Math.round(a * 100)} %). Die naechsten Lektionen scheitern bald.` });
|
|
70
|
+
}
|
|
71
|
+
else if (a >= 0.75) {
|
|
72
|
+
aus.push({ art: 'hinweis', text: `${mb(l.benutzt)} von ${mb(l.grenze)} belegt (${Math.round(a * 100)} %).` });
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
aus.push({ art: 'gut', text: `${mb(l.benutzt)} von ${mb(l.grenze)} belegt (${Math.round(a * 100)} %).` });
|
|
76
|
+
}
|
|
77
|
+
return aus;
|
|
78
|
+
}
|
|
79
|
+
/** Eine Zahl aus einem INFO-Block, z. B. `used_memory`. `null`, wenn sie fehlt. */
|
|
80
|
+
export function zahlAusInfo(info, name) {
|
|
81
|
+
const t = new RegExp(`^${name}:(\\d+)`, 'm').exec(info);
|
|
82
|
+
return t ? Number(t[1]) : null;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=speicherlage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speicherlage.js","sourceRoot":"","sources":["../../src/speicherlage.ts"],"names":[],"mappings":"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"}
|