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
Nome | Tipo | Descrizione |
---|---|---|
broken-holds | Contatore |
Conta il numero dei blocchi che la soluzione infrange, se al risolutore è
permesso infrangerli (Aptitude::ProblemResolver::Allow-Break-Holds ).
|
canceled-actions | Contatore | Conta il numero delle azioni in attesa che la soluzione annulla (mantenendo i pacchetti alla loro versione attuale). |
installs | Contatore | Conta il numero dei pacchetti che la soluzione installa. |
non-default-versions | Contatore | Conta il numero delle versioni che la soluzione installa o aggiorna da sorgenti che non sono quella predefinita. |
priority | Livello | 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). |
removals | Contatore | Conta il numero dei pacchetti che la soluzione rimuove. |
removals-of-manual | Contatore | Conta il numero dei pacchetti installati manualmente che la soluzione rimuove. |
safety | Livello | Un valore largamente euristico che aumenta quando le azioni diventano meno «sicure»; per i dettagli vedere sezione chiamata «Costi di sicurezza». |
upgrades | Contatore | 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 | |
---|---|
È un errore sommare due livelli o prendere il massimo tra due contatori
oppure combinare in qualsiasi modo livelli e contatori. Ad esempio, i costi
|
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.
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 | |
---|---|
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 costo | Descrizione | Opzione 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.