建築物の安全性を確保するにはどうすれば良いか。結論から先に言う。建築主が建築物(の一部)を所有するように仕組みを変えれば、建築物の価値が下がるような手抜きをある程度防ぐことができるだろう。つまり、銀行に対する自己資本規制のようなものを建築主に対して導入すれば良い。
まず、マンションなどの購入者が共同でお金を出し合って、設計図の点検や、建築現場の監視を依頼するという解決方法はどうだろうか。建築途中での買い主の抜き打ち点検の権利を法律で保証しておく。こうすると、情報の非対称性を軽減できるという案。なかなか良いかも知れない。ただ、買い主が依頼した専門家が点検の手を抜いてしまうかも知れないという不安がある(プリンシパルエージェント問題)。でも、良く考えてみれば、問題になっている建築士だって、自分の利益と同時に依頼主である建築主の利益を優先した結果このような事態を招いたのだから、逆にマンションの買い主が依頼主になれば、ちゃんと働いてくれるんじゃなかろうかという予想もできる。
別の案としては、買い主にローンを貸している銀行と建築主とが同じ会社だったら、問題はそれほど深刻ではないよね、というものがある。つまり自分が建てた建築物を担保にお金を貸すなら、誰も強度の低い建物を建てたりはしない。でも、銀行が建築業を始めるのも、その逆も非現実的だし、非効率だ。でも、アイディアとしては悪くない。
というわけで、最初の案になる。建築主に建物の全てを所有させることが非現実的なら、一部を強制的に所有させれば、建築主の手抜きをある程度防ぐことができるだろう。例えば、マンション購入者のローンを証券化し、その劣後債を建築主に強制的に売りつける。ローン返済完了までにマンションに欠陥が見つかれば、債券は紙くずとなる。
もちろん、このような自己資本規制だって、建築主の手抜きによる利潤追求を防ぐことができないと人は言うかも知れない。それじゃ、その人はBIS規制は銀行の無茶な行動を防ぐことができないと言うんだろうか。いや実際、完璧に防ぐことなんてできないだろう。建築業と銀行業が違うところは、銀行の方が恐ろしく規模を大きくて、預金保険機構が存在するために、小額預金者が銀行を監視するインセンティブがあまり無いというところだ。
コメント欄での議論がおもしろい。http://bewaad.com/20051130.html#c01
建築主に対する刑事罰の強化が平凡だけど、順当な結論か?
てへ。間違った説明を書いていた。
$ ruby -e' require "monitor" class Foo < Struct.new :foo, :bar include MonitorMixin def initialize foo, bar super end end p Foo.new(1, 2)' #<struct Foo foo=1, bar=2>
急いでいるので、現在している数値計算には慣れている C 言語を採用した。けど、演算子の多重定義とか、一時オブジェクトの扱いとか、関数をインライン化ができるとか、例外の扱いとかを考えると、C++ を採用した方がきれいで速いコードが書けた気がする。もう C で書いちゃったけど。
関数空間に測度を入れることになります。一番良く研究されているのが C([0, 1]) にガウス測度を入れた Wiener 空間でしょうか。
TVCM だけでなく Google の広告でも、告知を行なっているようだ。例えば、。
土日で C++ の復習をして、月曜日は uBlas のコードを眺めていた。 uBlas というのは boost のライブラリのうちの一つで、線形代数の数値計算のための基本的な機能を提供している。疎行列も OK。テンプレートの能力を最大限に活用した遅延評価により、一時オブジェクトの生成を極力押えることができる。
テンプレートを使いまくった C++ のコードって、他人が理解するのは非常に難しいということを実感した。というか、uBlas のコードってメンテナンス可能だとは思えないんだけど。こんなもんなんだろうか。
uBlas を使う上での注意点。
デフォルトではライブラリの色んなところで assert が呼ばれる。バグを見つけるのには便利だけど、その分 遅くなる。バグが無くなったと思ったら、オプション -DNDEBUG をつけて再コンパイルする。
行列同士のかけ算は prod(mat1, mat2) なんだけど、以下のようなコードは現在のバージョン boost-1.33.1 ではコンパイル時にエラーになる。boost user - uBLASによれば以前はできたらしい。
prod(mat1, prod(ma2, mat3));
この例だと一時オブジェクトを作らざるを得ないから、それよりかエラーにすることを選んだのか。
以下のようなコードでは、一時オブジェクトが生成されてしまう。
v3 = prod (Mat, v1) + v2;
右辺に v3 が使われているかどうか、コンパイラにはわからないので、v3 の内容を壊さないために、右辺の内容をいったん 一時オブジェクトに格納する必要があるから。v3 が右辺に無いことをコンパイラに教えるには、以下のように noalias を使う。
noalias(v3) = prod (Mat, v1) + v2;
と書く。この例だと、一時オブジェクトは全く生成されない。右辺のベクトルの各成分を計算した結果は、直接 v3 に格納される。prod (Mat, v1) + v2 は式オブジェクトを生成し、noalias(v3) = の代入演算子が呼ばれた時点で、右辺のベクトルが実際に計算される。その「実際の計算」が書かれているコードは functional.hpp。
僕がやりたい計算は提供されている線形代数の演算だけでは実現できないので、どのライブラリを使うにしても中を覗く必要があるんだけど、uBlas は強烈。
とてもおもしろい。
Tiny Vector Matrix library using Expression Templates の略。文字どおり小さなサイズの行列とベクトルの数値計算のためのライブラリ。例を実行してみたらインチキみたいに速かったので、どんなインチキを使っているのかとソースを眺めてみた。Introduction によると Expression Templates の他に、Template Metaprograms を使って、ループの展開を行なっているそうだ。Template Metaprograms とは、例えば次のようにコンパイル時に階乗を計算してしまったりすること(正確には、これは compile-time template programming であって、template meta-programming じゃないようですが)。
#include <iostream> template<int N> class Factorial { public: enum { value = N * Factorial<N-1>::value }; }; class Factorial<1> { public: enum { value = 1 }; }; int main(){ int i = Factorial<4>::value; std::cout << i << " must be 4!." << endl; }
tvmet ではそう難しい Template Metaprogramming はしていなくて、基本的にはこれと同じ程度のテンプレートの再帰をやっているだけのようだ。具体的には include/tvmet/meta の各 *.h ファイルの中。行列やベクトルのサイズがあらかじめ決められた大きさを越えると、metaprogramming は使わずに、include/tvmet/loop で定義された普通の loop を回すコードが使われる。loop を回すといっても、Duff's device を使っていたりするわけですが。
yarv で irb も動くようになった。すげえ。
更新されている。おもしろい。
おもしろい。
これも。
最近のコメント