summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/lzp_buffer/lzp_buffer_kernel_1.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/lzp_buffer/lzp_buffer_kernel_1.h')
-rw-r--r--ml/dlib/dlib/lzp_buffer/lzp_buffer_kernel_1.h236
1 files changed, 236 insertions, 0 deletions
diff --git a/ml/dlib/dlib/lzp_buffer/lzp_buffer_kernel_1.h b/ml/dlib/dlib/lzp_buffer/lzp_buffer_kernel_1.h
new file mode 100644
index 000000000..f24d74eee
--- /dev/null
+++ b/ml/dlib/dlib/lzp_buffer/lzp_buffer_kernel_1.h
@@ -0,0 +1,236 @@
+// Copyright (C) 2005 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#ifndef DLIB_LZP_BUFFER_KERNEl_1_
+#define DLIB_LZP_BUFFER_KERNEl_1_
+
+#include "../algs.h"
+#include "lzp_buffer_kernel_abstract.h"
+
+namespace dlib
+{
+
+ template <
+ typename sbuf
+ >
+ class lzp_buffer_kernel_1
+ {
+ /*!
+ REQUIREMENTS ON sbuf
+ sbuf is an implementation of sliding_buffer/sliding_buffer_kernel_abstract.h
+ T == unsigned char
+
+ INITIAL VALUE
+ - buffer.size() == the size as defined by the constructor
+ - table_size == the number of elements in the table array
+ - for all i: buffer[i] == 0
+ - for all i: table[i] == buffer.size()
+
+ CONVENTION
+ - table_size == the number of elements in the table array
+ - size() == buffer.size()
+ - operator[](i) == buffer[i]
+
+ - if (table[hash()] != buffer.size()) then
+ - buffer.get_element_index(table[hash()]) == the index we will
+ predict for the current context
+ - else
+ - there is no prediction for the current context
+
+ - last_element == buffer.size()-1
+
+
+ This is LZP with just an order-3 model without context confirmation.
+
+ !*/
+
+ public:
+
+ explicit lzp_buffer_kernel_1 (
+ unsigned long buffer_size
+ );
+
+ virtual ~lzp_buffer_kernel_1 (
+ );
+
+ void clear(
+ );
+
+ inline void add (
+ unsigned char symbol
+ );
+
+ inline unsigned long predict_match (
+ unsigned long& index
+ );
+
+ inline size_t size (
+ ) const;
+
+ inline unsigned char operator[] (
+ unsigned long index
+ ) const;
+
+ private:
+
+ inline unsigned long hash (
+ ) const
+ /*!
+ ensures
+ - returns a hash computed from the current context. This hash
+ is always in the range for table.
+ !*/
+ {
+ unsigned long temp = buffer[0];
+ temp <<= 16;
+ unsigned long temp2 = buffer[1];
+ temp2 <<= 8;
+ unsigned long temp3 = buffer[2];
+ temp = temp|temp2|temp3;
+
+ temp = ((temp>>11)^temp)&0xFFFF;
+
+ return temp;
+ }
+
+ sbuf buffer;
+ const unsigned long table_size;
+ unsigned long* const table;
+ unsigned long last_element;
+
+ // restricted functions
+ lzp_buffer_kernel_1(const lzp_buffer_kernel_1<sbuf>&); // copy constructor
+ lzp_buffer_kernel_1<sbuf>& operator=(const lzp_buffer_kernel_1<sbuf>&); // assignment operator
+
+ };
+
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+ // member function definitions
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename sbuf
+ >
+ lzp_buffer_kernel_1<sbuf>::
+ lzp_buffer_kernel_1 (
+ unsigned long buffer_size
+ ) :
+ table_size(65536),
+ table(new unsigned long[table_size])
+ {
+ buffer.set_size(buffer_size);
+
+ for (unsigned long i = 0; i < buffer.size(); ++i)
+ buffer[i] = 0;
+
+ for (unsigned long i = 0; i < table_size; ++i)
+ table[i] = buffer.size();
+
+ last_element = buffer.size()-1;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename sbuf
+ >
+ lzp_buffer_kernel_1<sbuf>::
+ ~lzp_buffer_kernel_1 (
+ )
+ {
+ delete [] table;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename sbuf
+ >
+ void lzp_buffer_kernel_1<sbuf>::
+ clear(
+ )
+ {
+ for (unsigned long i = 0; i < buffer.size(); ++i)
+ buffer[i] = 0;
+
+ for (unsigned long i = 0; i < table_size; ++i)
+ table[i] = buffer.size();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename sbuf
+ >
+ void lzp_buffer_kernel_1<sbuf>::
+ add (
+ unsigned char symbol
+ )
+ {
+ buffer.rotate_left(1);
+ buffer[0] = symbol;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename sbuf
+ >
+ unsigned long lzp_buffer_kernel_1<sbuf>::
+ predict_match (
+ unsigned long& index
+ )
+ {
+ const unsigned long i = hash();
+
+ if (table[i] != buffer.size())
+ {
+ index = buffer.get_element_index(table[i]);
+
+ if (index > 20)
+ {
+ // update the prediction for this context
+ table[i] = buffer.get_element_id(last_element);
+ }
+ return 3;
+ }
+ else
+ {
+ // update the prediction for this context
+ table[i] = buffer.get_element_id(last_element);
+ return 0;
+ }
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename sbuf
+ >
+ size_t lzp_buffer_kernel_1<sbuf>::
+ size (
+ ) const
+ {
+ return buffer.size();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename sbuf
+ >
+ unsigned char lzp_buffer_kernel_1<sbuf>::
+ operator[] (
+ unsigned long index
+ ) const
+ {
+ return buffer[index];
+ }
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#endif // DLIB_LZP_BUFFER_KERNEl_1_
+