人生っていいもんだ
Paraisoを実用的な問題で試してみましょう。そうですね、生命現象のシミュレーションなどが実用的で良いのではないでしょうか。さっそくサンプルプログラムを見ていきましょう。まずはインポートです。
#!/usr/bin/env runhaskell {-# LANGUAGE NoImplicitPrelude, OverloadedStrings #-} {-# OPTIONS -Wall #-} import Control.Monad import Data.Tensor.TypeLevel import Language.Paraiso.Annotation (Annotation) import qualified Language.Paraiso.Annotation.Boundary as Boundary import Language.Paraiso.Generator (generateIO) import qualified Language.Paraiso.Generator.Native as Native import Language.Paraiso.Name import Language.Paraiso.OM import Language.Paraiso.OM.Builder import Language.Paraiso.OM.Builder.Boolean (select,eq,ge,le) import Language.Paraiso.OM.DynValue as DVal import Language.Paraiso.OM.Realm import qualified Language.Paraiso.OM.Reduce as Reduce import Language.Paraiso.OM.Value (StaticValue(..)) import Language.Paraiso.Optimization import Language.Paraiso.Prelude import NumericPrelude hiding ((||),(&&)) -- the main program main :: IO () main = do _ <- generateIO mySetup myOM return ()
80マス×48マスの大きさで、周期境界条件が課された計算領域を用意します。OMの名前はずばり"Life"にしましょう。
-- the code generation setup mySetup :: Native.Setup Vec2 Int mySetup = (Native.defaultSetup $ Vec :~ 80 :~ 48) { Native.directory = "./dist/" , Native.boundary = compose $ const Boundary.Cyclic } -- the orthotope machine to be generated myOM :: OM Vec2 Int Annotation myOM = optimize O3 $ makeOM (mkName "Life") [] myVars myKernels
セルオートマトンの状態を表す配列変数cell
、人口を数えるためのスカラー変数population
、および経過時間を数えるためのスカラー変数generation
という三つの変数を用意します。
-- the variables we use cell :: Named (StaticValue TArray Int) cell = "cell" `isNameOf` StaticValue TArray undefined population :: Named (StaticValue TScalar Int) population = "population" `isNameOf` StaticValue TScalar undefined generation :: Named (StaticValue TScalar Int) generation = "generation" `isNameOf` StaticValue TScalar undefined myVars :: [Named DynValue] myVars = [f2d cell, f2d population, f2d generation]
カーネルは2つ作ります。1つは初期化のためのカーネルで、もうひとつはシミュレーションを1ステップ進めるためのカーネルです。
>|haskell|
-
- our kernel
myKernels :: [Named (Builder Vec2 Int Annotation ())]
myKernels = ["init" `isNameOf` initBuilder,
"proceed" `isNameOf` proceedBuilder]
|