/***************************************************************************************
 *
 *  WRITEPAD(r): Handwriting Recognition Engine (HWRE) and components.
 *  Copyright (c) 2001-2016 PhatWare (r) Corp. All rights reserved.
 *
 *  Licensing and other inquires: <developer@phatware.com>
 *  Developer: Stan Miasnikov, et al. (c) PhatWare Corp. <http://www.phatware.com>
 *
 *  WRITEPAD HWRE is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 *  AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 *  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 *  FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL PHATWARE CORP.
 *  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL,
 *  INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
 *  INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE, SAVINGS
 *  OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR NOT PHATWARE CORP.
 *  HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 *  ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 *  POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 *  See the GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with WritePad.  If not, see <http://www.gnu.org/licenses/>.
 *
 **************************************************************************************/

#ifndef XRLV_HEADER_INCLUDED
#define XRLV_HEADER_INCLUDED

#include "snn.h"

// ----------------- Defines ---------------------------------------------------

#define XRLV_ALL_MULTIWORD     0   // Enable multiwording on any location
#define XRLV_LNK_MULTIWORD     0   // Enable multiwording on link location
#define XRLV_SEG_MULTIWORD     1   // Enable multiwording only on designated segmentation locs

#define XRLV_ST_PUNCT_PENL     2
#define XRLV_EN_PUNCT_PENL     2

#define XRLV_NEWWORD_ST_PENL   2   /* Penalty for starting a new word */
#define XRLV_NEWWORD_COEFF     0   /* Runnining penalty for new word coeff */

#define XRLV_NOTFINISHED_PENL 24
/* Alll penaties per XR el, mul by 4*/
#define XRLV_VOC_PENL          0   /* Vocabulary symbol penalty */
#define XRLV_PSX_ST_PENL       3   /* Prefix/Suffix starting symbol penalty */
#define XRLV_PSX_PENL          1   /* Prefix/Suffix symbol penalty */
#define XRLV_LDB_PENL          2   /* Lexical data base symbol penalty */
#define XRLV_TRD_PENL          2   /* Triads symbol penalty */

#define XRLV_CSA_PENL          4   /* Charset Alpha symbol penalty */
#define XRLV_CSN_PENL          3   /* Charset Numbers symbol penalty */
#define XRLV_CSM_PENL          4   /* Charset MATH symbol penalty */
#define XRLV_CSO_PENL          4   /* Charset Other symbol penalty */
#define XRLV_CSP_PENL          4   /* Charset Punctuation symbol penalty */

#define XRLV_MWDP_COEFF        3   /* Penalty for startin a new word */
#define XRLV_MWSP_COEFF        2   /* Multiplier of segm multiword penalty */

#define XRLV_CSA_ID            1   /* Charset Alpha symbol Id */
#define XRLV_CSN_ID            2   /* Charset Numbers symbol Id */
#define XRLV_CSM_ID            3   /* Charset MATH symbol Id */
#define XRLV_CSO_ID            4   /* Charset Other symbol Id */
#define XRLV_CSP_ID            5   /* Charset Punctuation symbol Id */

#define XRLV_VARNUM             256  /* Max number of cells to allocate per position */
#define XRLV_CS_LOC_SHARE       8   /* One eight of all loactions will be devoted to CS */
#define XRLV_ANS_SIZE           (XRLV_VARNUM)
#define XRLV_VOC_SIZE           512
#define XRLV_CS_SIZE            256
#define XRLV_PT_SIZE            16
#define XRLV_ANSW_MAX_LEN       (w_lim)
#define XRLV_PP_INFO_SIZE       (DTI_XR_SIZE+2)
#define XRLV_MIN_BUFFERS        2   /* Number of symbol sources in XRLV */

#define XRLV_FLOOR              -50
#define XRLV_INITIAL_WEIGHT     100

#define XRLV_SEP_PENL_V         1
#define XRLV_SEP_PENL_O         4
#define XRLV_F_NCAP_PENL        5
#define XRLV_S_LET_PENL         2

#define XRLV_DICT_STREWARD      (XRLV_CSA_PENL) /*  Reward for dict words to overcome first letter competition */
#define XRLV_VFL_CAP_PENL       2    /* Penalize capitalization of the first letter of dict */

