Dragonero GDR: una sessione introduttiva per nuovi giocatori – terza parte

Terza e ultima parte dell’avventura. Potete recupecare i post con la prima e la seconda parte.

La fuga

Usciti dalla città, i quattro si dirigono verso il mare seguendo la strada che corre parallela alla riva del fiume. Non troppo lontano dalle mura, il bosco lascia spazio ad alcuni campi coltivati. Da una fattoria provengono urla e rumori.

Restando in silenzio, dalla strada il gruppo si accorge che un paio di orchi sta colpendo con forza la porta della fattoria. Non c’è alcuna discussione, gli avventurieri decidono di intervenire.

Dato che i due orchi danno loro le spalle e sono impegnati a cercare di entrare nell’edificio, Mugrim e Oparal cercano di avvicinarsi silenziosamente per verificare la situazione, in modo da evitare di incontrare un gruppo troppo numeroso. L’accordo con gli altri è che segnaleranno il via libera scagliando una freccia.

Una volta attraversato un campo, mantenendosi nascosti dietro l’alta coltivazione, i due raggiungono un punto a metà strada tra la casa e il granaio, dove notano un altro orco sul lato dell’edificio. Mentre dall’interno provengono pianti e grida disperate, con in mano una torcia già accesa, il guerriero sta evidentemente considerando di stanare gli occupanti con il fuoco.

Mugrim scaglia una freccia, ma Duncan e il mago sono distratti e non se ne accorgono. Non vedendo arrivare gli amici, Mugrim decide di tornare indietro per avvertirli.

Oparal non ha voglia di aspettare i compagni, sgattaiola alle spalle dell’orco e cli pianta un pugnale tra spalla e collo. L’orco lancia un urlo e fronteggia la ladra.

I due razziatori ssol fronte della casa i girano verso sinistra, attirati dalla voce del ferito. Sentito l’urlo, i 3 eroi si lanciano all’attacco, approfittando della distrazione dei due orchi.

Duncan si avventa sull’orco più a sinistra e con un potentissimo fendente della sua ascia bipenne lo colpisce alla base del collo, spaccandogli a metà la cassa toracica e uccidendolo sul colpo. Mugrim invece si avventa su quello più a destra, colpendolo con forza alla schiena con l’enorme ascia. Dalla distanza, il mago fa fluire l’energia magica attraverso il proprio corpo, trasferendola dall’ambiente circostante e concentrandola nel proprio pugno. Raggiunta subita la quantità di forza magica necessaria, sferra un pugno. Immediatamente, l’aria davanti alla sua mano si addensa, diventando come solida, ed è scagliata come un proiettile verso l’orco superstite. Il colpo lo raggiunge alla testa, l’impatto scaraventa il grosso pelleverde a terra, da cui non si rialzerà più.

Nel frattempo, superato il primo momento di confusione, l’ultimo orco sopravvissuto ha lasciato cadere la torcia per poter prendere l’ascia appesa alla cintura. Oparal si allontana da lui per evitare di essere colpita.

Duncan e Mugrim raggiungono la ladra e si piazzano tra lei e l’orco. Duncan tenta un fendente contro il nemico, ma il colpo rimbalza sulla spessa armatura di cuoio. Mugrim invece riesce a ferirlo al fianco. In un impeto di furia, il razziatore tenta di colpire Duncan, ma il dolore per le ferite è lancinante e manca il colpo, accasciandosi a terra puntelandosi con l’ascia. Oparal ne approfitta subito, sguscia alle spalle dell’orco e gli piazza due pugnali nel collo, uccidendolo.

I quattro avventurieri si dirigono quindi alla porta, da cui continuano a provenire singhiozzi e pianti disperati. Duncan bussa, cercando di tranquillizzare gli occupanti relantivamente allo scampato pericolo. Dall’interno non sono molto convinti, ma dopo un paio di tentennamenti aprono la porta. All’interno c’è una donna con un paio di bambini di circa 8 anni. I due ragazzini impugnano dei manici di scopa, in un vano tentativo di difendere la madre. Da dietro un tavolo sbuca una bambina più piccola. Alla vista di Mugrim, questa inizia a piangere e strillare.

