OSDN Git Service

データ保存関連を整備。
[chnosproject/CHNOSProject.git] / CHNOSProject / AI003 / AI003 / main.c
index 0110272..e49f4db 100755 (executable)
@@ -22,23 +22,22 @@ AI_WorkingSet WorkingSet;
 int main(int argc, const char * argv[])\r
 {\r
     //エントリポイント\r
-    int i, i_max;\r
+    int i, i_max, j, count;\r
     CHNLIB_String *input, *temp;\r
     CHNLIB_UIPArray *separated, *sorted;\r
     int passthink;\r
-    FILE *readfp;\r
+    FILE *readfp, *writefp;\r
     \r
     CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]);\r
     \r
-    CHNLIB_Debug("Hello, World.", CHNLIB_DEBUG_ARGUMENTS);\r
-    \r
     AI_System_InitializeSystemWorkingSet();\r
     \r
     AI_System_LoadMemory(AI_CONFIG_FILE_NAME);\r
     \r
     readfp = NULL;\r
+    writefp = NULL;\r
 \r
-    for(;;){\r
+    for(count = 0; ; count++){\r
         passthink = False;\r
         if(readfp == NULL){\r
             input = CHNLIB_ReadLine(stdin);\r
@@ -64,26 +63,53 @@ int main(int argc, const char * argv[])
                 } else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){\r
                     break;\r
                 } else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){\r
-                    sorted = CHNLIB_UIPArray_GetSortedInDescendingOrderByData32(WorkingSet.RootWordList);\r
+                    temp = CHNLIB_UIPArray_GetPointerByIndex(separated, 4);\r
+                    if(temp == NULL){\r
+                        //そのまま表示\r
+                        sorted = WorkingSet.RootWordList;\r
+                        retain(sorted);\r
+                    } else if(CHNLIB_String_CompareStringWithCString(temp, "count")){\r
+                        //回数カウント順\r
+                        sorted = CHNLIB_UIPArray_GetSortedInDescendingOrderByData32(WorkingSet.RootWordList);\r
+                    } else if(CHNLIB_String_CompareStringWithCString(temp, "length")){\r
+                        //文字列長順\r
+                        sorted = AI_Think_WordList_GetSortedByLength(WorkingSet.RootWordList);\r
+                    } else{\r
+                        sorted = NULL;\r
+                    }\r
+                    \r
                     i_max = CHNLIB_UIPArray_GetNumberOfDatas(sorted);\r
+                    j = 0;\r
                     for(i = 0; i < i_max; i++){\r
                         printf("word%3d:%3d:%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(sorted, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(sorted, i)));\r
+                        j += CHNLIB_UIPArray_GetData32ByIndex(sorted, i);\r
+                    }\r
+                    if(i > 0){\r
+                        printf("Average:%d\n", j / i);\r
                     }\r
                     //CHNLIB_UIPArray_FreeOnlyArray(&sorted);\r
                     release(sorted);\r
+                } else if(CHNLIB_String_CompareStringWithCString(temp, "memlist")){\r
+                    CHNLIB_Debug_PrintStructureData(WorkingSet.RootMemory, 0);\r
                 } else if(CHNLIB_String_CompareStringWithCString(temp, "readfile")){\r
                     //::readfile:filename\r
-                    readfp = fopen(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)), "rb");\r
                     if(readfp == NULL){\r
-                        puts("File open error.");\r
+                        readfp = fopen(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)), "rb");\r
+                        if(readfp == NULL){\r
+                            puts("File open error.");\r
+                        }\r
                     }\r
+                } else if(CHNLIB_String_CompareStringWithCString(temp, "savewordlist")){\r
+                    AI_System_SaveMemory_RootWordList(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)));\r
+               } else if(CHNLIB_String_CompareStringWithCString(temp, "savememlist")){\r
+                   AI_System_SaveMemory_RootMemory(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)));\r
+                } else if(CHNLIB_String_CompareStringWithCString(temp, "addmemtag")){\r
+                    //[not implemented]\r
                 } else{\r
                     passthink = False;\r
                 }\r
             }\r
             \r
-            ////WorkingSet.SystemWordList0を使っているので、解放しないように注意\r
-            //CHNLIB_UIPArray_FreeSelectedAll(&separated);\r
             release(separated);\r
         }\r
         \r
@@ -113,13 +139,12 @@ void AI_Think_LearnWordFromInputString(CHNLIB_String *input)
     //入力文字列から単語を抽出して記憶する。\r
     CHNLIB_UIPArray *candidateWordList;\r
     int i, i_max;\r
