| summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/knowledge/knowledge_learn_sequence.c')
| -rw-r--r-- | src/knowledge/knowledge_learn_sequence.c | 192 |
1 files changed, 174 insertions, 18 deletions
diff --git a/src/knowledge/knowledge_learn_sequence.c b/src/knowledge/knowledge_learn_sequence.c index 35b6d15..927b186 100644 --- a/src/knowledge/knowledge_learn_sequence.c +++ b/src/knowledge/knowledge_learn_sequence.c @@ -8,38 +8,180 @@ #include "knowledge.h" + + /******************************************************************************/ /** LEARN FOLLOWING SEQUENCE **************************************************/ /******************************************************************************/ -static int add_following_sequence +static void parse_swt_sequence +( + const ZoO_index sequence [const restrict static 1], + const size_t index, + ZoO_index buffer [const restrict static 1], + const ZoO_index buffer_length +) +{ + size_t j; + size_t index_offset; + + index_offset = buffer_length; + + for (j = 0; j < buffer_length; ++j) + { + index_offset = (buffer_length - j); + + if (index >= index_offset) + { + buffer[j] = sequence[index - index_offset]; + } + else + { + buffer[j] = ZoO_START_OF_SEQUENCE_ID; + } + } +} + +static int add_swt_sequence ( struct ZoO_knowledge k [const restrict static 1], const ZoO_index sequence [const restrict static 1], const size_t index, const size_t sequence_length, - const ZoO_index markov_order, + ZoO_index buffer [const restrict static 1], + const ZoO_index buffer_length, const struct ZoO_pipe io [const restrict static 1] ) { - /* TODO */ - return -1; + ZoO_index sequence_id; + + parse_swt_sequence(sequence, index, buffer, buffer_length); + + if + ( + ZoO_knowledge_learn_markov_sequence + ( + k, + buffer, + (buffer_length + 1), + &sequence_id, + io + ) + ) + { + return -1; + } + + if (index == (sequence_length - 1)) + { + return + ZoO_knowledge_strengthen_swt + ( + k, + sequence_id, + sequence[index], + ZoO_END_OF_SEQUENCE_ID, + io + ); + } + else + { + return + ZoO_knowledge_strengthen_swt + ( + k, + sequence_id, + sequence[index], + sequence[index + 1], + io + ); + } } /******************************************************************************/ /** LEARN PRECEDING SEQUENCE **************************************************/ /******************************************************************************/ -static int add_preceding_sequence +static void parse_tws_sequence +( + const ZoO_index sequence [const restrict static 1], + const size_t index, + const size_t sequence_length, + ZoO_index buffer [const restrict static 1], + const ZoO_index buffer_length +) +{ + size_t j; + size_t index_offset; + const size_t remaining_items = (sequence_length - index); + + for (j = 0; j < buffer_length; ++j) + { + index_offset = (j + 1); + + if (remaining_items > index_offset) + { + buffer[j] = sequence[index + index_offset]; + } + else + { + buffer[j] = ZoO_END_OF_SEQUENCE_ID; + } + } +} + +static int add_tws_sequence ( struct ZoO_knowledge k [const restrict static 1], const ZoO_index sequence [const restrict static 1], const size_t index, const size_t sequence_length, - const ZoO_index markov_order, + ZoO_index buffer [const restrict static 1], + const ZoO_index buffer_length, const struct ZoO_pipe io [const restrict static 1] ) { - /* TODO */ - return -1; + ZoO_index sequence_id; + + parse_tws_sequence(sequence, index, sequence_length, buffer, buffer_length); + + if + ( + ZoO_knowledge_learn_markov_sequence + ( + k, + buffer, + (buffer_length + 1), + &sequence_id, + io + ) + ) + { + return -1; + } + + if (index == 0) + { + return + ZoO_knowledge_strengthen_tws + ( + k, + ZoO_START_OF_SEQUENCE_ID, + sequence[index], + sequence_id, + io + ); + } + else + { + return + ZoO_knowledge_strengthen_tws + ( + k, + sequence[index - 1], + sequence[index], + sequence_id, + io + ); + } } /******************************************************************************/ @@ -58,35 +200,49 @@ int ZoO_knowledge_learn_sequence size_t i; const ZoO_index buffer_length = (markov_order - 1); - for (i = 0; i < sequence_length; ++i) + buffer = + (ZoO_index *) calloc + ( + (size_t) buffer_length, + sizeof(ZoO_index) + ); + + if (buffer == (ZoO_index *) NULL) { - k->words[sequence[i]].occurrences += 1; + ZoO_S_ERROR + ( + io, + "Unable to allocate memory required to create markov sequences." + ); + + return -1; + } - add_preceding_sequence + for (i = 0; i < sequence_length; ++i) + { + add_tws_sequence ( k, sequence, i, sequence_length, + buffer, buffer_length, io ); - add_following_sequence + add_swt_sequence ( k, sequence, i, sequence_length, - markov_order, + buffer, + buffer_length, io ); - /* - * TODO: in case of failure, undo part of the word done so far: instead - * of unlearning, just remove the occurrence count of sequences and - * words so that {k} remains coherent. - */ + k->words[sequence[i]].occurrences += 1; } return 0; |


