예제 #1
0
  void test_except_boundary(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::PrefixCursor cursor;

    cursor.open(trie, grn::dat::String("東京都庁ビル"), 0,
                0, grn::dat::UINT32_MAX, grn::dat::EXCEPT_EXACT_MATCH);
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen("東京"),
                0, grn::dat::UINT32_MAX, grn::dat::EXCEPT_EXACT_MATCH);
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁"), std::strlen("東京"),
                0, grn::dat::UINT32_MAX, grn::dat::EXCEPT_EXACT_MATCH);
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("京都府"), 0,
                0, grn::dat::UINT32_MAX, grn::dat::EXCEPT_EXACT_MATCH);
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #2
0
  void test_ascending_cursor(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::PrefixCursor cursor;

    cursor.open(trie, grn::dat::String("京都府"), 0,
                0, grn::dat::UINT32_MAX, grn::dat::ASCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("京都府"), std::strlen("京都"),
                0, grn::dat::UINT32_MAX, grn::dat::ASCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("京都府"), 0,
                1, grn::dat::UINT32_MAX, grn::dat::ASCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("京都府"), 0,
                0, 1, grn::dat::ASCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #3
0
  void test_descending_cursor(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::KeyCursor cursor;

    cursor.open(trie, grn::dat::String(), grn::dat::String(),
                0, grn::dat::UINT32_MAX, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Elf"), grn::dat::String("Human"),
                0, grn::dat::UINT32_MAX, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Dwarf"), grn::dat::String("Trebor"),
                3, 2, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #4
0
  void test_limit(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::KeyCursor cursor;

    cursor.open(trie, grn::dat::String("Gnome"), grn::dat::String("Werdna"),
                0, grn::dat::UINT32_MAX);
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Gnome"), grn::dat::String("Werdna"),
                0, 3);
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("A"), grn::dat::String("Z"), 3, 2);
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("A"), grn::dat::String("Z"), 0, 0);
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #5
0
  void test_offset(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::KeyCursor cursor;

    cursor.open(trie, grn::dat::String("Hobbit"), grn::dat::String("Trebor"), 0);
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String(), grn::dat::String(), 5);
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Gnome"), grn::dat::String("Trebor"), 2);
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Gnome"), grn::dat::String("Trebor"), 100);
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #6
0
  void test_offset(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::PrefixCursor cursor;

    cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 0);
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 1);
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 2);
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 3);
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #7
0
  void test_null(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::PrefixCursor cursor;
    cursor.open(trie, grn::dat::String());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #8
0
  void test_min_max(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::KeyCursor cursor;
    cursor.open(trie, grn::dat::String("Gnome"), grn::dat::String("Trebor"));
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #9
0
int main()
{T=initial();
    for(int k=0;k<1000;k++)word_count_all[k]=0;
    for(int j=0;j<=968;j++){
       
        int flag=0;//for xcode, flag=1;for windows, flag=0;
        
        if(flag){
        char filename[10];
        char entire_add[300]="/Users/aidanfok/Documents/大三下/Data\ Structure/mini\ search\ engine/out/";
        memset(filename,0,sizeof(filename));
        sprintf(filename,"%d",j);
        strcat(filename,".txt");
        strcat(entire_add, filename);
        FILE* fp;
        fp=fopen(entire_add,"r");
        create_trie(fp,j);
        printf("word count of %d file:%d\n",j,word_count_all[j]);
            fclose(fp);}
        else {
            char filename[10];
            memset(filename,0,sizeof(filename));
            sprintf(filename,"%d",j);
            strcat(filename,".txt");
            FILE* fp;
            fp=fopen(filename,"r");
            create_trie(fp,j);
            printf("word count of %d file:%d\n",j,word_count_all[j]);
            fclose(fp);
        }
    }
    T=find_noisy(T);
    
    char a[1000]="pluck";
    find(a, T);
    return 0;
}
예제 #10
0
  void test_except_boundary(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::KeyCursor cursor;

    cursor.open(trie, grn::dat::String(), grn::dat::String(),
                0, grn::dat::UINT32_MAX,
                grn::dat::EXCEPT_LOWER_BOUND | grn::dat::EXCEPT_UPPER_BOUND);
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Dwarf"), grn::dat::String("Werdna"),
                0, grn::dat::UINT32_MAX,
                grn::dat::EXCEPT_LOWER_BOUND | grn::dat::EXCEPT_UPPER_BOUND);
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Elf"), grn::dat::String("Trebor"),
                2, 100, grn::dat::EXCEPT_LOWER_BOUND);
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Elf"), grn::dat::String("Trebor"),
                2, 100, grn::dat::EXCEPT_UPPER_BOUND);
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("Fighter"), grn::dat::String("Samurai"),
                0, grn::dat::UINT32_MAX,
                grn::dat::EXCEPT_LOWER_BOUND | grn::dat::EXCEPT_UPPER_BOUND);
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #11
0
  void test_null(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::KeyCursor cursor;
    cursor.open(trie, grn::dat::String(), grn::dat::String());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #12
0
  void test_descending_cursor(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::PrefixCursor cursor;

    cursor.open(trie, grn::dat::String("東京都庁"), 0,
                0, grn::dat::MAX_UINT32, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁"), std::strlen("東京都"),
                0, grn::dat::MAX_UINT32, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁"), std::strlen("東京都"),
                1, grn::dat::MAX_UINT32, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁"), std::strlen("東京都"),
                0, 1, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁"), 0,
                1, grn::dat::MAX_UINT32, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁"), 0,
                0, 2, grn::dat::DESCENDING_CURSOR);
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #13
0
  void test_max_by_str(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::KeyCursor cursor;

    cursor.open(trie, grn::dat::String(), grn::dat::String("Elf"));
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String(), grn::dat::String("F"));
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String(), grn::dat::String("A"));
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #14
0
파일: sbank.c 프로젝트: zetafish/code-kata
struct node* insert(struct node* node, int* s) {
  int ch = *s;

  if (node == NULL) {
    node = create_trie(s);
  }
  else if (ch < node->ch) {
    node->left = insert(node->left, s);
  }
  else if (ch > node->ch) {
    node->right = insert(node->right, s);
  }
  else if (*(s+1) >= 0 ) {
    node->mid = insert(node->mid, s+1);
  }
  else {
    // last character.
    ++node->last;
  }
  return node;
}
예제 #15
0
  void test_min_length(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::PrefixCursor cursor;

    cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen(""));
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen("東"));
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen("東京"));
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen("東京都"));
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"),
                std::strlen("東京都庁"));
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁ビル"),
                std::strlen("東京都庁ビル"));
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #16
0
  void test_str(void)
  {
    grn::dat::Trie trie;
    create_trie(&trie);

    grn::dat::PrefixCursor cursor;

    cursor.open(trie, grn::dat::String("京都"));
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("京都府"));
    cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京"));
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都"));
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都庁"));
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());

    cursor.open(trie, grn::dat::String("東京都議会"));
    cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
    cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
    cppcut_assert_equal(false, cursor.next().is_valid());
  }
