00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 #if !defined(ALIZE_MixtureFileReaderAmiral_cpp)
00056 #define ALIZE_MixtureFileReaderAmiral_cpp
00057
00058 #include <new>
00059 #include "MixtureFileReaderAmiral.h"
00060 #include "Mixture.h"
00061 #include "MixtureGD.h"
00062 #include "DistribGD.h"
00063 #include "Exception.h"
00064 #include "Config.h"
00065 #include "FileReader.h"
00066
00067 using namespace alize;
00068 typedef MixtureFileReaderAmiral R;
00069
00070
00071 R::MixtureFileReaderAmiral(const FileName& f, const Config& c, BigEndian be)
00072 :MixtureFileReaderAbstract(&FileReader::create(f, getPath(f, c),
00073 getExt(f, c), getBigEndian(c, be)), c) {}
00074
00075 R& R::create(const FileName& f, const Config& c, BigEndian be)
00076 {
00077 R* p = new (std::nothrow) R(f, c, be);
00078 assertMemoryIsAllocated(p, __FILE__, __LINE__);
00079 return *p;
00080 }
00081
00082 const Mixture& R::readMixture()
00083 {
00084 assert(_pReader != NULL);
00085 if (_pReader->readString(24) != "LIA Modele Multidistrib.")
00086 throw InvalidDataException("Invalid file", __FILE__, __LINE__,
00087 _pReader->getFullFileName());
00088 _pReader->readChar();
00089 _pReader->swap() = (_pReader->readInt2() != 1);
00090 if (_pReader->readChar() == 2)
00091 readVersion2();
00092 else
00093 throw InvalidDataException("Invalid file", __FILE__, __LINE__,
00094 _pReader->getFullFileName());
00095 return *_pMixture;
00096 }
00097
00098 const MixtureGD& R::readMixtureGD()
00099 {
00100 assert(_pReader != NULL);
00101 if (_pReader->readString(24) != "LIA Modele Multidistrib.")
00102 throw InvalidDataException("Invalid file", __FILE__, __LINE__,
00103 _pReader->getFullFileName());
00104 _pReader->readChar();
00105 _pReader->swap() = (_pReader->readInt2() != 1);
00106 if (_pReader->readChar() == 2)
00107 readVersionGD2();
00108 else
00109 throw InvalidDataException("Invalid file", __FILE__, __LINE__,
00110 _pReader->getFullFileName());
00111 return *static_cast<MixtureGD*>(_pMixture);
00112 }
00113
00114 void R::readVersionGD2()
00115 {
00116 unsigned long c;
00117 MixtureGD* pMix = NULL;
00118 assert(_pReader != NULL);
00119
00120 try
00121 {
00122
00123 _pReader->readInt4();
00124
00125
00126 long t = _pReader->readInt4();
00127
00128
00129 if (t > 0)
00130 {
00131 _pReader->readString(t);
00132
00133 }
00134
00135
00136 unsigned long distribCount = _pReader->readInt4();
00137
00138
00139 _vectSize = _pReader->readInt2();
00140
00141
00142 _pReader->readUInt4();
00143
00144
00145 DoubleVector weightVector;
00146 for (c=0; c<distribCount; c++)
00147 { weightVector.addValue(_pReader->readDouble()); }
00148
00149 for (c=0; c<distribCount; c++)
00150 {
00151 if (_pReader->readChar() == 1)
00152 {
00153 _pReader->readDouble();
00154
00155 char typeMatrice = _pReader->readChar();
00156
00157 if (typeMatrice == 1)
00158 {
00159 if (pMix == NULL)
00160 pMix = &MixtureGD::create(K::k, _pReader->getFileName(),
00161 _vectSize, distribCount);
00162 pMix->weight(c) = weightVector[c];
00163 readDistribGD(pMix->getDistrib(c));
00164 }
00165 else
00166 throw InvalidDataException("Matrix is not diagonal",
00167 __FILE__, __LINE__, _pReader->getFullFileName());
00168 }
00169 else
00170 throw InvalidDataException("Distribution is not Gaussian",
00171 __FILE__, __LINE__, _pReader->getFullFileName());
00172 }
00173 _pMixture = pMix;
00174 }
00175 catch (Exception&)
00176 {
00177 if (pMix != NULL)
00178 delete pMix;
00179 throw;
00180 }
00181 }
00182
00183 void R::readVersion2()
00184 {
00185 unsigned long c;
00186 _pMixture = NULL;
00187 assert(_pReader != NULL);
00188 try
00189 {
00190
00191 _pReader->readInt4();
00192
00193
00194 long t = _pReader->readInt4();
00195
00196
00197 if (t > 0)
00198 _pReader->readString(t);
00199
00200
00201 unsigned long distribCount = _pReader->readInt4();
00202
00203
00204 _vectSize = _pReader->readInt2();
00205
00206
00207 _pReader->readUInt4();
00208
00209
00210 DoubleVector weightVector;
00211 for (c=0; c<distribCount; c++)
00212 { weightVector.addValue(_pReader->readDouble()); }
00213
00214 for (c=0; c<distribCount; c++)
00215 {
00216 if (_pReader->readChar() == 1)
00217 {
00218 _pReader->readDouble();
00219
00220 char typeMatrice = _pReader->readChar();
00221
00222 if (typeMatrice == 1)
00223 {
00224 if (_pMixture == NULL)
00225 _pMixture = &MixtureGD::create(K::k, _pReader->getFileName()
00226 ,_vectSize, distribCount);
00227 _pMixture->weight(c) = weightVector[c];
00228 readDistribGD(static_cast<DistribGD&>
00229 (_pMixture->getDistrib(c)));
00230 }
00231 else if (typeMatrice == 0)
00232 {
00233 throw InvalidDataException("Unknown matrix type",
00234 __FILE__, __LINE__, _pReader->getFullFileName());
00235 }
00236 else
00237 throw InvalidDataException("Unknown matrix type",
00238 __FILE__, __LINE__, _pReader->getFullFileName());
00239 }
00240 else
00241 throw InvalidDataException("Unknown distribution type",
00242 __FILE__, __LINE__, _pReader->getFullFileName());
00243 }
00244 }
00245 catch (Exception&)
00246 {
00247 if (_pMixture != NULL)
00248 delete _pMixture;
00249 throw;
00250 }
00251 }
00252
00253 void R::readDistribGD(DistribGD& distrib)
00254 {
00255 assert(distrib.getVectSize() == _vectSize);
00256 assert(_pReader != NULL);
00257 unsigned long i;
00258
00259 for (i = 0; i < _vectSize; i++)
00260 { distrib.setCov(_pReader->readDouble(), i); }
00261
00262
00263 for (i = 0; i < _vectSize; i++)
00264 { _pReader->readDouble(); }
00265
00266
00267 for (i = 0; i < _vectSize; i++)
00268 { distrib.setMean(_pReader->readDouble(), i); }
00269
00270
00271 _pReader->readDouble();
00272
00273
00274
00275 _pReader->readDouble();
00276
00277
00278 distrib.computeAll();
00279 }
00280
00281 String R::getClassName() const { return "MixtureFileReaderAmiral"; }
00282
00283 R::~MixtureFileReaderAmiral() {}
00284
00285
00286 #endif // !defined(ALIZE_MixtureFileReaderAmiral_cpp)
00287