Home | History | Annotate | Download | only in b_TensorEm
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef bts_COMPACT_MAT_EM_H
     18 #define bts_COMPACT_MAT_EM_H
     19 
     20 /* ---- includes ----------------------------------------------------------- */
     21 
     22 #include "b_BasicEm/Int16Arr.h"
     23 
     24 /* ---- related objects  --------------------------------------------------- */
     25 
     26 /* ---- typedefs ----------------------------------------------------------- */
     27 
     28 /* ---- constants ---------------------------------------------------------- */
     29 
     30 /* data format version number */
     31 #define bts_COMPACT_MAT_VERSION 100
     32 
     33 /* ---- object definition -------------------------------------------------- */
     34 
     35 /** Compact Matrix
     36  *  This object represents a general nxm Matrix that stores its values in
     37  *  bit-packs of fixed size. Rows are encoded individually to yield
     38  *  maximum accuracy for the given number of bits. The matrix takes sparseness
     39  *  into account.
     40  *
     41  *  Use this object for memory efficient storage of large matrices.
     42  */
     43 struct bts_CompactMat
     44 {
     45 
     46 	/* ---- private data --------------------------------------------------- */
     47 
     48 	/* ---- public data ---------------------------------------------------- */
     49 
     50 	/* width (columns) of matrix */
     51 	uint32 widthE;
     52 
     53 	/* height (rows) of matrix */
     54 	uint32 heightE;
     55 
     56 	/* bits per value */
     57 	uint32 bitsPerValueE;
     58 
     59 	/* 16 bit words per row including row-header (always even) */
     60 	uint32 wordsPerRowE;
     61 
     62 	/* maximum of ( 16 + factorExp + normBits ) for all rows (this value can be negative!) */
     63 	int32 maxRowBitsE;
     64 
     65 	/** Composite data array
     66 	 *  Encoding per row:
     67 	 *  (int16) 'offs' offset of row-vector (0 when row is not sparse)
     68 	 *  (int16) 'size' effective size of row vector (= widthE when row is not sparse)
     69 	 *  (int16) 'factorMan' mantisse of factor
     70 	 *  (int16) 'factorExp' exponent of factor
     71 	 *  (int16) 'normBits' norm bits of row vector
     72 	 *  (int16), (int16), ... packed data
     73 	 *  Each row has the effective length of 'wordsPerRowE'
     74 	 *  wordsPerRowE is always even -> rows are 32bit-aligned
     75 	 */
     76 	struct bbs_Int16Arr cpsArrE;
     77 
     78 	/** temorary array used for exponents */
     79 	struct bbs_Int16Arr expArrE;
     80 
     81 };
     82 
     83 /* ---- associated objects ------------------------------------------------- */
     84 
     85 /* ---- external functions ------------------------------------------------- */
     86 
     87 /* ---- \ghd{ constructor/destructor } ------------------------------------- */
     88 
     89 /** initializes object */
     90 void bts_CompactMat_init( struct bbs_Context* cpA,
     91 					      struct bts_CompactMat* ptrA );
     92 
     93 /** destroys object */
     94 void bts_CompactMat_exit( struct bbs_Context* cpA,
     95 					      struct bts_CompactMat* ptrA );
     96 
     97 /* ---- \ghd{ operators } -------------------------------------------------- */
     98 
     99 /* copies matrix */
    100 void bts_CompactMat_copy( struct bbs_Context* cpA,
    101 					      struct bts_CompactMat* ptrA,
    102 						  const struct bts_CompactMat* srcPtrA );
    103 
    104 /* ---- \ghd{ query functions } -------------------------------------------- */
    105 
    106 /* ---- \ghd{ modify functions } ------------------------------------------- */
    107 
    108 /** allocates matrix */
    109 void bts_CompactMat_create( struct bbs_Context* cpA,
    110 						    struct bts_CompactMat* ptrA,
    111 						    uint32 widthA,
    112 						    uint32 heightA,
    113 						    uint32 bitsA,
    114 							uint32 maxRowSizeA,
    115 				            struct bbs_MemSeg* mspA );
    116 
    117 /* ---- \ghd{ memory I/O } ------------------------------------------------- */
    118 
    119 /** size object needs when written to memory */
    120 uint32 bts_CompactMat_memSize( struct bbs_Context* cpA,
    121 							   const struct bts_CompactMat* ptrA );
    122 
    123 /** writes object to memory; returns number of bytes written */
    124 uint32 bts_CompactMat_memWrite( struct bbs_Context* cpA,
    125 							    const struct bts_CompactMat* ptrA,
    126 							    uint16* memPtrA );
    127 
    128 /** reads object from memory; returns number of bytes read */
    129 uint32 bts_CompactMat_memRead( struct bbs_Context* cpA,
    130 							   struct bts_CompactMat* ptrA,
    131 							   const uint16* memPtrA,
    132 				               struct bbs_MemSeg* mspA );
    133 
    134 /* ---- \ghd{ exec functions } --------------------------------------------- */
    135 
    136 /** Maps vector inVec to outVec (overflow-safe)
    137  *  Memory areas of vectors may not overlap
    138  *  Function executes reasonably fast with maximum possible accuracy
    139  *  outExpPtrA - exponent to output vector values
    140  */
    141 void bts_CompactMat_map( struct bbs_Context* cpA,
    142 						 const struct bts_CompactMat* ptrA,
    143 						 const int16* inVecA,
    144 						 int16* outVecA,
    145 						 int16* outExpPtrA );
    146 
    147 #endif /* bts_COMPACT_MAT_EM_H */
    148 
    149