dense-armor 1.0.0__tar.gz
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.
- dense_armor-1.0.0/LICENSE.md +42 -0
- dense_armor-1.0.0/PKG-INFO +223 -0
- dense_armor-1.0.0/README.md +194 -0
- dense_armor-1.0.0/dense_armor/__init__.py +6 -0
- dense_armor-1.0.0/dense_armor/__main__.py +3 -0
- dense_armor-1.0.0/dense_armor/armatura.py +202 -0
- dense_armor-1.0.0/dense_armor/core/__init__.py +0 -0
- dense_armor-1.0.0/dense_armor/core/chunk.py +96 -0
- dense_armor-1.0.0/dense_armor/core/compiler.py +253 -0
- dense_armor-1.0.0/dense_armor/core/damping_operator.py +89 -0
- dense_armor-1.0.0/dense_armor/core/engine.py +426 -0
- dense_armor-1.0.0/dense_armor/core/init.py +35 -0
- dense_armor-1.0.0/dense_armor/core/logger.py +45 -0
- dense_armor-1.0.0/dense_armor/core/memory.py +114 -0
- dense_armor-1.0.0/dense_armor/core/noise.py +122 -0
- dense_armor-1.0.0/dense_armor/core/preset.py +80 -0
- dense_armor-1.0.0/dense_armor/core/profiler.py +88 -0
- dense_armor-1.0.0/dense_armor/core/tensor.py +69 -0
- dense_armor-1.0.0/dense_armor/core/vector.py +140 -0
- dense_armor-1.0.0/dense_armor/core/visualizer.py +103 -0
- dense_armor-1.0.0/dense_armor/utility/__init__.py +0 -0
- dense_armor-1.0.0/dense_armor/utility/anwav.py +54 -0
- dense_armor-1.0.0/dense_armor/utility/collatz.py +92 -0
- dense_armor-1.0.0/dense_armor/utility/curvature.py +21 -0
- dense_armor-1.0.0/dense_armor/utility/diagnostic.py +50 -0
- dense_armor-1.0.0/dense_armor/utility/iodat.py +32 -0
- dense_armor-1.0.0/dense_armor/utility/metro.py +31 -0
- dense_armor-1.0.0/dense_armor/utility/orca.py +227 -0
- dense_armor-1.0.0/dense_armor/utility/resonance_search.py +74 -0
- dense_armor-1.0.0/dense_armor.egg-info/PKG-INFO +223 -0
- dense_armor-1.0.0/dense_armor.egg-info/SOURCES.txt +35 -0
- dense_armor-1.0.0/dense_armor.egg-info/dependency_links.txt +1 -0
- dense_armor-1.0.0/dense_armor.egg-info/entry_points.txt +2 -0
- dense_armor-1.0.0/dense_armor.egg-info/requires.txt +13 -0
- dense_armor-1.0.0/dense_armor.egg-info/top_level.txt +1 -0
- dense_armor-1.0.0/pyproject.toml +36 -0
- dense_armor-1.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Business Source License 1.1 (BSL 1.1)
|
|
2
|
+
|
|
3
|
+
**Software:** Dense-Armor
|
|
4
|
+
**Licenziante:** Salvatore Pennacchio <jtatopenn@libero.it>
|
|
5
|
+
|
|
6
|
+
La presente Business Source License (la "Licenza") si applica integralmente al codice sorgente, agli algoritmi, ai moduli software, ai file di configurazione e all'oggetto binario del software denominato "Dense-Armor" (il "Software").
|
|
7
|
+
|
|
8
|
+
## 1. Parametri della Licenza
|
|
9
|
+
|
|
10
|
+
* **Licenziante:** Salvatore Pennacchio <jtatopenn@libero.it>
|
|
11
|
+
* **Software:** Dense-Armor (incluso il nucleo Sentinel: stabilizzatore adattivo, gating ABCollatz, rilevatori di anomalia e deriva, utility e opere derivate fornite dal Licenziante).
|
|
12
|
+
* **Data di Modifica:** 1 Giugno 2029
|
|
13
|
+
* **Licenza di Modifica:** Apache License, Versione 2.0 (o successive, a esclusiva discrezione del Licenziante).
|
|
14
|
+
* **Uso Consentito per la Produzione:** Uso strettamente non commerciale ed esecuzioni limitate ai parametri definiti nella Sezione 4. Per l'uso in ambienti di produzione commerciale, industriale o di consulenza tariffata che ecceda tali parametri, si applica l'obbligo inderogabile di licenza separata.
|
|
15
|
+
|
|
16
|
+
## 2. Concessione della Licenza e Obbligo di Attribuzione
|
|
17
|
+
|
|
18
|
+
Il Licenziante concede al Licenziatario una licenza non esclusiva, valida in tutto il mondo, esente da royalty e revocabile unicamente in caso di violazione dei termini qui stabiliti, per l'uso, la riproduzione, la distribuzione, la modifica e la creazione di opere derivate del Software, per scopi non commerciali e nei limiti dell'Uso Consentito per la Produzione.
|
|
19
|
+
|
|
20
|
+
**Condizione Tassativa di Attribuzione:** Qualsiasi copia, porzione, modulo o opera derivata del Software (incluse piattaforme terze, infrastrutture cloud, sistemi hardware o interfacce API che integrino o richiamino Dense-Armor) deve includere in modo visibile, inalterato e permanente il copyright originale e l'attribuzione esplicita al Licenziante nella forma:
|
|
21
|
+
`© 2026 Salvatore Pennacchio <jtatopenn@libero.it> - Dense-Armor`.
|
|
22
|
+
|
|
23
|
+
## 3. Condizioni e Limiti Generali di Utilizzo
|
|
24
|
+
|
|
25
|
+
Il Software può essere utilizzato, riprodotto, distribuito e modificato a condizione che tale utilizzo non sia destinato a scopi di produzione commerciale, industriale o all'erogazione di servizi computazionali e cloud commerciali che competano direttamente o indirettamente con i prodotti o i servizi offerti dal Licenziante, ad eccezione di quanto espressamente previsto dalla Sezione 4 o a partire dalla Data di Modifica (Sezione 5).
|
|
26
|
+
|
|
27
|
+
## 4. Concessione di Utilizzo Aggiuntivo (Uso Commerciale Limitato)
|
|
28
|
+
|
|
29
|
+
In deroga alle restrizioni della Sezione 3, il Licenziatario è autorizzato a utilizzare il Software per scopi di produzione commerciale, industriale o di consulenza tariffata, senza necessità di una licenza separata a pagamento, esclusivamente nei seguenti limiti:
|
|
30
|
+
|
|
31
|
+
* **Uso interno e di valutazione:** integrazione del Software in pipeline interne di monitoraggio, ricerca e sviluppo della propria organizzazione.
|
|
32
|
+
* **Limite di scala:** l'impiego del Software in servizi erogati a terzi (API, SaaS, consulenza tariffata) oltre l'uso interno richiede la preventiva sottoscrizione di un accordo di licenza commerciale separato con il Licenziante.
|
|
33
|
+
|
|
34
|
+
**Divieto di Elusione Tecnica:** è fatto esplicito divieto di aggirare i presenti limiti tramite mascheramento dei sottomoduli (*wrapping*) o ridistribuzione su più entità appartenenti alla stessa organizzazione.
|
|
35
|
+
|
|
36
|
+
## 5. Data di Modifica
|
|
37
|
+
|
|
38
|
+
A partire dalla Data di Modifica indicata nella Sezione 1, il Software è automaticamente reso disponibile secondo i termini della Licenza di Modifica (Apache License 2.0), che sostituisce integralmente le restrizioni della presente Licenza.
|
|
39
|
+
|
|
40
|
+
## 6. Assenza di Garanzia
|
|
41
|
+
|
|
42
|
+
IL SOFTWARE È FORNITO "COSÌ COM'È", SENZA GARANZIE DI ALCUN TIPO, ESPRESSE O IMPLICITE. IN NESSUN CASO IL LICENZIANTE POTRÀ ESSERE RITENUTO RESPONSABILE PER DANNI DERIVANTI DALL'USO DEL SOFTWARE.
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dense-armor
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: The wearable Sentinel shield: two-stage adaptive anomaly damping (IIR + ABCollatz gating) for any AI signal - NaN-safe, drift-aware, dimension-agnostic
|
|
5
|
+
Author-email: Salvatore Pennacchio <jtatopenn@libero.it>
|
|
6
|
+
License: Business Source License 1.1
|
|
7
|
+
Project-URL: Homepage, https://github.com/tatopenn-cell/Dense-Armor
|
|
8
|
+
Project-URL: Repository, https://github.com/tatopenn-cell/Dense-Armor
|
|
9
|
+
Project-URL: Sister project (Dense-Evolution), https://github.com/tatopenn-cell/Dense-Evolution
|
|
10
|
+
Keywords: anomaly-detection,signal-processing,drift-detection,ai-safety,robust-statistics,jax
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Intended Audience :: Science/Research
|
|
13
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Requires-Python: >=3.10
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE.md
|
|
18
|
+
Requires-Dist: numpy
|
|
19
|
+
Requires-Dist: jax
|
|
20
|
+
Requires-Dist: psutil
|
|
21
|
+
Provides-Extra: audio
|
|
22
|
+
Requires-Dist: scipy; extra == "audio"
|
|
23
|
+
Provides-Extra: data
|
|
24
|
+
Requires-Dist: h5py; extra == "data"
|
|
25
|
+
Requires-Dist: netCDF4; extra == "data"
|
|
26
|
+
Provides-Extra: quantum
|
|
27
|
+
Requires-Dist: dense-evolution; extra == "quantum"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
██████╗ ███████╗███╗ ██╗███████╗███████╗ █████╗ ██████╗ ███╗ ███╗ ██████╗ ██████╗
|
|
32
|
+
██╔══██╗██╔════╝████╗ ██║██╔════╝██╔════╝ ██╔══██╗██╔══██╗████╗ ████║██╔═══██╗██╔══██╗
|
|
33
|
+
██║ ██║█████╗ ██╔██╗ ██║███████╗█████╗ █████╗███████║██████╔╝██╔████╔██║██║ ██║██████╔╝
|
|
34
|
+
██║ ██║██╔══╝ ██║╚██╗██║╚════██║██╔══╝ ╚════╝██╔══██║██╔══██╗██║╚██╔╝██║██║ ██║██╔══██╗
|
|
35
|
+
██████╔╝███████╗██║ ╚████║███████║███████╗ ██║ ██║██║ ██║██║ ╚═╝ ██║╚██████╔╝██║ ██║
|
|
36
|
+
╚═════╝ ╚══════╝╚═╝ ╚═══╝╚══════╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
<p align="center">
|
|
40
|
+
<img alt="license" src="https://img.shields.io/badge/license-BSL_1.1-blue.svg">
|
|
41
|
+
<img alt="python" src="https://img.shields.io/badge/python-3.10%2B-blue.svg">
|
|
42
|
+
<img alt="backend" src="https://img.shields.io/badge/backend-JAX-orange.svg">
|
|
43
|
+
<img alt="training" src="https://img.shields.io/badge/training%20required-no-brightgreen.svg">
|
|
44
|
+
<img alt="nan" src="https://img.shields.io/badge/NaN--safe-yes-brightgreen.svg">
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
<p align="center"><strong>Runtime shield per input/output di modelli IA. Nessun riaddestramento. Nessuna magia — solo damping adattivo verificato con test reali.</strong></p>
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## `$ cosa fa`
|
|
52
|
+
|
|
53
|
+
Un sensore che manda letture perse (`NaN`) o spara un valore assurdo (`1e6` invece di `1.2`) rompe silenziosamente qualunque pipeline a valle. Dense-Armor si mette in mezzo, tra il dato grezzo e il modello che lo consuma:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
dato corrotto ──► [ SCUDO INGRESSO ] ──► modello IA ──► [ SCUDO USCITA ] ──► output pulito
|
|
57
|
+
purifica vs │ purifica vs
|
|
58
|
+
riferimento │ risposta-al-riferimento
|
|
59
|
+
(o stima cieca robusta) │ (o auto-consistenza)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- **Ingresso**: ripulisce il dato corrotto verso un riferimento pulito, se lo hai — o verso una stima robusta ricavata dal dato stesso, se non lo hai.
|
|
63
|
+
- **Uscita**: verifica che la risposta del modello non sia a sua volta corrotta, confrontandola con la risposta che il modello darebbe al riferimento pulito.
|
|
64
|
+
- **Margine d'errore**: per ogni valore corretto, restituisce quanto è stato spostato per ripulirlo. Correzione piccola → fidati. Correzione grande → tratta con cautela.
|
|
65
|
+
|
|
66
|
+
Non tocca i pesi. Non riaddestra niente. Gira a runtime su qualunque tensore JAX/NumPy.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## `$ install`
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pip install dense-armor # core: numpy + jax
|
|
74
|
+
pip install "dense-armor[quantum]" # + Dense-Evolution (simulatore NISQ)
|
|
75
|
+
pip install "dense-armor[audio,data]" # + WAV, HDF5, NetCDF
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
# obbligatorio prima di ogni import — richiesto dal gating a 64-bit
|
|
80
|
+
import jax
|
|
81
|
+
jax.config.update("jax_enable_x64", True)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```powershell
|
|
85
|
+
# equivalente da PowerShell, prima del lancio
|
|
86
|
+
$env:JAX_ENABLE_X64="True"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## `$ quickstart`
|
|
92
|
+
|
|
93
|
+
```powershell
|
|
94
|
+
python -m dense_armor --json 1.2 1.3 9999 1.25 nan 1.3
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
> anomalia @ indice 2 (picco 9999)
|
|
99
|
+
> anomalia @ indice 4 (NaN)
|
|
100
|
+
> tutto il resto: intatto
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Collegato a un modello vero:
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
from dense_armor.utility.orca import Orca
|
|
107
|
+
|
|
108
|
+
orca = Orca()
|
|
109
|
+
output_protetto = orca.protect_and_forward(
|
|
110
|
+
mio_modello, # callable: x -> output (JAX/NumPy)
|
|
111
|
+
dato_corrotto, # tensore dal sensore/pipeline
|
|
112
|
+
x_reference=dato_pulito_di_riferimento, # opzionale ma consigliato
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
orca.margine_ingresso_medio, orca.margine_uscita_medio # quanto fidarsi
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Serie 1D (loss di training, metriche, token stream):
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
from dense_armor import Armatura
|
|
122
|
+
|
|
123
|
+
a = Armatura(livello_ia=0.0) # 0 = filtra attivamente · 1 = solo segnala
|
|
124
|
+
pulito, K, anomalie = a.analizza(serie)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## `$ internals`
|
|
130
|
+
|
|
131
|
+
Due stadi in sequenza, nessuno dei due amplifica mai un errore — solo damping verso il pulito:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
STADIO 1 core/engine.py STADIO 2 utility/collatz.py
|
|
135
|
+
────────────────────────── ──────────────────────────────
|
|
136
|
+
stabilizzatore adattivo gating basato su Collatz
|
|
137
|
+
soglia dinamica su volatilità decide QUANTO smorzare ogni punto
|
|
138
|
+
recente, smorza chi la supera verso il riferimento pulito
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Senza riferimento pulito (modalità cieca): rigetto degli outlier gravi via mediana locale, poi Stadio 1 in versione causale — usa tutta la storia della serie, non solo i vicini immediati, per stimare cosa "dovrebbe" essere quel punto.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## `$ margine d'errore`
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
orca.margine_ingresso orca.margine_ingresso_medio orca.margine_ingresso_max
|
|
149
|
+
orca.margine_uscita orca.margine_uscita_medio orca.margine_uscita_max
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`|valore ricevuto − valore corretto|` — quanto lo scudo ha dovuto spostare un dato per ripulirlo. Non è una covarianza calibrata in senso statistico stretto, ma correla bene nei test: basso quando la correzione è affidabile, alto quando lo scudo sta indovinando alla cieca.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## `$ vs kalman-filter --honest`
|
|
157
|
+
|
|
158
|
+
Non sostituisce un Kalman filter — risolvono problemi diversi, punto.
|
|
159
|
+
|
|
160
|
+
Random walk, 15% dati mancanti, 3% spike enormi:
|
|
161
|
+
|
|
162
|
+
| metodo | MSE |
|
|
163
|
+
|---|---|
|
|
164
|
+
| nessuna protezione | ~21000 |
|
|
165
|
+
| Kalman *senza* gating anti-outlier (il caso comune) | ~7300 |
|
|
166
|
+
| Kalman *con* gating anti-outlier e dinamica nota | **~0.12** |
|
|
167
|
+
| Dense-Armor, modalità cieca | ~0.23 |
|
|
168
|
+
|
|
169
|
+
```diff
|
|
170
|
+
+ contro un Kalman non protetto (lo scenario piu' comune in pratica): vince nettamente
|
|
171
|
+
+ un solo spike enorme manda in tilt il gain di Kalman e lo trascina dietro di se'
|
|
172
|
+
+ zero setup: nessun modello di processo da conoscere, stimare o calibrare (niente Q/R)
|
|
173
|
+
+ funziona anche dove Kalman non si applica per niente: immagini, embedding, tensori generici
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Il vantaggio è la libertà, non la specializzazione.** Un Kalman filter ben progettato, calibrato su un processo dinamico *noto*, resta più preciso su quel singolo caso d'uso — ma richiede di conoscere in anticipo il modello del sistema e ricalibrarlo per ogni nuovo tipo di dato. Dense-Armor è un **filtro generale**: nessuna personalizzazione, nessuna conoscenza a priori richiesta, si applica così com'è a qualunque tensore (temporale o no). Il prezzo di questa libertà è un po' di precisione in meno nel caso specifico in cui esiste già un modello dinamico noto e calibrato — una perdita piccola (~0.23 vs ~0.12 di MSE nel nostro test) rispetto al vantaggio di non dover mai configurare nulla.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## `$ robustezza adversarial --tested`
|
|
181
|
+
|
|
182
|
+
9 test motore condivisi eseguiti fino in fondo, nessun crash, nessun NaN sfuggito. Nessuna difesa mai sotto il 64%:
|
|
183
|
+
|
|
184
|
+
| attacco | tipo | difesa |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| PGD / BIM / MI-FGSM | gradiente, 1000 passi | mitigato, V finale 0.013-0.078 |
|
|
187
|
+
| affine / elastico | geometrico, 50k iter | contenuto, V_inf 0.05-0.14 |
|
|
188
|
+
| Fourier broadband | dominio frequenza, 50k iter FFT | **99.78%+** |
|
|
189
|
+
| Carlini-Wagner (L2) | ottimizzazione | 78.96% |
|
|
190
|
+
| Carlini-Wagner (L∞) | ottimizzazione | **64.39%** — il punto più debole trovato finora |
|
|
191
|
+
| DeepFool | ottimizzazione | 78.79% |
|
|
192
|
+
| combinato (tutti insieme) | 150.140 passi totali | nessun gradiente esplosivo |
|
|
193
|
+
|
|
194
|
+
Onesto: **C&W in norma L∞ è l'attacco che buca di più** tra quelli testati. Non è un fallimento — resta protezione reale — ma è la crepa più vicina a un cedimento tra tutte le prove fatte, e va saputo prima di affidarci contro quello scenario specifico.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## `$ limiti --known`
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
1. semantica distingue deviazioni geometriche, non significati
|
|
202
|
+
2. modalita' cieca senza riferimento: buona per evitare collassi/NaN, non per
|
|
203
|
+
ricostruire con precisione un dato realmente perso
|
|
204
|
+
3. generalita' zero calibrazione richiesta, si applica a qualunque tensore --
|
|
205
|
+
a discapito di un pizzico di precisione dove esiste gia' un
|
|
206
|
+
modello dinamico noto e calibrato (es. Kalman su serie pure)
|
|
207
|
+
4. deriva lenta invisibile punto per punto, serve riferimento=baseline_storica
|
|
208
|
+
5. C&W norma L-inf la difesa piu' debole misurata finora (64%, contro 79-83%
|
|
209
|
+
delle altre varianti di attacco testate) -- vedi tabella sopra
|
|
210
|
+
6. adversarial attacchi costruiti apposta per mimare la coerenza del
|
|
211
|
+
adattivo segnale pulito (oltre a PGD/BIM/MI-FGSM/C&W/DeepFool/Fourier
|
|
212
|
+
gia' testati) non ancora coperti dalla suite
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## `$ license`
|
|
218
|
+
|
|
219
|
+
Business Source License 1.1 — uso gratuito non commerciale, converte in Apache 2.0 il `2029-06-01`. Vedi [LICENSE.md](LICENSE.md).
|
|
220
|
+
|
|
221
|
+
`© 2026 Salvatore Pennacchio <jtatopenn@libero.it>`
|
|
222
|
+
|
|
223
|
+
Parte dell'ecosistema **Sentinel**, insieme a [Dense-Evolution](https://github.com/tatopenn-cell/Dense-Evolution) (simulatore di circuiti quantistici NISQ).
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
```
|
|
2
|
+
██████╗ ███████╗███╗ ██╗███████╗███████╗ █████╗ ██████╗ ███╗ ███╗ ██████╗ ██████╗
|
|
3
|
+
██╔══██╗██╔════╝████╗ ██║██╔════╝██╔════╝ ██╔══██╗██╔══██╗████╗ ████║██╔═══██╗██╔══██╗
|
|
4
|
+
██║ ██║█████╗ ██╔██╗ ██║███████╗█████╗ █████╗███████║██████╔╝██╔████╔██║██║ ██║██████╔╝
|
|
5
|
+
██║ ██║██╔══╝ ██║╚██╗██║╚════██║██╔══╝ ╚════╝██╔══██║██╔══██╗██║╚██╔╝██║██║ ██║██╔══██╗
|
|
6
|
+
██████╔╝███████╗██║ ╚████║███████║███████╗ ██║ ██║██║ ██║██║ ╚═╝ ██║╚██████╔╝██║ ██║
|
|
7
|
+
╚═════╝ ╚══════╝╚═╝ ╚═══╝╚══════╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<img alt="license" src="https://img.shields.io/badge/license-BSL_1.1-blue.svg">
|
|
12
|
+
<img alt="python" src="https://img.shields.io/badge/python-3.10%2B-blue.svg">
|
|
13
|
+
<img alt="backend" src="https://img.shields.io/badge/backend-JAX-orange.svg">
|
|
14
|
+
<img alt="training" src="https://img.shields.io/badge/training%20required-no-brightgreen.svg">
|
|
15
|
+
<img alt="nan" src="https://img.shields.io/badge/NaN--safe-yes-brightgreen.svg">
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<p align="center"><strong>Runtime shield per input/output di modelli IA. Nessun riaddestramento. Nessuna magia — solo damping adattivo verificato con test reali.</strong></p>
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## `$ cosa fa`
|
|
23
|
+
|
|
24
|
+
Un sensore che manda letture perse (`NaN`) o spara un valore assurdo (`1e6` invece di `1.2`) rompe silenziosamente qualunque pipeline a valle. Dense-Armor si mette in mezzo, tra il dato grezzo e il modello che lo consuma:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
dato corrotto ──► [ SCUDO INGRESSO ] ──► modello IA ──► [ SCUDO USCITA ] ──► output pulito
|
|
28
|
+
purifica vs │ purifica vs
|
|
29
|
+
riferimento │ risposta-al-riferimento
|
|
30
|
+
(o stima cieca robusta) │ (o auto-consistenza)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- **Ingresso**: ripulisce il dato corrotto verso un riferimento pulito, se lo hai — o verso una stima robusta ricavata dal dato stesso, se non lo hai.
|
|
34
|
+
- **Uscita**: verifica che la risposta del modello non sia a sua volta corrotta, confrontandola con la risposta che il modello darebbe al riferimento pulito.
|
|
35
|
+
- **Margine d'errore**: per ogni valore corretto, restituisce quanto è stato spostato per ripulirlo. Correzione piccola → fidati. Correzione grande → tratta con cautela.
|
|
36
|
+
|
|
37
|
+
Non tocca i pesi. Non riaddestra niente. Gira a runtime su qualunque tensore JAX/NumPy.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## `$ install`
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pip install dense-armor # core: numpy + jax
|
|
45
|
+
pip install "dense-armor[quantum]" # + Dense-Evolution (simulatore NISQ)
|
|
46
|
+
pip install "dense-armor[audio,data]" # + WAV, HDF5, NetCDF
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
# obbligatorio prima di ogni import — richiesto dal gating a 64-bit
|
|
51
|
+
import jax
|
|
52
|
+
jax.config.update("jax_enable_x64", True)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
# equivalente da PowerShell, prima del lancio
|
|
57
|
+
$env:JAX_ENABLE_X64="True"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## `$ quickstart`
|
|
63
|
+
|
|
64
|
+
```powershell
|
|
65
|
+
python -m dense_armor --json 1.2 1.3 9999 1.25 nan 1.3
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
> anomalia @ indice 2 (picco 9999)
|
|
70
|
+
> anomalia @ indice 4 (NaN)
|
|
71
|
+
> tutto il resto: intatto
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Collegato a un modello vero:
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
from dense_armor.utility.orca import Orca
|
|
78
|
+
|
|
79
|
+
orca = Orca()
|
|
80
|
+
output_protetto = orca.protect_and_forward(
|
|
81
|
+
mio_modello, # callable: x -> output (JAX/NumPy)
|
|
82
|
+
dato_corrotto, # tensore dal sensore/pipeline
|
|
83
|
+
x_reference=dato_pulito_di_riferimento, # opzionale ma consigliato
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
orca.margine_ingresso_medio, orca.margine_uscita_medio # quanto fidarsi
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Serie 1D (loss di training, metriche, token stream):
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
from dense_armor import Armatura
|
|
93
|
+
|
|
94
|
+
a = Armatura(livello_ia=0.0) # 0 = filtra attivamente · 1 = solo segnala
|
|
95
|
+
pulito, K, anomalie = a.analizza(serie)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## `$ internals`
|
|
101
|
+
|
|
102
|
+
Due stadi in sequenza, nessuno dei due amplifica mai un errore — solo damping verso il pulito:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
STADIO 1 core/engine.py STADIO 2 utility/collatz.py
|
|
106
|
+
────────────────────────── ──────────────────────────────
|
|
107
|
+
stabilizzatore adattivo gating basato su Collatz
|
|
108
|
+
soglia dinamica su volatilità decide QUANTO smorzare ogni punto
|
|
109
|
+
recente, smorza chi la supera verso il riferimento pulito
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Senza riferimento pulito (modalità cieca): rigetto degli outlier gravi via mediana locale, poi Stadio 1 in versione causale — usa tutta la storia della serie, non solo i vicini immediati, per stimare cosa "dovrebbe" essere quel punto.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## `$ margine d'errore`
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
orca.margine_ingresso orca.margine_ingresso_medio orca.margine_ingresso_max
|
|
120
|
+
orca.margine_uscita orca.margine_uscita_medio orca.margine_uscita_max
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`|valore ricevuto − valore corretto|` — quanto lo scudo ha dovuto spostare un dato per ripulirlo. Non è una covarianza calibrata in senso statistico stretto, ma correla bene nei test: basso quando la correzione è affidabile, alto quando lo scudo sta indovinando alla cieca.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## `$ vs kalman-filter --honest`
|
|
128
|
+
|
|
129
|
+
Non sostituisce un Kalman filter — risolvono problemi diversi, punto.
|
|
130
|
+
|
|
131
|
+
Random walk, 15% dati mancanti, 3% spike enormi:
|
|
132
|
+
|
|
133
|
+
| metodo | MSE |
|
|
134
|
+
|---|---|
|
|
135
|
+
| nessuna protezione | ~21000 |
|
|
136
|
+
| Kalman *senza* gating anti-outlier (il caso comune) | ~7300 |
|
|
137
|
+
| Kalman *con* gating anti-outlier e dinamica nota | **~0.12** |
|
|
138
|
+
| Dense-Armor, modalità cieca | ~0.23 |
|
|
139
|
+
|
|
140
|
+
```diff
|
|
141
|
+
+ contro un Kalman non protetto (lo scenario piu' comune in pratica): vince nettamente
|
|
142
|
+
+ un solo spike enorme manda in tilt il gain di Kalman e lo trascina dietro di se'
|
|
143
|
+
+ zero setup: nessun modello di processo da conoscere, stimare o calibrare (niente Q/R)
|
|
144
|
+
+ funziona anche dove Kalman non si applica per niente: immagini, embedding, tensori generici
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Il vantaggio è la libertà, non la specializzazione.** Un Kalman filter ben progettato, calibrato su un processo dinamico *noto*, resta più preciso su quel singolo caso d'uso — ma richiede di conoscere in anticipo il modello del sistema e ricalibrarlo per ogni nuovo tipo di dato. Dense-Armor è un **filtro generale**: nessuna personalizzazione, nessuna conoscenza a priori richiesta, si applica così com'è a qualunque tensore (temporale o no). Il prezzo di questa libertà è un po' di precisione in meno nel caso specifico in cui esiste già un modello dinamico noto e calibrato — una perdita piccola (~0.23 vs ~0.12 di MSE nel nostro test) rispetto al vantaggio di non dover mai configurare nulla.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## `$ robustezza adversarial --tested`
|
|
152
|
+
|
|
153
|
+
9 test motore condivisi eseguiti fino in fondo, nessun crash, nessun NaN sfuggito. Nessuna difesa mai sotto il 64%:
|
|
154
|
+
|
|
155
|
+
| attacco | tipo | difesa |
|
|
156
|
+
|---|---|---|
|
|
157
|
+
| PGD / BIM / MI-FGSM | gradiente, 1000 passi | mitigato, V finale 0.013-0.078 |
|
|
158
|
+
| affine / elastico | geometrico, 50k iter | contenuto, V_inf 0.05-0.14 |
|
|
159
|
+
| Fourier broadband | dominio frequenza, 50k iter FFT | **99.78%+** |
|
|
160
|
+
| Carlini-Wagner (L2) | ottimizzazione | 78.96% |
|
|
161
|
+
| Carlini-Wagner (L∞) | ottimizzazione | **64.39%** — il punto più debole trovato finora |
|
|
162
|
+
| DeepFool | ottimizzazione | 78.79% |
|
|
163
|
+
| combinato (tutti insieme) | 150.140 passi totali | nessun gradiente esplosivo |
|
|
164
|
+
|
|
165
|
+
Onesto: **C&W in norma L∞ è l'attacco che buca di più** tra quelli testati. Non è un fallimento — resta protezione reale — ma è la crepa più vicina a un cedimento tra tutte le prove fatte, e va saputo prima di affidarci contro quello scenario specifico.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## `$ limiti --known`
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
1. semantica distingue deviazioni geometriche, non significati
|
|
173
|
+
2. modalita' cieca senza riferimento: buona per evitare collassi/NaN, non per
|
|
174
|
+
ricostruire con precisione un dato realmente perso
|
|
175
|
+
3. generalita' zero calibrazione richiesta, si applica a qualunque tensore --
|
|
176
|
+
a discapito di un pizzico di precisione dove esiste gia' un
|
|
177
|
+
modello dinamico noto e calibrato (es. Kalman su serie pure)
|
|
178
|
+
4. deriva lenta invisibile punto per punto, serve riferimento=baseline_storica
|
|
179
|
+
5. C&W norma L-inf la difesa piu' debole misurata finora (64%, contro 79-83%
|
|
180
|
+
delle altre varianti di attacco testate) -- vedi tabella sopra
|
|
181
|
+
6. adversarial attacchi costruiti apposta per mimare la coerenza del
|
|
182
|
+
adattivo segnale pulito (oltre a PGD/BIM/MI-FGSM/C&W/DeepFool/Fourier
|
|
183
|
+
gia' testati) non ancora coperti dalla suite
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## `$ license`
|
|
189
|
+
|
|
190
|
+
Business Source License 1.1 — uso gratuito non commerciale, converte in Apache 2.0 il `2029-06-01`. Vedi [LICENSE.md](LICENSE.md).
|
|
191
|
+
|
|
192
|
+
`© 2026 Salvatore Pennacchio <jtatopenn@libero.it>`
|
|
193
|
+
|
|
194
|
+
Parte dell'ecosistema **Sentinel**, insieme a [Dense-Evolution](https://github.com/tatopenn-cell/Dense-Evolution) (simulatore di circuiti quantistici NISQ).
|