LEMON Graph LibraryをMacで使う(成功とおもいきや)

前回,LEMON Graph Libraryのインストールに成功した.
と思ったが,そのライブラリを使うプログラムをコンパイルしてみたところ,うまく行かなかったのでメモ.
※この記事はLEMON Graph Libraryが悪いのではなく,brewで普通に入れたBoostと一緒に使おうとしたのが原因です
症状は,リンク時にリンカエラーで,boost::regex系の何かがないと言われる次のようなもの.

 "boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std
::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::all
ocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_st
ring<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_t
raits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_rege
x<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boo
st::regex_constants::_match_flags)", referenced from:
      boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*,
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::
allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic
…

これの原因はおそらく,入れてるBoostがclangでコンパイルされているのに対して,lemonがgcc49でコンパイルされていることだと思う.
これを回避するには,Boostのbrewするときに –interactive で gcc49 を使ってインストールすれば良いと思うが,他のBoostを使っているプログラムにも影響が出そうなのでまだ試していない.

LEMON Graph LibraryをMacで使う(成功)

先日書いた記事では,LEMON Graph Libraryをhomebrewでインストールしようとしてうまくいかないという話だった.
今回,うまく行ったのでメモ.
手順としては,gccの新しいやつをいれ,それを使ってlemon-graphを入れれば良い.
lemonはgccの新しいやつでないとコンパイルが出来ないらしい.
まず,gccのインストールは

brew tap homebrew/versions
brew install gcc49

これでgccの4.9が使えるようになる.
そして,次はlemon-graphをgccを使って入れる.
ここでは, –interactive オプションが重要.
まず,COINORのリポジトリを追加して,

brew tap dpo/homebrew-coinor
brew install lemon-graph --interactive

これを実行すると,シェルに戻ってくる.
ここで,手動でビルドしてインストールすれば良い.
lemonのバージョンが1.3でgccが4.9の場合

cmake -DCMAKE_C_COMPILER=/usr/local/bin/gcc-49 -DCMAKE_CXX_COMPILER=/usr/local/bin/g++-49 -DCMAKE_INSTALL_PREFIX=/usr/local/Cellar/lemon-graph/1.3
make
make install
exit

することで,brewによるインストールが完了し,元のシェルに戻る.
これで無事LEMON Graph Libraryが使えるようになった.

LEMON Graph Libraryで有向グラフを作成

前回,LEMON Graph Libraryのインストールに成功したので,今回は有向グラフの作成をやってみる.
悪名高いBoost.Graphでは,使いはじめる前にひたすらtypedefをしていく作業(もしくはよくわからないままtypedefをコピペする作業)が待っているが,LEMON Graph Libraryはシンプル.

#include <lemon/list_graph.h>

をインクルードして

lemon::ListDigraph g;

でOK.
頂点の追加は

lemon::ListDigraph::Node a = g.addNode();
lemon::ListDigraph::Node b = g.addNode();

辺の追加は

lemon::ListDigraph::Arc ab = g.addArc(a,b);

でOK.
非常にわかりやすくて簡単.
頂点も辺も同じようにプロパティを割り当てることができる.
それをするのがMap.
頂点ならNodeMap,辺ならArcMapを使う.
これはテンプレートクラスなので,プロパティの型をテンプレートで渡す.
例えばdouble型で表現される辺の重みと,std::string型で表現される頂点の名前なら以下のようになる.

lemon::ListDigraph::ArcMap<double> weight(g);
lemon::ListDigraph::NodeMap<std::string> name(g);
weight[ab]=1;
name[a]="NodeA";
name[b]="NodeB";

まとめると,

#include <lemon/list_graph.h>
int main(){
    lemon::ListDigraph g;
    auto a = g.addNode();
    auto b = g.addNode();
    auto c = g.addArc(a,b);
    lemon::ListDigraph::ArcMap<double> weight(g);
    lemon::ListDigraph::NodeMap<std::string> name(g);
    weight[ab]=1;
    name[a]="NodeA";
    name[b]="NodeB";
    return 0;
}

次回はこれをファイルに保存したり,読み込んだりするところの説明をする予定.

LEMON Graph LibraryをLinuxで使う(成功)

先日LEMON Graph Libraryhomebrewでインストールしようとしたけどうまく行かなかった(記事).
そこで,Macでやるのを一旦あきらめて,Linuxで試してみた.使ったディストロはFedora 20.

インストール

簡単で,ソースコードを落としてきてコンパイルしてインストールすれば良い.cmakeが必要なので,インストールしていない人は

sudo yum install cmake

してから,

wget http://lemon.cs.elte.hu/pub/sources/lemon-1.3.tar.gz
tar zxvf lemon-1.3.tar.gz
cd lemon-1.3
mkdir build
cd build
cmake ..
make
sudo make install

でインストールできる.
次回は簡単なグラフの作成方法と読み書きについて書く予定.

LEMON Graph Libraryで最小費用流問題を解く(失敗)

Boost.GraphがわけわからんのでLEMON Graph Libraryを使ってみようとした.

インストール

まず,homebrewにOerations Researchの研究に使われるライブラリ群を入れることができるリポジトリを追加する.
ここにあるように,

brew tap dpo/coinor
brew install lemon-graph

でインストールできる…はずがコンパイルが通らなくて断念.