OSDN Git Service

1f3f6b411086809b32353523ab2e0d4138944d17
[chnosproject/CHNOSProject.git] / CHNOSProject / AI003 / AI003 / main.c
1 //\r
2 //  main.c\r
3 //  AI003\r
4 //\r
5 //  Created by 西田 耀 on 13/01/28.\r
6 //  Copyright (c) 2013年 Hikaru Nishida. All rights reserved.\r
7 //\r
8 \r
9 //\r
10 //Include headers\r
11 //\r
12 \r
13 #include <stdio.h>\r
14 #include "core.h"\r
15 \r
16 //\r
17 //Define static values\r
18 //\r
19 \r
20 AI_WorkingSet WorkingSet;\r
21 \r
22 int main(int argc, const char * argv[])\r
23 {\r
24     //エントリポイント\r
25     int i, i_max;\r
26     CHNLIB_String *input, *temp;\r
27     CHNLIB_UIPArray *separated;\r
28     int passthink;\r
29     \r
30     CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]);\r
31     \r
32     CHNLIB_Debug("Hello, World.", CHNLIB_DEBUG_ARGUMENTS);\r
33     \r
34     AI_System_InitializeSystemWorkingSet();\r
35     \r
36     AI_System_LoadMemory(AI_CONFIG_FILE_NAME);\r
37 \r
38     for(;;){\r
39         passthink = False;\r
40         input = CHNLIB_ReadLine(stdin);\r
41 \r
42         if(CHNLIB_String_CompareStringWithCString(input, "::")){\r
43             //システムコマンド解釈\r
44             passthink = True;\r
45             separated = CHNLIB_UIPArray_Initialize();\r
46             CHNLIB_UIPArray_GetSeparatedStringByUIPArray(&separated, WorkingSet.SystemWordList0, input);\r
47             \r
48             temp = CHNLIB_UIPArray_GetPointerByIndex(separated, 2);\r
49             if(temp != NULL){\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
53                     break;\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
58                     }\r
59                 } else{\r
60                     passthink = False;\r
61                 }\r
62             }\r
63             \r
64             CHNLIB_UIPArray_FreeSelectedAll(&separated);\r
65         }\r
66         \r
67         if(!passthink){\r
68             //AIへの入力\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
75             }\r
76             CHNLIB_UIPArray_FreeAll(&separated);\r
77             CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory), input);\r
78         }\r
79     }\r
80     \r
81     return 0;\r
82 }\r
83 \r
84 CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)\r
85 {\r
86     //[UTF-8]\r
87     //入力文字列と履歴文字列を照らし合わせ、単語の候補を抜き出す。\r
88     //候補単語は、新たに確保されたUIPArrayに格納され、そのArrayへのポインタを返す。\r
89     //data32=入力文字列中に含まれる候補単語の数。\r
90     //pointer=候補単語を示すCHNLIB_String.\r
91     CHNLIB_UIPArray *candidatewordlist;\r
92     int i, i_max;\r
93     int j, j_max;\r
94     int k, k_max;\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
99     \r
100     candidatewordlist = CHNLIB_UIPArray_Initialize();\r
101     i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory);\r
102     \r
103     cstr_input = CHNLIB_String_GetReferencePointerOfCString(input);\r
104     k_max = CHNLIB_UTF8_GetStringLengthByCharacter(cstr_input);\r
105     cstrp_input = cstr_input;\r
106     \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
116             \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
122                     //単語の候補とする。\r
123                     candidatelength = templength;\r
124                 }\r
125                 CHNLIB_UTF8_GetNextUnicodeOfCharacter(cstrp_history, &cstrp_history);\r
126             }\r
127         }\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
130         }\r
131         CHNLIB_UTF8_GetNextUnicodeOfCharacter(cstrp_input, &cstrp_input);\r
132     }\r
133     \r
134     //各候補単語が履歴文字列にいくつ含まれているかをdata32に保存する。\r
135     k_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);\r
136     for(k = 0; k < k_max; k++){\r
137         j = 0;\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
142             \r
143         }\r
144         CHNLIB_UIPArray_SetData32ByIndex(candidatewordlist, k, j);\r
145     }\r
146     \r
147     return candidatewordlist;\r
148 }\r
149 \r
150 int AI_Think_CandidateWordList_Filter00(CHNLIB_UIPArray *candidatewordlist)\r
151 {\r
152     //[Not implemented]\r
153     //[UTF-8]\r
154     //AI_Think_SlideLookUpWordByHistoryで返されたArray内の候補単語に対して、フィルターをかける。\r
155     int i, i_max;\r
156     CHNLIB_String *nowstr, *basestr;\r
157     int nowstrlen, basestrlen;\r
158     \r
159     i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);\r
160     basestr = CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, 0);\r
161     //basestrlen =\r
162     for(i = 1; i < i_max; i++){\r
163         nowstr = CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i);\r
164         \r
165     }\r
166     return 0;\r
167 }\r
168 \r
169 void AI_Memory_AddRootWordData(CHNLIB_String *tag)\r
170 {\r
171     //WorkingSet.RootWordListに文字列を追加する。\r
172     //重複がある場合は警告を出し、追加しない。\r
173     int i, i_max;\r
174     \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
179             return;\r
180         }\r
181     }\r
182     \r
183     CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i_max, tag);\r
184     \r
185     CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList), tag, &AI_Memory_AddRootWordData_IsDuplicated);\r
186     \r
187     return;\r
188 }\r
189 \r
190 int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)\r
191 {\r
192     //CHNLIB_UIPArray_AppendLast_ProtectFromDuplicationに渡す関数ポインタ。\r
193     if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){\r
194         return False;\r
195     }\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
198         return True;\r
199     }\r
200     return False;\r
201 }\r
202 \r
203 void AI_System_InitializeSystemWorkingSet(void)\r
204 {\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
209     \r
210     WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();\r
211     \r
212     return;\r
213 }\r
214 \r
215 void AI_System_LoadMemory(const char configfilename[])\r
216 {\r
217     //指定されたファイル名のテキストファイルから設定を読み出す。\r
218     FILE *fp;\r
219     CHNLIB_String *line, *currentfilename;\r
220     int i;\r
221     \r
222     fp = fopen(configfilename, "rb");\r
223     currentfilename = CHNLIB_ReadLine(fp);\r
224     fclose(fp);\r
225     \r
226     fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");\r
227     \r
228     WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();\r
229     for(i = 1; ;i++){\r
230         line = CHNLIB_ReadLine(fp);\r
231         if(line == NULL){\r
232             break;\r
233         }\r
234         CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);\r
235         //CHNLIB_String_Free(line);リストに登録している実体なので解放の必要なし!\r
236     }\r
237     fclose(fp);\r
238     CHNLIB_String_Free(currentfilename);\r
239     \r
240     //CHNLIB_Debug_PrintStructureData(WorkingSet.RootWordList, 0);\r
241     \r
242     return;\r
243 }\r