I costi nel risolutore interattivo di dipendenze

Costi e componenti dei costi
Costi di sicurezza

Costi e componenti dei costi

Il costo di una soluzione prodotta dal risolutore interattivo di dipendenze è un valore che aptitude usa per determinare quanto «brutta» sia quella soluzione. Le soluzioni che sono «migliori» sono sempre visualizzate prima di quelle che sono «peggiori». Il costo delle soluzioni è definito nell'opzione di configurazione Aptitude::ProblemResolver::SolutionCost.

Alcuni dei costi tipici sono mostrati in Esempio 2.1, «Esempi di costi del risolutore».

Esempio 2.1. Esempi di costi del risolutore

Il costo predefinito, che ordina le soluzioni in base al loro costo in sicurezza e poi alla loro priorità di pin di apt:

safety, priority

Rimuovere meno pacchetti possibile, quindi annullare quante meno azioni possibile.

removals, canceled-actions

Ordinare le soluzioni in base al numero di pacchetti che rimuovono più due volte il numero di azioni che annullano.

removals + 2 * canceled-actions

Come si può vedere nell'esempio precedente, un costo non è necessariamente un singolo numero. In effetti, un costo consiste di uno o più componenti di costo, ciascuno dei quali è un numero associato alla soluzione. Quando le soluzioni vengono ordinate, il risolutore esamina i componenti di costo in ordine, procedendo ai componenti successivi solo se i precedenti sono uguali. Per esempio, nel costo «removals, canceled-actions» (rimozioni, azioni-annullate) le soluzioni con meno rimozioni appaiono sempre prima di quelle con più rimozioni, indipendentemente da quante azioni annullate abbiano. Tuttavia, le soluzioni con lo stesso numero di rimozioni vengono ordinate in modo che quelle con meno azioni annullate appaiano prima.

I componenti di costo sono di due tipi: componenti di costo di base e componenti di costo composti.

I componenti di base indicano semplicemente una qualche proprietà della soluzione, come «upgrades» (aggiornamenti) o «removals» (rimozioni). Si può vedere un elenco dei componenti di base incorporati forniti da aptitude in Tabella 2.1, «Componenti di costo di base». È anche possibile creare i propri componenti di costo usando i suggerimenti add-to-cost-component e raise-cost-component; per i dettagli vedere sezione chiamata «Configurare i suggerimenti per il risolutore».

Ciascun componente di base è un contatore oppure un livello. I contatori calcolano quante azioni di una soluzione soddisfino una qualche condizione (come rimuovere pacchetti o installare nuovi pacchetti), mentre i livelli associano un numero ad ogni azione e calcolano il più alto numero associato con ciascuna azione nella soluzione.

Tabella 2.1. Componenti di costo di base

NomeTipoDescrizione
broken-holdsContatore Conta il numero dei blocchi che la soluzione infrange, se al risolutore è permesso infrangerli (Aptitude::ProblemResolver::Allow-Break-Holds).
canceled-actionsContatore Conta il numero delle azioni in attesa che la soluzione annulla (mantenendo i pacchetti alla loro versione attuale).
installsContatore Conta il numero dei pacchetti che la soluzione installa.
non-default-versionsContatore Conta il numero delle versioni che la soluzione installa o aggiorna da sorgenti che non sono quella predefinita.
priorityLivello Un valore che aumenta al diminuire della priorità di pin di apt per una versione. Specificatamente viene calcolato come il valore della priorità di pin con segno opposto (perciò, ad esempio, se la priorià di pin è 500, questo componente sarà -500).
removalsContatore Conta il numero dei pacchetti che la soluzione rimuove.
removals-of-manualContatore Conta il numero dei pacchetti installati manualmente che la soluzione rimuove.
safetyLivello Un valore largamente euristico che aumenta quando le azioni diventano meno «sicure»; per i dettagli vedere sezione chiamata «Costi di sicurezza».
upgradesContatore Conta il numero dei pacchetti che la soluzione aggiorna.

I componenti composti vengono costruiti combinando il valore dei componenti di base. Per esempio, removals + canceled-actions (rimozioni + azioni-annullate) somma i componenti removals e canceled-actions ottenendo come risultato un componente che conta il numero di rimozioni e di azioni annullate. I componenti composti combinano i contatori sommandoli insieme e i livelli prendendo il loro valore massimo, come mostrato in Figura 2.11, «Sintassi per i componenti di costo composti».

[Nota]Nota

