読者です 読者をやめる 読者になる 読者になる

Paraisoでシミュレーションを始める

ICFDP

シミュレーションを始めるには、まず初期条件を設定できる必要があります。初期条件の場を計算する仕事は、Paraiso式づくりのとっかかりとしても優れています。やってみましょう。サンプルを見てください。

table :: Named (StaticValue TArray Double)
table = "table" `isNameOf` StaticValue TArray undefined

createBuilder :: Builder Vec2 Int Annotation ()
createBuilder = do
  x01 <- bind $ (cast $ loadIndex (Axis 0)) 
              / (cast $ broadcast $ loadSize (Axis 0))
  y01 <- bind $ (cast $ loadIndex (Axis 1)) 
              / (cast $ broadcast $ loadSize (Axis 1))
  x <- bind $ 4 * (x01-0.5)
  y <- bind $ 5 * (y01-0.5)
  z <- bind $ atan((1- x^2 - (y-(x^2)**(1/3))^2)*10)
  store table z

Generator.hsでは、少々煩雑ですが、castbroadcastを使って配列変数の添字とサイズから、x座標とy座標を0から1までの範囲の実数として求めています。castbroadcastの引数や返値は、うまいこと型推論してもらえてるみたいですね。実際、配列変数の添字とサイズはcreateBuilderの型注釈からしてInt型なのに対し、tableDouble型で、そこから明示的なcastを挟まずに繋がっているx01,y01,x,y,zなどの型もみなDouble(のBuilder)になります。経験のある読者は、1/3が一見整数どうしの除算として0に切り捨てられることなく、ちゃんとDouble同士の除算として扱われていることにも気づいたかもしれません。

それでは、これがParaisoと筆者から読者への気持ちです!
A heart mark drawn by Paraiso and Gnuplot