あめだまふぁくとりー

Boost.Graphとかできますん

今日覚えたVimコマンド(:タブ挿入)

set expandtab状態でもでタブを挿入可能だったんですね〜.知りませんでした,はい.
休日の間にちょっとだけVimいじったりプラグインいれてみたりしてみた.

vimrcは見やすくしてステータスラインの表示を追加した程度.あと補間対象からインクルードファイルを取り除いた.Boostがあると補間時間がBooostしすぎてやばい.

以下,追加したプラグイン.メジャーなのしかいれてないですね.

neobundle.vim

プラグイン管理.gitとかのリポジトリからプラグインを自動でダウンロードしてくれる.多分一番感動したプラグイン.vimfiler,vimshellを手動で入れてたときいろいろと挙動がおかしかったのだが全部治ってうれしさ百倍.

vimshell

シェル.copenで頑張ろうと思ったけどmakeの方がいろいろと面倒になったのでこっちの方がいいかも.

vimfiler

Vimをファイラにする.WindowsでDynaファイラ使っていたので,Linuxで使うならこれしかないと思いましたね.Windowsもこれに統一しようか悩み中です.特にまだ変わった使い方はしてませんが,ディレクトリの同一名ディレクトリへのムーブができてないので今度調べる.
VimFiler用にVimを開くときは

vim -c VimFiler

でいけますね.起動はちょっと遅いかも...

unite.vim

まだいじってないです><

neocomplcache.vim

ほとんど触ってないです><

im_control.vim

日本語固定入力プラグイン.こんな素晴らしいプラグインがあったなんて...もっと早く出会いたかった.ノーマルモードにIMをOFFにしてくれるだけでもすごい便利です.

buftabs.vim

バッファリストをステータスラインに表示.今までタブばっかりを使ってたのでバッファをもっと使おうという意志のもと導入.vimfilerとかvimshellが表示されなかったりするので後でちょっと改造してみる.

纏めてみるとたいしたことしてないなー.

property_map_iterator…だと…?

make_property_map_iterator

プロパティマップとそのキーを指すイテレータからプロパティマップの値・参照を指すイテレータを作る

make_iterator_property_map

ランダムアクセスイテレータRAとインデックスマップからRAが指す参照を返すプロパティマップを作る.

名前似すぎだろ…(´Д`)
make_property_map_iteratorはこんな感じ↓で使える.

#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <numeric>
#include <random>
#include <boost/graph/adjacency_list.hpp>
#include <boost/property_map/property_map_iterator.hpp>

int main()
{
    using namespace boost;

    typedef adjacency_list<vecS, vecS, undirectedS,
            no_property, property<edge_weight_t, int> > Graph;
    enum { A, B, C, D, E, F, NumV };
    typedef std::pair<int, int> Edge;
    Edge edge_array[] = {
        Edge(A, B), Edge(A, D), Edge(A, E),
        Edge(B, C), Edge(B, D), Edge(B, F),
        Edge(C, D), Edge(C, F),
        Edge(D, E), Edge(E, F),
        Edge(E, F)
    };
    const int NumE = sizeof(edge_array) / sizeof(edge_array[0]);
    Graph g(edge_array, edge_array + NumE, NumV);

    property_map<Graph, edge_weight_t>::type
        weight_map = get(edge_weight, g);

    // 枝の重みをランダムに割り当てる
    std::mt19937 eng;
    std::uniform_int_distribution<int> dist(1, 10);
    std::generate
        (make_property_map_iterator(weight_map, edges(g).first),
         make_property_map_iterator(weight_map, edges(g).second),
         bind(dist, eng));

    // 枝の重みを出力
    std::copy
        (make_property_map_iterator(weight_map, edges(g).first),
         make_property_map_iterator(weight_map, edges(g).second),
         std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    // 枝の重みの総和を出力
    std::cout << std::accumulate
        (make_property_map_iterator(weight_map, edges(g).first),
         make_property_map_iterator(weight_map, edges(g).second), 0)
        << std::endl;
}

これが使えばid:amedama41:20120110で作ったputを行う関数オブジェクトアダプタもいらないじゃないかヽ(`Д´)ノウワァァァン.でもmake_property_map_iteratorでの代入はLValuePropertyMapコンセプトを満たしたプロパティマップじゃないとできないからLValueじゃないWritableなプロパティマップに対してはあの関数オブジェクトは意味があるんだからね!

randomとかはじめて使った…

今日覚えたVimコマンド(%:対応する括弧へジャンプ)

寝て起きるまでは12日なのだ!問題ない!

今までVimは一通りコマンド覚えて軽いスクリプト組んでた程度なのでもっと効率的に使えるようになりたい.で,大学の図書館でVimテクニックバイブルを借りることができたので,ちゃんとVimの勉強をしようと奮起してみる.
まぁでもまだほとんど読んでないのだが,makeからのcopenがイイ(・∀・)!!エラーがハイライトされてて読みやすい.ちゃんと読んで色々新しい発見ができたらいいなー.

