| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2016-07-24 22:42:09 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2016-07-24 22:42:09 +0200 | 
| commit | 8994c7b5cf56f540c71c763173a8927569ba94b3 (patch) | |
| tree | 5b7822bd827593f612c1e103df92001781ac72c6 /src/core/knowledge.c | |
| parent | f74d57fee040218af039f8157cf645d0902ad300 (diff) | |
Experimenting with K Order Markovian chains.
I do not recommend using this branch ATM, it has not been tested.
Diffstat (limited to 'src/core/knowledge.c')
| -rw-r--r-- | src/core/knowledge.c | 149 | 
1 files changed, 66 insertions, 83 deletions
| diff --git a/src/core/knowledge.c b/src/core/knowledge.c index 9b4e250..a2bf708 100644 --- a/src/core/knowledge.c +++ b/src/core/knowledge.c @@ -3,6 +3,7 @@  #include <stdint.h> /* defines SIZE_MAX */  #include "../io/error.h" +#include "../tool/sorted_list.h"  #include "knowledge.h" @@ -35,6 +36,28 @@ const ZoO_char const ZoO_knowledge_forbidden_chars[8]=        '>'     }; +static int cmp_word +( +   const void * const a, +   const void * const b, +   const void * const other +) +{ +   ZoO_char const * word; +   ZoO_index const * sorted_index; +   struct ZoO_knowledge const * k; + +   word = (ZoO_char const *) a; +   sorted_index = (ZoO_index const *) b; +   k = (struct ZoO_knowledge *) other; + +   return strcmp +   ( +      (const char *) word, +      (const char *) k->words[*sorted_index].word +   ); +} +  /* See "knowledge.h". */  int ZoO_knowledge_find  ( @@ -43,74 +66,31 @@ int ZoO_knowledge_find     ZoO_index result [const restrict static 1]  )  { -   int cmp; -   ZoO_index i, current_min, current_max; +   ZoO_index r; -   /* This is a binary search. */ - -   if (k->words_count < 1) +   if +   ( +      ZoO_sorted_list_index_of +      ( +         k->words_count, +         (void const *) k->sorted_indices, +         (void const *) word, +         sizeof(ZoO_index), +         cmp_word, +         (void const *) k, +         &r +      ) +      == 0 +   )     { -      *result = 0; +      *result = k->sorted_indices[r]; -      return -1; +      return 0;     } -   current_min = 0; - -   /* Safe: (>= k->words_count 1) */ -   current_max = (k->words_count - 1); - -   for (;;) -   { -      /* FIXME: overflow-safe? */ -      i = ((current_min + current_max) / 2); - -      if (i == k->words_count) -      { -         *result = k->words_count; - -         return -1; -      } - -      cmp = -         /* XXX: Assumed to be compatible with ZoO_char */ -         strcmp -         ( -            (char *) word, -            (const char *) k->words[k->sorted_indices[i]].word -         ); - -      if (cmp > 0) -      { -         if ((current_min > current_max)) -         { -            *result = (i + 1); - -            return -1; -         } +   *result = r; -         /* FIXME: overflow-safe? */ -         current_min = (i + 1); -      } -      else if (cmp < 0) -      { -         if ((current_min > current_max) || (i == 0)) -         { -            *result = i; - -            return -1; -         } - -         /* overflow-safe */ -         current_max = (i - 1); -      } -      else -      { -         *result = k->sorted_indices[i]; - -         return 0; -      } -   } +   return -1;  }  static void word_init (struct ZoO_knowledge_word w [const restrict static 1]) @@ -121,10 +101,8 @@ static void word_init (struct ZoO_knowledge_word w [const restrict static 1])     w->occurrences = 1;     w->forward_links_count  = 0;     w->backward_links_count = 0; -   w->forward_links_occurrences  = (ZoO_index *) NULL; -   w->backward_links_occurrences = (ZoO_index *) NULL; -   w->forward_links  = (ZoO_index *) NULL; -   w->backward_links = (ZoO_index *) NULL; +   w->forward_links  = (struct ZoO_knowledge_link *) NULL; +   w->backward_links = (struct ZoO_knowledge_link *) NULL;  }  /* @@ -209,6 +187,21 @@ int ZoO_knowledge_initialize (struct ZoO_knowledge k [const static 1])     return 0;  } +static void finalize_links +( +   ZoO_index const count, +   struct ZoO_knowledge_link links [const restrict static count] +) +{ +   ZoO_index i; + +   for (i = 0; i < count; ++i) +   { +      free((void *) links[i].targets_occurrences); +      free((void *) links[i].targets); +   } +} +  /*   * Frees all the memory used by {w}, but not {w} itself.   * The values of {w}'s members are set to reflect the changes. @@ -225,32 +218,22 @@ static void finalize_word        w->word = (ZoO_char *) NULL;     } -   if (w->forward_links_occurrences != (ZoO_index *) NULL) +   if (w->forward_links != (struct ZoO_knowledge_link *) NULL)     { -      free((void *) w->forward_links_occurrences); - -      w->forward_links_occurrences = (ZoO_index *) NULL; -   } +      finalize_links(w->forward_links_count, w->forward_links); -   if (w->backward_links_occurrences != (ZoO_index *) NULL) -   { -      free((void *) w->backward_links_occurrences); - -      w->backward_links_occurrences = (ZoO_index *) NULL; -   } - -   if (w->forward_links != (ZoO_index *) NULL) -   {        free((void *) w->forward_links); -      w->forward_links = (ZoO_index *) NULL; +      w->forward_links = (struct ZoO_knowledge_link *) NULL;     } -   if (w->backward_links != (ZoO_index *) NULL) +   if (w->backward_links != (struct ZoO_knowledge_link *) NULL)     { +      finalize_links(w->backward_links_count, w->backward_links); +        free((void *) w->backward_links); -      w->backward_links = (ZoO_index *) NULL; +      w->backward_links = (struct ZoO_knowledge_link *) NULL;     }     w->forward_links_count  = 0; | 


