俺のための Julia 入門(0)

数値計算への新たな接近

Julia
俺のためのJulia入門
Author

司馬博文

Published

9/05/2020

Modified

7/04/2024

概要
Julia はスクリプト言語とコンパイル言語の良いとこどりを目指して開発された言語である.Matlab のような数学的な記述ができ,C のような実行速度を保ち,Python のような汎用性を持ち,Shell のようなモジュール性を持つ.

1 Julia のすすめ

1.1 導入

Julia は Why We Created Julia の文書と共に,2/14/2012 に公開された科学計算向けの言語である.論文 (Bezanson et al., 2017) が発表されて後,2018 年にはバージョン 1.0 がリリースされた.

現在の最新は,12/26/2023 リリースの v1.10.0 である.

1.2 Quarto で始める Julia

Quarto は Jupyter を通じて,Pytho, R だけでなく Julia もサポートしている.1

Code
using Plots

plot(sin, 
    x->sin(2x), 
    0, 
    2π, 
    leg=false, 
    fill=(0,:lavender))
図 1: Parametric Plots

Quarto で Julia を始めるために,最も簡便なインストール方法は こちら

  1. まずは Julia をインストール

    curl -fsSL https://install.julialang.org | sh

    すると,julia コマンドで対話的セッションを開始できる.これを Julia では REPL (Read-Eval-Print Loop) と呼ぶ.

  2. 続いて,Quarto で julia ブロックを動かすには,IJulia パッケージをインストールする.次を REPL で実行する:

    using Pkg
    Pkg.add("IJulia")
    using IJulia
    notebook()

    これで,Jupyter Notebook で Julia を使うことができる.2

  3. Revise.jl も追加すると,Julia セッションを再起動するためが省ける

    using Pkg
    Pkg.add("Revise")
  4. Jupyter Cache も追加すると,ソースが変わらない限りその出力がキャッシュされ,再実行が控えられる.

    using Conda
    Conda.add("jupyter-cache")
Getting Started
juliaup update

その後,

jupyter kernelspec list

で表示されるカーネルもアップデートする必要がある.アップデートは再インストールによる:

using IJulia
installkernel("Julia")

1.3 パッケージ管理

Julia を始めるにあたって最も心強いのは,Julia 独自のパッケージマネジャー Pkg の存在である.

juliaキーワードで立ち上がる対話的実行環境 REPL(第 [@-sec-REPL] 節)において,] キーでパッケージモードに入り,add でパッケージを追加する.

(@v1.10) pkg> status  # または st

でパッケージの情報が表示される.

(@v1.10) pkg> update  # または up

でアップデートが可能である.

(@v1.10) pkg> status --outdated -m

により,アップデートがあるパッケージの一覧を得ることができる.

ものによっては,アップデートを阻害している依存関係が見れる.

(@v1.10) pkg> rm Example

1.4 プロジェクト

パッケージ管理システム Pkg が提供する環境分離システムの単位を プロジェクト という.3

generateは新たなディレクトリと,Project.tomlsrc/MyPackage.jl を作成する.

(@v1.10) pkg> generate MyProject

activate . はパスを引数に取り,そのディレクトリにある Project.toml を有効化する.

(@v1.10) pkg> activate MyProject

引数なしで activate を実行することで,デフォルトの環境に戻る.

(@v1.10) pkg> instantiate

は,working directory にプロジェクトファイル(Project.tomlManifest.toml)を作成する.

1.5 数学表記

何よりコードの見た目の特徴に,LaTeX コマンドと数学記号が使える ことがある.

law tex を打って tab を押すと処理されるのである!

α = 2  # \alpha と打って tab を押すと処理される.
β = 3
γ = α + β

println("α + β = $γ")
α + β = 5

加えて,プロットのタイトルにも使える:

Code
using Plots

plot(1:10, (1:10).^2, title="Plot of \$y = x^2\$")

これと合わせ,変数名にはUnicodeが許される.÷, ^ などの使用が直感的に行える.

÷
div (generic function with 57 methods)
x = 2^3  # 2の3乗
println("2^3 = $x")
2^3 = 8

また,変数の前に数値をつけると暗黙に乗算と解釈する.

そのほかにも関数定義など,数学的にも直感的に読める,文芸的プログラミングの精神が込められている言語である.

1.6 Shell コマンド

pwd()
cd()

などのコマンドが使える.

2 概要

2.1 クラス構造

  • 組み込み型,組み込み関数はいずれもBaseクラスに属する.

2.2 Read-Eval-Print Loop

julia コマンドで起動される

  • —project
    • —project=@. の略記.
    • 現在のディレクトリ . にある Project.toml によるプロジェクトを有効化する,
    • PERL における activate コマンドに対応する.
    • 環境変数 JULIA_PROJECT@. に変更することと等価.
  • Ctrl+Dexit()で終了
  • ans:直近の evaluated term が格納されて居る.

5つのモードがある.

  1. Juliaモード
  2. help:? で発動.backspace で戻る.使いやすい!
  3. package:] で発動.標準では GitHub のリポジトリ上の任意のモジュールがインストール可能.
  4. shell:; で発動
  5. search

3 Pkg

]で package mode に入る.

