2023년 4월 3일 월요일

결착은 일본식 한자어

 적어도 10년전까지는 결착이란 단어를 본 적이 없었던 것 같은데 최근 들어 심심치 않게 들린다. 심지어는 방송에도 등장하는 것 같다. 혹시나 싶어 찾아보니, 일본식 한자어인 것이 거의 확실한 것 같다. 비록 사전에 등재되어 있다곤 하지만 일제 이전 과거 기록에서 사용된 예가 거의 없다고 한다. 개인적으로도 이전에 들어본 단어가 아니기 때문에 확실하다고 본다. 도대체 왜 이런 단어가 쓰이게 된 것일까? 아마도 일본  만화나 애니메이션 번역 과정에서 일본식 한자어를 그대로 사용했기 때문일 것이다. 충분히 승부,매듭을 짓다 등의 익숙한 표현들이 있는데  그대로 쓴 것은 번역자의 게으름이라고 볼 수 밖에 없다. 문제는 이런 사실을 모른체 사용하는 사람이 늘고 있다는 것이다. 심지어 열혈강호 라는 국산만화에서도 결착이라는 단어를 사용하는 것이 충격적이었다. 일본식 한자의 사용을 경계하는 것이 무리인 것일까?   일본 문화를 즐기는 것 자체는 문제가 없다고 볼 수도 있겠지만 아마도 더 큰 문제는 청소년들이 일본 문화를 즐기면서 자신도 모르게 일본에 동화되어 가는 것이 아닐까 싶다.

2023년 3월 22일 수요일

GEANT4 설치 Ubuntu 22.04

Geant4 , Ubuntu, Qt 등의 version이 바뀜에 따라 인터넷에서 찾아본 설치과정이 더 이상 옳지 않은 경우가 생겼다. 

그래서, 현재 버전 (Geant 4 v.11, Ubuntu 22, Qt 5)에 맞는 설치 방법을 찾아야 했다.

설치 과정은 다음 링크를 주로 참고 했다.  

 https://evanote.mew.kr/course/g4install/ubuntu/g4install-111-ubt2204/


List of steps to install Geant4 in Ubuntu

(1) 시스템 업데이트 

sudo apt update -y && sudo apt upgrade -y && sudo apt autoremove -y

(2) 필수 프로그램 설치

sudo apt install -y build-essential

sudo apt install -y cmake

sudo apt install -y libexpat1-dev

sudo apt install -y libxmu-dev

(3) Qt 설치:

웹페이지에는

sudo apt install -y qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools

이면 충분하다고 되어 있으나,Qt53D 실행에 문제가 있어서, 아예 remove하고

새로 Qt 를 정식 홈페이지에서 다운 받아 설치 했다.

(4) Geant4 source 코드를 다운 받음.

(5) cmake를 이용하여 build 준비 

sudo cmake <source path > -DCMAKE_INSTALL_PREFIX="<install path>" -DGEANT4_BUILD_MULTITHREADED=ON -DGEANT4_INSTALL_DATA=ON -DCMAKE_PREFIX_PATH="< Qt path >Qt/5.15.2/gcc_64/lib/cmake/" -DGEANT4_USE_QT=ON

(6) build and install
sudo make && make install


예제코드를 compile하기 위해서는 

cmake < example path > && make 

를 하면 된다. 

2023년 2월 13일 월요일

c++로 짜여진 코드에서 흔히 보는 세 연산자 "::" , "->", "." 의 차이

 c++로 짜여진 코드에서 흔히 보는 세 연산자 "::" , "->", "."   의 차이 


세 연산자 모두 멤버 함수나 변수에 접근하기 위해 사용된다.

그 차이는 접근하는 방법에 있다. 


https://stackoverflow.com/questions/11902791/what-is-the-difference-between-and-in-c


(1) Dot operator is used in direct member selection scenarios.

print(a.b)

Here, we are accessing b, which is a direct member of an object a. So, primarily, a is an object and b is a member (function/ variable etc) of a.

즉 여기서 a 는 object 


(2) Arrow operator is used in indirect member selection scenarios.

print(a->b)

Here, we are accessing b which is a member of the object, that is pointed to by a. It is shorthand of (*a).b and so here, a is primarily a pointer to an object and b is a member of that object.

즉, 이 경우 a 는 pointer 

(3) Double Colon (Scope) operator is used in namespace related direct member selection scenarios.

print(a::b)

Here, we are accessing b which is a member of the class/namespace a.So, primarily, a is a class/namespace and b is a member (function/ variable etc) of a.


