Saturday, November 27, 2010

IETT Duraklari ve Hatlari

Istanbul IETT durak ve hat verisini yazinin altindaki kaynaktan indirebilirsiniz. Veri iki cesit, duz hat ve durak verisi, bir de Python pickle halinde islenmis veri yapilarinin oldugu .pkl dosyalari. Duz veriyi kullanmaya gerek yok, pickle dosyalari her seyi iceriyor. Veri yapilari, fonksiyonlari "Path-Planning Algorithms for Public Transportation Systems" adli makalede tarif edilen veri yapilaridir.

CS yapisi ortak duraklar (common stops) veri yapisidir; iki hattin ortak, cakistigi duraklarin ismini listeler. K fonksiyonu (verisi) x hatti uzerindeki y duraginin hattin basindan baslayarak sayi olarak "kacinci" oldugunu rapor eder. SR cagrisi bir duraktan gecen hatlar, routestops bir hattin ziyaret ettigi duraklardir.

Python cagrisi olarak bazi ornekler:

59N ve 59R hattinin ortak duraklari

print CS(cs, '59N', '59R')

59N hattindaki L0168A duragi kacinci duraktir (cevap 4).

print K(k, '59N', 'L0168A')

Durak detaylari

print duraklar['L0139J']

Bir hattin gectigi duraklar

print routestops['59N']

Bir duraktan gecen hatlar

print sr['L0168A']

Ustteki cagrilarin hepsi test.py adli dosya icinde.

Bu veriler, veri yapilari kullanilarak iki nokta arasindaki en kisa seyahati bulan kodlar yazilabilir. Hangi hatlara binilecegi, inilecegi gibi.. isin bu kismi ilgilenen okuyuculara odev olsun. Ustteki makalede konu hakkinda guzel detaylar var. Matematiksel olarak kombinatoryel matematik, grafik teorisi (graph theory) gibi konular isin icine giriyor. Tek transfer, iki transfer, vs. hesaplari ayri ayri yapiliyor.

Not: Durak kodlari ayni sayi ama sonunda 'A' ve 'B' gibi eklerle yolun karsilikli taraflarinda, ayni hat uzerinde ama ters yonlere gidecek sekilde konumlandirilmis olabiliyor. Bunu niye soyluyoruz? Eger bir uygulama durak ismini aratarak (mesela "levent" gibi) durak kodu almayi, ve oradan seyahat planlama yapmayi dusunuyorsa birden fazla durak koduyla is yapmaya hazir olmali.

Kodlar

Sunday, November 21, 2010

Ubuntu Server ve Matplotlib

Icinde matplotlib kutuphanesini kullanarak grafik olusturan, mesela plot() kullanan kodlar, gelistirme ortaminda yeni bir pencere acarlar ve grafigi basarlar. Ama Ubuntu Server uzerinde ayni kodlari isletiyorsak, ekran tabii ki acilamaz, ama plot() cagirmiyor olsak bile sadece matplotlib import etmek bile problemli olabiliyor. Su hata gelebilir:

server GtkWarning: could not open display

Bu mesaj ekran olmayan server ortaminda grafik olusturulamiyor demektir.

Tamir icin, Python komut satirina girin
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
Son komut bir dosya ismi verecek. Bu dosyaya sudo uzerinden bir editor ile girin, ve "backend" diyen satirda GTKAgg ibaresini PDF kelimesine degistirin. Bundan sonra gorsel islemler bos gecilecek, ama hesap yapan kodlar hala isleyecek.

Kaynak

Tuesday, November 9, 2010

preview-latex

Emacs icinde tex dosyalari edit ederken, matematik formullu bolgelerinin formulu grafik olarak gostermesini istiyorsak, preview-latex modu kullanilabilir. Kurmak icin Ubuntu uzerinde sudo apt-get install preview-latex ; Bu cagri Emacs ayarlarini otomatik olarak yapar.

Emacs'i baslatinca .tex dosyasi icindeyken menude Preview secenegi gorulecektir. Ustunde oldugunuz noktayi, ya da tum dosyayi grafiklettirmek yani preview yapmak mumkun. Bir tus kombinasyonu grafik bolgeyi tekrar duz tex haline dondurebiliyor, arada hizla gidip gelinebiliyor.

