16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef __ML_INTERNAL_H__
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define __ML_INTERNAL_H__
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if _MSC_VER >= 1200
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#pragma warning( disable: 4514 4710 4711 4710 )
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ml.h"
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "cxmisc.h"
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <assert.h>
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <float.h>
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <limits.h>
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <math.h>
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <stdlib.h>
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <stdio.h>
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <string.h>
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <time.h>
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef FALSE
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define FALSE 0
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef TRUE
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define TRUE 1
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ML_IMPL CV_IMPL
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_ELEM_FLAG( mat, type, comp, vect, tflag )    \
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (( tflag == CV_ROW_SAMPLE )                             \
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ? (CV_MAT_ELEM( mat, type, comp, vect ))                \
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    : (CV_MAT_ELEM( mat, type, vect, comp )))
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Convert matrix to vector */
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_MAT2VEC( mat, vdata, vstep, num )      \
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( MIN( (mat).rows, (mat).cols ) != 1 )       \
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "" );              \
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (vdata) = ((mat).data.ptr);                    \
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (mat).rows == 1 )                          \
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                              \
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (vstep) = CV_ELEM_SIZE( (mat).type );      \
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (num) = (mat).cols;                        \
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                              \
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                           \
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                              \
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (vstep) = (mat).step;                      \
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (num) = (mat).rows;                        \
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* get raw data */
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_RAWDATA( mat, flags, rdata, sstep, cstep, m, n )         \
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (rdata) = (mat).data.ptr;                                        \
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_ROW_SAMPLE( flags ) )                                  \
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                \
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (sstep) = (mat).step;                                        \
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (cstep) = CV_ELEM_SIZE( (mat).type );                        \
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (m) = (mat).rows;                                            \
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (n) = (mat).cols;                                            \
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                \
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                             \
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                \
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (cstep) = (mat).step;                                        \
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (sstep) = CV_ELEM_SIZE( (mat).type );                        \
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (n) = (mat).rows;                                            \
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (m) = (mat).cols;                                            \
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_IS_MAT_OF_TYPE( mat, mat_type) \
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_MAT( mat ) && CV_MAT_TYPE( mat->type ) == (mat_type) &&   \
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (mat)->cols > 0 && (mat)->rows > 0)
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* data; int sstep, cstep;      - trainData->data
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* classes; int clstep; int ncl;- trainClasses
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* tmask; int tmstep; int ntm;  - typeMask
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* missed;int msstep, mcstep;   -missedMeasurements...
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mm, mn;                         == m,n == size,dim
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* sidx;int sistep;             - sampleIdx
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* cidx;int cistep;             - compIdx
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int k, l;                           == n,m == dim,size (length of cidx, sidx)
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int m, n;                           == size,dim
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DECLARE_TRAIN_ARGS()                                                    \
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* data;                                                                    \
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int sstep, cstep;                                                               \
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* classes;                                                                 \
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int clstep;                                                                     \
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int ncl;                                                                        \
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* tmask;                                                                   \
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int tmstep;                                                                     \
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int ntm;                                                                        \
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* missed;                                                                  \
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int msstep, mcstep;                                                             \
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mm, mn;                                                                     \
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* sidx;                                                                    \
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int sistep;                                                                     \
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* cidx;                                                                    \
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cistep;                                                                     \
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int k, l;                                                                       \
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int m, n;                                                                       \
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    data = classes = tmask = missed = sidx = cidx = NULL;                           \
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sstep = cstep = clstep = ncl = tmstep = ntm = msstep = mcstep = mm = mn = 0;    \
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sistep = cistep = k = l = m = n = 0;
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_TRAIN_DATA_REQUIRED( param, flags )                                     \
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !ICV_IS_MAT_OF_TYPE( (param), CV_32FC1 ) )                                  \
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Invalid " #param " parameter" );                   \
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                               \
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                            \
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_RAWDATA( *(param), (flags), data, sstep, cstep, m, n );                 \
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        k = n;                                                                      \
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        l = m;                                                                      \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_TRAIN_CLASSES_REQUIRED( param )                                         \
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !ICV_IS_MAT_OF_TYPE( (param), CV_32FC1 ) )                                  \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Invalid " #param " parameter" );                   \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                               \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                            \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_MAT2VEC( *(param), classes, clstep, ncl );                              \
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( m != ncl )                                                              \
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Unmatched sizes" );                            \
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_ARG_NULL( param )                                                       \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (param) != NULL )                                                           \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, #param " parameter must be NULL" );                 \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_MISSED_MEASUREMENTS_OPTIONAL( param, flags )                            \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( param )                                                                     \
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !ICV_IS_MAT_OF_TYPE( param, CV_8UC1 ) )                                 \
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Invalid " #param " parameter" );               \
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else                                                                        \
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_RAWDATA( *(param), (flags), missed, msstep, mcstep, mm, mn );       \
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mm != m || mn != n )                                                \
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                       \
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadArg, "Unmatched sizes" );                        \
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                       \
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_COMP_IDX_OPTIONAL( param )                                              \
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( param )                                                                     \
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !ICV_IS_MAT_OF_TYPE( param, CV_32SC1 ) )                                \
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Invalid " #param " parameter" );               \
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else                                                                        \
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_MAT2VEC( *(param), cidx, cistep, k );                               \
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( k > n )                                                             \
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadArg, "Invalid " #param " parameter" );           \
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_SAMPLE_IDX_OPTIONAL( param )                                            \
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( param )                                                                     \
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !ICV_IS_MAT_OF_TYPE( param, CV_32SC1 ) )                                \
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Invalid " #param " parameter" );               \
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else                                                                        \
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_MAT2VEC( *sampleIdx, sidx, sistep, l );                             \
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( l > m )                                                             \
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadArg, "Invalid " #param " parameter" );           \
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************/
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_CONVERT_FLOAT_ARRAY_TO_MATRICE( array, matrice )        \
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat a, b;                                                     \
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims = (matrice)->cols;                                     \
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int nsamples = (matrice)->rows;                                 \
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = CV_MAT_TYPE((matrice)->type);                        \
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, offset = dims;                                           \
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_ASSERT( type == CV_32FC1 || type == CV_64FC1 );              \
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    offset *= ((type == CV_32FC1) ? sizeof(float) : sizeof(double));\
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b = cvMat( 1, dims, CV_32FC1 );                                 \
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvGetRow( matrice, &a, 0 );                                     \
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < nsamples; i++, a.data.ptr += offset )           \
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                               \
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        b.data.fl = (float*)array[i];                               \
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvConvert( &b, &a ) );                             \
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                               \
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                       Auxiliary functions declarations                                 *
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Generates a set of classes centers in quantity <num_of_clusters> that are generated as
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   uniform random vectors in parallelepiped, where <data> is concentrated. Vectors in
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   <data> should have horizontal orientation. If <centers> != NULL, the function doesn't
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   allocate any memory and stores generated centers in <centers>, returns <centers>.
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   If <centers> == NULL, the function allocates memory and creates the matrice. Centers
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   are supposed to be oriented horizontally. */
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMat* icvGenerateRandomClusterCenters( int seed,
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        const CvMat* data,
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        int num_of_clusters,
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        CvMat* centers CV_DEFAULT(0));
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Fills the <labels> using <probs> by choosing the maximal probability. Outliers are
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   fixed by <oulier_tresh> and have cluster label (-1). Function also controls that there
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   weren't "empty" clusters by filling empty clusters with the maximal probability vector.
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   If probs_sums != NULL, filles it with the sums of probabilities for each sample (it is
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   useful for normalizing probabilities' matrice of FCM) */
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid icvFindClusterLabels( const CvMat* probs, float outlier_thresh, float r,
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           const CvMat* labels );
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSparseVecElem32f
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int idx;
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float val;
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSparseVecElem32f;
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Prepare training data and related parameters */
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TRAIN_STATMODEL_DEFRAGMENT_TRAIN_DATA    1
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TRAIN_STATMODEL_SAMPLES_AS_ROWS          2
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TRAIN_STATMODEL_SAMPLES_AS_COLUMNS       4
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TRAIN_STATMODEL_CATEGORICAL_RESPONSE     8
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TRAIN_STATMODEL_ORDERED_RESPONSE         16
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TRAIN_STATMODEL_RESPONSES_ON_OUTPUT      32
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TRAIN_STATMODEL_ALWAYS_COPY_TRAIN_DATA   64
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TRAIN_STATMODEL_SPARSE_AS_SPARSE         128
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvPrepareTrainData( const char* /*funcname*/,
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const CvMat* train_data, int tflag,
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const CvMat* responses, int response_type,
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const CvMat* var_idx,
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const CvMat* sample_idx,
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    bool always_copy_data,
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const float*** out_train_samples,
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int* _sample_count,
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int* _var_count,
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int* _var_all,
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvMat** out_responses,
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvMat** out_response_map,
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvMat** out_var_idx,
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvMat** out_sample_idx=0 );
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSortSamplesByClasses( const float** samples, const CvMat* classes,
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int* class_ranges, const uchar** mask CV_DEFAULT(0) );
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCombineResponseMaps (CvMat*  _responses,
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                 const CvMat*  old_response_map,
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvMat*  new_response_map,
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvMat** out_response_map);
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvPreparePredictData( const CvArr* sample, int dims_all, const CvMat* comp_idx,
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      int class_count, const CvMat* prob, float** row_sample,
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      int as_sparse CV_DEFAULT(0) );
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* copies clustering [or batch "predict"] results
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   (labels and/or centers and/or probs) back to the output arrays */
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvWritebackLabels( const CvMat* labels, CvMat* dst_labels,
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   const CvMat* centers, CvMat* dst_centers,
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   const CvMat* probs, CvMat* dst_probs,
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   const CvMat* sample_idx, int samples_all,
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   const CvMat* comp_idx, int dims_all );
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cvWritebackResponses cvWritebackLabels
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define XML_FIELD_NAME "_name"
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvFileNode* icvFileNodeGetChild(CvFileNode* father, const char* name);
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvFileNode* icvFileNodeGetChildArrayElem(CvFileNode* father, const char* name,int index);
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvFileNode* icvFileNodeGetNext(CvFileNode* n, const char* name);
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid cvCheckTrainData( const CvMat* train_data, int tflag,
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       const CvMat* missing_mask,
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       int* var_all, int* sample_all );
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMat* cvPreprocessIndexArray( const CvMat* idx_arr, int data_arr_size, bool check_for_duplicates=false );
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMat* cvPreprocessVarType( const CvMat* type_mask, const CvMat* var_idx,
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            int var_all, int* response_type );
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMat* cvPreprocessOrderedResponses( const CvMat* responses,
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const CvMat* sample_idx, int sample_all );
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMat* cvPreprocessCategoricalResponses( const CvMat* responses,
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const CvMat* sample_idx, int sample_all,
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvMat** out_response_map, CvMat** class_counts=0 );
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennconst float** cvGetTrainSamples( const CvMat* train_data, int tflag,
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   const CvMat* var_idx, const CvMat* sample_idx,
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   int* _var_count, int* _sample_count,
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   bool always_copy_data=false );
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /* __ML_H__ */
355