36 #ifndef GEOTESSMODEL_OBJECT_H
37 #define GEOTESSMODEL_OBJECT_H
67 class GeoTessPosition;
69 class GeoTessMetaData;
70 class OptimizationType;
133 static map<string, GeoTessGrid*> reuseGridMap;
174 void deleteProfiles();
186 void loadModelAscii(
const string& inputFile,
const string& relGridFilePath);
204 virtual void loadModelAscii(
IFStreamAscii& input,
const string& inputDirectory,
205 const string& relGridFilePath);
220 void loadModelBinary(
const string& inputFile,
const string& relGridFilePath);
237 virtual void loadModelBinary(
IFStreamBinary& input,
const string& inputDirectory,
238 const string& relGridFilePath);
249 void writeModelAscii(
const string& outputFile,
const string& gridFileName);
260 virtual void writeModelAscii(
IFStreamAscii& output,
const string& gridFileName);
271 void writeModelBinary(
const string& outputFile,
const string& gridFileName);
282 virtual void writeModelBinary(
IFStreamBinary& output,
const string& gridFileName);
297 void loadGrid(T& input,
const string& inputDirectory,
298 const string& relGridFilePath,
const string& gridFileName,
299 const string& gridID,
const string& funcName)
304 map<string, GeoTessGrid*>::iterator it = reuseGridMap.find(gridID);
305 if (it != reuseGridMap.end())
308 if (gridFileName ==
"*")
315 &metaData->getOptimizationType());
322 if (metaData->isGridReuseOn())
323 reuseGridMap[gridID] = grid;
333 string gridFil = gridFileName;
334 if (relGridFilePath !=
"")
335 gridFil = CPPUtils::insertPathSeparator(relGridFilePath, gridFileName);
336 if (inputDirectory !=
"")
337 gridFil = CPPUtils::insertPathSeparator(inputDirectory, gridFil);
339 grid =
new GeoTessGrid(&metaData->getOptimizationType());
341 if (metaData->isGridReuseOn())
342 reuseGridMap[gridID] = grid;
346 if (grid->getGridID() != gridID)
349 os << endl <<
"ERROR in GeoTessModel::" + funcName << endl
350 <<
"gridIDs in model file and existingGrid are not equal: "
351 << endl <<
" Model File gridID = " << gridID << endl
352 <<
" Grid File gridID = " << grid->
getGridID() << endl;
359 grid->addReference();
405 GeoTessModel(
const string& inputFile,
const string& relativeGridPath,
466 GeoTessModel(
const string& inputFile,
const string& relativeGridPath,
467 vector<int>& attributeFilter,
488 GeoTessModel(
const string& modelInputFile, vector<int>& attributeFilter,
576 GeoTessModel* loadModel(
const string& inputFile,
const string& relGridFilePath =
"");
584 static bool isGeoTessModel(
const string& fileName);
591 static void clearReuseGrid()
593 reuseGridMap.clear();
602 static int getReuseGridMapSize()
604 return reuseGridMap.size();
679 int getNVertices()
const;
685 int getNLayers()
const;
693 return getPointMap()->size();
714 bool operator != (
const GeoTessModel& other)
const {
return !(*
this == other); } ;
734 if (!pointMap->isPopulated())
747 const set<int>& getConnectedVertices(
int layerIndex)
757 void setActiveRegion()
759 pointMap->setActiveRegion();
774 void setActiveRegion(
const string& polygon)
776 pointMap->setActiveRegion(polygon);
789 pointMap->setActiveRegion(polygon);
800 void getLayerCount(
bool activeOnly,
int* layerCount)
802 for (
int layer=0; layer<getNLayers(); ++layer)
803 layerCount[layer] = 0;
807 for (
int v=0; v<getNVertices(); ++v)
810 for (
int layer=0; layer<getNLayers(); ++layer)
820 layerCount[layer] += pp[layer]->
getNData();
834 return profiles[vertex][layer];
845 return profiles[vertex];
863 void setProfile(
int vertex,
int layer,
Profile* profile);
879 void setProfile(
int vertex,
int layer, vector<float>& radii, vector<vector<T> >& values)
881 if (getConnectedVertices(layer).count(vertex) == 1)
882 setProfile(vertex, layer, Profile::newProfile(radii, values));
883 else setProfile(vertex, layer,
new ProfileEmpty(radii[0], radii[radii.size()-1]));
902 void setProfile(
const int& vertex,
const int& layer,
903 float* radii,
const int& nRadii,
904 T** values,
const int& nNodes,
const int& nAttributes)
906 if (getConnectedVertices(layer).count(vertex) == 1)
907 setProfile(vertex, layer, Profile::newProfile(radii, nRadii, values, nNodes, nAttributes));
908 else setProfile(vertex, layer,
new ProfileEmpty(radii[0], radii[nRadii-1]));
920 void setProfile(
const int& vertex, vector<T>& values)
933 void setProfile(
const int& vertex, T* values,
const int& nAttributes)
950 void writeModel(
const string& outputFile,
const string& gridFileName);
964 void getLayerCount(vector<int>& layerCount,
const bool& activeOnly)
970 for (
int vtx=0; vtx<getNVertices(); ++vtx)
973 for (
int layer = 0; layer < metaData->
getNLayers(); ++layer)
977 for (
int n = 0; n < p->
getNData(); ++n)
982 layerCount[layer] += pp[layer]->
getNData();
993 void profileCount(vector< vector<int> >& count)
1000 vector<int> totalCount;
1001 for (
int profileType=0; profileType<ProfileType::size(); ++profileType)
1002 totalCount.push_back(0);
1004 for (
int layer = 0; layer < getNLayers(); ++layer)
1006 vector<int> typeCount;
1008 for (
int profileType=0; profileType<ProfileType::size(); ++profileType)
1009 typeCount.push_back(0);
1011 count.push_back(typeCount);
1014 for (
int layer = 0; layer < getNLayers(); ++layer)
1016 for (
int vertex = 0; vertex < metaData->
getNVertices(); ++vertex)
1018 int pType = profiles[vertex][layer]->getType().ordinal();
1019 count[layer][pType] += 1;
1020 totalCount[pType] += 1;
1024 count.push_back(totalCount);
1060 template<
typename T>
1061 void initializeData(
const vector<string>& attributeNames,
1062 const vector<string>& attributeUnits, T fillValue)
1064 if (profiles == NULL)
1067 os << endl <<
"ERROR in GeoTessModel::initializeData" << endl
1068 <<
"Attempting to initialize the model data before Profiles" << endl
1069 <<
"have been specified (profiles == NULL)" << endl;
1073 const DataType& newDataType = DataType::getDataType(fillValue);
1074 int nAttributesNew = attributeNames.size();
1076 int newDataTypeOrdinal = newDataType.
ordinal();
1081 if (newDataTypeOrdinal != oldDataTypeOrdinal || nAttributesNew != metaData->
getNAttributes())
1085 T* newValues =
new T[nAttributesNew];
1086 for (
int i=0; i<nAttributesNew; ++i)
1087 newValues[i] = fillValue;
1091 for (
int v = 0; v < getNVertices(); ++v)
1092 for (
int lid = 0; lid < getNLayers(); ++lid)
1094 profile = profiles[v][lid];
1097 for (
int n = 0; n < profile->
getNData(); ++n)
1100 data.push_back(Data::getData(newValues, nAttributesNew));
1125 template<
typename T>
1126 void initializeData(
const string& attributeNames,
1127 const string& attributeUnits, T fillValue)
1129 vector<string> names;
1130 CPPUtils::tokenizeString(attributeNames,
";", names);
1131 vector<string> units;
1132 CPPUtils::tokenizeString(attributeUnits,
";", units);
1133 initializeData(names, units, fillValue);
1151 void getWeights(
const vector<double*>& vectors,
1154 map<int, double>& weights);
1167 bool isSupportedFormatVersion(
int frmtVrsn)
1168 {
return (frmtVrsn == 1) ?
true :
false; }
1175 bool testLayerRadii();
1190 void writeModel(
const string& outputFile)
1191 { writeModel(outputFile, getGridFileReference()); }
1202 string getGridFileReference()
const
1217 #endif // GEOTESSMODEL_OBJECT_H