즉, 이 경우 a 는 class/namespace. 

2023년 2월 7일 화요일

일생소애 一生所爱

 얼마전 넷플릭스에서 선리기연을 오래간만에 다시 보았다. 이미 여러번 보았기 때문에, 예전과 같은 재미나 감동을 느끼지는 못했지만, 여전히 일생소애(一生所爱) 노래가 흘러나오는 부분에서는 아련함을 느낄 수 있었다. 노래의 가사를 잘 몰랐기 때문에 인터넷으로 한 번 찾아보았는데, 중국어를 하나도 모름에도 대강의 뜻을 파악할 수 있었다. 오히려 한국식 한자 음을 붙여보니, 신선한 재미가 있었기에, 여기에 적어본다. (한 번 한국식 한자음으로 노래를 불러보라. 색다를 것이다.) 

인터넷에서 찾아본 바로는 가사의 한자가 조금 다른 경우가 있었다. 어느 쪽이 맞는지 모르므로, 그냥 한자와 해석을 나무 위키에 있는 것을 가져왔다.(중국어 해석이 맞는지 모름) 중국음은 역시 나무위키를 볼 것. 여기서는 각 한자를 풀어 보기만 하겠다.

從前現在過去再不來
종전현재과거재불래
(쫓을 종, 앞 전, 나타날 현, 있을 재, 지날 과, 갈 거, 두 재, 아니 불, 올 래)
흘러간 시간은 한 번 가면 다시 오지 않는 것이라

紅紅落葉長埋塵土內
홍홍낙엽장매진토내
(붉을 홍, 붉을 홍, 떨어질 락, 잎 엽, 길 장, 묻을 매, 티끌 진, 흙 토,안 내)
울굿불긋한 낙엽이 흙먼지에 묻혀만 가듯이

開始終結總是沒變改
개시종결총시몰변개
(열 개, 비로소 시, 마칠 종, 맺을 결, 다 총, 이 시,빠질 몰, 변할 변 ,고칠 개)
시작이 있으면 끝이 있음은 바꿀 수는 없는 법인 즉

天邊的你飄泊在白雲外
천변적니표박재백운외
(하늘 천, 가장자리 변, 과녁 적, 너 니(이), 나부낄 표,머무를 박,
있을 재 ,흰 백,구름 운,바깥 외)하늘가의 당신은 흰 구름 저 멀리에서 아른거릴 뿐이오

苦海翻起愛恨
고해번기애한
(쓸 고, 바다 해,날 번,일어날 기,사랑 애,
한 한)
고해속에서 반복되는 사랑과 미움은,

在世間難逃避命運
재세간난도피명운
( 있을 재, 인간 세,사이 간,어려울 난,도망할 도,
피할 피 ,목숨 명, 옮길 운)
속세에서는 피하기 어려운 운명이라네

相親竟不可接近
상친경불가접근
(서로 상, 친할 친,마침내 경, 아닐 불, 옳을 가, 이을 접,가까울 근)
서로 사랑하지만 끝내 곁에 두지 못하는

或我應該相信是緣份
혹아응해상신시연분
(혹 혹,나 아,응할 응,갖출 해,서로 상, 믿을 신,이 시/옳을 시,인연 연,부분 분)
이것이 운명임을 받아들여야겠지


情人別後永遠再不來
정인별후영원재불래
(뜻 정,사람 인,나눌 별,뒤 후, 길 영,
멀 원 , 두 재, 아닐 불, 올 래)
떠나간 사랑은 다시 돌아올 수 없으리니

(消散的情緣)
소산적정연
(사라질 소, 흩을 산, 과녁 적, 뜻 정, 인연 연)
(사라져버린 정분이여)

無言獨坐放眼塵世外
무언독좌방안진세외
(없을 무, 말씀 언, 홀로 독, 앉을 좌,
놓을 방 , 눈 안, 티끌 진,인간 세,
바깥 외 )
말없이 홀로 앉아, 눈은 저 멀리 속세 밖을 보네.

(願來日再續)
원내일재속
(원할 원 , 올 래,날 일,두 재,이을 속)
(내일은 다시 이어지기를)

鮮花雖會凋謝(只願)
선화수회조사(지원)
(고울 선, 꽃 화,비록 수 ,모일 회, 시들 조,사례할 사, 다만 지,원할 원 )
곱던 꽃은 이내 시들어버리지만 (바라건대)

