Daily Julia #8

まるで読めていない。分かってないものを無理矢理読み込もうとしてもきつい気がするのでお勉強ブログに切り替えようか。

R の findInterval が欲しい(Closed) #7469

RFC: findInterval(x,vec) by floswald · Pull Request #7469 · JuliaLang/julia

アレな感じのプルリクで実際マージされなかったが丁寧にコメントが付いており参考になる。

readavailable を廃止 #7478

discontinue readavailable() by vtjnash · Pull Request #7478 · JuliaLang/julia

Daily Julia #7

JuliaCon 続き。

Simon Byrne — Distributions.jl

  • 統計における分散を扱うパッケージ
  • 例:カーネル密度推定が簡単に実装できるよ!
  • Rmath をぶっとばせ
  • ポアソン密度関数を例に。式変形をうまくしないとオーバフローが起きたり桁落ち誤差が起きたり収束も遅かったり
  • log を直接求めるのは安定しないのでテイラー展開➡わかる
  • テイラー展開は正負の項が交互に現れるので桁落ち誤差が起こる➡わかる
  • r = x / (x + 2) と置けばすべて正の項になるので桁落ちがなくなる➡???
  • 桁落ちがなくなるのは分かるが r をどうやって思いついたのか見当がつかない
  • 数学能力が低過ぎて悲しい
  • 解析の勉強真面目にやり直さな…うう…
  • ちなみに Rmath は Horner 法で展開しているらしい➡IFPH でやったことあるやつだ!
  • 他にも様々なトピックがあるが曖昧な理解なのであまり触れるのやめておこう…