-    int tagIndex, maxExistingWordIndex;\r
+    int tagIndex;\r
     \r
     candidateWordList = CHNLIB_UIPArray_Initialize();\r
     candidateWordList = AI_Think_SlideLookUpWordByHistory(input);\r
     i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidateWordList);\r
-    maxExistingWordIndex = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList) - 1;\r
-    \r
+\r
     printf("Index(Decimal),CountOfContain(Decimal), String\n");\r
     for(i = 0; i < i_max; i++){\r
         printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(candidateWordList, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(candidateWordList, i)));\r
@@ -201,134 +226,82 @@ CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)
     }\r
     \r
     //重複抽出フィルタリング\r
+    AI_Think_CandidateWordList_Filter02(&candidatewordlist, 1);\r
     AI_Think_CandidateWordList_Filter01(&candidatewordlist, 1);\r
     AI_Think_CandidateWordList_Filter00(&candidatewordlist);\r
     \r
     return candidatewordlist;\r
 }\r
 \r
-int AI_Think_CandidateWordList_Filter00(CHNLIB_UIPArray **candidatewordlist)\r
+CHNLIB_UIPArray *AI_Think_WordList_GetSortedByLength(const CHNLIB_UIPArray *wordlist)\r
 {\r
-    //[Not implemented]\r
-    //[UTF-8]\r
-    //AI_Think_SlideLookUpWordByHistoryで返されたArray内の候補単語に対して、フィルターをかける。\r
-    //00:長い単語に含まれており、かつ出現頻度が長い単語と等しい単語を削除\r
-    int i, i_max;\r
-    CHNLIB_String *nowstr, *basestr;\r
-    int basestrCoC;     //CountOfContainInHistoryStrings\r
+    CHNLIB_UIPArray *temp, *sorted;\r
     \r
-    i_max = CHNLIB_UIPArray_GetNumberOfDatas(*candidatewordlist);\r
-    basestr = CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, 0);\r
-    basestrCoC = CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, 0);\r
-    for(i = 1; i < i_max; i++){\r
-        nowstr = CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, i);\r
-        if(CHNLIB_UTF8_GetCountOfContain(CHNLIB_String_GetReferencePointerOfCString(basestr), CHNLIB_String_GetReferencePointerOfCString(nowstr)) > 0){\r
-            //nowstrはbasestrに含まれている\r
-            if(basestrCoC == CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i)){\r
-                //かつ出現頻度が等しいので不要な単語\r
-                //出現頻度を0にして、後で削除する。\r
-                CHNLIB_UIPArray_SetData32ByIndex(*candidatewordlist, i, 0);\r
-            }\r
-        }\r
-        \r
-        if(CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i) != 0){\r
-            //単語は削除されなかった、つまり異なる単語なので、basestrを更新\r
-            basestr = nowstr;\r
-            basestrCoC = CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i);\r
-        }\r
-    }\r
+    temp = CHNLIB_UIPArray_CopyArray(wordlist);\r
     \r
-    for(i = 1; i < i_max; i++){\r
-        if(CHNLIB_UIPArray_GetData32ByIndex(*candidatewordlist, i) == 0){\r
-            //削除対象\r
-            CHNLIB_UIPArray_RemoveByIndex(candidatewordlist, i);\r
-            i--;\r
-            i_max--;\r
-        }\r
-    }\r
+    AI_Think_WordList_SetLengthToData32(&temp);\r
+    sorted = CHNLIB_UIPArray_GetSortedInDescendingOrderByData32(temp);\r
     \r
-    return 0;\r
+    release(temp);\r
+    \r
+    return sorted;\r
 }\r
 \r
-int AI_Think_CandidateWordList_Filter01(CHNLIB_UIPArray **candidatewordlist, int length)\r
+void AI_Think_WordList_SetLengthToData32(CHNLIB_UIPArray **wordlist)\r
 {\r
-    //[Not implemented]\r
-    //[UTF-8]\r
-    //AI_Think_SlideLookUpWordByHistoryで返されたArray内の候補単語に対して、フィルターをかける。\r
-    //01:length以下の文字数の単語を削除\r
-    \r
     int i, i_max;\r
     \r
-    i_max = CHNLIB_UIPArray_GetNumberOfDatas(*candidatewordlist);\r
+    i_max = CHNLIB_UIPArray_GetNumberOfDatas(*wordlist);\r
+    \r
     for(i = 0; i < i_max; i++){\r
-        if(CHNLIB_UTF8_GetStringLengthByCharacter(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(*candidatewordlist, i))) <= length){\r
-            CHNLIB_UIPArray_RemoveByIndex(candidatewordlist, i);\r
-            i--;\r
-            i_max--;\r
-        }\r
+        CHNLIB_UIPArray_SetData32ByIndex(*wordlist, i, CHNLIB_UTF8_GetStringLengthByCharacter(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(*wordlist, i))));\r
     }\r
     \r