pkg> add <package name>  # 追加
using <filename without extension>  # 使用
help  # 使用可能なコマンドの一覧
  • st (= statusの alias)
    • 現在のプロジェクトがどの config file によるかの確認
      • デフォルトは Status ~/.julia/environments/v1.5/Project.toml
      • こういうデフォルトプロジェクトはユーザー固有になる(ホームディレクトリの下にあるから)
    • 現在インストールされている外部パッケージの状態
  • rm (= removeの alias)
    • install した package を消去する
  • up (= updateの alias)
    • 引数無しで用いると,install している全ての package の更新
  • gc (garbage collection)
    • package の追加・削除・消去を繰り返すと不要なデータが蓄積するらしい.これを自動的に削除してくれる.

3.1 プロット

3.1.1 Plots

  • Soss

3.2 Soss:確率的プログラミング

3.3 数値実験4

3.3.1 JLD2:数値実験の結果を保存

3.3.2 LaTeXStrings:LaTeX 文字列を扱う

3.4 DownloadしたPackageのリスト

standard library = built-in packagesであるが,Base以外は,addして依存パッケージとして逐一追加する必要がある.これがprojectという観念である.

  • Pkg.jl
    • JuliaのPackage managerはこのdocumantationを見る.
  • IJulia.jl
    • Jupyter NotebookをJuliaで使う
    • Jupyter Notebookは,ウェブブラウザで動作するプログラムの対話型実行環境で,Julia, Python, R, Rubyなどの言語に対応して居る.Jupyter Notebookでは,ノートブックと呼ばれるドキュメントを作成し,その中でプログラムの記述と実行,メモの作成,保存と共有などを行うことができる. using IJulia notebook()
    • condaのJupyter Notebookを使うのか?
  • Pluto.jl
    • ] add Pluto
    • julia> import Pluto
    • julia> Pluto.run(1234)
    • で,ブラウザ上でコードする.
  • Images.jl
    • using Imagesobject name = load(filename::AbstractString)
  • FileIO.jl
    • high-level support for formatted filesの関数loadとsaveの2つを提供する.
  • JDF2.jl
    • Julia objectの保存.
  • HDF5
    • 大規模改装データの保存用フォーマット(科学技術界の標準).JDF2はこのサブセット.
  • JSON.jl
  • DataStructure.jl
    • ヒープや優先度付きキューなどの,直積の上に構造をのせたデータ型
  • Atom
    • なんかJuliaとAtom相性いいんだよなぁ.
  • Juno
  • QuartzImageIO
    • 画像ファイルのIOするときに必要だった記憶
  • Distributions

Package management Config fileとしてはTOML形式を採用している.可読性も高い. * ディクショナリ構造に明確にマッピングされるように設計されている * Tom’s Obvious, Minimal Language * TOMLの構文は、大部分がキーと値の組 1. key = “value” 3. [テーブル名] 4. # コメント * の3種類からなる。

  • Project.toml
    • 現在のProjectが依存しているpackageを管理する.
      • packageとしてダウンロードしたdirectoryにあるProject.tomlを読んで,依存パッケージもダウンロードするようになっている.
    • プロジェクト自体のメタデータや依存パッケージの一覧が収められているテーブル.
    • 開発者も書き足せる.
      • project名など.
    • [deps] テーブルには,(package名) = “UUID”が納められている.
      • こういうのは人間が書くものではない.UUID複雑.これをするのがAdd commandの実装に他ならない.
  • Manifest.toml
    • 実際にJuliaの実行時に使うべきパッケージの正確なversionやインストール場所を管理するテーブル.
    • このファイルは,package manegerがProject.tomlを参照しながら依存解決して生成する.

pkg管理モードのコマンド * activate . * > Activating environment at ~/tmp/myproject/Project.toml * Project.tomlを読み込んで,新たなプロジェクトを実行する. * Prompt名が新たなプロジェクト名に更新される. * installされているpackageも刷新される. * これはうまくできているなぁ! * REPLじゃない時は—project=@.オプションでjuliaから実行する.

Package作成

Julia packageに必要な要素は次のとおり. * README.md * LICENSE * Project.toml * src * source code * Package名と同じ名前の.jlファイル. * test * test code * docs * documentation * deps * パッケージの依存ライブラリやビルドスクリプトを収める * 継続的インテグレーションのための設定ファイル *Manifest.tomlは開発環境に特異的で,バージョン管理ツール(GitHub)で共有しないのが一般的.

pkg管理モードのコマンド * generate MyPackage * MyPackageディレクトリを作り,その中にProject.tomlとsrc/MyPackage.jlを作る. * Project.tomlには,UUIDを毎回ランダムに生成し,versionやnameやauthorが登録される. * こうしてつくったMyPackageはすぐにusing MyPackageとMyPackage.greet()で呼べる.

References

Bezanson, J., Edelman, A., Karpinski, S., and Shah, V. B. (2017). Julia: A fresh approach to numerical computing. SIAM Review, 59(1), 65–98.

Footnotes

  1. Quarto – Using Julia↩︎

  2. Jupyter Notebook をインストールしていない場合,install Jupyter via Conda, y/n? [y]: n の確認がなされる.これに y で応えると,Conda.jl パッケージを通じて,Miniconda から最小限の Jupyter 環境がインストールされ,グローバル環境は変わらない.↩︎

  3. 正確には,Project.toml(とManifest.toml)により定義される写像がプロジェクトである.↩︎

  4. to reproduce weakly informative resampling codes↩︎