死者の短剣  惑わし(ロイス・マクマスター・ビジョルド)



ビジョルド新シリーズファンタジー1作目。

ここのところファンタジーもの続きで、SFのヴォルコシガンシリーズの方を期待していた向きにはちょっと残念だったかも。

とは言え、さすがはヒューゴー、ネビュラ、ローカス賞のトリプルホルダー。今シリーズも期待を裏切らないドラマティックな展開はさすがの一言。
主人公地の民の少女フォーン(「スピリットリング」の主人公フィアメッタをちょっと彷彿させるようなイメージかも)と湖の民ダグの出会いから始まって、二人で様々な困難に向き合っていき関係を深めていく過程が、ビジョルドならではの舞台設定と相まってぐいぐい読ませる。
設定はファンタジーなんだけど、展開はむしろヴォルコシガンシリーズの「名誉のかけら」「バラヤー内乱」の主人公コーデリア/アラールの関係性を思わせるようなところがあって、ビジョルドファンにはいろいろと深読み出来そうなところもなかなかおいしい。

本書ではとりあえず一つの山場を超え一応のハッピーエンドで幕を閉じるが、二人が抱えることになった大きな問題の解決はまだこれからというところなので、次作の期待もますます高まろうというものか。

なお、ヴォルコシガンシリーズの新作「コマール(仮)」も訳出されるそうで、そちらも心待ちの日々が続くことになり、ファンにはなんともじれったい年になりそうだ。

Haskell::GR-nの生成/OGR-nの探索(その9)

OGR-nの探索もちょっと煮詰まってきたっぽいので、目先を変えてgr〜.hs、ogr〜.hsでGR型に関連した共通のコードを整理してモジュール化。両者で共用できるようにしてみた。

GR.hs

GR型もEq、Showクラスのインスタンスとすることで、(==)、showをそのまま適用できるようにしたので、プリティプリントのコードなども多少簡素になっている。

コンパイルは

% ghc -O2 –make gr9.hs

% ghc -O2 –make ogr9.hs

で、必要な依存関係を解決してくれるので、特にMakefileなどを用意する必要もない。

GRのモジュール化でgr9.hsも相当シンプルになった。

最初は必要性が分からなかった flip や、Maybe型に対応した関数の使い方に慣れてくると、その便利さがだんだん実感できてきて面白いね。

本日午前中に実家から数々の救援物資と共に蟹1杯がクール便で届く。
半解凍状態だったので冷蔵庫に入れて今日の夕食にすることに。

19:30冷蔵庫から取り出し、常温にて待機状態に。併せて攻略兵器(キッチン鋏、割り箸)を準備。

20:00攻略開始。

20:30敵左翼(右脚部)制圧完了。作戦は順調に進行中。

21:00敵右翼(左脚部)制圧完了。士気は未だ高けれど、自軍(胃)に若干の疲れが認められる。一時後退(小休止)。

21:20敵本陣(甲羅)突入開始。自軍(指)に若干の被害が出るも、果敢に敵戦力を削減する。

22:00敵全戦力制圧完了。敵戦力甚大なれど完全な殲滅戦に成功する。

え~と、やっぱり一人で蟹一杯はちょっと多かったです。
微妙に胸焼けが。

Haskell::OGR-nの探索(その8)

Stateモナドが理解できんと言っててもしゃあないので、まずは持ち回し方式でその7のコードをメモ化。

ogr8.hs

メモ化にあたって、コードを大幅に整理。

  •  GRを単なるタイプエイリアスから、マークの配列とその差分セットの配列をメンバーに持つdata typeとして定義。それに合わせてインタフェースとなる関数(fromList、newRank、===)などを定義
  • 関数pgr(n,m)をGR-nの内長さがmのものだけを計算するように仕様を変更(従来は、m以下のもの全てを計算していた)

今回はまずメモ化が実効的な手段足り得るかを確認するのが目的なので、その7で実装したような計算済みのOGRのsave/loadの機能はわざと省いてある。

で、まず計算時間をn=3〜10で測ってみる。

3:([0,1,3],[0,2,3])
0.001u 0.000s 0:00.00 0.0%      0+0k 0+0io 0pf+0w
4:([0,1,4,6],[0,2,5,6])
0.000u 0.001s 0:00.00 0.0%      0+0k 0+0io 0pf+0w
5:([0,2,7,8,11],[0,3,4,9,11])
5:([0,1,4,9,11],[0,2,7,10,11])
0.000u 0.002s 0:00.00 0.0%      0+0k 0+0io 0pf+0w
6:([0,1,4,10,12,17],[0,1,8,11,13,17])
6:([0,4,6,9,16,17],[0,5,7,13,16,17])
6:([0,1,8,12,14,17],[0,3,5,9,16,17])
6:([0,1,4,10,15,17],[0,2,7,13,16,17])
0.000u 0.004s 0:00.00 0.0%      0+0k 0+0io 0pf+0w
7:([0,2,3,10,16,21,25],[0,4,9,15,22,23,25])
7:([0,2,7,13,21,22,25],[0,3,4,12,18,23,25])
7:([0,1,4,10,18,23,25],[0,2,7,15,21,24,25])
7:([0,1,11,16,19,23,25],[0,2,6,9,14,24,25])
7:([0,1,7,11,20,23,25],[0,2,5,14,18,24,25])
0.035u 0.007s 0:00.03 100.0%    906+1020k 0+0io 0pf+0w
8:([0,1,4,9,15,22,32,34],[0,2,12,19,25,30,33,34])
0.359u 0.007s 0:00.36 97.2%     746+839k 0+0io 0pf+0w
9:([0,1,5,12,25,27,35,41,44],[0,3,9,17,19,32,39,43,44])
3.885u 0.075s 0:03.98 99.2%     725+815k 0+0io 0pf+0w
10:([0,2,15,21,22,32,46,50,55,58],[0,3,8,12,26,36,37,43,56,58])
921.774u 1.211s 15:24.96 99.7%  723+813k 0+0io 0pf+0w