-    return 0;\r
-}\r
-\r
-int AI_Memory_AddRootWordData(CHNLIB_String *tag)\r
-{\r
-    //WorkingSet.RootWordListに文字列を追加する。\r
-    //重複がある場合は警告を出し、追加しない。\r
-    //戻り値は追加されたまたは重複したタグのIndex.\r
-    \r
-    return CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, 0, tag, &AI_Memory_AddRootWordData_IsDuplicated);\r
-}\r
-\r
-int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)\r
-{\r
-    //CHNLIB_UIPArray_AppendLast_ProtectFromDuplicationに渡す関数ポインタ。\r
-    if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){\r
-        return False;\r
-    }\r
-    if(CHNLIB_String_CompareString_Strict(listtag, newtag)){\r
-        CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(newtag));\r
-        return True;\r
-    }\r
-    return False;\r
+    return;\r
 }\r
 \r
 void AI_System_InitializeSystemWorkingSet(void)\r
 {\r
     //WorkingSetを初期化する。\r
+    int i, i_max;\r
+    \r
     WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize();\r
-    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, autorelease(CHNLIB_String_Initialize(":")));\r
-    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, autorelease(CHNLIB_String_Initialize(",")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Delimiter_Colon, autorelease(CHNLIB_String_Initialize(":")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Delimiter_Comma, autorelease(CHNLIB_String_Initialize(",")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Delimiter_Plus, autorelease(CHNLIB_String_Initialize("+")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Bracket_Start, autorelease(CHNLIB_String_Initialize("[")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, AI_SW_Bracket_End, autorelease(CHNLIB_String_Initialize("]")));\r
     \r
-    WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();\r
+    WorkingSet.SystemWordList1 = CHNLIB_UIPArray_Initialize();\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList1, True, autorelease(CHNLIB_String_Initialize("未定義")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList1, True, autorelease(CHNLIB_String_Initialize("真")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList1, True, autorelease(CHNLIB_String_Initialize("偽")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList1, True, autorelease(CHNLIB_String_Initialize("あいさつ")));\r
     \r
-    return;\r
-}\r
-\r
-void AI_System_LoadMemory(const char configfilename[])\r
-{\r
-    //指定されたファイル名のテキストファイルから設定を読み出す。\r
-    FILE *fp;\r
-    CHNLIB_String *line, *currentfilename;\r
-    int i;\r
+    WorkingSet.SystemWordList2 = CHNLIB_UIPArray_Initialize();\r
+    for(i = 0; i < 10; i++){\r
+        CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList2, True, autorelease(CHNLIB_String_InitializeWithFormat("%d", i)));\r
+    }\r
+    \r
+    WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();\r
+    WorkingSet.RootMemory = CHNLIB_UIPArray_Initialize();\r
+    WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();\r
     \r
-    fp = fopen(configfilename, "rb");\r
-    currentfilename = CHNLIB_ReadLine(fp);\r
-    fclose(fp);\r
+    //WordListへシステム文字列を追加\r
+    i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.SystemWordList0);\r
+    for(i = 0; i < i_max; i++){\r
+        CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, 0, CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.SystemWordList0, i));\r
+    }\r
     \r
-    fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");\r
-    release(currentfilename);\r
+    i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.SystemWordList1);\r
+    for(i = 0; i < i_max; i++){\r
+        CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, 0, CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.SystemWordList1, i));\r
+    }\r
     \r
-    WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();\r
-    for(i = 1; ;i++){\r
-        line = CHNLIB_ReadLine(fp);\r
-        if(line == NULL){\r
-            break;\r
-        }\r
-        CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);\r
-        release(line);\r
+    i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.SystemWordList2);\r
+    for(i = 0; i < i_max; i++){\r
+        CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, 0, CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.SystemWordList2, i));\r
     }\r
-    fclose(fp);\r
     \r
     return;\r
 }\r