2015년 5월 20일 수요일

Intel Math Kernel Library (MKL) and FFTW3 링크하기

먼저 MKL library의 위치를 찾을 것. 
MKL library에 FFTW가 포함되어 있다고 하지만 FFTW의 위치도 알아둘 것.

MKL libary를 사용하는 방법은 두가지가 있다.

(1) -mkl 옵션을 사용하는 방법
(2) 모든 옵션을 일일이 지정해 주는 방법
-mkl 옵션의 경우 default 설정이 무엇인가에  따라 달라지게 된다.일반적인 경우라면,

ifort test.f90 -mkl -o test_f
icc test.c -mkl -o test_c

만으로 충분하고 FFTW를 사용하는 경우에는 

icc test.c -w -DMKL_DOUBLE -I/opt/intel/Compiler/11.1/069/mkl/include/fftw -mkl -o test_c

ifort -I/opt/intel/Compiler/11.1/069/mkl/include/fftw test.f90 -mkl -o test_f

icc test.c -I/opt/intel/Compiler/11.1/069/mkl/include/fftw -mkl -o test_c

ifort test.f90 -I/opt/intel/Compiler/11.1/069/mkl/include/fftw -mkl -o test_f

와 같이 include path를 지정해 주는 것이 좋다고 한다. 

-mkl 옵션을 쓰지 않으면 아래와 같이 일일이 써 주어야한다. 

icc test.c -I/opt/intel/Compiler/11.1/069/mkl/include -I/opt/intel/Compiler/11.1/069/mkl/include/fftw
-lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm 
-L/opt/intel/Compiler/11.1/069/mkl/lib/em64t -o c_test 

ifort test.f90 -I/opt/intel/Compiler/11.1/069/mkl/include -I/opt/intel/Compiler/11.1/069/mkl/include/fftw 
-lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm 
-L/opt/intel/Compiler/11.1/069/mkl/lib/em64t -o f_test


(주의1) -lmkl_intel_lp64 는 64bit cpu 용 libary를 사용한다는 뜻이고,  
-lmkl_intel_ilp64 는 64bit cpu 용 libary를 사용하되 
정수도 64bit인 libary를 사용한다는 뜻으로 compile 할 때 -i8 option을 추가해 주어야 한다.   
ilp64를 사용할 경우 FFTW와 integer type이 다를 수 있으므로 주의해야 한다.

(주의2) FFTW2 를 사용할 경우는 option을 다르게 주어야한다.
icc test2.c -o test2_c -I/opt/intel/Compiler/11.1/069/mkl/include/fftw 
-L/opt/intel/Compiler/11.1/069/mkl/lib/em64t -lfftw2xc_intel -mkl 

ifort test2.f -o test2_f -I/opt/intel/Compiler/11.1/069/mkl/include/fftw 
-L/opt/intel/Compiler/11.1/069/mkl/lib/em64t -lfftw2xf_intel -mkl

만약 외부 FFTW library를 사용하는 경우에는 아래와 같이 사용한다.
ifort -O3 -o fftw_example.exe fftw_example.f -I/u/username/fftw/include -L/u/username/fftw/lib -lfftw3

참고:

http://geco.mines.edu/software/mkl/fftw/

http://www.nas.nasa.gov/hecc/support/kb/MKL-FFTW-Interface_204.html



(Details on the -mkl option )


-mkl[=]
          link to the Intel(R) Math Kernel Library (Intel(R) MKL) and
          bring in the associated headers
            parallel   - link using the threaded Intel(R) MKL libraries.
                         This is the default when -mkl is specified
            sequential - link using the non-threaded Intel(R) MKL libraries
            cluster    - link using the Intel(R) MKL Cluster libraries plus
                         the sequential Intel(R) MKL libraries