悪くはないが、良くもない。n=10ではその7にも負けてるし。
しかも、n=10の時にtopで大雑把にメモリ消費量を見てみると2GBを越えているので、これではn=11以降の計算には使い物にならない。

ただ、メモ化のテーブルだけでn=10時点でそこまでメモリを消費するとも思いがたいので、n=9で実行時のプロファイルを取ってみる。

ogr8.prof

先頭部分を抜粋

        Tue Jan 20 18:22 2009 Time and Allocation Profiling Report  (Final)
ogr8 +RTS -p -hd -RTS 9
total time  =        5.64 secs   (282 ticks @ 20 ms)
total alloc = 3,508,133,336 bytes  (excludes profiling overheads)
COST CENTRE                    MODULE               %time %alloc
intersect_p                    Main                  38.3   23.3
e_diff_a                       Main                  21.6   29.0
l2a                            Main                  13.5    7.5
pgr                            Main                   8.9    7.4
a2l                            Main                   5.7   18.8
newRank                        Main                   3.5    1.3
pgr_lt                         Main                   3.2    2.9
a_add_a                        Main                   3.2    6.5
a_add_e                        Main                   2.1    3.3

メモリ割当量がintersect_p、e_diff_a、a2lで結構な割合を占めている。

次に、ヒープメモリの種類別割当状況のグラフを見てみると、

ogr8-n9.png

UArrayはまあ順当に割当量が増加しているが、同様にARR_WORDSの割当量も相等に増加している。ARR_WORDSはクロージャやサンクを含むワーキングメモリなので、メモリ使用量の増加はメモ化のテーブルそのものと、メモ化の過程で使用したワーキングメモリの領域漏れの両方によるものと考えられる。

上記プロファイルの上位の関数について正格評価を行えばARR_WORDSの割当量は低減できるかもしれない。

桂冠詩人(ALI PROJECT)


久々のALI PROJECTのシングルコレクション + PV DVDということで購入。
どちらかというと、DVD目当て。

相変わらずのコスプレっぷりが素晴らしいというか、凄まじい。PVのセットの作りこみも力が入ってるわぁ。
デフォルトのゴスロリ(白/黒)はもちろんだが、「勇侠青春謳」の極妻コスプレがすごいつぼにはまった。
Voの宝野アリカに和装+日本髪+刺青がこれほどお似合いになるとは思わなんだ。
改めてみると、宝野アリカってやっぱり美人さんやねぇ。

「我が﨟たし悪の華」は割と今までのALI PROJECTらしいPVでまあおとなしめの感じ。って、この出来でおとなしめな印象になってしまうのもある意味凄いが。

「鬼帝の剣」では衣装やメイクは妖艶な感じでかっちょいいんだが、バストショットの映像とそのエフェクトがメインなのでPVとしては面白みに欠けるか。

それにしても、よくこんな文語調というか書き言葉で作詞ができるなぁ。それでのりのりのメロディラインで歌えちゃうし。
相当な文学オタ少女だったと見るがどうか。

奥歯欠けた(泣)

昨夜、酒のつまみにクラッカーを齧ってると「じゃりっ」と違和感が。

吐き出してみると歯の欠片の模様。確かに、舌で右上の奥歯の辺りを触ると鋭い断面ができるようだ。欠片の大きさは3mm角程度でさすがに奥歯が割れたというところまでいかなかったようだ。痛みは全然ないので神経の部分までは達していないのか。

何はともあれ、診察の予約を入れることに。

しばらくの間歯科からおさらばできるかと思ってたのに、また通院の日々が始まるのね(泣)。

Haskell::OGR-nの探索(その7′)

n=13の探索が昨日ようやく完了。

13:([0,2,5,25,37,43,59,70,85,89,98,99,106],[0,7,8,17,21,36,47,63,69,81,101,104,106])
372392.773u 437.249s 227:30:46.57 45.5% 1841+1526k 0+0io 0pf+0w

結局9日以上かかったことになる。爆発どころの騒ぎじゃない。
やっぱり下位のGRの生成時のメモ化を実装せんと話にならん。

けど、Memoiseを何度読み返してもしっくりこんのよねぇ。
頭固くなってるなぁ。

しかも、下位のGRは探索の過程で爆発的に増加していくので、メモ化のためのテーブルの構造も工夫せんとすぐにメモのサーチにかかる計算コストが問題になってくるだろうし。
となるとData.MapやらSTUArrayやらの理解が必要になりそうだしなぁ。

何とも道は険しい。

チャーリーの手帳

slashdot.jpの記事中

これさえあれば

でスコアが4もついてるあたり、スラド人口の年齢構成がわかりそうな(もしくはSFアレゲ度の高さか?)。

ちなみにハント博士が開発した技術はニュートリノビームによる対象の非破壊立体スキャン。なので、生体や非常に脆いものであっても内部透視が可能というものでしたね。