DAY 27
1

# 狀態

``````abstract State

immutable StatePair
current::State
proposal::State
end

immutable ConcreteState <: State
value::Float64
end
``````

`ConcreteState`就是直接拿來擴充的範例。

# Acceptance, energy function and loss function

``````function boltzmann_factor(g::Function, temperature::Float64)
if temperature == 0.0
return 0.0
end
ΔE = g()
if ΔE < 0.0
return 1.0
end
return exp(-ΔE / temperature)
end

function acceptance(sym::Type{Val{:energy}}, f::Function, states::StatePair, temperature::Float64)
g = () -> f(states.proposal) - f(states.current)
return boltzmann_factor(g, temperature)
end

function acceptance(sym::Type{Val{:loss}}, f::Function, states::StatePair, temperature::Float64)
g = () -> f(states.proposal, states.current)
return boltzmann_factor(g, temperature)
end

acceptance(sym::Symbol, f::Function, states::StatePair, temperature::Float64) = acceptance(Val{sym}, f, states, temperature)
``````

1. 一種版本是考慮到大家有可能一個狀態可以單獨算出一個energy的值，這是比較一般的case，所以使用者需要給的是energy function
2. 另一種是你的狀態無法精準算出energy，但是可以算出相對距離，也就是給不俱備絕對測量值的case用的，那他可以藉由定義好loss function，然後由這邊的套件幫你執行計算

`boltzmann_factor`是我去查了一些物理的統計力學名詞之後得出來的名字，當狀態轉成能量差後，把能量差除上溫度會是所謂的entropy，也就是熵，或是說亂度。

Julia語言—從入門到專案31