#define XRLV_CACHE_LEN          (DTI_XR_SIZE+4)
#define XRLV_SYMCORR_CACHE_SIZE (DTI_NUMSYMBOLS)

#define XRLV_CACHE_EL_SET       0x01
#define XRLV_CACHE_EL_VBAD      0x02
#define XRLV_CACHE_EL_CBAD      0x04

#define XRLV_DICT_FL_CAP        0x80  /* VocSymSet buf flags / xlv cell flag*/
#define XRLV_SORT_USED          0x40  /* VocSymSet buf flags / xlv cell flag*/

#define XRLV_DICT_PREFIXED      0x01  /* Word had prefix!, xlv cell flag*/
#define XRLV_DICT_STREWARDED    0x02  /* This word has received initial reword, need to subtract, xlv cell flag */

#define XRLV_YIELD_BREAK        2   /* Marker that xrlv data was saved after break by yield */

// ----------------- Structures ------------------------------------------------

typedef struct
{
    _UCHAR                   nvar;
    _UCHAR                   st;
    _UCHAR                   end;
    _UCHAR                   flags;
    _UCHAR                   mbuf[XRLV_CACHE_LEN];
    _UCHAR                   nvars[XRLV_CACHE_LEN];
} xrlv_cache_type, _PTR p_xrlv_cache_type;

typedef struct
{
    _UCHAR                   sym;
    _UCHAR                   st;             // Pos of parent
    _UCHAR                   np;             // Num of parent
    _UCHAR                   sym_type;       // Type of symbol (for trnp)
    _SCHAR                   ppw;            // PostProc penalty
    _USHORT                  boxp;           // Boxes penalty
    _UCHAR                   lexp;           // Lex penalty
    _UCHAR                   othp;           // Other penalties
    _UCHAR                   nvar;           // Number of sym variant in DTI
    _UCHAR                   nwords;         // Num of voc words in this chain
    _SCHAR                   w;              // Sym weight
    _SHORT                   sw;             // Sequence weight (word weight)
    _UCHAR                   source;         // Lexical Source of the symbol
    _UCHAR                   len;            // Length of current word
    _UCHAR                   wlen;           // Length of last voc/ld word
    _UCHAR                   flags;          // Flags of symbol
    fw_buf_type              sd;             // Legacy stuff about symbol, to be updated !!
    _UCHAR                   word[XRLV_ANSW_MAX_LEN];// Answer symbols
    _SCHAR                   symw[XRLV_ANSW_MAX_LEN];// Symbols' weight
    _UCHAR                   nvps[XRLV_ANSW_MAX_LEN];// NumVar (4hbit)/ Len (in positions)(4lbit)
} xrlv_var_data_type, _PTR p_xrlv_var_data_type;

typedef struct
{
    _INT                     gw;
    _INT                     min_w_v;
    _INT                     min_w_loc_v;
    _INT                     min_w_c;
    _INT                     min_w_loc_c;
    _INT                     nsym;
    _INT                     nsym_v;
    _INT                     nsym_c;
    _INT                     n_put;
    //                _INT                     flags;
    _UCHAR                   nn_weights[256]; // 256 - Weights provided by the net
    xrlv_var_data_type       buf[XRLV_VARNUM];
} xrlv_var_data_type_array, _PTR p_xrlv_var_data_type_array;

typedef struct
{
    _SHORT                   percent;       // Answer percent
    _UCHAR                   num;           // Answer num in last pos buf
    _UCHAR                   vp ;           // Answer voc penalty
} xrlv_ans_type, _PTR p_xrlv_ans_type;

