mfng - Multifraktálhálózat-generátor

Telepítése és frissítése

Töltsük le a cxnet-et a bazaar-os tárolóból:

bzr branch http://www.arek.uni-obuda.hu/repo/cxnet

Ezentúl, ha a frissebb változatot szeretnénk letölteni, azt a következő paranccsal tehetjük majd meg, ha a most létrehozott (külső) cxnet könyvtár bármely alkönyvtárában állunk:

bzr pull

Használata

Lépjünk bele a cxnet/mfng könyvtárba:

cd cxnet/mfng

Elvileg futtathatnánk közvetlenül is az mfngrun.py fájlt, de azzal gondok lehetnek, ha frissíteni szeretnénk a tárolóból a cxnet csomagot. Ezért célravezetőbb egy másolatot készíteni róla és azt futtatni. Másoljuk át tehát az mfngrun.py fájlt mrun.py névre:

cp mfngrun.py mrun.py

Szerkesszük át kedvünkre az mrun.py fájlt. Ehhez a következő szakaszban található segítség. Átszerkesztés után futtathatjuk:

python mrun.py

A futtatás eredményei ilyenkor a projektkönyvtár runs.py, runs.json és runs.self fájljaiba kerülnek. Az első kettő síma szövegfájl, bármely szövegszerkesztővel megtekinthető.

A részletek ilyenkor a képernyőre kerülnek. A részletes adatok minden egyes lépésre tartalmazzák a valószínűségeket és az osztópontokat, valamint a kiszámított energiát, és hogy elfogadta-e a program az új generáló mértéket.

Ezt a kimenetet UNIX és Linux alatt átirányíthatjuk egy tetszőleges fájlba. Például:

python mrun.py >> project_base/details.txt

Így, dupla kacsacsőrrel (>>), az eredeti fájl végéhez illeszti az új adatokat, egyszeres kacsacsőrrel (>) mindig felülírja.

Az mfngrun.py (mrun.py) fájlban szereplő paraméterek

Az mrun.py fájlban a Python teljes fegyverzetét felhasználhatjuk. Az alábbiakban pár alapvető dolgot írunk le a nyelvvel és konkrétan a szimulációval kapcsolatban.

Fontos tudnunk, hogy a Python nyelvben az utasítások csoportosítását behúzásokkal végezzük el. Amíg például a for cikluson belül egyforma mértékben vannak behúzva a sorok, addig azok a for ciklus magjához tartoznak. Mihelyt visszatérünk a for ciklus vonalában, az az utasítás már nem lesz ciklusban. A Python programnyelvről magyar nyelven a http://www.arek.uni-obuda.hu/cxnet/ oldalról érhető el egy kisfilm, illetve a http://pythontutorial.pergamen.hu/downloads/html/tut/ oldalon érhető el oktatóanyag, angolul pedig a http://python.org hivatalos honlapról.

A generator objektum fontosabb paraméterei.

Név leírás
T0 kezdeti hőmérséklet
Tlimit eddig az értékig csökken a hőmérséklet
steps a lépések száma
K az iterációk száma
m a beosztások száma a kezdeti divs-ben
n a csúcsok száma a generált hálózatokban
nps a lépésenként generált hálózatok száma
npsfactor ennyiszer több hálózatot generál E+T energia alatt
divexponent az osztópontok áthelyezésénél szereplő kitevő

Egy vagy több paramétert ciklussal is lehet változtatni, és a különböző paraméterekkel egy-egy futtatást végrehajtani. A mfngrun.py-ben található példából kitalálható a for-ciklus működése.

A generator.append_property metódussal tetszőleges tulajdonságot adhatunk a generátorunkhoz (jelenleg a MaxDegree és AverageDegree érhető el). Például, ha azt szeretnénk, hogy a cél az legyen, hogy a maximális fokszám 50 legyen, akkor az alábbi sor kell:

generator.append_property(MaxDegree(50))

Ha azt szeretnénk, hogy a cél az átlagos fokszámra 20 legyen, akkor pedig ez:

generator.append_property(AverageDegree(20))

Egyszerre több tulajdonságot is tudunk optimalizálni, például a fenti kettő egymás után is végrehajtható. A nem kívánt törlése helyett érdemes lehet inkább megjegyzésbe rakni, azaz #-et rakni elé.

Az eredményfájl

Az eredményfájl tartalmazza többek között:

  • a futtatás fontosabb paramétereit
  • a kapott divs és probs értékeket, valamint
  • a futás időtartamát.

Tartalmazza azt is, hogy az egyes lépésekben mikor utasította el (. azaz pont) illetve mikor fogadta el (A, accept) az új generáló mértéket. Azt, amikor úgy fogadta el az új mértéket, hogy az új mértékhez tartozó energia nagyobb lett, (kicsi) a jelöli.

Az eredmények kiértékelése

Az analyzer nevű fejlesztés alatt álló modullal egyszerűen megtudhatjuk a kapott generáló mérték pár fontos tulajdonságát. A továbbiakban egy mintát mutatunk, hogyan használhatjuk ipython parancsértelmezővel. Az alábbiaknál feltételezzük, hogy az ipythont a -pylab opcióval indítottuk így:

ipython -pylab

(A hagyományos python-parancssor nem képes több grafikont egy grafikonra rajzolni, a továbbiak közül nem minden fog vele működni.) Az In [x] és Out [x] kezdetű sorokban a beírt parancsok, illetve a visszatérési értékeik találhatóak.

In [1]: import analyzer
I have found an rc file: /home/ha/.cxnetrc.py.
The graph_module was set in the rc file to "igraph".
I will use igraph. (It have been imported.)

