Ora che abbiamo scambiato i preliminari, veniamo al dunque
Ho aperto questa discussione per via di un problema che si verifica in maniera del tutto casuale e senza un motivo che io riesca a ricondurre a qualche errore nel codice di una simulazione che sto facendo.
In questo messaggio descrivo, inzialmente, il tipo di problema riscontrato.
Poi descrivo a grandi linee cosa fa la simulazione.
Infine posto il codice della simulazione
... o meglio faccio una domanda e in base alla risposta, in un prossimo messaggio posto il codice.
Presentazione del problema
Il problema (che illustro ora ma che ovviamente sarà chiarito nel corso del messaggio) consiste nel fatto che ad un certo punto la stampa dell'output della simulazione si blocca e comincia a stampare ciclicamente le ultime righe di output.
La stampa procede in maniera "normale", mettiamo, fino alla TOT-esima riga di output... poi decide di prendere le ultime N righe e stampare solo quelle ciclicamente fino alla fine (con una piccola differenza tra ogni ciclo di "ri"stampa, che a breve chiarisco).
È importante notare che:
- Sia TOT, sia N variano in maniera tale che io non riesco a dargli un senso, né a ricondurlo a qualche errore nel codice.
- Tale anomalia si presenta solo per un determinato valore di un parametro da cui dipende la simulazione, come spiegato nel dettaglio più avanti.
Le righe che vengono stampate nel file di output sono di questo tipo:
Codice: Seleziona tutto
{1: 0.946203, 2: 1.02234, 3: 1.00639, 4: 0.983212, 5: 1.00071, 6: 0.972706, 7: 0.994123, 8: 0.990442, 9: 0.998881, 10: 1.01909, 11: 1.00857, 'tempo': 0, 'trapped': 0}
{1: 0.931899, 2: 0.997133, 3: 1.00047, 4: 0.990522, 5: 0.988729, 6: 0.985936, 7: 0.984237, 8: 0.981894, 9: 1.00522, 10: 1.01475, 11: 1.01218, 'tempo': 200, 'trapped': 98}
{1: 0.832278, 2: 0.949309, 3: 1.00562, 4: 1.01238, 5: 0.995105, 6: 0.973542, 7: 0.985381, 8: 0.983326, 9: 0.999169, 10: 1.01155, 11: 1.01116, 'tempo': 400, 'trapped': 182}
{1: 0.714225, 2: 0.923777, 3: 0.981992, 4: 1.01542, 5: 1.00918, 6: 0.975327, 7: 0.988659, 8: 0.983942, 9: 1.00026, 10: 1.01125, 11: 1.00595, 'tempo': 600, 'trapped': 246}
{1: 0.690427, 2: 0.911372, 3: 0.987685, 4: 1.00982, 5: 0.992876, 6: 0.967907, 7: 0.984038, 8: 0.999183, 9: 1.00855, 10: 1.00444, 11: 1.00328, 'tempo': 800, 'trapped': 311}
Sono pensate come dei dizionari (python) per poi essere date in pasto a degli script di analisi dati che mi sono scritto (in python).
Le chiavi numeriche rappresentano delle etichette per indicare delle zone di una superficie (la superficie è la griglia su cui si muovono le pedine, di cui ho parlato nei messaggi iniziali della discussione), cui sono associati dei valori che rappresentano le densità medie di tali zone.
Le chiavi non numeriche sono il 'tempo' (che indica l'iterazione cui è arrivato l'algoritmo della simulazione) e un insieme di valori di cui devo monitorare l'evoluzione temporale nel corso della simulazione. Tale insieme, in questo caso, è dato dalla sola quantità 'trapped'.
Proprio nella simulazione di cui questo è un estratto della parte iniziale dell'output, avviene l'inceppamento di cui sopra.
Ad un certo punto, la simulazione impazzisce e si ha, fino alla fine del file, la stampa ciclica delle 4 righe:
Codice: Seleziona tutto
{1: 0.252025, 2: 0.332553, 3: 0.374517, 4: 0.371656, 5: 0.398688, 6: 0.401279, 7: 0.393009, 8: 0.409103, 9: 0.42026, 10: 0.419669, 11: 0.421743, 'tempo': 131200, 'trapped': 24017}
{1: 0.252041, 2: 0.332569, 3: 0.374092, 4: 0.371788, 5: 0.398798, 6: 0.401442, 7: 0.393052, 8: 0.408843, 9: 0.420419, 10: 0.419567, 11: 0.421775, 'tempo': 131400, 'trapped': 24017}
{1: 0.251915, 2: 0.332649, 3: 0.374089, 4: 0.371622, 5: 0.398989, 6: 0.401369, 7: 0.393097, 8: 0.408882, 9: 0.420356, 10: 0.419601, 11: 0.421754, 'tempo': 131600, 'trapped': 24017}
{1: 0.25193, 2: 0.332814, 3: 0.374345, 4: 0.371436, 5: 0.398959, 6: 0.401275, 7: 0.393013, 8: 0.409191, 9: 0.420057, 10: 0.419788, 11: 0.421714, 'tempo': 131800, 'trapped': 24017}
Come dicevo prima, le righe non vengono riprodotte in maniera "identica"... perché pare che il tempo continui a scorrere, ovvero:
Codice: Seleziona tutto
{1: 0.252025, 2: 0.332553, 3: 0.374517, 4: 0.371656, 5: 0.398688, 6: 0.401279, 7: 0.393009, 8: 0.409103, 9: 0.42026, 10: 0.419669, 11: 0.421743, 'tempo': 132000, 'trapped': 24017}
{1: 0.252041, 2: 0.332569, 3: 0.374092, 4: 0.371788, 5: 0.398798, 6: 0.401442, 7: 0.393052, 8: 0.408843, 9: 0.420419, 10: 0.419567, 11: 0.421775, 'tempo': 132200, 'trapped': 24017}
{1: 0.251915, 2: 0.332649, 3: 0.374089, 4: 0.371622, 5: 0.398989, 6: 0.401369, 7: 0.393097, 8: 0.408882, 9: 0.420356, 10: 0.419601, 11: 0.421754, 'tempo': 132400, 'trapped': 24017}
{1: 0.25193, 2: 0.332814, 3: 0.374345, 4: 0.371436, 5: 0.398959, 6: 0.401275, 7: 0.393013, 8: 0.409191, 9: 0.420057, 10: 0.419788, 11: 0.421714, 'tempo': 132600, 'trapped': 24017}
{1: 0.252025, 2: 0.332553, 3: 0.374517, 4: 0.371656, 5: 0.398688, 6: 0.401279, 7: 0.393009, 8: 0.409103, 9: 0.42026, 10: 0.419669, 11: 0.421743, 'tempo': 132800, 'trapped': 24017}
{1: 0.252041, 2: 0.332569, 3: 0.374092, 4: 0.371788, 5: 0.398798, 6: 0.401442, 7: 0.393052, 8: 0.408843, 9: 0.420419, 10: 0.419567, 11: 0.421775, 'tempo': 133000, 'trapped': 24017}
{1: 0.251915, 2: 0.332649, 3: 0.374089, 4: 0.371622, 5: 0.398989, 6: 0.401369, 7: 0.393097, 8: 0.408882, 9: 0.420356, 10: 0.419601, 11: 0.421754, 'tempo': 133200, 'trapped': 24017}
{1: 0.25193, 2: 0.332814, 3: 0.374345, 4: 0.371436, 5: 0.398959, 6: 0.401275, 7: 0.393013, 8: 0.409191, 9: 0.420057, 10: 0.419788, 11: 0.421714, 'tempo': 133400, 'trapped': 24017}
{1: 0.252025, 2: 0.332553, 3: 0.374517, 4: 0.371656, 5: 0.398688, 6: 0.401279, 7: 0.393009, 8: 0.409103, 9: 0.42026, 10: 0.419669, 11: 0.421743, 'tempo': 133600, 'trapped': 24017}
{1: 0.252041, 2: 0.332569, 3: 0.374092, 4: 0.371788, 5: 0.398798, 6: 0.401442, 7: 0.393052, 8: 0.408843, 9: 0.420419, 10: 0.419567, 11: 0.421775, 'tempo': 133800, 'trapped': 24017}
{1: 0.251915, 2: 0.332649, 3: 0.374089, 4: 0.371622, 5: 0.398989, 6: 0.401369, 7: 0.393097, 8: 0.408882, 9: 0.420356, 10: 0.419601, 11: 0.421754, 'tempo': 134000, 'trapped': 24017}
{1: 0.25193, 2: 0.332814, 3: 0.374345, 4: 0.371436, 5: 0.398959, 6: 0.401275, 7: 0.393013, 8: 0.409191, 9: 0.420057, 10: 0.419788, 11: 0.421714, 'tempo': 134200, 'trapped': 24017}
... e così via fino alla fine (del file e della mia salute mentale).
In questo esempio, quindi, N (il numero di righe ripetute) è quattro, mentre TOT (il numero dell'ultima riga stampata "correttamente") è 656:
Codice: Seleziona tutto
{1: 0.261709, 2: 0.330952, 3: 0.364284, 4: 0.379183, 5: 0.394826, 6: 0.405324, 7: 0.394472, 8: 0.410913, 9: 0.416415, 10: 0.423693, 11: 0.420384, 'tempo': 131000, 'trapped': 24017}
In cosa consiste la simulazione
La simulazione la cui stampa presenta questo problema è la seguente.
Si immagini una griglia quadrata (tipo una scacchiera) il cui lato è arbitrariamente scelto come parametro iniziale.
Si immagini di scegliere un numero (arbitrario) di pedine e che tali pedine (dal programma) vengano disposte sulla scacchiera, distribuite in modo equiprobabile tra tutte le caselle (ovviamente su una stessa casella possono capitare più di una pedina), ad eccezione di una casella particolare posta nel centro della griglia.
(dal momento che si immagina che nel centro della scacchiera ci sia una casella "particolare", per questioni di simmetria, la griglia può avere solo lati con un numero dispari di caselle)
Una volta disposte, le particelle (ad ogni turno) si muovono secondo un random walk bidimensionale indipendente, sulla griglia, con condizioni periodiche al contorno (se escono da un lato, rientrano da quello opposto).
I random walk sono indipendenti, nel senso che le pedine non interagiscono in nessun modo tra di loro, non vedendosi, e possono anche stare in "gruppo" sulla stessa casella.
La casella nel centro ha la "particolarità" data dal fatto di essere "appiccicosa".
Se una particella ci capita sopra, vi rimarrà intrappolata.
Se la trappola è popolata, può emettere (una particella per turno, fino a che eventualmente si svuota) con una probabilità (normalizzata ad uno) passata alla simulazione come parametro.
Lo scopo è analizzare l'evoluzione temporale delle densità medie (mediate spazialmente e temporalmente su un "ciclo di stampa") in sezioni della scacchiera.
Le sezioni possono essere corone circolari o cornici rettangolari concentriche.
Praticamente si decide una durata della simulazione ed un intervallo di stampa.
Per tutta la durata, si fa evolvere il sistema, come spiegato, e si stampano le densità mediate nel tempo (l'intervallo di stampa) e nello spazio (il numero di siti nella corona circolare o rettangolare).
Si stampano inoltre, altri valori mediati, associati alle chiavi non numeriche di cui sopra.
Codici della simulazione
La simulazione è composta dai moduli:
-
parseLib.cpp
un parser per la riga di comando, brutto e minimale, ma che fa quello che mi serve.
-
libSys.ccp
per gestire il controllo sull'esistenza e la creazione delle directory in cui poi vengono creati i file di output
-
libEvolSmart.cpp
si occupa dell'inizializzazione del sistema, delle routine di aggiornamento delle posizioni delle particelle, della gestione della trappola
-
libDens.cpp
si occupa delle routine per calcolare la densità nelle varie corone circolari o rettangolari
-
libPrint.cpp
si occupa della stampa su file
-
randwalmain.cpp
il main
Prima di postare il codice (o di caricarlo in qualche sito di hosting e postare i link), avrei un dubbio.
Sto facendo alcune modifiche alla gestione dei dati, o meglio sto cambiando alcuni contenitori.
Per esempio, su tuo suggerimento, non uso più dei vector bidimensionali, per le coordinate delle pedine, ma le memorizzo in una std::pair.
Di conseguenza stanno cambiando un po' di funzioni.
Gli algoritmi sono esattamente gli stessi, cambiano solo i contenitori.
Che faccio?
Posto il codice attuale?
O quello con i contenitori modificati?
Ad occhio e croce, visto che il problema della stampa si verifica da "parecchie versioni" della simulazione (e nel tempo ho cambiato vari contenitori), si verificherà anche se uso pair al posto di vector e se faccio piccole modifiche nel codice
È una domanda da "idiot", me ne rendo conto.
Ho però il timore di trovare/risolvere il problema per l'attuale codice con cui faccio le simulazioni... ma, visto che sto apportando tali modifiche, trovarmi poi con una soluzione per un codice che non uso più, perché modificato per esempio con pair al posto di vector.
Ciao e grazie infinite per la disponibilità, Ikitt!!!