Duncan presente l’orco come un amico, qualcuno che li ha aiutati, ma la bambina continua a urlare. Temendo che altri razziatori possano sentirla, Mugrim urla “SILENZIO!”. La bambina balbetta e si ammutolisce. Gli avventurieri danno uno sguardo alla casa, una semplice abitazione da contadini che non contiene nulla di valore, con grande disappunto di Oparal.

Duncan chiede alla donna cosa sia successo, questa spieg come il marito abbia preso il cavallo per andare a chiedere aiuto in città appena notato il gruppo di orchi al margine dei campi coltivati. Il guerriero le fa sapere come loro si stiano dirigendo verso il mare, dato che la città non è sicura, ma di come la strada sia lunga per dei bambini così piccoli. La donna rassicura i quattro, dicendo che nascusta sulla riva del fiume vi è una chiatta che utilizzano per trasportare con facilità gli animali. L’imbarcazione può ospitare comodamente un paio di mucche e un paio di persone, quindi loro dovrebbero riuscire a sarci anche se un po’ stretti.

Senza attendere oltre, tutti si dirigono verso la strada. Per evitare problemi, il mago lancia una fitta nebbia tra loro e la riva del fiume. Tutti camminano in fila indiana, tenendosi per mano, con Mugrim in cima al gruppo per poter seguire meglio il terreno. Dalla strada, in direzione della città, provengono urla di battaglia, ma la nebbia impedisce a chiunque di vedere cosa stia succedendo.

Raggiunta la chiatta, il gruppo si dirige verso la foce del fiume raggiungendola dopo qualche ora di navigazione. Al largo si notano subito numerose navi e sulla riva sono presenti alcune lance guardate a vista da soldati imperiali. I bambini e la donna corrono subito verso le imbarcazioni, dove sono giù raccolti alcuni sopravvissuti all’attacco alla città. I soldati li accolgono in modo tranquillizzante, ma subito si irrigidiscono alla vista di Mugrim. Duncan tenta di spiegare come l’orco sia stato cruciale nel salvare queste persone, ma i soldati portano le mani alle armi. Il mago si fa avanti, e facendo pesare il proprio rango, riprende fermamente i soldati. Questi scattano subito sull’attenti, scusandosi per i propri modi, e invitano i quattro avventuriari su una delle lance.

Diretti verso una delle grandi navi al largo, tutti si rilassano dopo la concitazione delle ultime ore. La donna guarda con serenità i propri figli, e rivolgendosi ai suoi salvatori porge una piccola borsa di denaro che teneva nascosta nei vestiti. Il pegno di ringraziamento è molto apprezzato, soprattutto da Oparal.

Il gruppo ha provato la propria forza contro dei nemici determinati ed è pronto alla prossima avventura.

Dragonero GDR: una sessione introduttiva per nuovi giocatori – seconda parte

Seconda parte dell’avventura. Qui la prima parte.

L’incendio

Gli avventori della locanda fuggono dalla porta principale, mentre i quattro avventurieri, vedendo del fumo provenire dalle scale, decidono di provare a soccorrere chi fosse rimasto al piano superiore.

Nella fretta di salire le scale, l’orco scivola e batte la testa su un gradino. Oparal e Duncan non riescono a scorgere molto oltre le fiamme e il fumo, ma il mago percepisce chiaramente che quel fuoco non è naturale. Le fiamme sono indomabili e non c’è nulla che loro possano fare.

I quattro decidono quindi di fuggire verso la strada, trovandosi al crocevia principale della città. Nel quartiere a est è in corso un enorme incendio, mentre l’edificio di fronte a loro, sede della milizia cittadina, è parzialmente in fiamme e sta iniziando a crollare. I quattro sanno che le strade possibili restano tre: una va verso la banchina, una porta verso il cancello principale nelle mura e segue il corso del fiume, l’altra va verso la foresta. Visto l’incendio, l’ipotesi foresta è scartata e si decide di procedere verso la banchina, sperando di trovare una chiatta per attraversare il fiume.

Mentre corrono lungo la strada, l’ultimo piano di un edificio esplode in una grande vampata e parte del tetto precipita verso terra. Duncan, che si trova davanti agli altri, accelera e con uno scatto schiva i detriti. L’orco e l’elfa invece, distratti dalle urla dei passanti e concentrati nella fuga, sono colpiti da un pezzo di cornicione che li ferisce leggermente. Il mago è coinvolto nel crollo, non è ferito ma resta leggermente intontito. Tutti e quattro riprendono a correre.

