ぎょーむ日誌 2001-08-22 
 
	 
 2001 年 08 月 22 日 (水) 
 
	-  0820 起床.
		今日は台風休み (夏休み) である.
		外はやはり荒れている.
	
 -  朝飯食ってから自宅外づけ計算機
		Mate
		で計算ぎょーむをひとつかたづける.
		甲山さんから昨晩メイルで発注がきた
		インドネシア森林 Serimbu のものである.
		これは Makefile の書き換えだけでできた.
	
 -  午前中は Abies PipeTree の資源配分関係の整理.
		これまた甲山さんとメイルのやりとり.
	
 -  北アルプス北部の名峰にして
		修験者の山であった剱岳 (2998m),
		ここでの荒行を終えて生還された長谷川宣教師からメイル.
		この宣教師殿は
		国立公園に関しても異端審問官を兼務しておられるので,
		先日「ぎょーむ日誌」で紹介してしまった
		40 年前の某高校夏山合宿焚き火炊飯における
		自然公園法 (1957 年制定) に照らした場合の
		違法性を追及されるそうである.
		おそるべし
		……
	
 -  甲山さんとメイル議論で,
		今回のシラビソ
		(縞枯山で縞枯れてるのは
		オオシラビソというよりシラビソ,
		だそうだ)
		PipeTree (なにが Pipe なのやら)
		の葉群は矢羽根みたいな形状,
		となってくる.
		それを 3 年も 4 年も生残させるってのは
		ちと面倒ですね.
	
 -  1700 ぐらいから 2100 ごろまで,
		自宅端末 ThinkPad560E の 800x600 ドット液晶ディスプレイにらみ
		HHK Lite2 鍵盤をたたいて,
		シラビソ PipeTree シミュレイター側の最初の難所,
		AllocatorTerminal
		なるクラスを書いてしまう.
		これは樹木シミュレイターの枝の先端あたりでうろうろしていて,
		中央から降りてくる地方交付金を
		我がものであるかのように差し押えたあげくに,
		この金の使い道にあれこれと
		口をはさんでくる田舎議員のごときイヤなやつなのである.
	
 -  こいつは中央に「予算はきちんと使いました」と
		報告せんがために,
		気の遠くなるような試行錯誤計算をやる.
		じっさい,
		その操作を C++ で書いた私の頭がくらくらしたほどだ.
		「ほらほらこっちに使ったことにしろ」
		「そっちにそんなにやったら帳尻あわんじゃないか」
		と,
		このあたりは架空帳簿の作成にはげむ現実の田舎議員のごとしである.
	
 -  このあたりの辻つまあわせは,
		強引なやりくちばかりであまり面白くない.
		しかし,
		発注者の甲山さんへの報告と
		激烈にモノ忘れる私の補助記憶装置を兼ねて,
		以下にその手つづきをひととおり書いてみる.
		誰もが気にもしてないだろうし,
		私だって今までまったく失念していたんだけど,
		ここは「ぎょーむ」日誌なのである.
	
 -  AllocatorTerminal は中央から送られてきた
		重さ R(g) の資源を先端部の主軸と側軸形成のために
		完全に使い切る機能をもつ.
		主軸・側軸の形状と側軸の本数はデータから
		憶測された条件によって制約されている.
		この制約のもとで主軸:側軸 = p : (1-p) の比で
		資源を配分したときに,
		与えられた R の資源を完全に使い切るような p* を
		動的に決定する.
	
 -  ある資源量 p R で主軸を形成すると,
		側軸の形状と本数が決定する (後述).
		側軸に必要な資源量は CalcMainSubStem 関数で計算する.
	
 -  解 p* の探策には二分法 (bisection method) を用いる.
		下限 p_lower と上限 p_upper のあいだで p* を探策する.
		最初は
		p = ( p_lower + p_lower ) / 2
		から始める.
	
 -  ある p R を CalcMainSubStem 関数に与えたときに,
		total_sub_weight が得られる.
		この total_sub_weight が残り資源 (1-p) R
		より小さいときは下限 p_lower = p と修整,
		そうでないときは上限 p_upper = p と修正する.
		あらたに
		p = ( p_lower + p_lower ) / 2
		を計算して p_upper - p_lower < 1.0e-3
		となるまでこの操作を繰りかえす.
		そのときの p を p* とする.
	
 -  関数 CalcMainSubStem では主軸形成用として与えられた
		資源量 pR によって主軸を形成し,
		その形状から側軸の形状と本数を計算して,
		側軸の総重量を返す機能をもつ.
		
			- 
				制約のもとで主軸の形状を決めるには
				二分法を用いる.
				下限 length_lower と上限 length_upper
				のあいだで,
				pR を使い切るような
				主軸とその葉群を形成する main_length を
				反復計算によって決定する.
				(精度は
				length_upper - length_lower < 1.0e-1 cm).
				この主軸形成には関数 CalcStemSize (後述)
				を用いる.
			
 
			- 
				計算によってもとめられた主軸の長さ
				main_length によって側軸の本数が決まる.
				これは垂直シュート・水平シュートによって
				様式が異なる.
			
 
			- 
				主軸の長さ length* によって
				側軸の長さ sub_length が決定される.
			
 
			- 
				側軸の太さ・重さ・葉群の量は
				(主軸と同じように)
				関数 CalcStemSize によって決定する.
			
 
			- 
				側軸の総重量を返り値とする.
			
 
		
	 -  全処理のもっとも下うけになっている関数 CalcShootSize は,
		軸の長さが与えられたときに
		その太さ・重さ・葉群の量を決定する機能をもつ.
		
			- 
				長さから太さを決める.
			
 
			- 
				長さ・太さから重量を決める.
			
 
			- 
				太さ (断面積) から葉群の重量を決める.
			
 
		
	 -  ……
		うう,
		ひととーり書いてみるとこんなモンかな.
		上の説明ではパイプモデルをはじめとする
		あれこれと面妖なアロメトリーモデル
		(○○から○○を決める,とか書いてるやつ)
		の詳細は省略した.
		それから垂直・水平の分業のさせかたとか,
		昨日ここに書いてた「計算結果キャッシュサーヴァー」機能と
		いった部分についても省略.
	
 -  2100 かなりへろへろになって
		(というより
		C++ 呪われハイになって)
		AllocatorTerminal をひととーり書き終える.
		行数は短くてヘッダーと実装あわせても
		わずか 200 行ちょっと.
		この中で二分法二重包囲を実現してんだよね.
	
 -  ここはまだ最初の難所.
		これがうまくできたとしても,
		つぎには
		個体全体で同じような帳尻あわせをやらねばならない.
		ああ.
		生態学的なナゾはすべて架空帳簿作成に
		押しこまれるのであった.
	
 -  ここでコンパイルエラーとったり動作試験を始めたりすると
		徹夜になってしまうので
		(それに頭の回転止めて冷やさないと眠れないので),
		今日のコード書きはここまで.
		晩飯作る.
		台風 11 号は私の知らないあいだに関東を
		通りすぎていったようだ.
	
 -  晩飯もそもそ食ってから,
		上のようないいかげんな報告を書く.
		時刻はすでに 2310.
		明日は台風一過で暑くなるってのに
		独房群まで出向かなければならんから,
		さっさと寝ますかね.
	
 -  う,
		まだ呪われハイの高速回転が維持されてて
		ぜんぜん眠気ささない.
		頭のなかでコードぐるぐる.
		「ぎょーむ日誌」も切り上げて
		散歩でもしてみようかな.
	
 -  今日の食卓
	
		-  朝 (0900):
			蕎麦.
		
 -  昼 (1300):
			スパゲッティー.
			昨晩の残りといっしょに.
		
 -  晩 (2130):
			米 0.9 合.
			豆腐・ゴーヤ・シイタケ・ニラ・ニンニク茎の
			炒めもの.