但會再開(為你)
단회재개(위니)
(다만 단,모일 회,두 재, 열 개,할 위 , 너 니(이) )
다시 피어날지어다 (당신을 위하여)

一生所愛隱約(守候)
일생소애은약(수후)
(한 일 ,날 생 ,바 소,사랑 애,숨을 은 , 맺을 약,지킬 수 ,살필 후)
평생 사랑했던 그대지만 이젠 그대 모습 마음에 어렴풋하네. (기다리고)

在白雲外(期待)
재백운외(기대)
(있을 재 ,흰 백, 구름 운, 바깥 외, 기약할 기, 기다릴 대)
흰 구름 밖에서... (또 기다리리라)

2022년 10월 9일 일요일

Tensorflow 2.0 custom gradient 만드는 법( vector output, multiple out의 경우)

 텐서플로우에서 이미 정의되어 있지않거나, 기존의 함수를 새로운 함수로 대체하고 싶을 경우, back propagation을 위한 gradient를 새로 정의할 필요가 있을 때가 있다. 이런 경우, 텐서플로우에서 @tf.custom_gradient 데코레이터를 이용하여 custom gradient를 정의해 줄수 있다. 

간단한 scalar 함수(y=f(x) 모양, 예를 들어 y = log(1+exp(x) ) 처럼)의 경우에는 https://www.tensorflow.org/api_docs/python/tf/custom_gradient 에 있는 예제를 보는 것으로 충분하다. 그러나, 결과값,output 이 array, vector, tensor 인 경우에 어떻게 custom gradient를 정의해야하는지는 예제를 찾기 어렵다. 나도 한참 코드를 만들고 고치면서 실험을 하고서야 방법을 알아낼 수 있었다.

그러나, 그렇게 고생해서 알아낸 것이 이미 위의 링크 페이지 맨 아래에 있는 설명을 잘 읽으면 되는 것이라는 것을 나중에야 알게 되었다. 

원칙적으로 input이 vector이고 output이 vector인 경우 수학적인 의미의 gradient는 Jacobian이 된다. 

예를 들어 input 이 (x1,x2) , output이 (y1,y2,y3) 인 경우, Jacobian은 dy1/dx1, dy1/dx2, dy2/dx1, dy2/dx2, dy3/dx1,dy3/dx2 를 모두 계산해야 한다. 

그러나, 신경망에서 관심이 있는 gradient는 사실상 loss function 에 대한 변수의 미분이기 때문에, 실제로는 dy/dx 가 아니라 d(loss)/dx = d(loss)/dy * dy/dx 만 필요하다. 여기서 , d(loss)/dy 를 upstream 이라고 부르고, 그 shape는 output y 의 shape와 같다.  custom_gradient로 정의하는 gradient는 바로 d(loss)/dx 이지, dy/dx 가 아니라는 것이다. (다만, Gradient tape를 이용하여 tape.gradient(y,x) 를 계산할 경우 y 가 scalar라면 upstream=1이라고 둘 수 있으므로 dy/dx 를 구하는 것과 마찬가지가 된다.)

 gradient의 output인 d(loss)/dx 는 input x의 shape와 같다. 따라서, custom gradient에서 정의하는 함수는 upstream을 input 으로 받아서, input x의 shape와 같은 모양의 결과를 내도록 정의되어야한다. 즉, y 가 vector라면, Jacobian에서 y 의 vector 축으로 그 값들을 모두 합한 결과가 필요한 것이다. 

위의 예의 경우에는 d(loss)/dx1 = d(loss)/dy1 * dy1/dx1+d(loss)/dy2 * dy2/dx1 +d(loss)/dy3 * dy3/dx1 로 구하고,  마찬가지로 d(loss)/dx2 를 계산하여 d(loss)/dx 를 return 하도록 custom gradient를 정의하면 된다. 

한편 새로 정의하는 함수 자신이 variable을 가지고 있을 경우에는 , (y=f(x;w) 처럼), 변수에 대한 미분도 정의해 주어야 한다. 이 경우에도 d(loss)/dw 는 변수 w 의 shape와 같아지도록 custom gradient를 정의한다. (즉,  d(loss)/dw= d(loss)/dy * dy/dw 에서 d(loss)/dy 의 shape는 y 의 shape와 같고, dy/dw의 Jacobian에서 redundant한 축에대해 더해주어 올바른 shape가 되도록 만들어야한다.)  