La banchina sul fiume si presenta come un inferno. La chiatta, coinvolta nell’incendio, è mezza affondata. Nonostante questo, il fuoco continua a consumarla anche sott’acqua. Alcuni cittadini con gli abiti in fiamme cercano inutilmente la salvezza gettandosi nel fiume. Altri stanno nutando disperatamente verso l’altra sponda.

Alle loro spalle, dalla strada che porta alla foresta, provengono urla concitate. Non sono richiami disperati degli abitanti, Duncan e Mugrim distinguono incitamenti da battaglia tipici degli orchi. Non riescono però a comprendere le esatte parole, quindi non è chiaro per quale motivo i pelleverde stiano attaccando la città.

Gli avventurieri iniziano a discutere animatamente. L’orco è l’unico capace di nuotare con una certa abilità, ma dovrebbe farsi carico di trasportare alcuni degli altri e la cosa richiederebbe più viaggi. Duncan sottolinea come sarebbero comunque indifesi, non avendo con sè le armi, rimaste alla locanda. L’unico ad avere qualcosa di simile a un’arma è il mago, che non si è mai separato dal proprio bastone. Qualcuno deve tornare indietro per recuperarne qualcuna.

Mugrim si propone volontario, potendo contare sull’aspetto per confondersi meglio tra gli assalitori, mentre gli altri resteranno nascosti al molo. L’orco torna quindi indietro, superando edifici ormai quasi consumati dalle fiamme. La locanda è uno di questi, le loro armi sono ormai perdute. Mugrim inizia quindi a frugare tra quello che resta dell’edificio delle milizia lì vicino. Nonostante i suoi sforzi, riesce a trovare solo pietre e macerie consumate dal fuoco.

Nel frattempo, Oparal non si dà pace, non essendo abituata a star ferma ad aspettare che qualcuno la assalga, soprattutto se disarmata. L’elfa inizia a frugare disperatamente nelle poche casse del piccolo porto fluviale, ma non trova nulla a parte delle gomene e dei barili vuoti.

Sentendo avvicinarsi le voci degli orchi, Mugrim rinuncia a cercare e corre verso la porta principale della città. I cancelli sono stati aperti per agevolare la fuga degli abitanti. C’è un posto di guardia abbandonato, probabilmente perché la guarnigione è tutta concentrata a respingere gli assalitori. Fortunatamente, nel posto di guardia vi sono numerose armi, tra cui anche un’ascia tipica delgi orchi, probabilmente sequestrata a qualche nativo. Dopo aver raccattato il possibile (due asce, arco e frecce, vari coltelli), Mugrim ripercorre al contrario la strada fatta.

All’incrocio principale, di fianco alla locanda ormai distrutta, gli si para davanti un orco dell’avanguardia, che lo guarda confuso chiedendosi come sia possibile che qualcuno l’abbia preceduto. Prima che l’aggressore possa capire, Mugrim gli urla in faccia cercando di spaventarlo. Terrorizzato e ritenendo l’aggressione un tentativo di marcare il territorio per un eventuale bottino, l’orco d’avanguardia fugge spaventato.

Raggiunti i compagni, ciascuno recupera le armi con cui è più a proprio agio: Duncan prende l’ascia bipenne, Oparal un set di pugnali e Mugrim tiene per sè l’arco e l’ascia più grande.

I richiami di guerra sono sempre più vicini, e giusto un momento prima di correre verso la battaglia, la ladra decide di dare un’ultima occhiata ai dintorni. Con molta fortuna trova uno stretto vicolo seminascosto, usato tipicamente per traffici illegali nella zona portuale. Preferendo evitare uno scontro diretto, i quattro si incamminano nel vicolo, raggiungendo le mura. Una piccola apertura con una pesante porta di legno, rinforzata con bande di ferro, si trova davanti a loro. L’elfa si propone per scassinare la serratura, ma Duncan sottolinea come, trovandosi dalla parte interna delle mura, il chiavistello sia proprio lì davanti a loro.

La porta si apre senza problemi e il gruppo fugge in direzione del mare, lasciandosi alle spalle la città in fiamme.

