\hypertarget{BTE_8c}{
\section{BTE.c File Reference}
\label{BTE_8c}\index{BTE.c@{BTE.c}}
}
Binary Tree Encoding routines. 

{\tt \#include $<$stdio.h$>$}\par
{\tt \#include \char`\"{}LDT/BTE.h\char`\"{}}\par


Include dependency graph for BTE.c:\begin{figure}[H]
\begin{center}
\leavevmode
\includegraphics[width=98pt]{BTE_8c__incl}
\end{center}
\end{figure}
\subsection*{Functions}
\begin{CompactItemize}
\item 
static \_\-\_\-inline unsigned int \hyperlink{BTE_8c_a0}{encode} (unsigned int e, unsigned int w, unsigned int p1, unsigned int p3)
\begin{CompactList}\small\item\em Encodes the input word {\em w\/} into the output word {\em e\/}. \item\end{CompactList}\item 
unsigned int \_\-\_\-inline \hyperlink{BTE_8c_a1}{BTE\_\-word\-Cnts} (unsigned int w, unsigned int pattern)
\begin{CompactList}\small\item\em Returns a packed 32-bit word, where each byte represents the count of the how times each of the 4 possible node values occurs. \item\end{CompactList}\item 
unsigned int \hyperlink{BTE_8c_a2}{BTE\_\-word\-Encode} (unsigned int w, unsigned int pattern, unsigned int scheme\_\-size)
\begin{CompactList}\small\item\em Encodes the original word and its higher level binary tree pattern returning a 32 bit output word. The algorithm is such that at most 32 bits are used, not counting the bits needed to encode the scheme. \item\end{CompactList}\item 
unsigned int \hyperlink{BTE_8c_a3}{BTE\_\-word\-Pattern} (unsigned int w)
\begin{CompactList}\small\item\em Prepares a pattern word which includes all but the lowest level of the binary tree. \item\end{CompactList}\item 
unsigned int \_\-\_\-inline \hyperlink{BTE_8c_a4}{BTE\_\-word\-Sizes} (unsigned int w, unsigned int pattern)
\begin{CompactList}\small\item\em Computes the bit size of the encoded word using each of the 4 possible encoding schemes. \item\end{CompactList}\item 
unsigned int \hyperlink{BTE_8c_a5}{BTE\_\-word\-Scheme\-Size} (unsigned int w, unsigned int pattern)
\begin{CompactList}\small\item\em Computes the optimal encoding scheme and size using of the 4 possible encoding schemes. \item\end{CompactList}\item 
unsigned int \hyperlink{BTE_8c_a6}{BTE\_\-word\-Size} (unsigned int w, unsigned int pattern, unsigned int scheme)
\begin{CompactList}\small\item\em Computes the size using of the specified encoding schemes. \item\end{CompactList}\item 
\hyperlink{struct__BTE__compressed}{BTE\_\-compressed} \hyperlink{BTE_8c_a7}{BTE\_\-word\-Compress} (unsigned int w)
\begin{CompactList}\small\item\em Computes and returns the compressed word plus its size, in bits, plus the encoding scheme used. \item\end{CompactList}\end{CompactItemize}


\subsection{Detailed Description}
Binary Tree Encoding routines. 

\begin{Desc}
\item[Author:]JJRussell - \href{mailto:russell@slac.stanford.edu}{\tt russell@slac.stanford.edu}\end{Desc}
Routines to encode bit strings using a binary tree



\footnotesize\begin{verbatim}    CVS $Id: BTE.c,v 1.2 2006/01/24 00:20:24 russell Exp $
\end{verbatim}
\normalsize


EXAMPLE The following shard of code shows how one ties these routines together to encode a 32 bit word, {\em word\/}.



\footnotesize\begin{verbatim}     unsigned int pattern     = BTE_wordPatten     (word);
     unsigned int scheme_size = BTE_wordSchemeSize (word, pattern);
     unsigned int encoded     = BTE_wordEncode     (word, pattern, scheme);
\end{verbatim}
\normalsize


\subsection{Function Documentation}
\hypertarget{BTE_8c_a1}{
\index{BTE.c@{BTE.c}!BTE_wordCnts@{BTE\_\-wordCnts}}
\index{BTE_wordCnts@{BTE\_\-wordCnts}!BTE.c@{BTE.c}}
\subsubsection[BTE\_\-wordCnts]{\setlength{\rightskip}{0pt plus 5cm}unsigned int BTE\_\-word\-Cnts (unsigned int {\em w}, unsigned int {\em pattern})}}
\label{BTE_8c_a1}


Returns a packed 32-bit word, where each byte represents the count of the how times each of the 4 possible node values occurs. 

\begin{Desc}
\item[Returns:]The packed 32-bit word\end{Desc}
\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em w}]The word being encoded \item[{\em pattern}]The precompiled pattern word\end{description}
\end{Desc}
\begin{Desc}
\item[]The bytes are (from least to most signficant\begin{itemize}
\item Count of Pattern 00, must be 0\item Count of Pattern 01\item Count of Pattern 10\item Count of Pattern 11\end{itemize}
\end{Desc}
\hypertarget{BTE_8c_a7}{
\index{BTE.c@{BTE.c}!BTE_wordCompress@{BTE\_\-wordCompress}}
\index{BTE_wordCompress@{BTE\_\-wordCompress}!BTE.c@{BTE.c}}
\subsubsection[BTE\_\-wordCompress]{\setlength{\rightskip}{0pt plus 5cm}\hyperlink{struct__BTE__compressed}{BTE\_\-compressed} BTE\_\-word\-Compress (unsigned int {\em w})}}
\label{BTE_8c_a7}


Computes and returns the compressed word plus its size, in bits, plus the encoding scheme used. 

\begin{Desc}
\item[Returns:]A BTE\_\-compressed structure containing the compressed word plus its size, in bits, plus the encoding scheme used\end{Desc}
\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em w}]The word to compress\end{description}
\end{Desc}
\begin{Desc}
\item[]This is a convenience routine combining the\begin{itemize}
\item BTE\_\-word\-Pattern\item BTE\_\-word\-Scheme\-Size\item BTE\_\-word\-Encode\end{itemize}
\end{Desc}
\begin{Desc}
\item[]While this routine is convenient, it does so at some cost. Each word is encoded according to the optimal scheme. This means the caller must make sure the encoding scheme is encoded along with each compressed word. The encoding of the encoding scheme itself costs some number of bits.\end{Desc}
\begin{Desc}
\item[]For a collection of words to encode, it may be more optimal to pick a fixed scheme. The fixed scheme may be based on some apriori knowledge (one just picks a scheme) or one computes the size of the collection for each of the 4 schemes, then uses the scheme giving the smallest total size of the whole collection, to encode the whole collection.\end{Desc}
\hypertarget{BTE_8c_a2}{
\index{BTE.c@{BTE.c}!BTE_wordEncode@{BTE\_\-wordEncode}}
\index{BTE_wordEncode@{BTE\_\-wordEncode}!BTE.c@{BTE.c}}
\subsubsection[BTE\_\-wordEncode]{\setlength{\rightskip}{0pt plus 5cm}unsigned int BTE\_\-word\-Encode (unsigned int {\em w}, unsigned int {\em pattern}, unsigned int {\em scheme\_\-size})}}
\label{BTE_8c_a2}


