niitsuma blog このページをアンテナに追加 RSSフィード

2014-07-17 Java

Use git in eclipse

create git repository

  1. Select your project top node
  2. Right Click
  3. [Team] -> [Share Project]
  4. select [Git]
  5. check [Use or create repository in parent folder of project]
  6. select your project folder
  7. Click [Create Repository]
  8. Click [Finish]
Ref

add file to git

  1. select file
  2. Right Click
  3. [Team] -> [Add to index]
Ref

browse git repository

  1. [Window]-> [Open perspective]->[other]
  2. select [Git]
Ref

http://gomafuace.seesaa.net/article/301694478.html

eclipse JUnit Unit test

Install JUnit

  1. Download junit-4.10.jar from http://sourceforge.net/projects/junit/files/junit/4.10/ to workspace/your-project/lib/
  2. start eclipse
  3. select your-project top node
  4. right click
  5. select [Refresh]
  6. select your-project top node
  7. right click
  8. select [Property]
  9. select [Java Build Path]
  10. select [Libraries] tab
  11. click [add JARs]
  12. select lib/junit-4.10.jar
  13. click [OK]
ref

http://www.okapiproject.com/java/java_tools/eclipse/vol_2/eclipse_junitfuncion.htm

generate unit-test

  1. select your class(want test)
  2. right click
  3. [New] -> [JUnit test case]
  4. [Finish]

run unit-test

  1. right click generated (edited) unit-test class
  2. [run as] -> [JUnit Test]

unit-test example

test this class

public class ChangeNum {
  public static void main(String[] args) {
    ChangeNum cn1 = new ChangeNum();
    cn1.changeNum(args[0]);
  }

  int changeNum(String s1) {
    int n1 = Integer.parseInt(s1);
    return n1;
  }
}
  1. select this class
  2. right click
  3. [New] -> [JUnit test case]
  4. [Finish]
  5. edit generated file as:
import junit.framework.TestCase;

public class ChangeNumTest extends TestCase {
  public ChangeNumTest(String name) {
    super(name);
  }
 
  public void testChangeNum() {
    String ts1 = "100"; 
    int tn1 = 100;
    ChangeNum tcn1 = new ChangeNum(); 
    int test1 = tcn1.changeNum(ts1); 
    assertEquals("Error not number type", tn1, test1); 
  }
}
  1. right click ChangeNumTest class
  2. [run as] -> [JUnit Test]
Ref

run all unit-test

  1. select your packege
  2. right click
  3. [new]->[other]->[java]->[JUnit]->[JUnit Test Suite]->[Next]
  4. click [select All]
  5. click [Finish]

Windowsで作られたeclipse workspaceをLinuxで動かす

  1. select project top node
  2. right click
  3. [property]->[Resorce]
  4. [text file encoding]->[other]->[MS932]
  5. [new text file line delimitter]->[other] -> [windows]

Ref

2013-12-17 text mining

CRF++

CRF++の使い方などのまとめ

CRFの原理

CRF++の使い方解説

CRF 応用

CRF++以外のCRF実装

CRF++の使い方の練習

CRF++を実際に動かして使い方の練習をする

簡単のため、次の1つの要素のみのtemplateファイルを使う

  • template
U02:%x[0,0]

このtemplateを使って次の学習データを学習する

  • train.data
A +
A +
A +
B -
B +
B +
C +
X -
X -
Y -
Z -

次のコマンドで学習を行う

$ crf_learn  -t template train.data   model

学習結果は以下のようなファイルとなる

  • model.txt
version: 100
cost-factor: 1
maxid: 12
xsize: 1

+
-

U02:%x[0,0]

0 U02:A
2 U02:B
4 U02:C
6 U02:X
8 U02:Y
10 U02:Z

0.6462678961244115
-0.6462678961244128
0.2016113127964356
-0.2016113127964371
0.3374158284496933
-0.3374158284496931
-0.5213066287709371
0.5213066287709373
-0.3374158284496930
0.3374158284496934
-0.3374158284496929
0.3374158284496936

この学習結果を次のテストファイルに適用する

test.data

A +
X -
B +
C +
$ crf_test -v2 -m model test.data

次の実行結果を得る

# 0.230404
A	+	+/0.784576	+/0.784576	-/0.215424
X	-	-/0.739354	+/0.260646	-/0.739354
B	+	+/0.599462	+/0.599462	-/0.400538
C	+	+/0.662584	+/0.662584	-/0.337416

Aの答えが+か-のどちらにラベルになるかの確率

+/0.784576	-/0.215424

は、学習データ中の最初の2つの数値

0.6462678961244115
-0.6462678961244128

で決まる。これを手計算してみる。