Continua domani…

Dragonero GDR: una sessione introduttiva per nuovi giocatori

Questo è il primo post di 3. Se vuoi saltare l’antefatto e andare direttamente al racconto della sessione di gioco, clicca qui.

Antefatto

Quando uscì, un paio di Lucca Comics fa, acquistai una copia del manuale del gioco di ruolo di Dragonero. Dragonero è una serie a fumetti che mi piace particolarmente, quindi ero molto interessato a vedere come poter giocare utilizzando quell’ambientazione. Il sistema di gioco è una variazione di Pathfinder, i punti di contatto con D&D terza edizione ci sono, ma ci sono anche molte modifiche.

L’anno successivo sono riuscito, con altre due persone (una digiuna di giochi di ruolo, l’altra appassionata di videogiochi come Dragon Age), a giocare una sessione dimostrativa allo stand della Wyrd (editore del manuale). Visto che agli altri due la cosa è piaciuta, abbiamo deciso di provare a mettere su un gruppo. Dopo un po’ di incastri di tempo e persone andati a male, qualche giorno fa siamo riusciti a giocare una sessione di prova insieme ad altre due persone completamente ignare di cosa fosse un gioco di ruolo, ma appassionate del “Trono di spade”.

Io fungevo da master e avevo preparato una mini avventura da poter giocare in un’oretta. Avevo deciso di non usare tutte le regole, perché lo scopo era invogliare i due nuovi a imbarcarsi in questo viaggio insieme. Sempre per questo motivo, abbiamo utilizzato i personaggi preparati dalla Wyrd e non abbiamo creato i personaggi sul momento. Se la cosa andrà in porto, probabilmente ci saranno delle modifiche ai protagonisti.

Sottolineo come questa fosse la mia prima sessione di gioco da master, i suggerimenti sono bene accetti.

Fine antefatto, via con la sessione.

Eroi per forza

Attenzione: se non hai letto i primi 4 numeri di Dragonero, potrebbe contenere SPOILER. Questa sessione funge da antefatto all’avventura “Echi di guerra” di Dragonero GDR (venduta insieme al manuale).

Amotheàrt, città fluviale degli umani situata nell’isola degli orchi. L’insediamento negli ultimi anni si è trasformato da avamposto militare dell’impero in una città fortificata di media grandezza, grazie alle ricche miniere delle vicinanze. Non è molto lontana dalla foce del fiume, su cui usualmente transitano varie imbarcazioni per trasporto merci.

La locanda

Alla locanda è una serata come le altre: un gran baccano, clienti che mangiano e bevono alla lunga tavolata posta nel mezzo della grande sala centrale. Delle fantesche si spostano tra la cucina e il tavolo portando bevande e cibarie di ogni tipo. Alcune cameriere fanno su e giù dalle scale che portano al piano superiore, cercando di completare la preparazione delle stanze per gli ospiti prima del tramonto.

Si sono formati dei piccoli gruppi di persone, che sedendo vicine si scambiano battute o si vantano di imprese mai compiute. Alla fine del tavolo, nella parte meno in vista e più lontana dall’ingresso, siedono alcuni clienti inusuali.

Mugrim Lupogrigio è un orco esploratore, esperto conoscitore dell’isola, che ha deciso di avventurarsi nella città. Non avendo un clan di appartenenza, nutre sentimenti meno ostili verso gli umani in confronto alla media dei suoi simili. Essendo palesemente fuori posto, è il primo a presentarsi e a cercare di attaccare discorso con gli altri.

Il mago alla sua destra lo guarda con attenzione, soppensandolo. Quasi subito decide di concentrarsi sulla cena, non avendo trovato nulla di interessante in questo loquace energumeno dalla pelle verde.

L’orco si rivolge quindi ad altri due commensali, seduti alla parte opposta del tavolo: un’elfa dai movimenti rapidi e un umano con indosso una corazza di cuoio.

L’umano è Duncan, un amichevole guerriero mercenario. Duncan ha deciso di passare una vacanza “rilassante” sull’isola: possibili risse con gli orchi sono certamente meno impegnative delle sue passate esperienze. L’elfa, di nome Oparal, si presenta come una esploratrice, ma Duncan non è molto propenso a crederle. Oparal insiste, sostenendo di essere una viaggiatrice che vaga per il mondo, ma Duncan inizia a guardarla con maggiore sospetto ed è molto diretto nel dimostrare la propria incredulità.

