2015年12月25日

auto-refresh pdf in windows

在linux桌面下,用latex寫論文,編譯後產生pdf,使用okular開啟pdf文件,每次重新編譯時,okular會自動更新pdf內容。
而在windows下要做到同樣auto-refreash pdf,目前我是用pdf x-change reader可做到相同功能,在cmd環境下,輸入c:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe" /A "nolock=yes=OpenParameters" ,pdf。
即可在每次latex編譯,自動更新pdf內容。

2015年11月19日

python == and is operators

在python當中,== operator是用於比較兩個變值之值是否相等,而is operator是比較兩個變數是否為相同物件。
比如說
a=[1,2,3]
b=[1,2,3]
a == b # True
a is b # False

通常我在寫程式的時候,如果比較的對象是None, True, False時,我會習慣用is operator,但是最近發現這種寫法在True, False時不一定能成功,讓我非常的驚訝,即我的程式中出現以下情況:
a=func(...) # a is False
if a is False:
   # do something
在 a is False這一行竟然結果為False而非True,必須將判斷式改為a==False才會為True。

2015年11月16日

using numpy in cython

最近大量的使用cython+numpy的方式在寫程式,有許多小細節值得注意。
在官方的文檔中,http://docs.cython.org/src/tutorial/numpy.html
基本使用方法如下:

cimport numpy as cnp
ctypedef cnp.float64_t FLOAT_t

@cython.wraparound(False)
@cython.boundscheck(False)
def myfunc(cnp.ndarray[FLOAT_t, ndim=2] f):
pass

  • numpy所定義的c version data type都是python version後面加_t,支援的type如連結
  • wraparound(False)關閉負值索引
  • boundcheck(False)加速array元素的存取,但是會無法使用負值的index且不做bound check。
  • 其它可用的選項可查詢:compiler directives
    cnp.ndarray[FLOAT_t, ndim=2]將不使用python的慢速索引,而直接使用c的buffer。
  • 如果在function中,array沒有使用到numpy的broadcasting或是相關的函式,而只有單純的存取元素時,可使用memoryview的方式定義變數。

2015年6月18日

ipython parallel callback

使用apply_async()函式後,會回傳AsyncResult_object,因此原本我設想可以如同multiprocessing模組中的apply_async函式使用callback function來處理執行完成物件的訊息,
但是在ipython parallel的apply_async似乎不支援callback的用法,所以後來我在stackoverflow找到了一個簡單的處理事件完成的解法如下:
c = Client()
dview = c[:]
asyncs = [dview.map_async(f, [arg]) for arg in args]
while asyncs:
    for async in asyncs[:]:
        if async.ready():
            asyncs.remove(async)
            print async.result[0]

2015年6月17日

tmux resolution

在tmux執行程式,經常會遇到解析度的問題,比如說在A電腦的解析度是1366*768,而在B電腦的解析度是1920*1080,如果在A電腦登入遠端主機使用tmux後,再使用B電腦登入遠端主機使用tmux attach時,會發現tmux邊緣會有一大片空白。

解決方法是B電腦使用tmux時,使用tmux attach -d,(detach the client),然後tmux就會依B電腦的解析度正確設定。

2015年6月15日

optimization solver

今天在測試J. Duchi, S. Shalev-Shwartz, Y. Singer, and T. Chandra, "Efficient projections onto the l 1-ball for learning in high dimensions," in  Proceedings of the 25th international conference on Machine learning, 2008, pp. 272-279.
這篇論文中的projection in simplex演算法,將該算法的結果,與直接用pyomo求解比較,該問題是quadratic programming(因為objective function is to minimize Euclidean distance between original vector and projected vector, 而constraint為convex set)。

使用pyomo求解時,solver使用了cplex, gurobi, and ipopt三種,cplex, gurobi與algorithm的結果一致,而使用ipopt時,答案居然有很大的誤差,看來商用軟體還是比較穩定。 

ipython parallel import

如果平行處理時需要import package時,可使用以下方式:
rc = Client(profile='ssh')
rc.block = True
dview = rc.direct_view()
dview.use_dill()

with dview.sync_imports():
   import numpy as np

# update dict
dview['np'] = np
dview['MyDerive'] = MyDerive

如果有自已定義的package(e.g. ipro)時,必須在每台機器設定PYTHONPATH,以保證可以直接在python當中import pro。