typedef struct
{
    _INT                     pos;          // Current position in development
    _INT                     npos;         // Overall Number of positions
    _INT                     n_real_pos;   // Number of really allocated positions
    _INT                     size_pos;     // Allocated memory for the position
    _INT                     nloc;         // Real Number of cells allocated for the position
    _INT                     nloc_c;       // Real Number of CS cells allocated for the position
    _INT                     nloc_v;       // Real Number of VOC/LD cells allocated for the position
    
    _INT                     bad_dist;     // Parameters From RC
    _INT                     xrwm;         // RC xrw mode
    _INT                     xrw_cs;       // RC charset select
    _INT                     caps_mode;
    
    _INT                     self_weight;  // Max weight of Xrdata
    _INT                     init_weight;  // Starting reward value
    
    _INT                     cs_fbuf_num;  // Number of elements in CS buffer
    _INT                     lp_fbuf_num;  // Number of elements in LP buffer
    _INT                     ep_fbuf_num;  // Number of elements in EP buffer
    
    p_xrcm_type              xrcm;
    p_rc_type                rc;
    p_xrdata_type            xrdata;
    
    p_SHORT                  xTrace;
    p_SHORT                  yTrace;
    p_xrlv_var_data_type_array pxrlvs[XRINP_SIZE];
    lex_data_type            vs;
    _UCHAR                   link_index[XRINP_SIZE];
    _UCHAR                   unlink_index[XRINP_SIZE];
    xrlv_ans_type            ans[XRLV_ANS_SIZE];
    _UCHAR                   order[XRLV_VARNUM];
    fw_buf_type              (_PTR fbuf)[XRWD_MAX_LETBUF];
    fw_buf_type              v_fbuf[XRLV_VOC_SIZE];
    fw_buf_type              c_fbuf[XRLV_CS_SIZE];
    fw_buf_type              lp_fbuf[XRLV_PT_SIZE];
    fw_buf_type              ep_fbuf[XRLV_PT_SIZE];
    xrlv_cache_type          cache[XRLV_SYMCORR_CACHE_SIZE];
    mlp_data_type            mlpd;
} xrlv_data_type, _PTR p_xrlv_data_type;

// ----------------- Functions -------------------------------------------------

_INT xrlv(p_xrdata_type xrdata, p_RWG_type rwg, rc_type  _PTR rc);
_INT XrlvDevelopPos(_INT pos, p_xrlv_data_type xd);
_INT XrlvDevelopCell(_INT pos, _INT caps_cnt, _INT penl, p_xrlv_var_data_type pxl, p_xrlv_data_type xd);
_INT XrlvSortXrlvPos(_INT pos, p_xrlv_data_type xd);
_INT XrlvGetNextSymbols(p_xrlv_var_data_type pbp, _INT cap_dupl, p_xrlv_data_type xd);
_INT XrlvAlloc(p_xrlv_data_type _PTR xdd, p_xrdata_type xrdata, p_rc_type rc);
_INT XrlvDealloc(p_xrlv_data_type _PTR xd);
_INT XrlvFreeSomePos(p_xrlv_data_type xd);
_INT XrlvCreateRWG(p_RWG_type rwg, p_xrlv_data_type xd);
_INT XrlvSetLocations(p_xrlv_data_type xd, _INT fl);
//_INT XrlvCreateAnswers(_INT iw, p_xrlv_data_type xd);
_INT XrlvSortAns(p_xrlv_data_type xd);
_INT XrlvCleanAns(p_xrlv_data_type xd);
_INT XrlvCHLXrlvPos(_INT pos, p_xrlv_data_type xd);
_INT XrlvTrimXrlvPos(_INT pos, p_xrlv_data_type xd);
_INT XrlvGuessFutureGws(_INT pos, p_xrlv_data_type xd);
//_INT XrlvAliasXrlvPos(_INT pos, p_xrlv_data_type xd);
_INT XrlvGetSymAliases(_UCHAR sym, _INT nvar, _INT st, _INT end, p_UCHAR buf, p_xrcm_type xrcm);
_INT XrlvPPDXrlvSym(_UCHAR sym, _UCHAR nvar, p_UCHAR buf, p_SHORT x, p_SHORT y, p_rc_type rc);
_INT XrlvGetCharset(p_xrlv_data_type xd);
_INT XrlvGetRwgSymAliases(_INT rwsi, p_RWG_type rwg, p_xrlv_data_type xd);
//_INT XrlvGetRwgSrcIds(p_RWG_type rwg, p_xrlv_data_type xd);
_INT XrlvCheckDictCap(p_xrlv_var_data_type xv, p_xrlv_data_type xd);
_INT XrlvApplyWordEndInfo(_INT pos, p_xrlv_var_data_type xv, p_xrlv_data_type xd);
_INT XrlvNNXrlvPos(_INT pos, p_xrlv_data_type xd, rc_type  _PTR rc);

#endif /* XRLV_HEADER_INCLUDED */

