root/library/bdm/mex/config2mxstruct.h @ 728

Revision 728, 5.0 kB (checked in by smidl, 15 years ago)

logger now has ability to store settings - used in estimator. New mexfunction epdf_mean

  • Property svn:eol-style set to native
Line 
1#ifndef CFGSTR_H
2#define CFGSTR_H
3
4#include "../base/libconfig/lib/libconfig.h++"
5#include <itpp/itbase.h>
6#include <itpp/itmex.h>
7#include <stdlib.h>
8
9using namespace itpp;
10using namespace std;
11using namespace libconfig;
12
13//! Reimplementation of libconfig's Config class for Matlab mxArray structures
14class UImxConfig : public Config {
15public:
16        //! Matlab structure where the info is stored
17        mxArray *mxconfig;
18        //! Load file in libconfig syntax to Matlab arrays
19        UImxConfig ( const char * filename ) {
20                Config config;
21                config.readFile ( filename );
22                mxconfig = group2mxstruct ( config.getRoot() );
23        }
24        //! Convert existing Setting to Matlab arrays
25        UImxConfig ( const Setting &setting ) {
26                mxconfig = group2mxstruct ( setting );
27        }
28
29private:
30        //! Convert libconfig's array to Matlab vector
31        mxArray* array2mxvector ( const Setting &setting )  {
32                if ( !setting.isArray() ) mexErrMsgTxt ( "Given setting is not an array" );
33                mxArray *result = mxCreateDoubleMatrix ( 1, setting.getLength(), mxREAL );
34                double *elements = mxGetPr(result);
35                for ( int i = 0; i < setting.getLength(); i++ ) {
36                        if ( setting.getType() == Setting::TypeInt ) { //TODO: tady je chyba -- zaporna cisla nejsou TypeInt
37                                elements[i] = (int) setting[i];
38                        } else {
39                                elements[i] =  setting[i];
40                        }
41                }
42                return result;
43        }
44
45        //! Convert libconfig's array to Matlab matrix
46        mxArray* list2mxmatrix ( const Setting &setting )  {
47                if ( !setting.isList() || ( strcmp("matrix", setting[0])!=0 ) )
48                        mexErrMsgTxt ( "Given setting is not a matrix" );
49                int rows = setting[1];
50                int cols = setting[2];
51                if ( setting[3].getLength() != rows*cols )
52                        mexErrMsgTxt ( "Matrix elements do not fit to rows*cols" );
53                double *elements = new double[rows*cols];
54                for ( int i = 0; i < rows*cols; i++ ) {
55                        elements[i] = setting[3][i];
56                }
57                mat &m = * ( new mat ( elements, rows, cols ) );
58                mxArray *result = mxCreateDoubleMatrix ( rows, cols, mxREAL );
59                mat2mxArray ( m, result );
60                delete &m;
61                delete [] elements;
62                return result;
63        }
64       
65        //! Convert libconfig's gourp to Matlab structure
66        mxArray* group2mxstruct ( const Setting &setting ) {
67                if ( !setting.isGroup() ) mexErrMsgTxt ( "Given setting is not a group." );
68                const char ** keys = new const char*[setting.getLength() ];
69                for ( int i = 0; i < setting.getLength(); i++ ) {
70                        keys[i] = setting[i].getName();
71                }
72                mxArray *result = mxCreateStructMatrix ( 1, 1, setting.getLength(), keys );
73                delete keys;
74                for ( int i = 0; i < setting.getLength(); i++ ) {
75                        Setting &value = setting[i];
76                        mxArray *old = mxGetFieldByNumber ( result, 0, i );
77                        if ( old ) mxDestroyArray ( old );
78                        switch ( value.getType() ) {
79                        case Setting::TypeString:
80                                mxSetFieldByNumber ( result, 0, i, mxCreateString ( value ) );
81                                break;
82                        case Setting::TypeBoolean:
83                                mxSetFieldByNumber ( result, 0, i, mxCreateLogicalScalar ( value ) );
84                                break;
85                        case Setting::TypeGroup:
86                                mxSetFieldByNumber ( result, 0, i, group2mxstruct ( value ) );
87                                break;
88                        case Setting::TypeList:
89                                mxSetFieldByNumber ( result, 0, i, list2mxcell ( value ) );
90                                break;
91                        case Setting::TypeArray:
92                                mxSetFieldByNumber ( result, 0, i, array2mxvector ( value ) );
93                                break;
94                        case Setting::TypeInt:
95                        case Setting::TypeInt64:
96                                mxSetFieldByNumber ( result, 0, i, mxCreateDoubleScalar ( ( int ) value ) );
97                                break;
98                        case Setting::TypeFloat:
99                                mxSetFieldByNumber ( result, 0, i, mxCreateDoubleScalar ( value ) );
100                                break;
101                        default:
102                                //this should never happen
103                                mexErrMsgTxt ( "Unknown type of a setting." );
104                        }
105                }
106                return result;
107
108        }
109        //! Convert libconfig's list  to Matlab cell
110        mxArray* list2mxcell ( const Setting &setting )  {
111                if ( !setting.isList() ) mexErrMsgTxt ( "Given setting is not a list." );
112                if ( setting.getLength() == 0 ) {
113                        mxArray *result = mxCreateCellMatrix ( 1, 0 );
114                        return result;
115                }
116               
117                if ( ( setting[0].getType() == Setting::TypeString )){
118                        string s=(setting[0]);
119                        if (s=="matrix") {
120                                return list2mxmatrix ( setting );
121                        }
122                }
123                mxArray *result = mxCreateCellMatrix ( 1, setting.getLength() );
124                for ( int i = 0; i < setting.getLength(); i++ ) {
125                        Setting &value = setting[i];
126                        mxArray *old = mxGetCell ( result, i );
127                        if ( old ) mxDestroyArray ( old );
128                        switch ( value.getType() ) {
129                        case Setting::TypeString:
130                                mxSetCell ( result, i, mxCreateString ( value ) );
131                                break;
132                        case Setting::TypeBoolean:
133                                mxSetCell ( result, i, mxCreateLogicalScalar ( value ) );
134                                break;
135                        case Setting::TypeGroup:
136                                mxSetCell ( result, i, group2mxstruct ( value ) );
137                                break;
138                        case Setting::TypeList:
139                                mxSetCell ( result, i, list2mxcell ( value ) );
140                                break;
141                        case Setting::TypeArray:
142                                mxSetCell ( result, i, array2mxvector ( value ) );
143                                break;
144                        case Setting::TypeInt:
145                        case Setting::TypeInt64:
146                                mxSetCell ( result, i, mxCreateDoubleScalar ( ( int ) value ) );
147                                break;
148                        case Setting::TypeFloat:
149                                mxSetCell ( result, i, mxCreateDoubleScalar ( value ) );
150                                break;
151                        default:
152                                //this should never happen
153                                mexErrMsgTxt ( "Unknown type of a setting." );
154                        }
155                }
156                return result;
157        }
158};
159
160#endif //CFGSTR_H
Note: See TracBrowser for help on using the browser.