The libraries that are linked in for:
    * -mkl=parallel

          --start-group \
          -lmkl_solver_lp64 \
          -lmkl_intel_lp64 \
          -lmkl_intel_thread \
          -lmkl_core \
          -liomp5 \
          --end-group \

    * -mkl=sequential

          --start-group \
          -lmkl_solver_lp64_sequential \
          -lmkl_intel_lp64 \
          -lmkl_sequential \
          -lmkl_core \
          --end-group \

    * -mkl=cluster

          --start-group \
          -lmkl_solver_lp64 \
          -lmkl_intel_lp64 \
          -lmkl_cdft_core \
          -lmkl_scalapack_lp64 \
          -lmkl_blacs_lp64 \
          -lmkl_sequential \
          -lmkl_core \
          -liomp5 \
          --end-group \

2015년 4월 24일 금요일

Python curve fitting for a function with input vectors(변수가 여러개인 함수의 fitting)

변수가 여러개인 함수 예를 들어 f(d,t; c_0,c_1...) 인 경우에는
어떻게 fitting을 할까? 여기서, d,t는 변수이고, c_0,c_1..등은
fitting parameter 이다.

Suppose we have data which corresponds to

y=f[d,t]

Something like (d,t)=(0,0) gives y=0, (0,1) gives y=1....

We want to fit these data with certain fitting function
with parameters c1,c2,c3...

fit[d,t; c1,c2,c3]