Dan Wlasiuk — A Brief History of TimeSeries

  • 時系列分析パッケージの基本的な使い方
  • パッケージのコードが少なめ。ミニマムな設計
  • Apply 系の関数は早いが Merge 系の関数が遅い。プルリク歓迎とのこと
  • 存在しないデータをどうするか。DataFrames と同様の問題に直面している
  • TimeSeries は存在しない値をなかったことにしている(NaNすら使わず単にテーブルが存在しない)
  • TimeSeries を利用しているいくつかのライブラリはこの対応に満足していない。Pandas のように NaN を詰めている(e.g. Quandl
  • R (quantmod) や Python (Pandas) との違いなど

Reid Atcheson — Rapidly Iterating from Prototype to Near-C Performance in Julia: A Finite Element Method Case Study

  • 有限要素法 (FEM) を実装したよ!
  • FEM の詳細には立ち入らずいかにして高速化したか
  • 一時変数をなくし ccall に切り替え devectorize した
  • naive な Julia コードに比べて 5 倍の高速化

Avik Sengupta — Moving Julia into Production

仕事で使ったという話かな。話を聞かないと分からないタイプのスライドだと思う。

Arch Robison — Practical Vectorization in Julia

Intel の並列計算の人らしい。ひえー。

内容は SIMD 並列化の話。まだシンプルな例に対してしか動かない、@inbound が必須、Float32 が最適、など種々の制限を抱えているが高速化はうまくいっているとのこと。

グラフィックスとマルチメディア

以下のセッションはマルチメディア・可視化関係なので感想だけ。

breakout session — package ecosystem (led by Iain Dunning)

パッケージ周りの状況。GitHub を中心にエコシステムが回ってるんですなー。pkg.julia.org はソーシャル圧力なのか…

Yuri Vishnevsky — Generative Art with Julia

Stackoverflow で見つけた visualization ネタを Julia に移植した的な。これは見ないと分からないが奇麗。

Daniel C. Jones — Gadfly: native Julia plotting and visualization

Gadfly は Julia では有名どころのプロットライブラリ。D3.js ベース。いい感じの作例が多い。

Spencer Russell — Realtime Audio in Julia with AudioIO.jl

オーディオライブラリあるんですか。無茶しやがって…感が強い。

これでいまのところ公開されている資料はひとさらいした。残りは Julia Core 関連のセッションなのだがこれはまだ来ていない。Bezanson による Julia Internal 解説や Leah Hanson による TypeCheck, Keno Fischer による Debugger の実装など重要度が高いセッションばかりなので早く見たいのだがこればかりは待つしかない。

Daily Julia #6

Julia の初のカンファレンスとなる JuliaCon が開催されている。

JuliaCon 2014: June 26-27, Chicago, IL.

なおスライドは以下に集められている。GitHub だと pdf 直接閲覧できないしリンクも貼りづらくありませんか…

JuliaCon/presentations

とりあえずタイムテーブル順にざっと見てみる。全分野素人なので詳しくは突っ込めない。

Tim Holy — Image Representation and Analysis

拡張子 .odp だと… open office 入ってないのでちょっとパス。一般的な話題っぽいし理解しやすそうと思っていたので残念。あとで気が向いたら確認する。

Pontus Stenetorp — Natural Language Processing with Julia

東大で自然言語を研究している人らしい。

  • Recursive Neural Network を実装してみたけど Matlab 並みに遅かったよ!でも Hacker News で聞いたら @inbound マクロを教えてもらって C に肉薄する結果が出たよ!
  • I/O が Python より遅い。ディクショナリのアクセスも Python より遅い。立ち上がりも正規表現も遅い?
  • transition-based な係り受け解析ライブラリの話 ninjin/allen

Iain Dunning / Joey Huchette — JuliaOpt - Optimization Packages for Julia

  • constrained な数学的最適化問題に絞った発表
  • MathProgBase.jl は Grobi, Clp/Cbc, GLPK, Mosek, lpopt などへのインターフェースを提供している
  • JuMP は代数的モデリングにより最適化問題を表現することができる
  • 例題として数独や遅延制約によるTSPなど

Madeleine Udell — Convex Optimization in Julia

後で学ぼう…

Douglas Bates — Fitting Statistical Models with Julia

13 枚しかないけど 1 枚毎に詰め込みすぎていて文章みたいになってる。内容もがっつり統計という感じなのでちょっとパス.

John Myles White — Representing Data in Julia

DataFrames.jl, DataArrays.jl の開発者によるデータ構造の解説。存在しないデータをいかにして表現するか、テーブルの表現は列指向であるべきか行指向であるべきか、データはメモリに保持すべきかディスクに保持するべきか、という基本的な点を詳説しており非常にためになる。

短く簡潔なスライドなので直接読んだほうが早いが軽くまとめておく。

存在しない値を表現する方法を模索していたが既存の方法には問題があった。

  1. 番兵 - 分かりやすいが特定の型ごとに NA を表す値を決めてやらねばならず(しかもそれは規約的)非常に面倒
  2. Option 型 - いわゆる Maybe であり、いい解決法に見えるがこの型は BLAS などで扱える配列の形式に馴染まない

上の問題を避けるために、NA をシングルトン (NAtype) として定義し、Array{T} の値保持形式を Union{T, NAtype} とすることで解決を図ったらしい。もっともこれは Option が使えない苦肉の策といった感じで、型が不安定であったりするなどの弊害もある。

なんとか Option 型を使えないかなーと画策しているらしいが BLAS compatible な実装を考えるのは難しい模様。

次。

テーブルの保持形式は行指向にするべきか列指向であるべきかという問題。それぞれ Pros & Cons があるが DataFrames は列指向でやっている。

次。

データはメモリに保持すべきかディスクに保持すべきか。これは今のところ普通にメモリ上にロードしている。しかし今後はon-diskなデータの取り扱いもうまくできるようにしたいらしい。

発表初日分の資料も目を通せていないが今日はここまで。

Daily Julia #5

range がおかしい #7420

Indexing a range by a range · Issue #7420 · JuliaLang/julia

r=0:0.1:1
a=collect(r)
a[1:5] # returns Float64[0.0, 0.1, 0.2, 0.3, 0.4]
r[1:5] # returns 0.0:0.01:0.04 

謎の挙動であるのは分かるが何を言っているのかちょっと理解できていない。

r=1:0.002:20
r[2:4] # returns 0.002004:4e-6:0.002012

以下で一応修正しているらしい。

Fix #7420 by ivarne · Pull Request #7421 · JuliaLang/julia

Pkg.add の挙動 #7325

Pkg.add installs wrong version · Issue #7325 · JuliaLang/julia

ぽつぽつとコメントが付いている模様。

Pkg.add の第 2 引数には version を指定できるのだが、以下のコードでは意図しないバージョンのパッケージがインストールされたように見える。

julia> Pkg.add("ArgParse",v"0.2.7")
INFO: Installing ArgParse v0.2.8
INFO: Installing Options v0.2.2
INFO: Installing TextWrap v0.1.2
INFO: Package database updated

実は Pkg.add のバージョンは下界を定めているだけらしい(ドキュメント読んでも分かり辛いが、REQUIRE の書式 に倣うとのこと)。

またバージョン番号リテラルの書式は有用で、次のように指定できる。

julia> Pkg.add("ArgParse", v"0.2.7", v"0.2.8-")

Daily Julia #4

A & B & C のパース #7368

:(A & B & C) が 2 項演算子の式 Expr(:call, :&, Expr(:call, :&, A, B), C) として扱われる。これは意図された動作だが、Julia は 3 項以上の条件演算をできるように定めていたはずなので Expr(:call, :&, :A, :B, :C) として扱うほうが合理的である。

Daily Julia #3

最大/最小値関数周りのリネームに関する議論 #7327

RFC: Added find_extrema, ind_extrema by kmsquire · Pull Request #7327 · JuliaLang/julia

Julia では Array の最大最小値の情報を得るための関数がいくつも存在する。

  • まず maximum, minimum という最大値と最小値のみをそれぞれ得る基本的な関数がある。

  • また extrema という関数がある。これはArray から最大値と最小値のタプルを返す関数である。

  • さらに indmax, indmin という Array から最大値あるいは最小値のインデックスを取り出す関数がある。

  • はたまた findmax, findmin という関数もある。これは値とインデックスのタプルを返却する。

現在ある最大最小値系の関数を表にすると次のようになる。

value (value, index) index
最小値 minimum findmin indmin
最大値 maximum findmax indmax
最大最小値 extrema - -

この Issue は「extrema における ind_extrema, find_extrema を追加しよう」というものだった。だった、というのは途中から議論の方向が「そもそもこの辺りの名前があまりよくない」という風向きになってきたからである。

まず口火を切ったのは Karpinski で、indmin, indmax という名前が lousy in the first place (そもそも気に食わない)と言い、argmax, argmin にリネームすべきと述べた。

すると johnmyleswhite は、argmax, argmin にするのはいいがそれは基本的に数学におけるある関数 f の最大/最小値を意味する言葉なのでインデックスを表す言葉に使うのはいかがなものかとコメントしている。

それにさらに応えて kmsquire 曰くいやいや関数 f をインデックスを値にマッピングする関数として捉えれば問題ないよ云々。高度なことを言っているわけではないが自分が同じように言い返せるかというと無理ですわ。

さて、いくらかの議論ののち kmsquire がまとめたところによると最大/最小値関数周りのネーミングは次のように整理され書き直された。

value (value, index) index
最小値 minimum findmin argmin
最大値 maximum findmax argmax
最大最小値 extrema findminmax argminmax

まだマージされていないがこれ以上あまり議論する余地もないだろうしそのうち取り入れられるだろう。

Git を Libgit2 に置き換える準備が整いつつある? #7339

WIP: andrioni's Libgit2 work by StefanKarpinski · Pull Request #7339 · JuliaLang/julia

Package のアップデートが遅いので (大量の git のシステムコールボトルネック?) libgit2 で書き換えて高速化しようという案件。前回の Issue が2013 年の 8 月なのでとっくに終わったものと思っていたら、ようやく一里塚に漕ぎ着けたというところだったのか。

Reimplement Git using libgit2 · Issue #4158 · JuliaLang/julia

関数が属しているモジュールを取るリフレクション #7322

added reflection method by mauro3 · Pull Request #7322 · JuliaLang/julia

これは便利なんじゃなかろうか。

julia> Base.@binding_module sin
Base

julia> Base.@binding_module a
ERROR: Symbol a is not bound in the current module Main and not exported in any 'used' module.
 in error at error.jl:21
 in binding_module at reflection.jl:171

julia> a = 4
4

julia> Base.@binding_module a
Main

julia> Base.binding_module(:a)
Main

Karpinski は REPL 上で属しているモジュール名を印字するようにすればいいんじゃねと言っている。

cumsum のパフォーマンスが悪い #7342

To improve performance in cumsum · Issue #7342 · JuliaLang/julia

cumsum は配列を類積和の配列にして返す関数。キャッシュを実装してないから遅い云々。どんなもんかなと実装見たらメタプログラミングされてて軽くビビった。