No. 4 C++で学ぶ最適化ソフトウェア開発: 実は最適化ソフトウェア作成が2回目というハナシ
※忙しい人はタイトルと太字部分だけ読めば大体OK!
この連載もようやくNo. 4となりました.今回は,過去にも最適化ソフトウェアを作っていて,今回の開発にはその知識を使ってますよ,という話になります.なので今回の開発は,当時のノウハウを踏まえた上でのリファイン部分も多かったりします.もちろん,当時とはプログラミング言語や筆者の知識・技能も大きく異なるので,どういった狙いがあるのかなども含めて楽しくお話ししていければと思います!
いにしえの最適化コード
実は昔作っていた,という話から.時期としては修士1年生の春頃で,開発というよりはリメイクや移植に近い作業でした.というのも当時,筆者は宇宙探査機の軌道に関する研究をしていました.で,その軌道を設計するのに最適化ソフトウェアが必要だったのです.軌道最適化の部分はソフトウェアにお任せし,推進の特性や制御の部分にフォーカスした研究がしたかったわけですね.そして当時の研究室には,すでに最適化ソフトウェアが存在しました.ラッキー!と思ったものの,そう簡単に話は進みません.その中身を読み解くことのできる人が1人もいなかったのです(研究室の教授は別ですが).なぜかというと
そもそも内容が難しすぎる
記述言語がFORTRAN77
だからです.内容が難しいという点はさておき,記述言語はFORTRAN77(F77)でした.これはかなり古い言語で,プログラミング学習で教材となることは現在ほぼないと思います.その昔,プログラムというのは紙に書いていました.嘘みたいな本当の話です.といっても文字が書いてあるわけではなく,パンチカードという紙に規則的に穴を開けたものをコンピュータに読み取らせていたのです.で,パンチカードをうまく読み取らせるために,紙の左側にはいくつかのスペースを挿入しておく必要がありました・・・なんでそんな話を始めたかといいますと,F77がこのパンチカードから派生した言語だからです.なので,F77でコードを書く場合,左側に必ず6つスペースを空けなければなりません.はい,左側にスペースを空けるのです.大事なことなので2回言いました(死語).もちろん紙の右側も幅が決まっているので,適当なところで改行して次の行に移行しなければなりません.その長さ,なんと72文字分.1行に書けるのは実質66文字(=72−6).そして,次の行を始める前にまたスペースを挿入・・・このような古いルールに縛られた,使いにくいプログラミング言語なのです.ただ,F77が登場した時点ではそれ以前と比較すると革新的にわかりやすい言語だったことでしょう.F77を分かりにくいと感じてしまうのは,単に登場から時間が経ってより良いものがどんどん開発されてきた結果に過ぎません.
さて,筆者もこのF77で書かれたプログラムを入手したのですが,そのまま使うことはしませんでした.当時は2012年で,Fortranも77から進化していたからです.最適化コードに触れる前の自分の研究は,新しいFortranでやっていたのです.そんな中ですでに新しい言語で書いた自分のプログラムをツールに合わせて古いF77言語の方のルールに書き換える作業なんて,その後の保守性などを考えても全くやる気が起きませんでした.
当時の技術でリメイク
ということで,自分の研究に使用する目的で,筆者はF77で書かれた最適化コードを,1世代新しい言語であるFortran90/95(F90)で書き直すことにしました.いわゆるリメイクや移植にあたる作業です.名前からわかるように,F90はF77から正統進化した言語です.なので共通点も多く楽勝・・・と思ったら大間違いです笑.細かいルールはかなり異なり,相当の苦労を強いられることになりました.当時,筆者は学部を卒業したての修士1年,プログラミングは勉強し始めてまだ1年経たないくらいでした(6ヶ月とか?).そんな状態で挑んだリメイクでしたので,はっきりいって全く自信がない状態で走っている感覚でした.当時はお金もなかったので,中古価格25,000円で買ったASUSの貧弱ノートPCを使って一生懸命やった記憶があります.が,エレガントではないものの最終的にはとりあえずきちんと動く状態まで持っていくことができました.このリメイクしたコードは,細部に調整を加えて使いやすくしながら,筆者を博士の卒業まで支えてくれた非常に強力なツールとなりました.F77のまま使おうなんて甘いことを考えずに本当に良かった・・・
ガラパゴス進化する最適化コード
さて,大学院を卒業した後も,筆者はこの最適化コードを使用しています.というのも,このコードより強力なものに出会ったことがないのですよね.もちろん,MATLABやPythonなどでは最適化ツールと呼ばれるものが手軽に使用できるよう整備されています.確かに使い勝手は良いらしいのですが,実行速度や解が得られるかなどの点を比較すると,自分のF90コードの方がより多くの解を圧倒的に高速に探してくる印象です.これはアルゴリズムが優れているというより,全てベタ書きのソースコードを持っているので細部まで自在に調整可能という点が大きいでしょう.
で,その後どうしたかというと,このF90による最適化コードを整備してどんどん使いやすくしていきました.ただし,言語はF90のまま笑
宇宙探査機の軌道やプロペラ形状,最後には飛行機やドローンの形まで最適化できるようにしちゃいました.F90で笑
タイトルにもあるように,これぞガラパゴス進化,という感じでしょうか.モジュールという考え方でグローバル変数(プログラムのどこからでも参照可能な変数)に対応させ,外部ファイル化,最適化を行う関数化し,メインのプログラムで呼び出してちょっと追記するだけであらゆる最適化の問題に対応できるようにしたのです.ただ,F90なので他の人が使えません(勉強すれば良いのですがそこまで手が回らない模様).筆者がプログラムを書いてあげ,それのパラメータをちょこちょこっと変えて計算して結果を出してもらう程度が限界だったのです.こんなに早くて便利なのに,誰も使えない.ちょっと本気見せて使えやとも思うのですが.
今回はC++によるフルリメイク
で,今回のC++による開発の話に戻るわけですね.ここまでの流れからわかるように,今回の作業はフルスクラッチというよりはフルリメイクに近いと言えるでしょう.アルゴリズムは基本的に共通ですし.ただ,当時と比較すると筆者の能力も結構上がっているので,もっとユーザーフレンドリーなソフトウェアにできるんじゃないかなぁという期待を込めて作業しています.ただ、リメイクといっても,そのまま書き直して動く,ということにはなりません.言語が違えばルールも違いますし,より高度な機能や便利な機能も組み込んだ上で本来の機能も成立させる必要があります.仕組みを分かっている人がやらないと、基本的には破綻しちゃうんじゃないでしょうか.
ということで,本件は現在も鋭意作業中です.一通り組んでアクセス違反なども出ずに回るのですが,まだ出てくる結果がおかしいのですよね...このあたりは今後の記事で触れていければなと思います.
さいごに
C++による開発の立ち位置というか事情を記事にしてみました.軽く触れましたが,開発自体は終盤に差し掛かっていると思います.実際に計算は最後まで流れるようになっており,今後はバグ取りを進めてテストケースで正しい解が得られることを確認していく段階に進もうかなと.
最後にちょっとした話なのですが,C++で開発している理由の一つに,移植性の高さがあります.iPhoneアプリを開発するSwiftなんかとも親和性が良い(ちょっと触ってそう思えた)ので,余裕があればiPhoneで動く最適化アプリなんていうのも悪くないかなぁと思ったりしています.Appstoreを探してもそんなもの存在しないんじゃないかと.多分やる時間がないでしょうけど.
とはいえ,これはまだ先の話.まずはC++バージョンが正しく動くところまで持っていかないといけません.とにかく手元で完成させて,自分の身近な人に生贄になって使ってもらうことで動作を確認するのが良いのでしょうね.
K. HISAKAWA