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

/*
  A Latent Variable Model for Sentiment Classification
  共通モジュール
*/


#ifndef _LSM_COMMON_H_
#define _LSM_COMMON_H_


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


#define TKN_MAX (32*256)	/* 一文中に含まれる最大トークン数 */
#define CLS_MAX 2	/* 隠れ変数のクラスの数 */
#define PRB1(prb, i, c) ((prb)[CLS_MAX * (i) + (c)])
#define PRB2(prb, i, c, d) ((prb)[CLS_MAX * CLS_MAX * (i) + CLS_MAX * (c) + (d)])
#define POT1(pot, i, c) ((pot)[CLS_MAX * (i) + (c)])
#define POT2(pot, i, c, d) ((pot)[CLS_MAX * CLS_MAX * (i) + CLS_MAX * (c) + (d)])


/*
  評価表現(トークン毎に分解して素性が入ったもの)
*/
typedef struct Xpr {
  int lbl;		/* ラベル */
  int num;
  int head[TKN_MAX];
  char *surf[TKN_MAX];
  char *base[TKN_MAX];
  char *cpos[TKN_MAX];
  char *fpos[TKN_MAX];
  int pol[TKN_MAX];
  int rev[TKN_MAX];
  int buf_size;
  char *buf;
} XPR;

/*
  variableノード
*/
typedef struct Var {
  int con;	/* 何人と隣接しているか */
  int cnt;	/* メッセージを何個受け取ったか */
  int flg;	/* 何回送信を行ったか */
} VAR;

/*
  factorノード
*/
typedef struct Fac {
  int con;	/* 何人と隣接しているか */
  int cnt;	/* メッセージを何個受け取ったか */
  int flg;	/* 何回送信を行ったか */
  int nbr[2];	/* 誰と隣接しているか */
  int rcv[2];	/* facノードがメッセージを受け取ったかどうか */
  int snd[2];	/* facノードがメッセージを送ったかどうか */
  double v2f[2][CLS_MAX];	/* variableから受け取ったメッセージ */
  double f2v[2][CLS_MAX];	/* variableに渡したメッセージ */
} FAC;


int readxpr(XPR *xpr, FILE *fp);
void makeftr1(SDB *ft, int add, XPR *xpr, int i, int c, int ftr_size, int *ftr_num, int *ftr);
void makeftr2(SDB *ft, int add, XPR *xpr, int i, int j, int c, int d, int ftr_size, int *ftr_num, int *ftr);
void bp(XPR *xpr, double *pot1, double *pot2, VAR *v, FAC *f, double *prb1, double *prb2);


#endif