Vista anche la stazza del guerriero, l’elfa cede, confessando di essere una ladra in cerca di un tesoro sull’isola. Le è stato fatto credere che ve ne sia uno cospicuo nell’entroterra, ma non ha una mappa per raggiungerlo.

Duncan inizia a ridere, non ritiene possibile che un’elfa così minuta possa sopravvivere all’interno dell’isola, con clan di bellicosi orchi a ogni angolo. Si propone come guardia del corpo, per un giusto prezzo, e chiede all’orco se abbia mai sentito parlare di questo tesoro e se sia disponibile ad accompagnarli, vista la sua conoscenza del territorio.

Mugrim risponde che questo tesoro è una novità anche per lui, ma che è disponibile ad accompagnare questi azzardati avventurieri, principalmente perché non se la sente di averli sulla coscienza.

Tutti e tre guardano il mago, Duncan chiede gentilmente se si possa unire a loro, visto che la magia potrebbe essere utile in un viaggio simile. Il mago li guarda, si stringe nelle spalle e acconsente.

Felici per l’accordo raggiunto, i quattro brindano all’avventura che li aspetta. In quel momento la pesante porta d’ingresso si spalanca, una persona visibilmente spaventata entra cercando riparo, mentre si sentono delle urla provenire dalla strada. Gli avventori si agitano, alcuni cercano di raggiungere l’uscita per verificare cosa possa essere successo.

Oparal guarda con interesse le borse di denaro appese alle cinture dei clienti, che distratti dall’improvvisa confusione sarebbero delle prede molto facili.

Un forte boato proveniente dal piano superiore zittisce tutti i commensali. Le pareti della locanda tremano e una cameriera con gli abiti in fiamme ruzzola giù dalle scale, accasciandosi vicino alla porta della cucina.

Continua domani…

Dynamic programming: Hidden Markov Models

Following the introduction on dynamic programming, I’m giving an example using Hidden Markov Models (HMM). Since I’m not here to teach math or the usage of such tools in bioinformatics, but just to present an application of the method, I’ll try to keep everything simple.

Let’s try a simple example: the “grumpy cat model”. This cat can be in a good or bad mood, but since it is grumpy it is more likely to stay in a bad mood. Let’s say that a mood lasts the whole day. Also, when the cat is in a bad mood it is more likely to scratch the carpet than to purr, while the opposite happens when in a good mood.

What you want to achieve with the HMM is to know something about good and bad mood days given the observation of scratched carpet and repeated sounds. In other words, the emotional state of the cat is hidden and you would like to know it given the model.

In general, you need a set of states, the probability of moving from one state to another (given an input) and some observable features. In our “grumpy cat model” example: states can be “good mood” and “bad mood“, the probability of going from good to bad is 75% and from bad to good is 40%. The observable features are “scratched carpet“, with an 80% probability to happen when in bad mood and 30% while in good mood, while 20% and 70% are for “purr“, respectively.

Also we need to know how likely is to start in a bad mood, let’s say 60%. Reaching the END states has a 5% probability for both the bad and the good mood. In this example, the END is the death of the cat.

First and most simple application of dynamic programming to HMM is to answer the following question: how likely is to have a specific sequence of observation given the model? I.e. how likely is to have 5 days of scratched carpet, or 2 purr days + 3 scratched carpet days given our grumpy cat model?

This can be achieved by using the forward algorithm. It starts with a table, in our example with 4 rows (one of START, one for BAD mood, one for GOOD mood and one of END) and 7 columns (the 5 days plus one column for the begin and one for the end).

In the first column you have 1 for START and 0 for everything else (initialization of probabilities).

Beginning
Scratch Scratch Scratch Scratch Scratch Pr.
START 1
GOOD 0
BAD 0
END 0

The iteration is the following: the table cell in row I and column J+1 contains the probability of observing the feature J+1 while in state I (i.e. if I is BAD and J+1 is scratched carpet, you use the value 0.8) times the sum of the values in the previous column (J) each multiplied by the probability of moving from that row to the current one.

