構文木をHaskell+Graphvizで
パーサーから直接書き出すようにしたいが、とりあえず。
import Data.Graph.Inductive
import Data.Graph.Inductive.Graphviz
labUEdges :: [Edge] -> [UEdge]
labUEdges = map (\(i,j) -> (i,j,()))
exprt :: Gr String ()
exprt = mkGraph (zip [1..5] ["2","*","3","+","4"])
(labUEdges [(2,1),(2,3),(4,2),(4,5)])
main = do putStrLn $ graphviz exprt "test" (0,0) (0,0) Portrait
コンパイルするには--makeオプションをつけて
$ ghc gvtest.hs --make
[1 of 1] Compiling Main ( gvtest.hs, gvtest.o )
Linking gvtest ...
$ ./gvtest | dot -Tpng > gvtest.png; open gvtest.png

pygraphviz
レイアウトをもう少しちゃんとしたい。
import pygraphviz as pgv
G=pgv.AGraph(strict=False,directed=True)
G.add_node('V1,C1')
G.add_node('V2,C2')
G.add_node('X1')
G.add_node('X2')
G.get_node('V2,C2').attr['shape'] = 'box'
G.get_node('V1,C1').attr['shape'] = 'box'
G.add_edge('V1,C1','V2,C2')
G.add_edge('V2,C2','V1,C1')
G.add_edge('V1,C1','X1')
G.add_edge('V1,C1','X2')
G.get_edge('V1,C1','V2,C2').attr['label'] = 'k12'
G.get_edge('V2,C2','V1,C1').attr['label'] = 'k21'
G.get_edge('V1,C1','X1').attr['label'] = 'Km,Vmax'
G.get_edge('V1,C1','X2').attr['label'] = 'K'
G.layout(prog='dot')
G.draw('pk1-3.png')

macbookにgraphviz,pygraphviz,networkxを入れた
コンパートメントモデルを書くのにいちいちInkspaceを立ち上げるのもめんどうなのでGraphvizにでも頼るかと思ったらmacbookには入ってなかった。networkxもついでに入れといた。
sudo port install graphviz
sudo easy_install-2.6 pygraphviz
sudo easy_install-2.6 networkx
使う
>>> import pygraphviz as pgv
>>> d={'1': {'2': None}, '2': {'1': None, '3': None}, '3': {'2': None}}
>>> A=pgv.AGraph(d)
>>> A.layout(prog='dot')
>>> A.draw('pyg.png')

複雑ネットワーク入門
特にsubgraphの探索とか勉強したいところなんだけど、軽く脱線気味に。グラフとかネットワークは勉強してて楽しいですのう。
半分くらいはグラフの基本的なことで、ゴルトン・ワトソン木、スモールワールド、スケールフリー、しきい値モデルをさらっと。
- 序章でラムゼー数
- クラスター係数
- いわゆる自分の友人同士が友人である
- 二部グラフ
- グラフの頂点集合が互いに素な二つの集合に分かれていること
- ケーリーの定理
- n個の頂点からなる木の個数はn^(n-2)個
- ランダムグラフのクラスター係数の期待値は本質的にはp
- ゴルトン・ワトソン過程はマルコフ連鎖
- スモールワールド性
- 少ない平均頂点距離と、大きなクラスター係数のとき
- NWモデル
- 拡張されたサイクルと、ランダムグラフを重ね合わせたグラフ
- しきい値モデル
- 次数分布がベキ則に従うことがある。
本書には具体的な例はほとんどないので自分で探せということか。



複雑ネットワーク入門
最短経路の本