Tájékoztat minket arról, hogy az igraph-ot vagy a networkx-et fogja-e használni. Az mfng-hez az igraph szükséges.

In [2]: r=analyzer.Runs("runs")  # Uses the runs.py file.

Alapból a runs.py fájlba menti az adatokat, ilyenkor a "runs" paraméter el is hagyható. Előfordulhat viszont, hogy egy másik gépről akarjuk áthozni a futási eredményeinek (mert esetleg ott esetleg nincs telepítve a kiértékeléshez szükséges matplotlib könyvtár). Ilyenkor általában nem szeretnénk felülírni a helyi runs.py fájlt, ezért más nevet adhatunk a fájlnak. Ha otherruns.py néven másoljuk be a cxnet/mfng könyvtárba (a .py kiterjesztés fontos), akkor paraméterként az "otherruns" sztringet adjuk meg.

In [3]: r.set_labels("3500_001")
Out[3]: ['3500_001']

Ha például egy 3500 csúcsponttal végeztem szimulációt, akkor az első futtatás címkéje ‘3500_001’ lesz, a másodiké ‘3500_002’ és így tovább. Ezt a címkét kell beírni argumentumként. Meg lehet adni címkék listáját is. Ilyen esetben olyan vizsgálatoknál, ahol értelme van, mindegyik futáson végigmegy az analízis, más esetekben csak az első címkével foglalkozik. (Pythonban a sztringek megadásánál az egyszeres és dupla idézőjel (' illetve ") között nincs különbség. Listák megadása szögletes zárójelben, vesszővel elválasztva történik. Pl. ['3500_001', '3500_002'])

Amennyiben a set_labelsnek nem adunk meg paramétert, azaz r.set_labels() formában hívjuk meg, akkor az fájlban szereplő összes címkét berakja a listába.

Pár alaptulajdonság meghatározása sok hálózat generálásából

In [4]: r.properties(n=50)
====================
label = 3500_001
====================

number of generated networks = 50
divs = [0.90256203480899999, 1.0],
probs=[[ 0.15533352  0.31063345]
 [ 0.31063345  0.22339959]]
   avg max deg = 105.14+-9.68485036181, avg average deg=21.5726628571+-0.301747377812

Itt a generáló mértékből n=50 darab hálózatot állítottunk elő, és abból vizsgáltuk a kapott hálózatok jellemzőit.

Fokszámeloszlás meghatározása, egyszerűbb változat

Miután r.set_labels függvénnyel beállítottuk a vizsgálni kívánt futásokat, kirajzoltathatjuk a fokszámeloszlást loglog skálán a következő sorral:

In [14]: r.loglog()

Az ábra címét és egyéb dolgokat ugyanúgy megváltoztathatjuk, mint a Fokszámeloszlás meghatározása, rugalmasabb de hosszadalmasabb változat fejezetben látható.

Az energia és az osztópontok változása a futás során

Az energia változását a futás során a mfng.analyzer.Runs.plot_energy_list függvénnyel rajzoltathatjuk fel:

In [3]: r.set_labels(["3500_001", "3500_002"])
["3500_001", "3500_002"]
In [4]: r.plot_energy_list()

Ekkor az összes beállított címkére ábrázolni fogja egy ábrán az energiaváltozást.

Az osztópontok változását mfng.analyzer.Runs.plot_divs_list függvénnyel ábrázolhatjuk, de ez csak a legelső címkére fogja kirajzoltatni:

In [5]: r.plot_divs_list()

Fokszámeloszlás meghatározása, rugalmasabb de hosszadalmasabb változat

In [5]: dd=r.degdist()

Ez a metódus egy cxnet.DegreeDistribution osztályból származó objektummal tér vissza, amely leírása a cxnet modul leírásánál szerepel. Az alábbiak megértéséhez azt érdemes átnézni.

In [6]: dd.set_binning("all")

In [7]: dd.loglog()
Out[7]: [<matplotlib.lines.Line2D object at 0xf8ac3ac>]

A továbbiakban összehasonlításként a kiinduló generáló mértékből is készíthetünk fokszámeloszlást, hogy lássuk, mi változott. Ha az ipythont a -pylab opcióval indítottuk, akkor ugyanarra az ábrára rá tudjuk helyezni ezt az eloszlást is:

In [8]: ddi=r.degdist(initial=True) # The distribution of random network (original prob. measure)

In [9]: ddi.set_binning("all")

In [10]: ddi.loglog()
Out[10]: [<matplotlib.lines.Line2D object at 0xfe4afac>]

A matplotlib csomag, illetve annak része a pylab modul lehetőséget ad arra, hogy a grafikont tovább módosítsuk. Ezek leírását a matplotlib oldalán megtalálhatjuk. Beállíthatjuk például kedvünk szerint az ábra címét, az egyes függvényekhez tartozó magyarázatot, és végül elmenthetjük egy fájlba. Érdemes vektorgrafikus formátumot választani: a pdf a pdflatex-hez, az eps a latex-hez lehet hasznos, a pixelgrafikus png pedig weboldalhoz. Fontos ábrákat érdemes lehet rögtön mindháromba menteni:

In [11]: title("""m=2, K=3, n=3500, maxdeg=85, avgdeg=20""")
Out[11]: <matplotlib.text.Text object at 0xf8a63ac>

In [12]: legend(("result", "random"),loc="upper left")
Out[12]: <matplotlib.legend.Legend object at 0xfcb5c0c>

In [13]: savefig("3500_001degdist.pdf") # pdf helyett lehet pl. png és eps is

Ez utóbbi az alábbihoz hasonló ábrát ad eredményül.

_images/3500_001degdist.png