2019年4月13日土曜日

最適化理論の難しさ

非線形最適化では制約想定を仮定したうえで収束とかの議論を行うことがあるが、制約想定のうちの一つのMangasarian-Fromovitz制約想定を扱ったものについては、間違った結果や証明を行っているものも少なくないようだ。

https://arxiv.org/pdf/1803.11304.pdf

個人的には、Newton 法の2次収束についての証明における「最適解に十分近いところからスタートすれば」というのが、ちょっと変だなぁ、と感じることもある。終了判定に使う閾値をεとしたときに「最適解からε未満の距離にある点からスタートすれば」当然ながら最初の終了判定でアルゴリズムは終了するので、2次収束よりも圧倒的に高速である。このあたりに最適化理論の解析の困難さが付きまとっているように感じている。

2019年4月2日火曜日

Julia の PyCall で python ファイルを reload する

Julia の Pycall だと、pyimport で python のファイルを読み込みはできるが、python ファイルを修正しても pyimport のそのままでは読み込めない。
これを回避するには、以下のように pyimport に reload とかをつける必要がある。
(たぶん python 側の制約じゃないかと思う。)


ここでは、test_py.py の中に test1() という関数がある場合とする。

まずは、python でどれを使っているかを明示して、
ENV["PYTHON"] = "/usr/bin/python"
それから、現在のディレクトリを python の path に通す。
using PyCall
if PyVector(pyimport("sys")["path"])[1] != ""
    pushfirst!(PyVector(pyimport("sys")["path"]), "")
end

このあとは、
if @isdefined(test_py)
    test_py = pyimport("importlib")["reload"](test_py)
else
    test_py = pyimport("test_py")
end
とする。
初回は pyimport("test_py") で読み込めるが、2回目以降は読み込めないので、これを "reload" を使って再読み込みするようにしている。

このようにすれば、test_py.test1() としてモジュールの中の関数を呼び出すことができる。