Day 1
Scratch Scratch Scratch Scratch Scratch Pr.
START 1
GOOD 0  0.4*0.3
BAD 0  0.6*0.8
END 0

This was easy: you have 0.4 probability of going from START to GOOD state, and you have 0.3 probability of a scratchy cat in a good mood. Then you have 0.6 probability of going from START to BAD and 0.8 probability of scratch while in bad MOOD.

Moving to the next column:

Day 2
Sc. Scratch Sc. Sc. Sc. Pr.
START 1
GOOD 0  0.12 0.3*(0.2*0.12 + 0.4*0.48)
BAD 0  0.48  0.8*(0.75*0.12 + 0.55*0.48)
END 0

In this case, for the GOOD state we have that either the cat stayed in a good mood, or it changed mood from a bad one to the good one. We have 0.2 chance of staying in a good mood times the chance on the good mood in the previous column (0.12), plus the chance of moving from a bad mood to a good mood (0.4) times the probability of bad mood in the previous column (0.48). The sum of these probabilities is multiplied by the chance of seeing a scratch while in a good mood (0.3).

The same reasoning applies for the bad mood.

This process is then iterated for the remaining columns, as shown in the following tables.

Day 3
Sc. Sc. Scratch Sc. Sc. Pr.
START 1
GOOD 0  0.12 0.065  0.3*(0.2*0.065 + 0.4*0.28)
BAD 0  0.48  0.28 0.8*(0.75*0.065 + 0.55*0.28)
END 0
Day 4
Sc. Sc. Sc. Scratch Sc. Pr.
START 1
GOOD 0  0.12 0.065 0.038  0.3*(0.2*0.038 + 0.4*0.163)
BAD 0  0.48  0.28 0.163  0.8* (0.75*0.038 + 0.55*0.163)
END 0
Day 5
Sc. Sc. Sc. Sc. Scratch Pr.
START 1
GOOD 0  0.12 0.065 0.038 0.022  0.3*(0.2*0.022 + 0.4*0.095)
BAD 0  0.48  0.28 0.163 0.095  0.8*(0.75*0.022 + 0.55*0.095)
END 0

After the last day, there is no emission, then the probabilities of the two states (moods) times the probability of reaching the end from that state (5% for both) are summed.

End
Sc. Sc. Sc. Sc. Sc. Pr.
START 1
GOOD 0  0.12 0.065 0.038 0.022 0.013
BAD 0  0.48  0.28 0.163 0.095 0.055
END 0  0.013*0.05 + 0.029*0.05

So, there is a 0.003, i.e. a 0.3% probability of observing 5 days of scratching given our grumpy cat model.

The dynamic programming approach evaluates just one column at the time while considering only the previous one. In this way, we can compute the probability for sequences of any length (i.e. as many days as we want) without using complex algorithms.

As exercise, you could try to compute the same matrix for the sequence of observations “Purr, Purr, Scratch, Scratch, Scratch”.

Jan 25 2016: the post has been edited to fix the transition probability to the END state.

Bucovina

Domenica ho conosciuto Adrian.

Era sdraiato per terra sotto la pensilina di una fermata dell’autobus, nella prima periferia di Bologna. Via Bentini di solito è abbastanza trafficata, ma alle 15 di domenica col caldo che c’era è probabile che nessuno sia passato di là. O si sia voluto fermare.

Passavo con la bici, dopo un paio d’ore di pedalata, cercando di arrivare a un parco lì vicino per fermarmi a prendere un gelato. Invece mi sono fermato per capire se quella persona per terra avesse avuto un malore, o peggio. Un signore anziano con un’auto si è fermato a chiedere cosa fosse successo e poi ha deciso di proseguire, non so se perché convinto che me ne stessi occupando io o perché non c’era un morto di cui poter parlare al circolo.

Gli metto una mano sulla spalla, lo scuoto e lo chiamo. Lui si sveglia, con un po’ di difficoltà ma abbastanza velocemente. Forse stava solo dormendo, o forse no. Recuperata dell’acqua in un bar lì vicino, ho cercato di farlo parlare per capire se fosse meglio chiamare l’ambulanza.

Sapeva chi era e dov’era. Alle domande ha risposto raccontandomi un po’ di cose. Non so se fossero tutte vere, ma non credo fosse quello il punto.

