SSブログ

厳密な光線追跡 - その22 [光線追跡エンジンを作る]

なんだかいつものように、ちんたらしたペースになってる光線追跡エンジンをMathematicaに実装する話の続き。

前回まででMathematicaパッケージのメカニズムをしてきた。今日はそのまとめとして、なるべく簡単にパッケージを作る、という話と、それで実際にどうなるのか、という話。

次回はこのシリーズの最終回としてオブジェクト指向風にMathematicaで実装した光線追跡エンジンのパッケージをここで披露したい。忘れなければ。

5.1.7  パッケージ化

普通に使うようにGlobal`コンテクストに書いていて、なんどか繰り返し使って変更することが少なくなってきた関数群は、パッケージにまとめるとよい。

そのためには
  1. エクスポートするシンボルと、それ以外を分類する
  2. パッケージの名前とコンテクストを決める
  3. エクスポートするシンボルにusageメッセージを書く
  4. BeginPackage[]とEndPackage[]の間に挟む
  5. エクスポートしないシンボルや関数定義を、さらにBegin[" `Private`"]とEnd[]で挟む
  6. フロントエンド上でBeginPackage[]からEndPackage[]までのセルを「初期化セル」に指定する
  7. コンテクストに従ったパスにファイルを保存する
ということをすればいい。

「初期化セル」は、セルを選択してフロントエンドのメニューから「セル」→「セルのプロパティ」→「初期化セル」を選べばいい。セルブラケットの形がちょっと変わって表示される。フロントエンド式としてはCell[]に
InitializationCell->True
というオプションが設定される(6.0以降の場合)。

「初期化セル」に指定されたセルの内容は、フロントエンドからファイルを保存するときにPackageName.nbというノートブックファイルとは別にPackageName.mファイルが作られて、そこにテクストが保存される。この.mファイルを先に説明した自動読み込みのメカニズムに従ったパスにおけばいい。

カーネルはNeedsやGetが呼ばれたとき、このPackageName.mだけを読み込む。この.mファイルにはフロントエンド用の式Cell[]の中身だけが取り出されて書き込まれている。つまりフロントエンドを介さずにちょうどターミナルからMathematicaカーネルを使うときと同じ形式になっていて、カーネルはただそこに書かれているものを上から順に評価しているだけである。

.mファイルの例を挙げてみると、ちょっと長いけど
(* ::Package:: *)

(************************************************************************)
(* This file was generated automatically by the Mathematica front end.  *)
(* It contains Initialization cells from a Notebook file, which         *)
(* typically will have the same name as this file except ending in      *)
(* ".nb" instead of ".m".                                               *)
(*                                                                      *)
(* This file is intended to be loaded into the Mathematica kernel using *)
(* the package loading commands Get or Needs.  Doing so is equivalent   *)
(* to using the Evaluate Initialization Cells menu command in the front *)
(* end.                                                                 *)
(*                                                                      *)
(* DO NOT EDIT THIS FILE.  This entire file is regenerated              *)
(* automatically each time the parent Notebook file is saved in the     *)
(* Mathematica front end.  Any changes you make to this file will be    *)
(* overwritten.                                                         *)
(************************************************************************)



BeginPackage["Optics`ZernikePolynomials`"]; 


ZernikePolynomialPackageVersion="Zernike Polynomial for optics. version 1.0A";


zernikePolynomial::usage = "zernikePolynomial[p,u,v,opt___] gives 'p'th Zernike polynomial for coordinate variables u and v. options can be accepted coordinateExpression, orderOfTerms and firstNumberOfTerm. setZernikeOptions function can not affect the zernikePolynomial behaviours."; 


zernikePolarPolynomial::usage = "zernikePolarPolynomial[p][r,theta]
 gives 'p'th polynomial term under polar coordinates with (r,theta)."

....
このようにご丁寧に注釈
  • Mathematicaで自動生成されたファイルである
  • .nbファイルの初期化Cellの中身が取り出されている
  • GetかNeedsで読み込む
  • このファイルを直接編集せずにノートブックの方を使え
などとMathematicaコメントとして入っている。
これは.nbファイルでは図-9のように表示される。
0216notebook.png
Figure 9: フロントエンドでの表示
これを比べてみればわかるようにCellのスタイルが"Tilte"や"Text"は.mファイルには含まれていない。

ちなみに、この.nbファイルをテキストエディタで開くと
(* Content-type: application/mathematica *)

(*** Wolfram Notebook File ***)
(* http://www.wolfram.com/nb *)

(* CreatedBy='Mathematica 6.0' *)

(*CacheID: 234*)
(* Internal cache information:
NotebookFileLineBreakTest
NotebookFileLineBreakTest
NotebookDataPosition[       145,          7]
NotebookDataLength[     37921,       1115]
NotebookOptionsPosition[     34159,        988]
NotebookOutlinePosition[     34565,       1006]
CellTagsIndexPosition[     34522,       1003]
WindowFrame->Normal
ContainsDynamic->False*)

(* Beginning of Notebook Content *)
Notebook[{

Cell[CellGroupData[{
Cell["Zernike Polynomial Functions for Optics", "Title",
 InitializationCell->True,
 CellChangeTimes->{{3.447304753867585*^9, 3.44730476797351*^9}}],

Cell[BoxData[
 RowBox[{"Package", " ", "Decralation"}]], "Subtitle",
 InitializationCell->True,
 CellChangeTimes->{{3.447384672826271*^9, 3.4473846790413857`*^9}}],

Cell[BoxData[
 RowBox[{
  RowBox[{
   RowBox[{"BeginPackage", "[", "\"\<Optics`ZernikePolynomials`\>\"", "]"}], 
   ";"}], " "}]], "Input",
 InitializationCell->True],

Cell[CellGroupData[{

Cell["usage messages", "Subtitle",
 InitializationCell->True,
 CellChangeTimes->{{3.4473047814636497`*^9, 3.447304786180193*^9}}],
というように全く違う構造をしている(Mathematica6.0の場合)。NoteBookの構造は、これはこれで面白いんだけど、今回の話とは関係ないのでまたこんどにする。

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立02/16献立02/17 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。