16#include <serializer.h>
17#include <initializer_list>
24 : DataTable(false, false)
28DataTable::DataTable(
bool allowDuplicates)
29 : DataTable(allowDuplicates, false)
33DataTable::DataTable(
bool allowDuplicates,
bool allowIncompleteGrid)
34 : allowDuplicates(allowDuplicates),
35 allowIncompleteGrid(allowIncompleteGrid),
41DataTable::DataTable(
const char* fileName)
42 : DataTable(std::string(fileName))
46DataTable::DataTable(
const std::string& fileName)
51void DataTable::addSample(
double x,
double y)
53 addSample(DataPoint(x, y));
56void DataTable::addSample(std::vector<double> x,
double y)
58 addSample(DataPoint(x, y));
61void DataTable::addSample(DenseVector x,
double y)
63 addSample(DataPoint(x, y));
66void DataTable::addSample(
const DataPoint& sample)
68 if (getNumSamples() == 0)
70 numVariables = sample.getDimX();
74 if (sample.getDimX() != numVariables)
76 throw Exception(
"Datatable::addSample: Dimension of new sample is inconsistent with previous samples!");
80 if (samples.count(sample) > 0)
85 Foam::Info <<
"Discarding duplicate sample because allowDuplicates is false!" <<
87 Foam::Info <<
"Initialise with DataTable(true) to set it to true." << Foam::endl;
95 samples.insert(sample);
96 recordGridPoint(sample);
99void DataTable::addSample(std::initializer_list<DataPoint> samples)
101 for (
auto & sample : samples)
107void DataTable::recordGridPoint(
const DataPoint& sample)
109 for (
unsigned int i = 0; i < getNumVariables(); i++)
111 grid.at(i).insert(sample.getX().at(i));
115unsigned int DataTable::getNumSamplesRequired()
const
117 unsigned long samplesRequired = 1;
120 for (
auto & variable : grid)
122 samplesRequired *= (
unsigned long) variable.size();
126 return (i > 0 ? samplesRequired : (
unsigned long) 0);
129bool DataTable::isGridComplete()
const
131 return samples.size() > 0
132 && samples.size() - numDuplicates == getNumSamplesRequired();
135void DataTable::initDataStructures()
137 for (
unsigned int i = 0; i < getNumVariables(); i++)
139 grid.push_back(std::set<double>());
143void DataTable::gridCompleteGuard()
const
145 if (!(isGridComplete() || allowIncompleteGrid))
147 throw Exception(
"DataTable::gridCompleteGuard: The grid is not complete yet!");
151void DataTable::save(
const std::string& fileName)
const
155 s.saveToFile(fileName);
158void DataTable::load(
const std::string& fileName)
160 Serializer s(fileName);
161 s.deserialize(*
this);
167std::multiset<DataPoint>::const_iterator DataTable::cbegin()
const
169 return samples.cbegin();
172std::multiset<DataPoint>::const_iterator DataTable::cend()
const
174 return samples.cend();
181std::vector< std::vector<double >> DataTable::getTableX()
const
185 std::vector<std::vector<double >> table;
187 for (
unsigned int i = 0; i < numVariables; i++)
189 std::vector<double> xi(getNumSamples(), 0.0);
196 for (
auto & sample : samples)
198 std::vector<double> x = sample.getX();
200 for (
unsigned int j = 0; j < numVariables; j++)
202 table.at(j).at(i) = x.at(j);
212std::vector<double> DataTable::getVectorY()
const
214 std::vector<double> y;
216 for (std::multiset<DataPoint>::const_iterator it = cbegin(); it != cend(); ++it)
218 y.push_back(it->getY());
224DataTable operator+(
const DataTable& lhs,
const DataTable& rhs)
226 if (lhs.getNumVariables() != rhs.getNumVariables())
228 throw Exception(
"operator+(DataTable, DataTable): trying to add two DataTable's of different dimensions!");
233 for (
auto it = lhs.cbegin(); it != lhs.cend(); it++)
235 result.addSample(* it);
238 for (
auto it = rhs.cbegin(); it != rhs.cend(); it++)
240 result.addSample(* it);
246DataTable operator-(
const DataTable& lhs,
const DataTable& rhs)
248 if (lhs.getNumVariables() != rhs.getNumVariables())
250 throw Exception(
"operator-(DataTable, DataTable): trying to subtract two DataTable's of different dimensions!");
254 auto rhsSamples = rhs.getSamples();
257 for (
auto it = lhs.cbegin(); it != lhs.cend(); it++)
259 if (rhsSamples.count(* it) == 0)
261 result.addSample(* it);