다음은  Y = X.W +b 인 경우를 custom gradient를 이용하여 구현한 것이다. 여기서 X.shape는 (batch_size, input_size), W.shape 는 (unit_size, input_size), Y는 (batch_size, unit_size) 의 모양을 가지는 tensor 이다.

  

@tf.custom_gradient

def custom_op(x):

    @tf.function

    def _inner_function():

        y = x @ w + b

        return y # y shape = (batch_size,unit_size)

    y = _inner_function()             

    def grads(upstream,variables):

        # here upstream is a shape of (batch_size,unit_size)  

        assert variables[0] is w

        dydx = upstream @ tf.transpose(w)  # (batch_size,input_size)

        dydw = tf.transpose(x) @ upstream  # (input_size,unit_size)

        dydb = tf.reduce_sum(upstream,axis=0) # (unit_size,)

        return dydx, [dydw, dydb]

    return y, grads


      



2022년 10월 4일 화요일

양자역학, CHSH 부등식, Bell 부등식

고전 역학과 양자 역학중 어느 것이 옳은지를 확실히 구분할 수 있는 실험 방법으로 Bell 부등식 또는 CHSH 부등식 실험이 있다. 결론부터 말하면, 고전역학에 기반한 (realistic local  hidden variable theory) 어떠한 이론이건 부등식을 만족시켜야하지만, 양자역학의 경우에는 부등식을 만족시키지 않을 수 있다. 따라서, 어떤 실험을 통해 부등식이 만족되지 않는 경우를 관찰한다면, 고전 역학이 옳을 수 없다는 것이 증명된다. 

양자역학적으로 서로 entangle 되어 있는, 예를 들어 두 개의 전자가 total spin zero 인 상태 $|S=0>=1/sqrt(2)(|up,down>-|down,up>)$ 에서 두 입자를 서로 다른 방향으로 보내어 A와 B에서 관찰한다고 생각해보자. 이 때, 두 관찰의 시간 차이동안 빛의 속도로 정보를 보내도 영향을 미치지 못할 정도로 A와 B는 매우 멀리 떨어져 있다. 양자 역학적으로는 A와 B의 측정 결과는 아무리 멀리 떨어져 있더라도 서로 관련이 있어 한 입자의 측정 결과는 입자 자체의 성질이 아니고 다른 입자와 함께 떼어 놓고 생각할 수 없다. 반면, 고전 역학적으로는 A와 B의 측정 결과는 서로에게 영향을 미칠 수 없고, A에서 관측된 결과는 오직 그 입자가 원래 가지고 있던 성질에 의해 결정된다.  

좀 더 구체적으로, A에서 실험의 관측값이 오직 두가지만 가능한, A0와 A1 이라는 두가지 실험중 하나를 랜덤하게 한다고 하자. 입자에 대해 A0 실험을 하면 +1 이거나 -1 인 결과를 얻는다. 마찬가지로 A1 실험에 대해서도 +1 이거나 -1 인 결과를 얻는다. 
만약, 입자의 관측 결과가 입자 자체의 성질에 의한 것이라면, 입자는 
(1,1),(1,-1),(-1,1),(-1,-1) 의 4가지 성질을 가지고 있을 수 있다. 즉, 원래 입자가 (1,-1)이라는 성질을 가지고 있었다면 A0 실험을 할 경우 1 , A1 실험을 할 경우 -1 이라는 관찰을 하게 될 것이다. 따라서, A에서 입자가 가지는 성질을 (a0,a1) 이라고 나타낼 수 있다. 
이 때, 입자가 4가지 성질 중 어느 것을 가지더라도, a0+a1 이나 a0-a1 중 하나는 반드시 0이 되고, 다른 하나는 반드시 +/- 2 값을 가지게 된다.   
마찬가지로 B에 있는 입자의 성질도 (b0,b1)이라고 나타낼 수 있다. 

두 입자의 성질의 다음과 같은 조합을 생각해 보자.

S = b0(a0 +a1)+b1(a0-a1) = a0*b0 + a1*b0 + a0*b1 -a1*b1 

