/*
  Copyright(C) 2007-2012 National Institute of Information and Communications Technology
*/

/*
  svmtools
  Common module
*/


#ifndef _SVM_COMMON_H_
#define _SVM_COMMON_H_


#include <stdio.h>


#define SVM_KERNEL_LINEAR 0
#define SVM_KERNEL_POLYNOMIAL 1
#define SVM_KERNEL_RBF 2
#define SVM_KERNEL_SIGMOID 3


/* Kernel parameter */
typedef struct Svm_kprm {
  int ktype;	/* カーネルの種類 */
  float degree;	/* カーネル関数のパラメータ */
  float gamma;	/* カーネル関数のパラメータ */
  float coef;	/* カーネル関数のパラメータ */
} SVM_KPRM;

/* Sparse vector */
typedef struct Svm_sv {
  int num;	/* ベクトルの要素数 */
  int *idx;	/* インデックス */
  float *val;	/* 値(binaryモードでは未使用) */
} SVM_SV;

/* Model data */
struct Svm_kwrk;
typedef struct Svm_mdl {
  SVM_KPRM kprm;	/* カーネルパラメータ */
  double *beta;	/* (alpha_i * y_i) */
  int num;	/* サポートベクター数 */
  SVM_SV **sv;  /* サポートベクター */
  double b;	/* b */
  float *reg;	/* 計算結果を格納する配列 */
  struct Svm_kwrk *kwrk;	/* カーネル計算の作業用 */
} SVM_MDL;

/* Example */
typedef struct Svm_exm {
  int num;	/* 事例数 */
  int *label;	/* ラベル(二値分類の場合は-1か+1) */
  SVM_SV **sv;	/* 素性ベクトル */
} SVM_EXM;


SVM_EXM *svm_readexm(FILE *fp);
int svm_createmdl(SVM_KPRM *kprm, SVM_EXM *exm, double *alpha, double b, FILE *fp);
SVM_MDL *svm_readmdl(FILE *fp);
double svm_decision(SVM_MDL *mdl, SVM_SV *x);
int svm_readvec(FILE *fp, int *label, SVM_SV *svbuf, int *svbuf_size, SVM_SV *sv);


extern int svm_verbose;
extern int svm_invidx;


#endif