p=exp(0.6462678961244115);
n=exp(-0.6462678961244128);
p/(p+n) =  .7845760890555549;
n/(p+n) =  0.215423910944445

となりcrf_testの結果と一致した。

Bについても学習データの

0.2016113127964356
-0.2016113127964371

から計算すると同じ様に計算できる。

CRF++の練習その2

次の入れ替えをした学習データで同じ事をしてみる

A:2 B:3 C:4 X:7 Y:8 Z:9

  • train.data
2 +
2 +
2 +
3 -
3 +
3 +
4 +
7 -
7 -
8 -
9 -

学習結果も名前が入れ替わっただけの同じものになる。

今度は学習データにない 0 5 を入力するとどうなるか確かめる

  • test.data
2 +
9 -
0 +
5 -

結果は以下のようになり 0,5は確率0.5でどちらともいえない結果になった

# 0.129962
2	+	+/0.784576	+/0.784576	-/0.215424
9	-	-/0.662584	+/0.337416	-/0.662584
0	+	+/0.500000	+/0.500000	-/0.500000
5	-	+/0.500000	+/0.500000	-/0.500000

CRF++は数値データの補完が出来ないことを確認した

LDA

LDAのリンクいろいろ

入門

ソフトウェア

応用


拡張

2013-05-12

[][] テザリング

Linux(Gnome2)から使う場合に上記よりもやや簡単な方法を発見した

  1. 記事と同じようにiphoneをセットアップ
  2. gnome無線LANアイコンを右クリックして無線LAN管理GUIメニューを次のように開く
    • 接続を編集する → 無線 → 追加 → 
      • モード アドホック 
      • IP4タブでiphoneテザリングソフトに表示されてるipと1つずらしたアドレスを設定
        • 例えばテザリングソフトでiphoneのアドレスが10.0.0.10と表示してるならパソコン側のIP4設定は10.0.0.11の255.255.255.0で他は空白
    • 新規接続に適当な名前を設定して保存
  3. 無線LANアイコンを左クリック → 表示されていない無線LANネットワークに接続 → 設定したネットワーク名を選択でadhocネットワークが起動
  4. iphoneを設定したネットワークに接続
  5. パソコン側firefoxproxyを上記記事と同じように設定

以上で接続できた。gentoo linuxで動作を確認。KDE4などでも同様にGUIだけでテザリング設定できると思われる

proxychains

firefoxの設定しなくても以下でも接続できる

/etc/proxychains.conf

localnet  10.0.0.0/255.255.255.0
socks5 10.0.0.10 8888

usage

proxychains ssh hoge@example.com

tsocks

/etc/socks/tsocks.conf

local = 10.0.0.0/255.255.255.0
server = 10.0.0.10
server_type = 5
server_port = 8888
#tordns_enable = false
usage
# nano /etc/hosts
ipaddress example.com
$ tsocks ssh hoge@example.com
DNSを自動解決するにはソースからビルドしなおす

http://debiancdn.wordpress.com/2009/07/08/macports%E3%81%AEportfile%E3%82%92%E3%81%84%E3%81%98%E3%81%A3%E3%81%A6socks%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA/

2012-08-03 C++

[][]boost fusion dynamic at_n

usage

  boost::fusion::vector<int,double,std::string,char> vec(9 ,2.2 ,"aaa" ,'b');
  std::cout << 
   at_n_dynamic<double>(vec, 1) 
    << std::endl; //=> 2.2

detail

#include <boost/fusion/include/vector.hpp>
//#include <boost/fusion/algorithm.hpp>

  template<typename V>
  struct fusion_at_n_functor
  {
    mutable int i;
    int n;
    mutable V value;
    fusion_at_n_functor(int _n):i(0),n(_n){}
    void operator()(const V & t) const
    { if(i==n){value=t;} i++;}  
    template<typename T>
    void operator()(const T & t) const
    { i++;}
  };

  template <typename First,typename Last,typename AtN > void
  at_n_dynamic_fusion_impl(First i,Last last,AtN &atn,boost::mpl::true_ ){}
  template <typename First,typename Last,typename AtN > void
  at_n_dynamic_fusion_impl(First i,Last last,AtN &atn,boost::mpl::false_ ){  
    if(atn.i == atn.n ){atn(boost::fusion::deref(i));}
    else{
      atn(boost::fusion::deref(i));
      at_n_dynamic_fusion_impl(boost::fusion::next(i),last,atn,
			   boost::fusion::result_of::equal_to<
			     typename boost::fusion::result_of::next<First>::type,Last>());}
  }

  template <typename Ret,typename Sequence>  Ret
  at_n_dynamic(Sequence & seq, int n){ 
    fusion_at_n_functor<Ret> atn(n);
#if 0
//debug
    boost::fusion::for_each(seq, atn);
#else
    at_n_dynamic_fusion_impl(boost::fusion::begin(seq),boost::fusion::end(seq) ,atn,
			 boost::fusion::result_of::equal_to<
			   typename boost::fusion::result_of::begin<Sequence>::type,
			   typename boost::fusion::result_of::end<Sequence>::type>());    
#endif
    return atn.value;}