(a0+a1) 과 (a0-a1) 중 하나는 반드시 0 이 되고, 나머지 하나는 +/- 2가 되고, b0와 b1 은 +/-1의 값을 가지므로, S의 값은 +2 나 -2 가 될 수 밖에 없다. 
이것은 입자 한 쌍에 대한 결과이다. 실험을 반복하여 많은 수의 실험 결과에 대한 평균을 낸다고 하자.  
S의 평균 값을 <S >으로 나타내면, 
<S> = < A0*B0> + < A1*B0> +< A0*B1> - <A1*B1> 
으로 쓸 수 있다. 여기서, < A0*B0>는 A0와 B0의 실험을 했을 때의 평균값을 나타낸다.
예를 들어 두 입자가 A0와 B0 실험에 대해 a0,b0라는 성질을 가지고 있을 경우, 
A0*B0 의 값은 단순히 a0*b0 로 두 값의 곱이 된다.    
만약 많은 수의 입자 쌍에 대해 실험을 하여 평균을 내면, 
하나의 입자쌍에 대해 S 는 +/- 2를 가질 것이므로, 
S의 평균값은 -2 에서 +2 사이에 있게 될 것이다. 
이것이 CHSH  부등식( -2<= S <= 2 ) 이고, 고전역학이 맞다고 반드시 만족시켜야하는 조건이다. 
(실제로는 하나의 입자에 대해서는 한가지 종류의 실험만이 이루어 질 것이다. 
예를 들어 첫번째 입자 쌍에 대해 A0와 B1이라는 실험을 하면, a1과 b0값은 측정이 안된다.
하지만, 많은 수의 입자에 대해 실험을 반복할 경우, A0 실험의 평균값 < A0> 는 모든 입자에 대한 a0 의 평균값에 가깝게 될 것이다. 다른 실험의 평균값의 경우도 마찬가지.)      

한편, 양자역학적으로 얽힌 상태의 경우, 예를 들어 $|S=0>=1/sqrt(2)(|up,down>-|down,up>)$의 경우  A0*B0의 실험 값은 expectation value, $<S=0| A0*B0| S=0>$
에 의해 결정된다. 이것은 다음과 같이 계산할 수 있다. 

<S=0|A0*B0|S=0> = (1/2)*(up|A0|up)*(down|B0|down)
                          -(1/2)*(up|A0|down)*(down|B0|up)
                          -(1/2)*(down|A0|up)*(up|B0|down) 
                          +(1/2)*(down|A0|down)*(up|B0|up)

즉, 양자역학의 경우는 결과가 단순히 곱으로 분리되지 않는다. 

특별히, 다음과 같은 실험을  준비한다고 하자. 

A0 : z축. 즉 ( 0,0, 1) 방향으로의 spin 값 측정
A1 : x축, 즉 ( 1,0,0 ) 방향으로의 spin 값 측정
B0 : 45도 축, 즉 (-1,0,-1) 방향 으로의 spin값 측정
B1:  -45도 축 , 즉 (1,0,-1)방향 으로의 spin값 측정

양자역학적으로는 각 실험에 다음과 같은 operator를 정해주는 것에 해당한다. 
A0 = sigma_z, 
A1 = sigma_x 
B0 = -1/sqrt(2)( sigma_x+sigma_z) 
B1= 1/sqrt(2)( sigma_x-sigma_z)

이 경우에 계산을 해보면 
< S=0| A0*B0| S=0> =  < S=0| A0*B1| S=0> =< S=0| A1*B0| S=0>= 1/sqrt(2) 
< S=0| A1*A1 |S=1> = -1/sqrt(2) 
으로 
S의 평균값은  (1/sqrt(2)+1/sqrt(2)+1/sqrt(2)-(-1/sqrt(2)))= 2*sqrt(2) 가 예상되게 된다. 이것은 고전역학이 만족시켜야하는 CHSH 부등식( -2 <= S <= 2)을 분명히 만족시키지 않는다. 따라서, <S> 의 값을 측정한 결과가 양자역학의 예상과 일치한다면, 고전역학은 틀릴 수 밖에 없다. 

photon 을 이용한 실험결과 <S>의 값이 고전적인 CHSH 부등식을 만족시키지 않고 양자역학적인 예측값과 일치하는 것을 확인할 수 있다고 한다. 

2022년 5월 24일 화요일

mingw-w64 install

 At some point, the install program of mingw-w64 does not work properly with error message " The file is not downloaded properly." 


The solution to this problem is to directly download the compiled files. 

(1) Go to the link

https://sourceforge.net/projects/mingw-w64/files/

(2) Select the chosen version of files (I choose x86_64-posix-seh )

(3) download and unzip. copy the file to c:\mingw-w64 (or to any path of choice)

(4) include the path (/bin and /include) to the Windows. 

   (For example c:\mingw-w64\bin and c:\mingw-w64\include) 

    ("system property"->"advanced"->"environment variables"-> "Path"->"add") 

 (5) Now one can use mingw in the command prompt.