Encodes the original word and its higher level binary tree pattern returning a 32 bit output word. The algorithm is such that at most 32 bits are used, not counting the bits needed to encode the scheme. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em w}]The original 32-bit word that is to be encoded \item[{\em pattern}]The higher level binary tree pattern word. This is generally computed by calling BTE\_\-word\-Prepare(). \item[{\em scheme\_\-size}]The encoding scheme to be used. This is generally computed by BTE\_\-word\-Scheme\-Size (), but can be determined by other means. The scheme is one of\end{description}
\end{Desc}
\begin{itemize}
\item 0, no encoding, just return w,\item 1, encode using 01 = 0, 10 = 10, 11 = 11\item 2, encode using 01 = 10, 10 = 0, 11 = 11\item 3, encode using 01 = 10, 10 = 11, 11 = 0\end{itemize}


\begin{Desc}
\item[Why is there an encoding scheme]The node of the binary encoding is a 2 bit number, indicating whether the left/right neighors are non-mpty. However, to get to a node {\em on\/} of the left or right neighbors {\em must\/} be non-empty. Therefore there are really only 3 states, {\em i.e\/}. only the states 01, 10 and 11 must be represented, 00, being impossible. These three states can be represented by the following bit strings\end{Desc}
\begin{itemize}
\item 0\item 10\item 11\end{itemize}


