/*-------------------------------------
2007/2/28

CLUTO のライブラリのサンプルプログラム
コンパイルは
> gcc gomi.c -lcluto -lm
実行は
> ./a.out tr45.mat 10

-----------------------------------------*/

#include <stdio.h>
#include "cluto.h"

#define MAXLENG 50000

int main(int argc, char *argv[])
{
     FILE *fp;
     char line[MAXLENG],*p;
     int  clsn, rown, clmn, nzn, cn, rp, vp,i;
     double  vl;

     int *rowptr, *rowind, *result;
     float *rowval;

/*----- ここから行列の読み込みの処理、本質的でない -----*/

     /* 引数は2つ、 matrixfile  clsnumber */

     if ((fp = fopen(argv[1],"r")) == NULL) exit(1);
     clsn = atoi(argv[2]);

     /* 1行目の処理 --- CLUTO に渡す引数の設定 */

     if (fgets(line,MAXLENG,fp) == NULL) exit(1);

     p = strtok(line," ");
     rown = atoi(p);
     p = strtok(NULL," ");
     clmn = atoi(p);
     p = strtok(NULL," ");
     nzn = atoi(p);

     rowptr = (int *)malloc(sizeof(int)*(rown + 1));  
     rowind = (int *)malloc(sizeof(int)*nzn);
     rowval = (float *)malloc(sizeof(float)*nzn);
     result = (int *)malloc(sizeof(int)*rown);
    
     /* 2行目以降のデータ */

     rp = 0; vp = 0;
     while(fgets(line,MAXLENG,fp) != NULL) {

	  /* 行の最初は空白かタブ、最低1個はデータを持つ、1個目 */

	  p = strtok(line," \t");
	  cn = atoi(p);
	  p = strtok(NULL," \t");
	  vl = atol(p);

	  rowptr[rp] = vp; rp++;
	  rowind[vp] = cn - 1;
	  rowval[vp] = (float) vl;
	  vp++;
	  
	  /* 2個目以降のデータ */

	  while(1) {
	       if ((p = strtok(NULL," \t")) == NULL) break;
	       cn = atoi(p);
	       p = strtok(NULL," \t");
	       vl = atol(p);

	       rowind[vp] = cn - 1;
	       rowval[vp] = (float) vl;
	       vp++;
	  }
     }
     close(fp);

/*--------- 行列の読み込み終わり --------------------*/

     /* CLUTO のライブラリの利用 */

     CLUTO_VP_ClusterRB(rown-1,clmn,rowptr,rowind,rowval,
			    CLUTO_SIM_COSINE, 
			    CLUTO_CLFUN_I2, 
			    CLUTO_ROWMODEL_NONE, 
			    CLUTO_COLMODEL_IDF, 
			    1.0,
			    10,
			    10,
			    8,
			    CLUTO_CSTYPE_BESTFIRST,
			    0,
			    0,
			    clsn,
			    result);

     /* 結果の表示 */

     for(i = 0;i < rown;i++)  printf("%d\n",result[i]);
}