Eger formuller ekran icinde ufak gozukuyorsa, imajlari buyutmenin yolu basit. Ayar dosyasi .emacs icinde

(custom-set-variables
...
'(preview-scale-function 1.2)
)

gibi bir kullanimla imajlar buyutulebilir. 1.2 formulleri "1.2 kat buyut" anlamina geliyor.


Diger ayarlar

'(preview-auto-cache-preamble nil)
'(preview-image-type (quote dvipng))

Kaynak

Wednesday, November 3, 2010

Cython

Python icinden C cagirmanin, Python kodunu C'ye cevirmenin yani daha hizli isler hale getirmenin yollarindan olan Cython'un populerligi artiyor. Bu arac ile Python icinde, Python sozdizimine benzer bir sekilde yazdiginiz kodlardan C kodu uretilmesi mumkun. Bir fark, bu kodu derlemek icin "python" cagrisi yerine "cython" cagrisi kullanmak gerekli. Bu cagri sonrasi .c dosyasi uretilecek, bu dosya gcc ile .o sonra .so dosyasina derlenecek. Elde edilen .so dosyasi artik pur Python tarafindan "import" edilebilir bir modul olacaktir.

Kurmak icin

http://cython.org/#download

Bildigimiz unzip, ve python setup.py install.

Bizim ornek kodlar bu yazinin altinda. Dosya p1.py icindeki pur Python, hemen python p1.py ile isletilebilir. c1.pyx icinde cython ile C'ye cevirilebilecek kodlar var. Bunlar "sh make.sh" ile hemen .o ve .so yapilabilir. Ardindan "python c1-main.py" ile hizlandirilmis kodlari isletmek mumkun. Zaman her iki koddan rapor edilecektir.

Alttaki baglantida konu hakkinda daha fazla ornek bulunabilir.

Dikkat: Python'a benzer kodlarin bir test.pyx icinde yazildigini varsayalim, derlenince bu kodun test.c dosyasina, ve test.so ile ayni isimdeki so kutuphanesine derlenmesi gereklidir.

Kaynak

c1.pyx

import math

def great_circle(float lon1,float lat1,float lon2,float lat2):
    cdef float radius = 3956.0
    cdef float pi = 3.14159265
    cdef float x = pi/180.0
    cdef float a,b,theta,c

    a = (90.0-lat1)*(x)
    b = (90.0-lat2)*(x)
    theta = (lon2-lon1)*(x)
    c = math.acos((math.cos(a)*math.cos(b)) + (math.sin(a)*math.sin(b)*math.cos(theta)))
    return radius*c


import timeit  

lon1, lat1, lon2, lat2 = -72.345, 34.323, -61.823, 54.826
num = 500000

t = timeit.Timer("p1.great_circle(%f,%f,%f,%f)" % (lon1,lat1,lon2,lat2),
                       "import p1")
print "Pure python function", t.timeit(num), "sec"

c1-main.py

import timeit

lon1, lat1, lon2, lat2 = -72.345, 34.323, -61.823, 54.826
num = 500000

t = timeit.Timer("c1.great_circle(%f,%f,%f,%f)" % (lon1,lat1,lon2,lat2),
                  "import c1")
print "Cython function (still using python math)", t.timeit(num), "sec"

p1.py

import math

def great_circle(lon1,lat1,lon2,lat2):
    radius = 3956 #miles
    x = math.pi/180.0

    a = (90.0-lat1)*(x)
    b = (90.0-lat2)*(x)
    theta = (lon2-lon1)*(x)
    c = math.acos((math.cos(a)*math.cos(b)) +
                  (math.sin(a)*math.sin(b)*math.cos(theta)))
    return radius*c


import timeit  

lon1, lat1, lon2, lat2 = -72.345, 34.323, -61.823, 54.826
num = 500000

t = timeit.Timer("p1.great_circle(%f,%f,%f,%f)" % (lon1,lat1,lon2,lat2),
                       "import p1")
print "Pure python function", t.timeit(num), "sec"

make.sh

cython c1.pyx
gcc -Wall  -I/usr/include/python2.7 -lpython2.7 -c c1.c
gcc -shared c1.o -o c1.so