Without resorting to statistical encoding methods one can pick the the state occuring most of the time to be represented by the symbol with only 1 bit, {\em i.e\/}. 0.

Of course, to properly decode the encoded word, one needs the symbol. The user is free to carry the which encoding is to be used by any means he wishes. An extreme example would be to use a fixed scheme for all the symbols. One might compute the size of a collection of symbols using all each scheme, then pick the one that gives the smallest size.\hypertarget{BTE_8c_a3}{
\index{BTE.c@{BTE.c}!BTE_wordPattern@{BTE\_\-wordPattern}}
\index{BTE_wordPattern@{BTE\_\-wordPattern}!BTE.c@{BTE.c}}
\subsubsection[BTE\_\-wordPattern]{\setlength{\rightskip}{0pt plus 5cm}unsigned int BTE\_\-word\-Pattern (unsigned int {\em w})}}
\label{BTE_8c_a3}


Prepares a pattern word which includes all but the lowest level of the binary tree. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em w}]The word to encode \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]The pattern word\end{Desc}
A 32 bit word express as a binary tree takes a maximum of 63 bits to encode. This tree looks like



\footnotesize\begin{verbatim}              +---------- x ----------+               word       =  1 bit
              |                       |
        +---- x ----+           +---- x ----+         half       =  2 bits
        |           |           |           |
     +- x -+     +- x -+     +- x -+     +- x -+      byte       =  4 bits
     |     |     |     |     |     |     |     |
     x     x     x     x     x     x     x     x      nibble     =  8 bits
    / \   / \   / \   / \   / \   / \   / \   / \
   x   x x   x x   x x   x x   x x   x x   x x   x    2 bit      = 16 bits
   ab cd ef gh ij kl mn op qr st uv wx yz AB CD EF    1 bit      = 32 bits
                                                                   --
                                                                   63 bits
  \end{verbatim}
\normalsize


This pattern word is arranged by levels from the highest levels in the most significant bits to the lowest levels. Note that the lowest level of the tree is original 32 bit word.

Here is an example of tree for w = 0x00011000



\footnotesize\begin{verbatim}                                1                                   L0
                                |
                 1--------------+----------------1                  L1
                 |                               |
         0-------+-------1               1-------+-------0          L2
         |               |               |               |
     0---+---0       0---+---1       1---+---0       0---+---0      L3
     |       |       |       |       |       |       |       |
   0-+-0   0-+-0   0-+-0   0-+-1   0-+-1   0-+-0   0-+-0   0-+-0    L4
   00 00   00 00   00 00   00 01   00 01   00 00   00 00   00 00    L5

  \end{verbatim}
\normalsize
 The levels are



\footnotesize\begin{verbatim}       l0                     1
       L1                    1 1
       L2                   01 10
       L3                0001   0100
       L4           00000001     01000000
       L5  0000000000000001       0001000000000000

  \end{verbatim}
\normalsize


Which, ignoring the lowest level, l5, is the pattern.



\footnotesize\begin{verbatim}         0 1 11 0110 00010100 0000000101000000
       = 0x76180140

  \end{verbatim}
\normalsize


Note, by convention, the highest level of the tree is ignored, so that only the upper 30 bits are used. This is beccause the upper bit only indicates whether the word is 0 or non-zero, something the user can easily determine.\hypertarget{BTE_8c_a5}{
\index{BTE.c@{BTE.c}!BTE_wordSchemeSize@{BTE\_\-wordSchemeSize}}
\index{BTE_wordSchemeSize@{BTE\_\-wordSchemeSize}!BTE.c@{BTE.c}}
\subsubsection[BTE\_\-wordSchemeSize]{\setlength{\rightskip}{0pt plus 5cm}unsigned int BTE\_\-word\-Scheme\-Size (unsigned int {\em w}, unsigned int {\em pattern})}}
\label{BTE_8c_a5}


Computes the optimal encoding scheme and size using of the 4 possible encoding schemes. 