///////////////////////////////////////////////
int main(){
  boost::fusion::vector<int,double,std::string,char> vec(9 ,2.2 ,"aaa" ,'b');
  std::cout << at_n_dynamic<double>(vec, 1) << std::endl; //=> 2.2
}

[][]boost.variantの補助ツール

boost::variant に以下の動作をさせたい

variant<int,int>  => int
variant<int,double>  =>  double
variant<int , boost::rational<int> >   =>   boost::rational<int>
variant<int , double , std::string>   =>   variant<double,std::string>

しかしこうなってくれないので自分で拡張ツールを作った。

https://github.com/niitsuma/variant_shrink

(要するにdecltype(int+double)=>double みたいにまとめられる場合はまとめるけど、まとめられない場合はvariant<X,Y>にしてしまえ,というもの

使用例

C++11が使えない環境でdecltypeの代用品として使う

template<typename X,typename Y> 
typename make_variant_shrink_over<boost::mpl::vector<X,Y> >::type //C++11ならdecltype(x+y)にできる
adder(X x, Y y) {return x + y;} 

double r1= adder(1,1.1); 

boost::rational<int> x(2,3); 
boost::rational<int> r2 = adder(1,x); 

使い方

boost::variant::make_variant_over<boost::mpl::vector<....>  >::type

と同じ様に使う.

ファイル"variant_shrink.hpp"をインクルードするだけで使える

#include "variant_shrink.hpp"

make_variant_shrink_over<boost::mpl::vector<int,int> >::type
=> int

make_variant_shrink_over<boost::mpl::vector<int,boost::rational<int> >::type
=> boost::rational <int>

make_variant_shrink_over<boost::mpl::vector<int,double > >::type
=> double

make_variant_shrink_over<boost::mpl::vector<double,std::string> >::type
=> boost::variant<double,std::string>

make_variant_shrink_over<boost::mpl::vector<double,int,std::string> >::type
=> boost::variant<double,std::string>




任意の縮小方法

デフォルト

typedef boost::mpl::vector<
         int,boost::rational<int>,float,double,std::complex<double> >::type 
          default_type_order;

となっていて

int <  boost::rational<int>  <  float  < double < std::complex<double> 

の順番で型の一般化(縮約?)がされていく。この順番を変更したい場合は、一般化の順番を決める関数オブジェクトを2番めのテンプレート引数として入力する。例えば

bool  <  int  <  long  <  boost::rational<int>   <  boost::rational<long>

の順番で一般化したい場合は

typedef make_variant_shrink_over<
  boost::mpl::vector<float,bool,boost::rational<long> >       
  , //2番めのテンプレート引数に順番情報を入力する
  generate_mpl_lambda_is_generalizable_to_from_type_order_sequence<      
    boost::mpl::vector<
     bool , int , long , boost::rational<int>  ,  boost::rational<long>  //ここに自分の好きな順番を入れる
      >  
    >::type
  >::type r8type;
BOOST_MPL_ASSERT((boost::mpl::equal<r8type ,boost::variant<boost::rational<long> ,float> > ));

この2番めのテンプレート引数に入力する一般化の順番を決める関数オブジェクト

is_generalizable_to<TypeFrom,TypeTo>

は次のような意味を持つものを作ればよい

is_generalizable_to<float,double> 
 =>  boost::mpl::true_   // float は double に一般化できる
is_generalizable_to<double,float> 
 =>  boost::mpl::false_ //double は float に一般化できない
is_generalizable_to<std::string,float> 
  => boost::mpl::false_  //std::string は floatと比較できない、またはfloatへの一般化はできない。

generate_mpl_lambda_is_generalizable_to_from_type_order_sequenceは一般化の順番ベクトル

generate_mpl_lambda_is_generalizable_to_from_type_order_sequence<   
   boost::mpl::vector<
     bool , int , long , boost::rational<int>  ,  boost::rational<long>
      >  //一般化の順番ベクトル
 >

を入力すると、上記の反応をする関数オブジェクトを生成する。

もっと複雑な縮小順番も入力できる。

浮動小数型:

float < double < long double

整数型:

bool < char < short < int <  long  

の順番で縮約されて、なおかつ浮動小数整数のunionはboost::variantにしたい場合はこうする。

template<typename T,typename TBase>
struct is_generalizable_to_custom : public
boost::mpl::if_<
  boost::is_floating_point<T>
  , typename boost::mpl::if_< 
     boost::is_floating_point<TBase>
     ,is_less_in_orderd_mpl_sequence<
          T,TBase,boost::mpl::vector<float,double,long double > >  //浮動小数型の順番
     ,boost::mpl::false_                      //浮動小数型と整数型のUnionはそのままvarinatにする
     >::type
 ,typename boost::mpl::if_<
     boost::is_integral<T>
         ,typename boost::mpl::if_<
           boost::is_integral<TBase>
           ,is_less_in_orderd_mpl_sequence<
           T,TBase,boost::mpl::vector<bool,char,short,int,long> > //整数型の順番
           ,boost::mpl::false_
          >::type
         ,boost::mpl::false_  //他の型(std::stringとか)はそのままにする
     >::type 
  >::type
{};

typedef boost::mpl::lambda<is_generalizable_to_custom<
    boost::mpl::_1 , boost::mpl::_2 > >::type 
       is_generalizable_to_custom_mpl_lambda; //boost::mpl::lambdaで包まないと関数オブジェクトとして引数に渡せない

typedef make_variant_shrink_over<
  boost::mpl::vector<double,float,bool,char> 
  ,is_generalizable_to_custom_mpl_lambda //2つ目のtemplate引数として上記で生成した関数オブジェクトを入力
>::type r10type;

BOOST_MPL_ASSERT((boost::mpl::equal<r10type 
   ,boost::variant<double,char> >));

ここで使った補助関数

is_less_in_orderd_mpl_sequence<T1, T2,OrderVector>

is_less_in_orderd_mpl_sequence<int, double ,mpl::vector<bool,int,double,long double> >
 => mpl::true_
is_less_in_orderd_mpl_sequence<double, int ,mpl::vector<bool,int,double,long double> >
 => mpl::false_

のようなT1がT2よりも先に順番ベクトルに出現する時にtrue_となる関数オブジェクト

関連

2012-02-03 scm2cpp

scm2cpp

scm2cpp is READABLE C++ code generator from Scheme code.

Ver 0.6

Ver 0.7

  • URL http://www.suri.cs.okayama-u.ac.jp/servlets2/scm2cpp.rkt
  • Feature
    • does not need C++11, C++03 is sufficient
    • Static type inference
      • but sometime can not distinguish int and float
    • Mainly forced on numeric computation
    • Not support symbol and string computation
  • Support
    • uniform vector, uniform list ...
    • More statement can deal than Ver 0.6
  • Not support
    • call/cc , string , char , symbol, switch , car , cdr , cons , let* , letrec , hash , alist ...
    • no difference let let*
    • tail recursion does not expanded
    • some type declaration does not work than Ver0.6
  • Bug in 0.7.2
    • function should not return lambda
    • function should not return do block
  • related work http://www-ti.informatik.uni-tuebingen.de/~weissr/doc/scm2cpp.pdf
  • Require C++ library
  • In ver 0.7.2 following implemented, but not tested.
    • do , named let , cond

scm2cpp usage

  1. Download and Unpack http://www.suri.cs.okayama-u.ac.jp/~niitsuma/scm2cpp/scm2cpp-0.7-commandline.tar.gz
  2. cd scm2cpp-0.7-commandline
  3. racket scm2cpp.scm -t scm2c.typ sample.scm
  4. g++ sample.cpp

  • more example

see file scm2cpp-0.7-commandline/benchmark/makefile

scm2cpp benchmark

fft.scm

http://www.suri.cs.okayama-u.ac.jp/~niitsuma/scm2cpp/benchmark/fft.scm


system stalin scm2cpp scm2cpp +openmp scm2cpp +manual rewrite gambit-c chicken racket gauche
i7@2.93GHz ubuntu 0.231 sec 0.407 sec 0.092 sec 0.230 sec 7.408 sec 18.236 sec 6.624 sec 38.055 sec
MacBook core2duo 2.26Ghz - 0.984 - - 16.797 - - -

MacBook
  • Gambit-C
$ time ./fft-gambit 
real	0m16.797s
user	0m13.046s
sys	0m0.135s
  • scm2cpp
$ time ./fft.exe 
real	0m5.202s
user	0m4.298s
sys	0m0.029s
  • scm2cpp with g++ O3
$ time ./fft-O3
real	0m0.984s
user	0m0.807s
sys	0m0.005s

Environment

MacBook core2duo 2.26Ghz

$ uname -a

Darwin 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; RELEASE_I386 i386