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