Conference Room SAD
[thread display] [new arrival display] [word search] [past log] [管理用]

Subject Re: Packages/optimize.n 1.42
Date: 2010/04/15(Thu) 17:22:10
ContributorAkio Morita

> ContractLevelオプションの導入に伴って、Simplex`DownhillSimplex[]とその内部実装が
> インスタンス変数経由での結合が強くなっているために、現状の同一のSimplexクラスインスタンスを
> 使いまわす実装では、DownhillSimplex[]関数の再突入可能性が失われています
> #旧来の実装は、CurrentSimplex,StatusはDownhillSimplex[]からユーザー関数側への
> #ステータス伝達のみなので、再突入で破壊されてもDownhillSimplex[]の動作自身へは
> #影響しません
>
> DownhillSimplex[]自身は、汎用の多変数関数最小化エンジンなので、再突入可能であるべきです。
> したがって、以下の変更を提案します
>
> A. SimplexクラスインスタンスをDownhillSimplex[]関数のローカル変数にする
>
> B. Simplexクラスのインスタンス変数から自身の内部動作を決定するパラメータを除外する
>
B案の具体的実装としては、
---- before
Clear[The$Simplex];
The$Simplex=Simplex[];
SetAttributes[The$Simplex,Dynamic];

DownhillSimplex=The$Simplex@DownhillSimplex;
---- after
Clear[The$Simplex];
SetAttributes[The$Simplex,Dynamic];

DownhillSimplex=Block[{The$Simplex},
The$Simplex = Simplex[];
The$Simplex@DownhillSimplex[##]]&;

と変更することを考えています
#DownhillSimplex[]内部で呼び出される評価関数の評価スコープでは、
#グローバルシンボルThe$Simplexに当該スコープに対応する Simplexクラスの
#クラスインスタンスが拘束されて見える

また、Simplexクラスインスタンス内部に状態変数をもっているので
Amoebar=The$Simplex@Amoebar;
Amoeba=The$Simplex@Amoeba;
で定義されている Amoebar[], Amoeba[]が、Packages/init.n経由で AutoLoadシンボルとして
公開されていますが、それ単体では意味を成さなくなっているので、ユースケースが無ければ
* AutoLoadシンボルから除外
* 公開APIからの削除
をした方が良いのではないかと思われます

以下のユースケースをご存知の方はおりませんか?
* Amoebar[], Amoeba[]を使った最大/最小化計算
* DownhillSimplex[]の目標関数内からの Amoebar[], Amoeba[] APIの参照


- 関連一覧ツリー (Click ▼ to display all articles in a thread.)