ところで自分は最近までバッファの概念をよく分かっていなくて,複数ファイルを開くときはタブで開いてたんだけどタブよりもバッファを使う方がいいのかな?真のVimmerはタブをあんまり使ってなさそうなイメージ.ここらへの操作も改善してきたい.

情緒不安定週間

日付を見て今日ポッキープリッツの日じゃんと一瞬思ってしまったが,11月でしたね….勢いで論文書き上げたせいで修正が難しいです,一貫性とか特に.
あ,話は変わりますけどsubgraphアダプタちょっと微妙ですね.どのへんが微妙かはいつか纏めると思います.

ぷっとも関数おぶじぇくと

プロパティマップを関数オブジェクトに変換するproperty_map_functionはSTLやboostのアルゴリズム,イテレータを使う際大変便利.でもこれはgetはできてもputができない.getのときはアルゴリズムでputのときはループ回すとかやだ!get,putは大抵関数テンプレートだからBoost.Bind,Boost.Lambdaもちょっと使いにくい.なのでちょっと作ってみた↓

#include <boost/property_map/property_map.hpp>

template <class PutPropMap, class GetPropMap>
  class put_property_map_function {
    PutPropMap put_pm;
    GetPropMap get_pm;
    typedef typename boost::property_traits<PutPropMap>::key_type param_type;
    public:
    put_property_map_function(const PutPropMap& ppm, const GetPropMap& gpm)
      : put_pm(ppm), get_pm(gpm) {}
    typedef void result_type;
    result_type operator()(const param_type& k) const
    {
      put(put_pm, k, get(get_pm, k));
    }
  };

template <class PutPropMap, class GetPropMap>
  inline put_property_map_function<PutPropMap, GetPropMap>
  make_put_prop_map_func(PutPropMap ppm, GetPropMap gpm)
  {
    return put_property_map_function<PutPropMap, GetPropMap>(ppm, gpm);
  }

↓のように使える.for_eachの登場数が一気に上がるぜ!

#include <iostream>
#include <boost/graph/adjacency_list.hpp>

int main()
{
  typedef property<edge_weight_t, double> EdgeProp;
  typedef 
    adjacency_list<vecS, vecS, directedS, no_property, EdgeProp>
    Graph;
  Graph g;
  // 以下省略

  // 枝の重みの初期化
  for_each(edges(g).first, edges(g).second,
    make_put_prop_map_func
    (get(edge_weight, g), static_property_map<double>(3.0)));

  // ExteriorMapという外部プロパティマップがあったとして
  // その初期化
  ExteriorMap exterior_map;
  for_each(edges(g).first, edges(g).second,
    make_put_prop_map_func(exterior_map, get(edge_weight, g));
}

なんで第二引数もプロマティマップにしたのかは自分でも覚えてない.まぁ定数はstatic_property_map,constant_property_mapがあるからいいよね!あとは関数(オブジェクト)をプロパティマップに見立てるアダプタが欲しいところ.いつかつくろ.

ん,C++11のλ?C++03を使うことを強いられているんだッ!(集中線)

修論の要旨終わった〜

あーつかれた〜.なんども読み返して目が痛い….なんであんなに誤字脱字をしてしまうんやろうか.指定されたフォーマットが二つあってそれぞれ微妙に違うのはなんとかしてほしい.

using declaration使えばいいじゃない

アホな話

まえがき

BGLのアルゴリズムを適用できるグラフ構造にはBGLに含まれているadjacency_list等だけでない.自分自身で定義したグラフクラスやBoost以外のライブラリのグラフクラス,さらにvectorや配列等までありとあらゆるものBGLのアルゴリズムに適用できる.しかしそのためにはちょっとした準備が必要となる.アルゴリズムはこれらありとあらゆるデータ構造の情報にアクセスするために,verticesやout_edges等の自由関数を用いる.つまり必要な準備の一つとして,それぞれのデータ構造をBGLのグラフとして扱うにはこれらの自由関数を定義する必要があるのだ.このことはexternal adaptationと呼ばれている.

本論

自身で定義したクラス用のvertices等のアダプタ関数はそのクラスで定義した名前空間で定義されるのが普通なので,アルゴリズム内ではvertices等の自由関数を修飾なしで呼ぶ.対して他のグラフライブラリやvector等のアダプタ関数はboost名前空間にオーバロードすることになる.これで問題なくアダプタ関数を呼べることとなる.

では次に自分でBGLのコンセプトを満たすアルゴリズムを作るときアダプタ関数をどう呼び出すのか.自分で定義したアルゴリズムはboostでない名前空間に定義するので,boost修飾なしで呼び出すとvector等が呼び出せない.でもboostをつけるとADLでの呼び出しができない.
むむむ…これじゃ駄目じゃないですか!やだーーー!
とか思っていたのですが,ADL等の話を見てたらusing boost::verticesとか書いて修飾なしで呼べばいいことに気がつきました.駄目なのは自分の頭ですね.というかこのことEffective C++で読んだばっかりだったのに….
というわけで今からusing declarationを入れる作業にはいる