Skip to content

Orca (full model shield)

orca

utility/orca.py Universal AI Orchestrator Shield (ORCA) -- orchestratore dinamico selettivo context-aware a 4 fasi.

Orca

Orca(static_threshold: float = 0.15, initial_damping: float = 0.85, alpha: float = 0.05, val_e: float = -4.0, chunk_threshold: Optional[int] = None, min_free_ram_percentage: float = 0.15, reference_memory_size: int = 32, reference_recall_min_score: float = 0.9)

val_e — esponente di scala target per la compressione log10 in ingresso; chunk_threshold — dimensione oltre la quale un batch viene processato a blocchi; None (default) lo auto-deriva da AIHardwareProfiler (RAM/backend dell'host corrente, vedi _CHUNK_THRESHOLD_BASELINE* sopra) invece del vecchio valore fisso uguale per qualunque macchina; reference_memory_size — quanti riferimenti puliti passati (per shape) tenere in memoria per il richiamo via risonanza in modalita' cieca (vedi _recall_reference); reference_recall_min_score — punteggio minimo di apply_fast_resonance sotto il quale un riferimento in memoria viene considerato non abbastanza simile e si ricade su _blind_reference (calibrato empiricamente: su vettori correlati lo score resta >0.95 anche con rumore moderato, su vettori scorrelati non supera ~0.75 — 0.90 lascia margine da entrambi i lati).

Source code in dense_armor/utility/orca.py
def __init__(self, static_threshold: float = 0.15, initial_damping: float = 0.85,
             alpha: float = 0.05, val_e: float = -4.0,
             chunk_threshold: Optional[int] = None, min_free_ram_percentage: float = 0.15,
             reference_memory_size: int = 32, reference_recall_min_score: float = 0.90) -> None:
    """val_e — esponente di scala target per la compressione log10 in ingresso;
    chunk_threshold — dimensione oltre la quale un batch viene processato a blocchi;
    None (default) lo auto-deriva da AIHardwareProfiler (RAM/backend
    dell'host corrente, vedi _CHUNK_THRESHOLD_BASELINE* sopra) invece del
    vecchio valore fisso uguale per qualunque macchina;
    reference_memory_size — quanti riferimenti puliti passati (per shape) tenere in
    memoria per il richiamo via risonanza in modalita' cieca (vedi _recall_reference);
    reference_recall_min_score — punteggio minimo di apply_fast_resonance sotto il
    quale un riferimento in memoria viene considerato non abbastanza simile e si
    ricade su _blind_reference (calibrato empiricamente: su vettori correlati lo
    score resta >0.95 anche con rumore moderato, su vettori scorrelati non supera
    ~0.75 — 0.90 lascia margine da entrambi i lati)."""
    self.static_threshold = static_threshold
    self.initial_damping = initial_damping
    self.alpha = alpha
    if chunk_threshold is None:
        profiler = AIHardwareProfiler()
        scale = profiler.max_tensor_dim / self._CHUNK_THRESHOLD_BASELINE_TENSOR_DIM
        chunk_threshold = int(self._CHUNK_THRESHOLD_BASELINE * scale)
        logger.info(
            "chunk_threshold auto-derivato da AIHardwareProfiler: %d (%s)",
            chunk_threshold, profiler.get_profile_summary(),
        )
    self.chunk_threshold = int(chunk_threshold)
    self.val_e = float(val_e)
    self.min_free_ram = min_free_ram_percentage
    self.reference_recall_min_score = float(reference_recall_min_score)
    self.stabilizer = AdaptiveSignalStabilizer(static_threshold, initial_damping, alpha)
    self.shield = ABCollatz(epsilon_target=1.0)
    self.last_kappa = 0.0
    # Guardia di memoria condivisa (RAM+VRAM), non piu' un check psutil
    # ad-hoc duplicato qui dentro (vedi _gc_se_ram_bassa).
    self._memory_guard = UniversalMemoryGuard(min_free_ram_percentage=min_free_ram_percentage)
    # Banca di riferimenti puliti visti in passato, una deque per shape
    # (le shape diverse non sono comparabili tra loro): quando il chiamante
    # fornisce x_reference, le sue righe vengono ricordate qui; in modalita'
    # cieca (x_reference=None) una richiesta futura con un input corrotto
    # simile a uno gia' visto puo' riusare il riferimento vero invece di
    # ripartire da zero con la sola stima locale (vedi _recall_reference).
    self._reference_bank: dict = {}
    self._reference_memory_size = int(reference_memory_size)
    # Kernel JAX precompilati una sola volta (stesso principio del fix
    # allo scan in AdaptiveSignalStabilizer.filter_data_stream): senza
    # questo, la pipeline eager di _execute_4_phase_*_shield ridispaccia
    # e ricompila ogni singola operazione JAX ad ogni chiamata.
    self._compiled_input_shield_kernel = jax.jit(self._run_input_shield_kernel)
    self._compiled_output_shield_kernel = jax.jit(self._run_output_shield_kernel)
    # margine d'errore (come la covarianza di Kalman, ma definito semplicemente
    # come |valore_ricevuto - valore_corretto|: quanto piu' lo scudo ha dovuto
    # spostare un valore, tanto meno ci si deve fidare del risultato in quel punto)
    self.margine_ingresso = None       # array, stessa forma dell'input: incertezza in SPAZIO INPUT
    self.margine_ingresso_medio = 0.0
    self.margine_ingresso_max = 0.0
    self.margine_uscita = None         # array, stessa forma dell'output: incertezza in SPAZIO OUTPUT
    self.margine_uscita_medio = 0.0
    self.margine_uscita_max = 0.0

protect_and_forward

protect_and_forward(ai_model_callable: Optional[Callable], x_corrupted: ndarray, x_reference: Optional[ndarray] = None, use_input_shield: bool = True, use_model_injection: bool = True, use_output_shield: bool = True) -> np.ndarray

Esegue le 4 fasi (scudo entrata -> modello -> scudo uscita) e ritorna l'output protetto.

Source code in dense_armor/utility/orca.py
def protect_and_forward(
    self,
    ai_model_callable: Optional[Callable],
    x_corrupted: np.ndarray,
    x_reference: Optional[np.ndarray] = None,
    use_input_shield: bool = True,
    use_model_injection: bool = True,
    use_output_shield: bool = True,
) -> np.ndarray:
    """Esegue le 4 fasi (scudo entrata -> modello -> scudo uscita) e ritorna l'output protetto."""
    is_simple_data_test = ai_model_callable is None or not use_model_injection
    if is_simple_data_test:
        logger.info("CONTRAZIONE LOGICA DETECTED: Riconosciuto Test di Protezione Dati Semplice (No IA Model).")
        use_model_injection = False

    # Un array 1D (es. una singola serie da sensore/pipeline) NON e' un
    # batch di N scalari indipendenti: e' UNA istanza con N campioni
    # correlati nel tempo. Senza questa promozione, B=N e ogni campione
    # veniva processato da solo (slice_shape=()), azzerando il contesto
    # su cui si basa il rilevamento outlier in modalita' cieca (senza
    # x_reference) -- il caso d'uso principale documentato nel README.
    was_1d = (x_corrupted.ndim == 1)
    if was_1d:
        x_corrupted = np.asarray(x_corrupted).reshape(1, -1)
        if x_reference is not None:
            x_reference = np.asarray(x_reference).reshape(1, -1)

    orig_shape = x_corrupted.shape
    B = orig_shape[0]
    slice_shape = orig_shape[1:]
    t_start = time.time()

    if use_input_shield:
        logger.info("Attivazione SCUDO ENTRATA (4 Fasi) su Ipervolume: %s", orig_shape)
        x_corrupted_np = np.array(x_corrupted)
        if x_reference is None:
            x_reference_np = np.zeros_like(x_corrupted_np)
            for b in range(B):
                row_flat = x_corrupted_np[b].flatten()
                recalled = self._recall_reference(row_flat, slice_shape)
                if recalled is not None:
                    x_reference_np[b] = recalled.reshape(slice_shape)
                else:
                    x_reference_np[b] = self._blind_reference(row_flat).reshape(slice_shape)
        else:
            x_reference_np = np.array(x_reference)
            self._remember_reference(x_reference_np, slice_shape)
        purified_batch = np.zeros(orig_shape, dtype=np.float64)
        margine_batch = np.zeros(orig_shape, dtype=np.float64)
        for b in range(B):
            flat_cl, flat_co = x_reference_np[b].flatten(), x_corrupted_np[b].flatten()
            total_elements = flat_cl.size
            out_flat = np.zeros_like(flat_cl)
            margine_flat = np.zeros_like(flat_cl)
            c_size = self.chunk_threshold if total_elements > self.chunk_threshold else total_elements
            for start_idx in range(0, total_elements, c_size):
                end_idx = min(start_idx + c_size, total_elements)
                purified_chunk, margine_chunk = self._execute_4_phase_input_shield(flat_cl[start_idx:end_idx], flat_co[start_idx:end_idx])
                out_flat[start_idx:end_idx] = purified_chunk
                margine_flat[start_idx:end_idx] = margine_chunk
                self._gc_se_ram_bassa()
            purified_batch[b] = out_flat.reshape(slice_shape)
            margine_batch[b] = margine_flat.reshape(slice_shape)
        x_for_model = jnp.array(purified_batch)
        self.margine_ingresso = margine_batch
        self.margine_ingresso_medio = float(np.mean(margine_batch))
        self.margine_ingresso_max = float(np.max(margine_batch))
        logger.info("Input purificato in %.3fs. Margine d'errore: medio=%.4g, max=%.4g",
                    time.time() - t_start, self.margine_ingresso_medio, self.margine_ingresso_max)
    else:
        logger.info("SCUDO ENTRATA disattivato. I dati transitano senza pre-filtri.")
        x_for_model = jnp.array(x_corrupted)
        self.margine_ingresso = None
        self.margine_ingresso_medio = self.margine_ingresso_max = 0.0

    if use_model_injection:
        t_ia = time.time()
        ai_output = ai_model_callable(x_for_model)
        jax.block_until_ready(ai_output)
        logger.info("Risposta IA ottenuta in %.3fs. Shape Output: %s", time.time() - t_ia, ai_output.shape)
    else:
        logger.info("INIEZIONE MODELLO bypassata. I dati purificati procedono verso la barriera spettrale.")
        ai_output = x_for_model

    if use_output_shield:
        t_out = time.time()
        logger.info("Attivazione SCUDO USCITA (4 Fasi) su Spettro Terminale...")
        if use_model_injection and x_reference is not None:
            # riferimento nello SPAZIO DI OUTPUT: risposta del modello al dato
            # pulito, non l'input purificato (spazio diverso se il modello e'
            # trasformativo, es. classificatori/embedding/reti non-lineari)
            output_reference = ai_model_callable(jnp.array(x_reference))
            jax.block_until_ready(output_reference)
        else:
            # nessun riferimento pulito noto: auto-consistenza cieca sull'output
            # stesso (stesso stabilizzatore della Fase 1, applicato qui all'uscita)
            output_reference = self.stabilizer.filter_batch_scenarios(
                ai_output.reshape(ai_output.shape[0], -1)).reshape(ai_output.shape)
        x_final, margine_out = self._execute_4_phase_output_shield(ai_output, output_reference)
        self.margine_uscita = np.array(margine_out)
        self.margine_uscita_medio = float(jnp.mean(margine_out))
        self.margine_uscita_max = float(jnp.max(margine_out))
        logger.info("Output rinormalizzato in %.3fs. Margine d'errore: medio=%.4g, max=%.4g",
                    time.time() - t_out, self.margine_uscita_medio, self.margine_uscita_max)
    else:
        logger.info("SCUDO USCITA disattivato. Emissione del flusso lineare.")
        x_final = ai_output
        self.margine_uscita = None
        self.margine_uscita_medio = self.margine_uscita_max = 0.0

    if was_1d:
        x_final = x_final.reshape(-1)
        if self.margine_ingresso is not None:
            self.margine_ingresso = self.margine_ingresso.reshape(-1)
        if self.margine_uscita is not None:
            self.margine_uscita = np.asarray(self.margine_uscita).reshape(-1)

    logger.info("Transito concluso. Sistema sigillato in %.3f secondi totali.", time.time() - t_start)
    return x_final

See also: Adaptive engine -- AdaptiveSignalStabilizer, Orca's Stage 1.