Even in this case, we can use curve_fit
(Following example copied from http://stackoverflow.com/a/27096056/2775514

from scipy.optimize import curve_fit
import scipy

def fn(x, a, b, c):
    return a + b*x[0] + c*x[1]

# y(x0,x1) data:
#    x0=0 1 2
# ___________
# x1=0 |0 1 2
# x1=1 |1 2 3
# x1=2 |2 3 4

x = scipy.array([[0,1,2,0,1,2,0,1,2,],[0,0,0,1,1,1,2,2,2]])
y = scipy.array([0,1,2,1,2,3,2,3,4])
popt, pcov = curve_fit(fn, x, y)
print popt
In this example,
x[:, i-th], y[i-th] corresponds to  i-th data set.

result returns popt -> [0,1,1].

One can use different form : 

x = np.array([ [1.0, 1.0 ],[1.0,1.5],[2.0,0.5],[2.1,1.6],[0.5,0.5],[0.8,1.2] ]  )
y = 0.5*x[:,0] + 2.0 *x[:,1]**2

def fitf(x,*paras):
    return paras[0]*x[:,0]+paras[1]*x[:,1]**2

xx = np.array( [x[:,0],x[:,1]])
def testf(x,*para):
    return para[0]*x[0]+x[1]**2*para[1]

print( curve_fit(fitf,x,y,p0=[1,1]) )
print( curve_fit(testf,xx,y,p0=[1,1]) )

Note that curve_fit calls the function as 

ydata = f(xdata, *params) +eps 

In other words, when xdata is an (k,M) array with M-data, 
the function should return array ydata with M-data. 
if function only works work for a scalar f(x), it cannot be used directly with curve_fit. 

On the other hand, leastsq(cost, p0) assumes the 
cost function  returns a number or array of length of p0
#--------------------------------------------------------------------------------------------

scipy.optimize.curve_fit(fxdataydatap0=Nonesigma=Noneabsolute_sigma=Falsecheck_finite=True**kw)[source]
Use non-linear least squares to fit a function, f, to data.
Assumes ydata = f(xdata, *params) + eps
Parameters:
f : callable
The model function, f(x, ...). It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments.
xdata : An M-length sequence or an (k,M)-shaped array
for functions with k predictors. The independent variable where the data is measured.
ydata : M-length sequence
The dependent data — nominally f(xdata, ...)
p0 : None, scalar, or N-length sequence
Initial guess for the parameters. If None, then the initial values will all be 1 (if the number of parameters for the function can be determined using introspection, otherwise a ValueError is raised).
sigma : None or M-length sequence, optional
If not None, the uncertainties in the ydata array. These are used as weights in the least-squares problem i.e. minimising np.sum( ((f(xdata, *popt) -ydata) / sigma)**2 ) If None, the uncertainties are assumed to be 1.
absolute_sigma : bool, optional
If False, sigma denotes relative weights of the data points. The returned covariance matrix pcov is based on estimated errors in the data, and is not affected by the overall magnitude of the values in sigma. Only the relative magnitudes of the sigma values matter.
If True, sigma describes one standard deviation errors of the input data points. The estimated covariance in pcov is based on these values.
check_finite : bool, optional
If True, check that the input arrays do not contain nans of infs, and raise a ValueError if they do. Setting this parameter to False may silently produce nonsensical results if the input arrays do contain nans. Default is True.
Returns:
popt : array
Optimal values for the parameters so that the sum of the squared error of f(xdata, *popt) - ydata is minimized
pcov : 2d array
The estimated covariance of popt. The diagonals provide the variance of the parameter estimate. To compute one standard deviation errors on the parameters use perr = np.sqrt(np.diag(pcov)).
How the sigma parameter affects the estimated covariance depends on absolute_sigma argument, as described above.
Raises:
OptimizeWarning
if covariance of the parameters can not be estimated.
ValueError
if ydata and xdata contain NaNs.

2015년 4월 13일 월요일

피자헛 할인 비교

그동안 어떤 방법으로 주문하는 것이 가장 할인이 많이 되는지 궁금했는데 이번 기회에 비교해 보기로 했다.

기준은 라지 사이즈 치즈크러스트 베이컨 포테이토 피자.

기본가격: 32,900원

(1) 방문 할인:    22,900원  (   10000원 할인 )
(2) 무료사이즈업:  26,900원 (6000원 할인)
(3) 올레 할인 : 15% 27,965원 (4935원 할인)
                   50% 16,450원 (16,450원 할인)
(4) 이벤트: 그때그가격 이벤트 23,900원(7000원 할인)

결국, 제휴 할인을 통해서 30% 이상 할인 받지 않는 이상
방문 포장 1만원 할인이 가장 할인을 많이 받는 셈이다.


2015년 3월 26일 목요일

[퍼즐] 잘못된 주소 또는 엉뚱한 모자 문제

여기에 5개의 목적지가 다른 편지와 각각의 주소가 적힌 편지 봉투 5개가 있다.
실수로 모든 편지를 잘못된 주소로 보낼 경우의 수는 몇인가?

변형된 다른 문제는 7개의 모자와 7명의 모자 주인이 있는데, 모든 모자 주인들이
엉뚱한 모자를 가져갈 경우의 수는 몇인가?

이 문제를 처음 접한 지는 꽤 되었는데,
이것에 교란순열(derangement)이라는 수학용어가 있었다.
(예를 들어 n개가 모두 잘못된 위치로 놓이는 방법은 !n 으로  쓴다.)

이 문제의 답을 스스로 생각해 내는 것은 항상 헷갈린다.


2015년 3월 17일 화요일

[퍼즐] 이상한 학교 인사

먼저 내가 접한 퍼즐 문제는 다음과 같다.

" 어떤 학교에는 이상한 인사방법이 있다. 모든 남학생들은 남학생끼리 서로에게 인사를 한 뒤, 선생님에게 인사를 한다. 한편, 모든 여학생들도 여학생들 끼리  서로에게 인사를 한 뒤,
선생님에게 인사를 한다. 마지막으로 모든 남학생들이 여학생들에게 인사하고, 여학생들도 남학생에게 인사를 한다. 이렇게 모두 900번의 인사를 한 뒤에야 수업이 시작된다. 이 학교의 여학생 수는 남학생의 2배라고 하고, 선생님은 답례를 하지 않는다고 할 때, 이 학교의 남학생 수는 얼마인가? "

원래 문제에서는 선생님이 답례를 한다는 것인지가 명확히 써 있지 않아서 헷갈렸다.

다음은 내가 변형 시켜 본 문제이다.

"다음해에 신입생들은 전통에 따라 같은 방식으로 인사를 하지만,
담임 선생님은 학생에 따라 내키는 대로 인사를 하기도 하고, 안하기도 한다.
모든 인사 수의 합이 정확히 얼마인지 모르지만, 대략 400 보다는 많고,
440 보다는 적다고 할 때, 올 해의 신입생 수는 얼마인가?"

풀이는 아래 클릭..

2015년 1월 18일 일요일

python fitting / optimization

주어진 xdata와 ydata에 대해,
Least square method로 data를 fitting 하는 방법.

결론은 , scipy의 optimize module을 이용한다.

import scipy.optimize as optimization

def func(x,para1,para2):
   return para1*sin(para2*x)

popt, pcov = optimization.curve_fit(func,xdata, ydata, p0=(1.0,1.0))

p0는 initial guess이고

popt는 parameter fitting 의 결과를, pcov는 covariance 계산 결과를 보여준다.

least square method를 사용하므로,
cost function chi(para...) 함수를 최소로 만드는 parameter를 찾는다.

pcov는 (parameter 갯수)*(parameter 갯수) matrix로,
cost function의 parameter 값의 변화에 대한 변화값을 나타낸다.
pcov(i,j)= d^2[chi(c1,c2..)]/dc_i dc_j

몇가지 다른 fitting 방법이 있다.

1. scipy.optimize.curve_fit : 
   입력: f(x,para) , xdata, ydata, yerr(optional)

    popt, pcov = optimization.curve_fit(f,xdata, ydata, p0=(1.0,1.0))

   curve_fit은 least square 방법을 통해  sum ( ydata - f(xdata,para))^2/yerr^2  
   을 minimize 시킨다. 
   parameter의 error estimation은 sqrt(diag(pcov)) 를 이용한다.

2. scipy.optimize.leastsq :
   입력: errFunc(para,x,y) , xdata, ydata 

    popt, hess_inv, infodict, errmsg, success = optimize.leastsq(errFunc, pstart, args=(xdata, ydata), full_output=1)   

    입력하는 함수는 errFunc(para,xdata,ydata) = ydata - f(xdata,para) 
    이고,  sum ( errFunc )^2 를 minimize 시킨다. 
    parameter의 error estimation은 hess_inv 와 residual variance 를 이용한다. 
    sqrt( diag( hess_inv * resVariance)) with 
    resVariance = sum( errFunc(para,xdata,ydata)^2) /(len(ydata)-len(para)) 

3. scipy.optimize.minimize :
    입력: minFunc(para,x,y) , xdata, ydata 
    
    result = optimize.minimize(lambda p,x,y: np.sum( errFunc(p,x,y)**2 ), pstart, args=(xdata, ydata))

    이 경우 입력함수 
    minFunc(para,xdata,ydata) = sum ( ydata- f(xdata,para))^2 이고, 
    minFunc을 minimize 시킨다.  parameter의 error estimation은 leastsq 와 같이
    result.hess_inv 와 residual variance 을 이용한다. 

    그러나, minimization의 방법에 따라 hess_inv가 제공되지 않는 경우가 있다. 





2014년 12월 7일 일요일

(퍼옴) 미루는습관고치기

Q: 머리 속에는 해야 할이 꽉 차있지만 정작 실행에 옮기지 못하고 일을 자꾸 미루는 습관이 있어요. 막상 일을 시작해도 마무리 짓지 못하고, 다 른 사소한 일에 매달리는 경우도 많구요. 미루는 만큼 쌓여가는 일들이 많아지다보니, 점점 더 하기 싫어지고 무기력해지는 것 같아요. 어떻게 하 면 좋을까요?

A: 조금씩 일을 미루다 보면 작은 일들이 산더미처럼 쌓여 마음을 더 짓누르게 되지요. 그래도 미루는 습관을 고치겠다는 마음을 가지셨으니 시작 이 반입니다. 이제부터 저와 함께 미루는 습관에서 벗어나는 길을 찾아 보아요.

첫째, 모든 것을 완벽하게 하겠다는 강박관념 때문에 일을 미루고 있다면, 기대수준을 조금 낮춰보세요. 실수하지 않고 완벽하게 처리하려면, 챙겨 야 할 게 참 많아집니다. 혹시라도 빠트리는 것이 있을까봐, 이것 저것 챙기다 보니 정작 중요한 일에 손을 대지 못하고 시간을 흘려 보냅니다. 결 과도 완벽할 것을 기대하니, 마음에 드는 성과가 드러날 것 같지 않으면 아예 시작도 못하는 경우가 많지요. 정작 일을 시작해놓고도, "내가 잘하고 있는가?, 제대로 하고 있는 걸까?"라는 자기검열의 생각 때문에 주춤주춤 거리고 일의 속도가 안납니다. 따라서, 100% 완전하게 해내겠다는 마음보다는 일단 70-80%만 도달해보자는 마음을 가져 보면 좋겠지요. 또, 큰 목표를 작은 덩어리로 나눠서 작 은 일부터 시작해보셔도 좋겠습니다. 집 전체를 다 정리하려고 하면 엄두가 나지 않지요. 하지만 방 하나, 혹은 방의 한쪽 일부분만 치운다는 마음 으로 시작하는 겁니다. 마치 지렛대의 원리처럼, 모든 일을 다 할 수는 없더라도, 작은 일을 하나 시작함으로써, 미뤄뒀던 큰 일을 하게 되는 시작 이 되는거지요.

둘째, 일을 미루면서 무기력한 상태에 빠져있다면, 작은 시도를 할 수 있도록 자기 자신을 격려해주세요. 누구나 마음 속에는 "네 이놈.. 똑바로해 야지"라고 높은 가치기준이나 도덕적 명령에 도달하도록 자신을 부추기는 상전의 목소리가 있습니다. 상전은 항상 "~~해야만 한다"고 명령하며, 하인의 게으름을 질타하고 몰아부칩니다. 하인이란 억압된 인격의 측면으로, 늘 꾸지람을 듣는 내면의 아이를 나타냅니다. 건강하지 못한 인격은 내면에서 상전과 하인이 서로의 입장을 존중하지 못하고 분열되어 팽팽한 싸움을 하며, 창조적인 에너지를 고갈시키게 됩니다. 이러한 상태를 신 경증적인 '자기고문게임'이라 하지요. 상전은 완벽을 추구하기에 하인이 도달할 수 없는 이상을 요구하며 하인을 야단치고, 하인은 다음에는 잘하 겠다고 하면서도 역시 말뿐 행동은 오히려 꾸물거리고 일을 회피함으로써 결국 상전과의 게임에서 승리를 합니다. 상전이 시키는 일이 하기 싫어 늦장을 부리거나 딴짓을 해서 속을 태우는거지요. 혹시 내가 어떤 일을 미루고 있다면, 내 안에서 저항하고 있는 것은 아닌지, 이러한 자기고문게 임에서 무기력한 상황에 빠져있는 것은 아닌지 살펴보시기 바랍니다. 만일 그렇다면, 스스로를 따뜻한 시선으로 바라봐주십시오. 마치 걸음마를 처음 배우는 어린아이가 비록 넘어지더라도 따뜻한 미소로 박수쳐주는 엄마의 시선처럼요. 자신의 부족하고 서툰 시도를 아무런 평가나 비판없이 바라보고, 뭐라도 시작했다는 것에 스스로를 격려하시기 바랍니다. 남 과 비교하지 말고, 적어도 내가 어제 시도하지 못했던 것을 오늘 해보았다는 것 만으로도 자신을 축하해주세요. 작은 시도와 작은 성공이 다음 발 걸음으로 이어지니까요.

셋째, 너무 많은 것을 고려하면서 결정을 미루고 있다면 선택의 가짓수를 제한해보세요. 예전에는 물건을 하나 사더라도 한정된 몇가지 중에 고르 면 그만이었지만, 이제는 최선의 선택을 위해 인터넷검색과 다양한 매체를 통해 관련 상품정보와 가격대를 비교하며 결정을 하게 됩니다. 최상의 선택을 하려고 애쓰면 애쓸수록 더 많은 선택의 가짓수를 넓히게 되고, 결국 선택을 미룰 수 밖에 없어집니다. 최선의 선택을 위해 시간을 미루는 것이 신중하다고 볼 수도 있지만, 선택을 미룸으로써 얻게 되는 손실도 생각해야겠지요. 예를 들어 새로운 컴퓨터를 구입하기 위해 온갖 사양을 비 교검토하느라 한두달을 지연하다보면, 더 업그레이드된 제품이 나올때마다 의사결정은 더 어려워집니다. 필요한 상황에 컴퓨터를 사용하지 못하 면서 제품비교에 들이는 시간비용까지는 고려한다면, 차라리 내가 필요한 그 순간에 적절한 사양과 가격에 맞는 제품을 구입하여 사용하는 것이 더욱 경제적인 선택이겠지요. 따라서 되도록 선택의 가짓수를 제한하는 것이 좋습니다. 시행착오를 겁내지 말고, 실험을 해본다는 마음으로 선택에 임하는 것도 좋을 것입니다. 생활을 단순화시키는 것도 일을 미루는 습관에서 벗어날 수 있는 방법입니다. 너무 많은 것을 관리하는데 들이는 시간을 줄일 수 있으니까요.

넷째, 벼락치기에 익숙해져 습관적으로 일을 미루고 있다면, 나만의 데드라인을 설정해보세요. 마감이 코앞에 닥치면 압박감 때문에 아드레날린이 분비되면서 광적인 에너지로 막판투혼을 펼칠 수 있습니다. 짧은 기간에 고도의 집중력을 발휘 하여 일을 해치우기도 하지요. 이러한 성취감에 '어떻게든 나는 해낸다'는 생각이 은연중에 쌓이면서 미루는 습관이 강화되기도 합니다. 또한 조금 부족한 결과에 대해 변명거리도 제공합니다. " 능력이 부족해서가 아니라 시간이 부족했을 뿐이라고" 변명하면서도 그 다음에 일을 할 때도 다시 미루는 습관은 여전합니다. 하지만, 이런 일이 반복되면 내성이 생기면서 끝낼 시간이 다가와도 더 이상 긴장되지 않고 집중력도 발휘되지 않습니 다. 넉넉한 시간이 주어져도 결국 끝내야 할 시간에 맞춰 일을 시작하기 때문에 미루기가 고질적인 습관으로 변하기도 합니다. 따라서, 마감일과 별도로 나만의 데드라인(Dedline), 즉 사선(死線)을 정해 보는 겁니다. 최종마감일 전에 중간 데드라인을 만들어두는 것도 좋겠 죠. 월말까지 마쳐야 할 보고서라면, 중순까지는 최소한 전체개요를 작성해 보는거지요. 또한 일을 끝내는 시점이 아닌, 일을 시작할 시간, 즉 개시 데드라인을 정해놓는 것도 유용한 방법입니다. 나중에 해야지 라고 막연하게 미루기보다는 다음 주 월요일까지는 어떻게든 시작하겠다고 마음 먹 는 거지요. 시작이 반이니까요. 단숨에 일을 해치울 수 없어 마냥 미루고만 있다면, 우선 한 시간 만 혹은 30분만 해보자고 마음먹고 시작해 보는 겁니다. 완성을 목표로 하는 것이 아니라, 정해진 시간 안에서 얼마나 해내는지 확인할 수 있으니, 좀더 현실적인 계획을 세울 수도 있겠지요.

이제 11월입니다. 얼마 남지 않은 한 해를 바라보며, 지금까지 내가 뭘 했지?라고 반문하고 계시지는 않으신가요? 쫓기는 마음에 허둥대다가 정작 중요한 일을 또 다시 미루고 있지는 않으신가요? 지금 이순간, 무엇을 하고 싶은지, 어떤 일을 해야 하는지 살펴보시고, 작은 것이라도 시작해보시 기 바랍니다. 미루는 습관 역시 단번에 완벽하게 고쳐지는 것은 아니까요. 일단 나 자신을 실험을 해본다는 마음으로 작은 시도를 해보세요. 당신의 작은 실험이 성공하시길 바랍니다.

칼럼리스트 : 이상희 삼성생활문화센터 상담실장