5 // Created by 西田 耀 on 13/01/28.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
17 //Define static values
\r
20 AI_WorkingSet WorkingSet;
\r
22 int main(int argc, const char * argv[])
\r
25 CHNLIB_String *input, *temp;
\r
26 CHNLIB_UIPArray *separated;
\r
29 CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]);
\r
31 CHNLIB_Debug("Hello, World.", __FILE__, __LINE__, __FUNCTION__);
\r
33 AI_System_InitializeSystemWorkingSet();
\r
35 AI_System_LoadMemory(AI_CONFIG_FILE_NAME);
\r
39 input = CHNLIB_ReadLine(stdin);
\r
41 if(CHNLIB_String_CompareStringWithCString(input, "::")){
\r
44 separated = CHNLIB_UIPArray_Initialize();
\r
45 CHNLIB_UIPArray_GetSeparatedStringByUIPArray(&separated, WorkingSet.SystemWordList0, input);
\r
47 temp = CHNLIB_UIPArray_GetPointerByIndex(separated, 2);
\r
49 if(CHNLIB_String_CompareStringWithCString(temp, "info")){
\r
50 printf("AI internal information:\n");
\r
51 } else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){
\r
53 } else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){
\r
54 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);
\r
55 for(i = 0; i < i_max; i++){
\r
56 printf("word%3d:%s\n", i, CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i)));
\r
63 CHNLIB_UIPArray_FreeSelectedAll(&separated);
\r
68 separated = CHNLIB_UIPArray_Initialize();
\r
69 separated = AI_Think_SlideLookUpWordByHistory(input);
\r
70 i_max = CHNLIB_UIPArray_GetNumberOfDatas(separated);
\r
71 printf("Index(Decimal),CountOfContain(Decimal), String\n");
\r
72 for(i = 0; i < i_max; i++){
\r
73 printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(separated, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, i)));
\r
75 CHNLIB_UIPArray_FreeAll(&separated);
\r
76 CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory), input);
\r
83 CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)
\r
85 CHNLIB_UIPArray *candidatewordlist;
\r
89 int candidatelength, templength;
\r
90 const char *cstr_input, *cstr_history;
\r
92 candidatewordlist = CHNLIB_UIPArray_Initialize();
\r
94 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory);
\r
96 cstr_input = CHNLIB_String_GetReferencePointerOfCString(input);
\r
97 k_max = CHNLIB_CString_GetLength(cstr_input);
\r
99 for(k = 0; k < k_max; k++){
\r
101 //UTF-8のマルチバイト部分でないことを確認
\r
102 if(CHNLIB_UTF8_GetCharacterType(cstr_input[k]) != 0){
\r
104 candidatelength = 0;
\r
105 for(i = 0; i < i_max; i++){
\r
106 cstr_history = CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i));
\r
107 j_max = CHNLIB_CString_GetLength(cstr_history);
\r
108 for(j = 0; j < j_max; j++){
\r
109 templength = CHNLIB_CString_CompareString_LeftHand(&cstr_history[j], &cstr_input[k]);
\r
110 if(templength > candidatelength && templength != (k_max - k)){
\r
112 //これまで見つかった単語よりも長く、かつ
\r
113 //入力文字列の検索部分の全長ではない場合、
\r
115 candidatelength = templength;
\r
119 if(candidatelength > 0){
\r
120 //AI_Memory_AddRootWordData(CHNLIB_String_ExtractByLength(input, k, candidatelength));
\r
121 CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&candidatewordlist, 0, CHNLIB_String_ExtractByLength(input, k, candidatelength), &AI_Memory_AddRootWordData_IsDuplicated);
\r
126 //各候補単語が入力文字列にいくつ含まれているかをdata32に保存する。
\r
127 i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);
\r
128 for(i = 0; i < i_max; i++){
\r
129 CHNLIB_UIPArray_SetData32ByIndex(candidatewordlist, i, CHNLIB_String_GetCountOfContain(input, CHNLIB_UIPArray_GetPointerByIndex(candidatewordlist, i)));
\r
132 return candidatewordlist;
\r
135 void AI_Memory_AddRootWordData(CHNLIB_String *tag)
\r
139 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);
\r
140 for(i = 0; i < i_max; i++){
\r
141 if(CHNLIB_String_CompareString_Strict(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i), tag)){
\r
142 CHNLIB_ReportError("Word[%s] has already existed.", __FILE__, __LINE__, __FUNCTION__, CHNLIB_String_GetReferencePointerOfCString(tag));
\r
147 CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i_max, tag);
\r
149 CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList), tag, &AI_Memory_AddRootWordData_IsDuplicated);
\r
154 int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)
\r
156 if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){
\r
159 if(CHNLIB_String_CompareString_Strict(listtag, newtag)){
\r
160 CHNLIB_ReportError("Word[%s] has already existed.", __FILE__, __LINE__, __FUNCTION__, CHNLIB_String_GetReferencePointerOfCString(newtag));
\r
166 void AI_System_InitializeSystemWorkingSet(void)
\r
168 WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize();
\r
169 CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, 0, CHNLIB_String_Initialize(":"));
\r
170 CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, 0, CHNLIB_String_Initialize(","));
\r
172 WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();
\r
177 void AI_System_LoadMemory(const char configfilename[])
\r
180 CHNLIB_String *line, *currentfilename;
\r
183 fp = fopen(configfilename, "rb");
\r
184 currentfilename = CHNLIB_ReadLine(fp);
\r
187 fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");
\r
189 WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();
\r
191 line = CHNLIB_ReadLine(fp);
\r
195 CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);
\r
196 //CHNLIB_String_Free(line);リストに登録している実体なので解放の必要なし!
\r
199 CHNLIB_String_Free(currentfilename);
\r
201 //CHNLIB_Debug_PrintStructureData(WorkingSet.RootWordList, 0);
\r