Originario della regione rumena della Buconiva (“è come Trento per voi”), dice di saper parlare tre lingue e di avere diversi diplomi professionali, tra cui quello di infermiere. Ha alle spalle una separazione, o un divorzio, non crede di poter trovare un’altra donna (“una di venti anni non si metterebbe con me”). Trova da mangiare in un banco alimentare e gli assistenti sociali gli avevano trovato un posto dove dormire, insieme ad altre nove persone, ma lui preferisce stare fuori.

Gli suggerisco di spostarsi almeno al parco lì vicino, è sicuramente più fresco e più comodo del marciapiede a mezzo metro da una strada trafficata. Preferisce di no, ha paura che qualcuno “gli spacchi la testa” per prendere le sue poche cose.

Lo aiuto a mettersi seduto sulla panchina e continuo a porgergli la bottiglia d’acqua. Lui ha una bottiglia con sé in una busta di plastica, ma preferisco essere sicuro che beva acqua.

Dice di essere stato in Afghanistan, che non sembra ma lui è molto forte, è solo un po’ dimagrito. Subito dice che anche se si sa difendere, lui non cerca guai. Vorrebbe un lavoro ma non lo riesce a trovare, dice che per gli africani e i cinesi è più facile, probabilmente perché accettano condizioni pessime. Non vuole neanche passare per il “solito rumeno”, e mima il gesto di sfilarmi qualcosa dalla tasca.

Per la terza volta insisto a voler chiamare l’ambulanza, ma lui è irremovibile. Mi racconta dei suoi problemi di salute. “Ho 9 malattie”, dice, e subito aggiunge “nessuna è contagiosa”. Inizia a elencarle, partendo dalla cirrosi epatica. Sulle altre inizia a usare termini tecnici in rumeno. Infermiere o no, di sicuro è ben informato sulle proprie condizioni. Al polso ha un braccialetto del S. Orsola, mi dice che l’hanno dimesso da un paio di giorni e che, a parte il Rizzoli, è stato in tutti gli ospedali tra Udine e Bologna.

Vorrebbe tornare in Romania, dice che ha una casa lì e un pezzettino di terra. Gli chiedo se vuole un biglietto dell’autobus per poter andare verso il centro città, ma non gli interessa. Insisto un’ultima volta per chiamare il 118, ma è chiaro che, anche in quelle condizioni, non potrei trattenerlo fino all’arrivo dell’ambulanza.

Ha 36 anni, un anno più di me. Non scarica la colpa su nessuno per la sua situazione. “Se sono così è perché ho fatto degli sbagli io”. Poi “la colpa è mia, almeno una parte”: Mi mostra un braccialetto di gomma con su scritto P Zero e mi dice “io qui sono questo, zero”.

Ambulanza? Scuote di nuovo la testa. Gli chiedo se c’è qualcuno che conosce che posso chiamare. “No”. “Non ti posso lasciare qui se non sono sicuro che stai bene”. “Non ti preoccupare, io non faccio casino”. Chiarisco che sono preoccupato per la sua salute, insiste che sta bene.

Ho parlato con lui per venti minuti. La data di nascita sul braccialetto dell’ospedale conferma l’età che mi ha riferito. Ha fatto discorsi coerenti, riesce a stare seduto sulla panchina e riesce anche a stare in piedi. Mi chiede se posso lasciargli qualche moneta, gli do qualche euro e cerco di convincerlo ad andare a sedersi al bar, al fresco, almeno per qualche minuto, magari prendendosi qualcosa da mangiare.

Mi ringrazia, mi stringe la mano, e si avvia.

Prendo la bici e mi avvio verso casa, chiedendomi quanto potrà andare avanti così e se lasciarsi il paese alle spalle ne sia valsa la pena.

Dynamic programming

Dynamic programming is a clever methodology used for solving very complex problems.

The basic idea is like construction works: you build a bigger wall by placing new bricks on existing ones. In dynamic programming, you identify a new solution by extending a previous one. Divide et impera to its best.

In the fields of bioinformatics and computational biology, two great examples of dynamic programming are used: alignment algorithms and Hidden Markov Models. I’m going to present some of them in the next posts, for now I would like to focus on the basic idea of dynamic programming, by using a very simple example.

