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
26 CHNLIB_String *input, *temp;
\r
27 CHNLIB_UIPArray *separated;
\r
30 CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]);
\r
32 CHNLIB_Debug("Hello, World.", CHNLIB_DEBUG_ARGUMENTS);
\r
34 AI_System_InitializeSystemWorkingSet();
\r
36 AI_System_LoadMemory(AI_CONFIG_FILE_NAME);
\r
40 input = CHNLIB_ReadLine(stdin);
\r
42 if(CHNLIB_String_CompareStringWithCString(input, "::")){
\r
45 separated = CHNLIB_UIPArray_Initialize();
\r
46 CHNLIB_UIPArray_GetSeparatedStringByUIPArray(&separated, WorkingSet.SystemWordList0, input);
\r
48 temp = CHNLIB_UIPArray_GetPointerByIndex(separated, 2);
\r
50 if(CHNLIB_String_CompareStringWithCString(temp, "info")){
\r
51 printf("AI internal information:\n");
\r
52 } else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){
\r
54 } else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){
\r
55 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);
\r
56 for(i = 0; i < i_max; i++){
\r
57 printf("word%3d:%s\n", i, CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i)));
\r
64 CHNLIB_UIPArray_FreeSelectedAll(&separated);
\r
69 separated = CHNLIB_UIPArray_Initialize();
\r
70 separated = AI_Think_SlideLookUpWordByHistory(input);
\r
71 i_max = CHNLIB_UIPArray_GetNumberOfDatas(separated);
\r
72 printf("Index(Decimal),CountOfContain(Decimal), String\n");
\r
73 for(i = 0; i < i_max; i++){
\r
74 printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(separated, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, i)));
\r
76 CHNLIB_UIPArray_FreeAll(&separated);
\r
77 CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory), input);
\r
84 CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)
\r
87 //入力文字列と履歴文字列を照らし合わせ、単語の候補を抜き出す。
\r
88 //候補単語は、新たに確保されたUIPArrayに格納され、そのArrayへのポインタを返す。
\r
89 //data32=入力文字列中に含まれる候補単語の数。
\r
90 //pointer=候補単語を示すCHNLIB_String.
\r
91 CHNLIB_UIPArray *candidatewordlist;
\r
95 const char *cstr_input, *cstrp_input;
\r
96 const char *cstr_history, *cstrp_history;
\r
97 int candidatelength, templength;
\r
98 int cstrp_input_length;
\r
100 candidatewordlist = CHNLIB_UIPArray_Initialize();
\r
101 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory);
\r
103 cstr_input = CHNLIB_String_GetReferencePointerOfCString(input);
\r
104 k_max = CHNLIB_UTF8_GetStringLengthByCharacter(cstr_input);
\r
105 cstrp_input = cstr_input;
\r
107 for(k = 0; k < k_max; k++){
\r
108 //input character loop
\r
109 candidatelength = 0;
\r
110 cstrp_input_length = CHNLIB_UTF8_GetStringLengthByCharacter(cstrp_input);
\r
111 for(i = 0; i < i_max; i++){
\r
112 //history entry loop
\r
113 cstr_history = CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i));
\r
114 j_max = CHNLIB_UTF8_GetStringLengthByCharacter(cstr_history);
\r
115 cstrp_history = cstr_history;
\r
117 for(j = 0; j < j_max; j++){
\r
118 //history character loop
\r
119 templength = CHNLIB_UTF8_CompareString_LeftHand(cstrp_history, cstrp_input);
\r
120 if(templength > candidatelength && templength != cstrp_input_length){
\r
121 //前方一致の長さが、これまで見つかった単語よりも長く、かつ入力文字列の検索部分の全長ではない場合、
\r
123 candidatelength = templength;
\r
125 CHNLIB_UTF8_GetNextUnicodeOfCharacter(cstrp_history, &cstrp_history);
\r
128 if(candidatelength > 0){
\r
129 CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&candidatewordlist, 0, CHNLIB_String_ExtractByLength(input, CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(cstr_input, 0, k - 1), CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(cstrp_input, 0, candidatelength - 1)), &AI_Memory_AddRootWordData_IsDuplicated);
\r
131 CHNLIB_UTF8_GetNextUnicodeOfCharacter(cstrp_input, &cstrp_input);
\r
134 //各候補単語が履歴文字列にいくつ含まれているかをdata32に保存する。
\r
135 k_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);
\r
136 for(k = 0; k < k_max; k++){
\r
138 cstr_input = CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(candidatewordlist, k));
\r
139 for(i = 0; i < i_max; i++){
\r
140 cstr_history = CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i));
\r
141 j += CHNLIB_UTF8_GetCountOfContain(cstr_history, cstr_input);
\r
144 CHNLIB_UIPArray_SetData32ByIndex(candidatewordlist, k, j);
\r
147 return candidatewordlist;
\r
150 int AI_Think_CandidateWordList_Filter00(CHNLIB_UIPArray *candidatewordlist)
\r
152 //[Not implemented]
\r
154 //AI_Think_SlideLookUpWordByHistoryで返されたArray内の候補単語に対して、フィルターをかける。
\r
156 CHNLIB_String *nowstr, *basestr;
\r
157 int nowstrlen, basestrlen;
\r
159 i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);
\r
160 basestr = CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, 0);
\r
162 for(i = 1; i < i_max; i++){
\r
163 nowstr = CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i);
\r
169 void AI_Memory_AddRootWordData(CHNLIB_String *tag)
\r
171 //WorkingSet.RootWordListに文字列を追加する。
\r
172 //重複がある場合は警告を出し、追加しない。
\r
175 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);
\r
176 for(i = 0; i < i_max; i++){
\r
177 if(CHNLIB_String_CompareString_Strict(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i), tag)){
\r
178 CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(tag));
\r
183 CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i_max, tag);
\r
185 CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList), tag, &AI_Memory_AddRootWordData_IsDuplicated);
\r
190 int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)
\r
192 //CHNLIB_UIPArray_AppendLast_ProtectFromDuplicationに渡す関数ポインタ。
\r
193 if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){
\r
196 if(CHNLIB_String_CompareString_Strict(listtag, newtag)){
\r
197 CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(newtag));
\r
203 void AI_System_InitializeSystemWorkingSet(void)
\r
205 //WorkingSetを初期化する。
\r
206 WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize();
\r
207 CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(":"));
\r
208 CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(","));
\r
210 WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();
\r
215 void AI_System_LoadMemory(const char configfilename[])
\r
217 //指定されたファイル名のテキストファイルから設定を読み出す。
\r
219 CHNLIB_String *line, *currentfilename;
\r
222 fp = fopen(configfilename, "rb");
\r
223 currentfilename = CHNLIB_ReadLine(fp);
\r
226 fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");
\r
228 WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();
\r
230 line = CHNLIB_ReadLine(fp);
\r
234 CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);
\r
235 //CHNLIB_String_Free(line);リストに登録している実体なので解放の必要なし!
\r
238 CHNLIB_String_Free(currentfilename);
\r
240 //CHNLIB_Debug_PrintStructureData(WorkingSet.RootWordList, 0);
\r