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

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

ノマド大会(2回目)

今回は3人でノマド.

朝は遅刻したので午後から参加.今回の会場は大阪.

はじめにラーメンが食べたいということで,どうとんぼり神座へ.

神座のラーメン好きです.

腹ごしらえを終えて,ノマド開始.1軒目はキャプテンテリーコーヒースタジアム なんば千日前店.場所が場所なのでざわざわしてる.ピザが一押しの模様.
電源があって作業しやすい,ちゃんと分煙されている,等比較的ポイントは高め.

おやつはたこ焼き.やっぱりたこ焼き道楽わなか美味しい.

一番ベーシックなやつを食べた.

ノマド2件目はなんばウォーク内の英国屋
混んでいたこともあり,退店願われた.

締めにSTANDARD BOOKSTORE
ここは本屋さん?購入前の本をカフェに持ち込んで読めるらしい.

新風館

新風館がカラフルになっていた.
新曲,いいくらしのリリース記念フリーライブ.

カップリングのこの曲やって欲しかったのにな…

チームしゃちほこの野菜生活体操

ライブの様子はナタリーで詳しくレポートされている.

send to kindle

最近Androidアプリ版のkindleを使い始めた.

kindleではAmazonで買った本の他に,「send to kindle日本語)」という機能を使って,自前のPDFもAmazonで買った本と同じように読むことができる.
send to kindleは,登録しておいたメールアドレス宛てにPDFを添付して送ると,そのPDFがkindleからダウンロードできるような形になる.

PDF以外にも

  • Microsoft Word (.DOC, .DOCX)
  • HTML (.HTML, .HTM)
  • RTF (.RTF)
  • Text (.TXT)
  • JPEG (.JPEG, .JPG)
  • Kindle Format (.MOBI, .AZW)
  • GIF (.GIF)
  • PNG (.PNG)
  • BMP (.BMP)
  • PDF (.PDF)

に対応しているらしい.

さらに,Chrome拡張のSend to Kindle for Google Chromeを使うと,Chromeで開いているWebページをKindleに送ることもできる.

sv_countのassertで死ぬ

Fedora 20上でOpenCVをコンパイルして使っている.
cv::SVMでサポートベクトル回帰(Support Vector Regression)を使って観ようとした時にうまく行かなかったのでメモ.

#include <opencv2/opencv.hpp>

int main(){
        // 適当な入力データと適当なラベル
	cv::Mat_<float> x(100,2,CV_32FC1);
	cv::Mat_<float> l(100,1);
	for(int i=50;i<100;i++) l(i,0)=1;

        // SVRのパラメータ
	CvSVMParams params;
	CvTermCriteria criteria;

	criteria=cv::TermCriteria(CV_TERMCRIT_EPS,1000,FLT_EPSILON);
        // ここで第1引数を CvSVM::EPS_SVR にすると SVMではなく SVR になる
	params=CvSVMParams(CvSVM::EPS_SVR,CvSVM::RBF,10.0,8.0,1.0,10.0,0.5,0.1,NULL,criteria);

	cv::SVM svm;

        // 学習の実行
	svm.train_auto(x,l,cv::Mat(),cv::Mat(),params);

	return 0;
}

SVRはこういう感じで使える.
SVMの種類はC_SVRとNU_SVRがあるが,とりあえずC_SVRを使う.

パラメータの設定は結構重要だが,クロスバリデーションによって自動で良いパラメータを探索してくれる.
このtrain_autoを実行しようとした時,アサーションエラーで死ぬようになった.

問題の箇所は sv_count != 0 のアサート.
多分サポートベクトルの数が0ならダメっていうことなんだろう.
普通のtrainなら上手くいくし,学習サンプル変えたりしながら色々試したけど原因わからず….

SVRの種類をNU_SVRに変えたら動いた….

agに--pager="less -R"すると捗る

最近話題のthe_silver_searcherを使い始めた.
the_silver_searcherはagというコマンドで,ざっくり言うとgrepの強いやつ.
聞いた話だと

grep < ack < ag

grep代わりに使っている.

インストールはとても簡単で,Macなら

brew install ag

Linuxならここからgitで取ってきてコンパイルすればインストールできる.

基本的にgrepなので,

grep hoge foobar.txt

としていたところを

ag hoge foobar.txt

とすれば良い.

さらに,ディレクトリ下の複数ファイルにも対応していて,引数にディレクトリを指定すれば,その中のファイル内を検索してくれる.さらに表示はカラフル.

この時,該当するファイルや行が多いと1画面に収まらない.パイプでlessに渡すとせっかくのカラフルな表示がなくなる.

調べたところ,
agコマンドの結果をlessでカラー表示する
という記事を見つけた.

これによると,.alias等に

alias ag='ag --pager="less -R"'

しておくことで,画面に収まらない場合はlessで表示してくれるようになる.

こちらの記事では,zshやvimからagを使うようにする設定も書かれていて,これをやると非常に便利になる.
ackを捨てて、より高速なag(The Silver Searcher)に切り替えた

初期化子リスト

C++11では初期化子リスト(initializer_list)というのがあって,配列を初期化するのに使う.
例えば,

#include <iostream>
#include <algorithm>
#include <vector>

int main(){
	std::vector<int> a={1,2,3};

	std::for_each(a.begin(),a.end(),[](int x){std::cout << x << std::endl;});
	return 0;
}

という形で,std::vectorなどを初期化することができる.

この{1,2,3}の部分の型は,カッコ内の変数の型によって型が決まる.
この場合int型になるだろう.(全体は std::initializer_list という型.)

これを上記のように std::vector 型の変数で受ければ,問題なく変数aが初期化される.

	std::vector<double> b={1,2,3};

の場合,右辺は本来int型だが,bの型がdoubleなので,double型のvectorになる.
しかし,次のように一旦autoの変数で受けてしまうと,この場合は {1,2,3} の中の型で変数の型が決定されてしまい,bbはstd::vectorになる.

	auto bb={1,2,3};
	std::vector<double> b=bb;

なので,上記のコードはstd::vectorとstd::vectorの代入が出来ないのでコンパイルエラーになる…のかな?

一方で,違う型を指定したらどうなるか調べてみた.

	std::vector<int> c={1.f, 2.f, 3.f};

この場合,右辺はfloat型に対して左辺はint型.
これでコンパイルをすると,

test2.cpp: In function 'int main()':
test2.cpp:11:30: warning: narrowing conversion of '1.0e+0f' from 'double' to 'int' inside { } [-Wnarrowing]
  std::vector<int> f={1.f,2.f,3.f};

という感じで,精度が落ちる変換が行われてることがwarningで出た.