È un errore sommare due livelli o prendere il massimo tra due contatori oppure combinare in qualsiasi modo livelli e contatori. Ad esempio, i costi removals + safety e max(upgrades, installs) vengono trattati come errori e ignorati dal risolutore.[13]

Figura 2.11. Sintassi per i componenti di costo composti

Sommare due o più costi base:

                [scala1]*costo1 + [scala2]*costo2 + ...
              

Prendere il valore massimo tra due o più costi base:

                max([scala1]*costo1, [scala2]*costo2, ...)
              

Notare che ciascun componente di base può essere moltiplicato per un fattore di scala prima di venir combinato con gli altri componenti. Ciò può essere usato per controllare i compromessi che il risolutore fa tra i costi. Ad esempio, un costo pari a 2*removals + 3*upgrades indica che tre rimozioni sono esattamente «brutte» come due aggiornamenti. Le soluzioni che contengono quattro rimozioni e un aggiornamento saranno considerate equivalenti a quelle che contengono una rimozione e tre aggiornamenti, dato che entrambe hanno un costo pari a undici.

Costi di sicurezza

Figura 2.12. Livelli dei costi di sicurezza

Livelli dei costi di sicurezza
[diagramma dei livelli dei costi di sicurezza]

Il componente di costo safety è una stima euristica di quanto «sicura» o «non sicura» sia una soluzione. Si può pensare ai costi di sicurezza come ad un modo per dividere le soluzioni in diversi «livelli» numerati, dando ai livelli «meno sicuri» numeri più alti. Figura 2.12, «Livelli dei costi di sicurezza» mostra come ciò funzioni con le impostazioni predefinite di aptitude.

[Suggerimento]Suggerimento

I livelli dei costi di sicurezza sono solo un modo di controllare l'ordine in cui vengono presentate le soluzioni delle dipendenze. Vedere sezione chiamata «I costi nel risolutore interattivo di dipendenze» per una descrizione completa di come si possa cambiare il criterio con cui aptitude ordina le soluzioni.

In modo predefinito, aptitude inizializza il risolutore con un «ragionevole» insieme di livelli per i costi di sicurezza. Questi sono:

Tabella 2.2. Livelli predefiniti per i costi di sicurezza

Livello di costoDescrizioneOpzione di configurazione
10.000 Soluzioni che includono solo azioni «sicure» (installare il candidato predefinito per un pacchetto o mantenere un pacchetto alla sua versione attuale) e rimozioni di pacchetti. Aptitude::ProblemResolver::Safe-Level, Aptitude::ProblemResolver::Remove-Level
10.000 La soluzione che annulla tutte le azioni dell'utente. Una volta era più alta di Aptitude::ProblemResolver::Remove-Level, ma alla rimozione dei pacchetti veniva assegnata una posizione più alta del mantenere gli stessi pacchetti, anche se il pacchetto doveva essere aggiornato. Aptitude::ProblemResolver::Keep-All-Level
40.000 Soluzioni che infrangono blocchi impostati dall'utente o installano versioni proibite. Aptitude::ProblemResolver::Break-Hold-Level
50.000 Soluzioni che installano pacchetti da versioni non predefinite (come «experimental», ad esempio). Aptitude::ProblemResolver::Non-Default-Level
60.000 Soluzioni che rimuovono pacchetti Essenziali Aptitude::ProblemResolver::Remove-Essential-Level

Se una soluzione corrisponde a diversi livelli di costo, verrà messa in quello più alto, cioè l'ultimo nell'ordine dell'elenco. Ad esempio, una soluzione che aggiorna un pacchetto alla sua versione predefinita e infrange un blocco su un secondo pacchetto viene posta al livello 40.000. Si possono regolare i livelli delle singole versioni usando i suggerimenti per il risolutore; per i dettagli vedere sezione chiamata «Configurare i suggerimenti per il risolutore». I livelli predefiniti sono illustrati in Figura 2.12, «Livelli dei costi di sicurezza».

Oltre ai numeri si possono anche usare le parole chiave «maximum» e «minimum» per i livelli di costo. Fanno riferimento, rispettivamente, al valore intero massimo o minimo possibile nell'architettura hardware del sistema in uso.



[13] Questo limite è stato imposto perché strutture di costo più complesse avrebbero potuto rendere difficile l'ottimizzazione del risolutore. Le versioni future del programma potrebbero eliminare alcune delle limitazioni se si rivelassero non necessarie.