예제 #17
0
파일: test_datrie.c 프로젝트: errord/fdict
void test_datrie_states()
{
  int states1[2] = {1, 1};
  int states2[3] = {1, 1, 2};
  int states3[3] = {1, 1, 4};
  int states4[2] = {2, 3};
  int states5[2] = {2, 5};
  int states6[3] = {2, 5, 4};
  int states7[2] = {3, 4};

  int fs1[2] = {1, 1};
  int fs2[3] = {1, 1, 2};
  int fs3[3] = {1, 1, 4};
  int fs4[2] = {2, 3};
  int fs5[2] = {2, 5};
  int fs6[3] = {2, 5, 4};
  int fs7[2] = {3, 4};

  int fs8[1] = {1}; 
  int fs9[3] = {1, 2, 3};
  int fs10[3] = {1, 1, 3};

  int r;
  struct tstate_s tstate;
  struct trie_s* trie;
  struct datrie_s* datrie;
  struct trie_state_s* state_list;
  struct stateslot_s stateslot;
  
  trie = create_trie(wordimage);
  /* add states */
  tstate.states = states1;
  tstate.statecount = 2;
  tstate.userdata.freq = 7;
  r = add_states(trie, &tstate);
  CHECK("check add states1", r > 0);
  tstate.states = states2;
  tstate.statecount = 3;
  tstate.userdata.freq = 6;
  r = add_states(trie, &tstate);
  CHECK("check add states2", r > 0);
  tstate.states = states3;
  tstate.statecount = 3;
  tstate.userdata.freq = 5;
  r = add_states(trie, &tstate);
  CHECK("check add states3", r > 0);
  tstate.states = states4;
  tstate.statecount = 2;
  tstate.userdata.freq = 4;
  r = add_states(trie, &tstate);
  CHECK("check add states4", r > 0);
  tstate.states = states5;
  tstate.statecount = 2;
  tstate.userdata.freq = 3;
  r = add_states(trie, &tstate);
  CHECK("check add states5", r > 0);
  tstate.states = states6;
  tstate.statecount = 3;
  tstate.userdata.freq = 2;
  r = add_states(trie, &tstate);
  CHECK("check add states6", r > 0);
  tstate.states = states7;
  tstate.statecount = 2;
  tstate.userdata.freq = 1;
  r = add_states(trie, &tstate);
  CHECK("check add states7", r > 0);

  trie_out_text(trie, NULL);
  datrie = create_datrie(wordimage, NULL, get_userdata_count(trie), 1, 0);
  state_list = get_sort_state_list(trie);
  build_state_list(datrie, state_list);
  
  /* find state */
  stateslot.s = 1;
  stateslot.userdata.freq = 0;
  r = dat_find_state(datrie, &stateslot, 1);
  CHECK("check find state=1", r == 1 && stateslot.userdata.freq == 0);
  r = dat_find_state(datrie, &stateslot, 1);
  CHECK("check find state=1", r == 2 && stateslot.userdata.freq == 7);
  r = dat_find_state(datrie, &stateslot, 4);
  CHECK("check find state=4", r == 2 && stateslot.userdata.freq == 5);

  /* find states */
  tstate.states = fs1;
  tstate.statecount = 2;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states1", r == 2 && tstate.userdata.freq == 7);
  tstate.states = fs2;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states2", r == 2 && tstate.userdata.freq == 6);
  tstate.states = fs3;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states3", r == 2 && tstate.userdata.freq == 5);
  tstate.states = fs4;
  tstate.statecount = 2;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states4", r == 2 && tstate.userdata.freq == 4);
  tstate.states = fs5;
  tstate.statecount = 2;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states5", r == 2 && tstate.userdata.freq == 3);
  tstate.states = fs6;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states6", r == 2 && tstate.userdata.freq == 2);
  tstate.states = fs7;
  tstate.statecount = 2;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states7", r == 2 && tstate.userdata.freq == 1);
  tstate.states = fs8;
  tstate.statecount = 1;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states8", r == 1 && tstate.userdata.freq == 0);
  tstate.states = fs9;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states9", r == 0 && tstate.userdata.freq == 0);
  tstate.states = fs10;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states10", r == 0 && tstate.userdata.freq == 0);
  

  clear_datrie(datrie);
  clear_trie(trie);
}
예제 #18
0
파일: test_datrie.c 프로젝트: errord/fdict
void test_trie_tree_states()
{
  int states1[5] = {1, 2, 3, 4, 5};
  int states2[4] = {3, 6, 8, 7};
  int states3[5] = {1, 2, 5, 8, 9};
  int states4[5] = {3, 7, 9, 2, 5};

  int fs1[5] = {1, 2, 3, 4, 5};
  int fs2[6] = {1, 2, 3, 4, 5, 7};
  int fs3[3] = {1, 2, 5};
  int fs4[4] = {1, 2, 3, 4};
  int fs5[5] = {1, 2, 5, 8, 7};
  int fs6[5] = {3, 7, 9, 2, 5};

  int r;
  struct tstate_s tstate;
  struct trie_s* trie;
  
  trie = create_trie(wordimage);
  
  /* add states */
  tstate.states = states1;
  tstate.statecount = 5;
  tstate.userdata.freq = 4;
  tstate.userdata.POS = 10;
  r = add_states(trie, &tstate);
  CHECK("check add states1", r > 0);
  tstate.states = states2;
  tstate.statecount = 4;
  tstate.userdata.freq = 3;
  r = add_states(trie, &tstate);
  CHECK("check add states2", r > 0);
  tstate.states = states3;
  tstate.statecount = 5;
  tstate.userdata.freq = 2;
  r = add_states(trie, &tstate);
  CHECK("check add states3", r > 0);
  tstate.states = states4;
  tstate.statecount = 5;
  tstate.userdata.freq = 1;
  r = add_states(trie, &tstate);
  CHECK("check add states4", r > 0);

  
  /* find states */
  tstate.states = fs1;
  tstate.statecount = 5;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs1", r == 1 && tstate.userdata.freq == 4 && tstate.userdata.POS == 10);
  tstate.states = fs2;
  tstate.statecount = 6;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs2", r == 0 && tstate.userdata.freq == 0);
  tstate.states = fs3;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs3", r == 1 && tstate.userdata.freq == 0);
  tstate.states = fs4;
  tstate.statecount = 4;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs4", r == 1 && tstate.userdata.freq == 0);
  tstate.states = fs5;
  tstate.statecount = 5;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs5", r == 0 && tstate.userdata.freq == 0);
  tstate.states = fs6;
  tstate.statecount = 5;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs5", r == 1 && tstate.userdata.freq == 1);

  /* trie tree sort */
  struct trie_state_s* sortlist = get_sort_state_list(trie);

  r = sortlist->nscount;
  CHECK("sort result 8", r == 16);
  sortlist = sortlist->sortnext;  
  r = sortlist->nscount;
  CHECK("sort result 7", r == 7);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 7", r == 7);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 6", r == 6);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 3", r == 3);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 2", r == 2);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 2", r == 2);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 2", r == 2);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 2", r == 2);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 1", r == 1);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 1", r == 1);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 1", r == 1);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 1", r == 1);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 0", r == 0);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 0", r == 0);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 0", r == 0);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 0", r == 0);

  clear_trie(trie);  
}
예제 #19
0
파일: main.c 프로젝트: NikolaYolov/Replacer
int main(int argc, char * argv[]) {
	struct a_table translator;
	FILE * dict = 0, * in = 0, * out = 0;

	LOG("This is a debug version!");

	if (argc == 1) {
		printf("Changes a text using a dictionary by replacing each occurrence of a word in the dictionary with the proper image word.\n"
			"Syntaxis: replacer dict input output\n"
			"dict is a text file with word pairs\n"
			"input is the file to be changed\n"
			"output is the result file.\n");
		return 0;
	}

	if (argc != 4) {
		printf("Invalid argumets! Extected 3, provided: %d.\n", argc - 1);
		return 1;
	}

	dict = fopen(argv[1], "r");
	if (dict == 0) {
		printf("Unable to open the dict file. Argument value is %s.\n", argv[1]);
		return 1;
	}

	/* initialize the allocator */
	mem_init();

	/* initialize the table */
	a_create_n(&translator, INIT_SIZE);

	/* step1: create a trie */
	create_trie(&translator, dict);

	fclose(dict);

	/* step2: create the full automaton */
	add_fail_links(&translator);

	in = fopen(argv[2], "rb");
	if (in == 0) {
		printf("Unable to open the input file. Argument value is %s.\n", argv[2]);
		fclose(dict);
		a_free(&translator);
		mem_fin();
		return 1;
	}

	out = fopen(argv[3], "wb");
	if (out == 0) {
		printf("Unable to open the output file. Argument value is %s.\n", argv[3]);
		fclose(in);
		fclose(dict);
		a_free(&translator);
		mem_fin();
		return 1;
	}

	/* finally we are going to use the automaton */
	travers(&translator, in, out);

	fclose(in);
	fclose(out);

	/* finalize the table */
	a_free(&translator);

	/* finalize the allocator */
	mem_fin();
}