At the basic of alignment and HMM algorithms you have a table. What you have to do is filling the table using some rules: you start from one side of the table, apply the rules to the next row or column and keep going on until the table is filled.

Let’s try the following: create a table of 5 rows and 10 columns.

As first step, you should always fill at leas a value into the table (initialization step). In our example, we put the numbers from 1 to 5 into the first column.

Now it is time to apply the iterative step: we have to repeat the same operation on all cells, starting from one side of the table and moving on.

In our example, the cell should contain the result of the following formula: value on the left times row number.

The first row should read as 1,1,1,1,1; the second 2,4,8,16,32 and so on. As you can see, each row contains the powers of the first number. What you needed to build it was just a local information: the previous value. So the 16 in the second row comes from the 8 in the third column, while the 16 in the fourth row is evaluated from the 4 on its left.

This is a very simple example, real dynamic programming algorithms may use the whole preceding column, complex mathematical functions on the previous values and so on. But the strategy is the same: if I change my function to “The maximum value on the preceding column times the minimum one, minus row number”, I would proceed in the same way: filling one column at the time, just using a different function.

 

Python scope and references

Variables are not that easy to understand for students. Often the name of the variable is something that has an ontological meaning for them, other times the usage of a variable in both the left and the right side of an assignment may be confusing.

But something they should not underestimate is the mixed management of references in Python.

To start, let’s first discuss scope (or visibility). Is a variable usable in a specific piece of code? Can I use the same name for a different variable?

While in other programming languages with a more strict syntax, the scope is straightforward, in Python is a bit more complicated.

Let’s start considering the simplest case: a global variable and its usage inside a function

a=1000

def f():
   print "Inside f",a

print a
f()
print a

So, the variable inside the function has the same value. Just to make thing more clear, you should remember that the value of a is the one at the time of execution of f(). I.e. it doesn’t matter if the variable is initialized before the definition:

def f():
   print "Inside f:",a

a = 73
f()
print a

What if I change the value of variable a inside f?

def f():
   a = 256
   print "Inside f:",a

a = 73
print a
f()
print a

As you can see, the variable inside the function is a different one. This is the scope in action: visibility of the inner variable is limited to the function. That applies also for parameters:

def f(a):
   a = 256
   print "Inside f:",a

a = 73
print a
f(a)
print a

So, everything assigned after the function name is local. Unless it is a reference.

A reference is like a pointer to something else: the memory location storing the information is the same, but it has different labels (i.e. variable names). This is true for lists:

l = [1,4]
t = l
l[0]=7
print l
print t

in this case, t is not a copy of l, it is just a different name for the same object. So changing the content of l would change the content of t, and vice-versa.
This happens for function parameters too: lists and dictionaries are passed as references, so changing the value inside a function would change the value of the original variable.

def f(a):
   a[0]=99
   print "Inside f:",a

a = [12,73]
print a
f(a)
print a

This is a classic example of a function with a side effect: the function changes something and you should be aware of that. Another example for side-effects due to references can be the following.
Consider that you may want to record every element added to any list into another one, like a log. What happens when you use the same function on the log itself?

log = []

def add(el,l):
    l.append(el)
    log.append(el)

a = [12,73]
add(2,a)
print a
print log
add(99,log)
print log

This happens because l and log point to the same memory location.

This is even worse when you try to create matrices using lists of list. Try the following:

def create_matrix(rows,cols):
    matrix = [[0]*cols]*rows
    return matrix

m = create_matrix(3,4)
for row in m:
    print row
m[1][1]=7
for row in m:
    print row

As you can see, changing an element in a row will change all the other elements in the same position in the other rows. This is because we have just one list as row, and every other is a reference to the same. While [0]*cols duplicates the integer value 0 (not a reference, but an actual value), the duplication of the rows is exactly as the assignment of a list to a different variable name: it creates a reference to the previous one.
Then, if you want to create a matrix, it may be better to use:

def create_matrix(rows,cols):
    matrix = []
    for i in range(rows):
       r = []
       for j in range(cols):
          r.append(0)
       matrix.append(r)
    return matrix

m = create_matrix(3,4)
for row in m:
    print row
m[1][1]=7
for row in m:
    print row