\begin{Desc}
\item[Returns:]A packed word containing the optimal encoding scheme and its size in bits. The upper 16 bits are the scheme number and the lower 16 bits is the size in bits.\end{Desc}
\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em w}]The original word (the lowest level of the tree \item[{\em pattern}]The pattern word (the higher levels of the tree\end{description}
\end{Desc}
The encoding size of using each of the 4 possible encoding schemes is found. The smallest size and its corresponding scheme identifier are returned. The scheme identifiers are

0: Just use the original 32 bit number 1: Use the scheme that assignes the 01 pattern the value 0 2: Use the scheme that assignes the 10 pattern the value 0 3: Use the scheme that assignes the 11 pattern the value 0\hypertarget{BTE_8c_a6}{
\index{BTE.c@{BTE.c}!BTE_wordSize@{BTE\_\-wordSize}}
\index{BTE_wordSize@{BTE\_\-wordSize}!BTE.c@{BTE.c}}
\subsubsection[BTE\_\-wordSize]{\setlength{\rightskip}{0pt plus 5cm}unsigned int BTE\_\-word\-Size (unsigned int {\em w}, unsigned int {\em pattern}, unsigned int {\em scheme})}}
\label{BTE_8c_a6}


Computes the size using of the specified encoding schemes. 

\begin{Desc}
\item[Returns:]A packed word containing the encoding scheme and its size in bits. The upper 16 bits are the scheme number and the lower 16 bits is the size in bits.\end{Desc}
\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em w}]The original word (the lowest level of the tree \item[{\em pattern}]The pattern word (the higher levels of the tree \item[{\em scheme}]The encoding scheme to use\end{description}
\end{Desc}
The schems are 0: Just use the original 32 bit number 1: Use the scheme that assignes the 01 pattern the value 0 2: Use the scheme that assignes the 10 pattern the value 0 3: Use the scheme that assignes the 11 pattern the value 0\hypertarget{BTE_8c_a4}{
\index{BTE.c@{BTE.c}!BTE_wordSizes@{BTE\_\-wordSizes}}
\index{BTE_wordSizes@{BTE\_\-wordSizes}!BTE.c@{BTE.c}}
\subsubsection[BTE\_\-wordSizes]{\setlength{\rightskip}{0pt plus 5cm}unsigned int BTE\_\-word\-Sizes (unsigned int {\em w}, unsigned int {\em pattern})}}
\label{BTE_8c_a4}


Computes the bit size of the encoded word using each of the 4 possible encoding schemes. 

\begin{Desc}
\item[Returns:]The 4 sizes packed a byte each into a 32-bit word with scheme 0 packed into the least signficant byte, scheme 1 into the next least signficant byte, etc.\end{Desc}
\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em w}]The original word (the lowest level of the tree \item[{\em pattern}]The pattern word (the higher levels of the tree\end{description}
\end{Desc}
The encoding size of using each of the 4 possible encoding schemes is found. The sizes are packed into the 32-bit return value, a byte/size with scheme 0 in the least significant byte. The scheme identifiers are

0: Use the original 32-bit number (implies low byte = 32) 1: Use the scheme that assigns the 01 pattern the value 0 2: Use the scheme that assigns the 10 pattern the value 0 3: Use the scheme that assigns the 11 pattern the value 0\hypertarget{BTE_8c_a0}{
\index{BTE.c@{BTE.c}!encode@{encode}}
\index{encode@{encode}!BTE.c@{BTE.c}}
\subsubsection[encode]{\setlength{\rightskip}{0pt plus 5cm}static unsigned int encode (unsigned int {\em e}, unsigned int {\em w}, unsigned int {\em p1}, unsigned int {\em p3})\hspace{0.3cm}{\tt  \mbox{[}static\mbox{]}}}}
\label{BTE_8c_a0}


Encodes the input word {\em w\/} into the output word {\em e\/}. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em e}]The current encoded word \item[{\em w}]The new set of 32 bits to add \item[{\em p1}]The pattern to associate with the encoding pattern 0 \item[{\em p3}]The pattern to associate with the encoding pattern 3\end{description}
\end{Desc}
The routine encodes 2 bits at a time, extracting the 2 bits from the 2 most significant bits of the input word {\em w\/}. These 2 bits are compared to {\em p1\/}. If they are equal, a single bit, 0, is loaded into the LSB of the output word and the output word is shifted left 1 bit. If these 2 are equal to {\em p3\/}, an encoding pattern of 2 bits is shifted into the LSB of the output word. If the pattern is 0, no bits are inserted. Finally if the pattern is not 0, p1, or p3, the pattern 10 is inserted.