/* splitterモジュールのインターフェイス */
#ifndef _splitter_h_included_
#define _splitter_h_included_

#include <xstr.h>
#include <wtype.h>
#include <segclass.h>

/** splitterのコンテキスト．
 * 最初の境界設定からanthy_contextの解放まで有効
 */
struct splitter_context {
  /** splitter内部で使用する構造体 */
  struct word_split_info_cache *word_split_info;
  int char_count;
  struct char_ent {
    xchar *c;
    int seg_border;
    int initial_seg_len;/* 最初の文節分割の際にここから始まった文節が
			   あればその長さ */
  }*ce;
};

/** seg_info中に置かれる，文節の要素 */
struct word_info {
  /** word_infoの長さ */
  int len;
  /** 品詞 */
  wtype_t wt;
  /** 要素の重み */
  int ratio;
};

/** splitterから文節の情報を取り出すための構造体
 * その文節の構成の一つの候補
 */
struct seg_info {
  /** そのseg_infoがどのような情報を持っているか */
  enum {
    SI_NORMAL,/* 品詞情報を持っている */
    SI_CAND/* 候補を与えられている */
  } type;
  
  /** word_infoでカバーされている部分の長さ
   * 文節後部の句読点などを含まない */
  int info_len; 

  /** word_infoの配列 */
  int nr_word_info;
  struct word_info *word_info;
  /* 自立語部のインデックス(自立語が無い場合は-1) */
  int core_word_info_index;

  /** 文節の形式のスコア
   * この数字が低いほどこの文節は確率の低い構造をしている
   * 0より大きくないといけない
   */
  int struct_ratio;
  /** 文節のクラス
   */
  struct seg_class seg_class;

  /** type == SI_CANDの時に候補が入っている */
  xstr cand;

  /* 以下のエントリはsplitterは使わない */
  /** seginfoのスコア */
  int score;
};

int anthy_init_splitter(void);
void anthy_quit_splitter(void);

void anthy_init_split_context(xstr *xs, struct splitter_context *);
/*
 * mark_border(context, l1, l2, r1);
 * l1とr1の間の文節を検出する、ただしl1とl2の間は境界にしない。
 */
void anthy_mark_border(struct splitter_context *, int from, int from2, int to);
void anthy_commit_border(struct splitter_context *, int nr,
		   struct seg_info **seg, int *len);
void anthy_release_split_context(struct splitter_context *c);

/* 作り出した文節の情報を取得する */
int anthy_get_nr_seginfo(struct splitter_context *, int from, int len);
struct seg_info *anthy_get_nth_seginfo(struct splitter_context *,
				 int from, int len, int nth);

/* パラメータ */
#define SCORE_PER_LEN 10000
#define RATIO_BASE 256

#define OCHAIRE_SCORE 5000000

#endif
