This example shows how to implement a virtual container for embedded lattice points that can be used by simulation software.
#ifndef EMBEDDED_LATTICE_POINTS_H
#define EMBEDDED_LATTICE_POINTS_H
class EmbeddedLatticePoints {
public:
typedef std::vector<double> value_type;
typedef size_t size_type;
EmbeddedLatticePoints(size_type base, size_type maxLevel, std::vector<unsigned long> gen):
m_base(base),
m_maxLevel(maxLevel),
m_intGen(std::move(gen)),
m_gen(m_intGen.size())
{ reset(); }
void reset() { m_level = 0; m_numPoints = 1; updateGen(); }
void extend() { m_level++; m_numPoints *= m_base; updateGen(); }
size_type base() const { return m_base; }
size_type maxLevel() const { return m_maxLevel; }
size_type level() const { return m_level; }
size_type numPoints() const { return m_numPoints; }
size_type size() const { return numPoints() <= 1 ? numPoints() : (base() - 1) * numPoints() / base(); }
size_type dimension() const { return m_gen.size(); }
value_type operator[](size_type i) const
{
std::vector<double> point(dimension());
for (size_type j = 0; j < point.size(); j++) {
double x = map(i) * m_gen[j];
point[j] = x - int(x);
}
return point;
}
private:
size_type m_base;
size_type m_maxLevel;
std::vector<unsigned long> m_intGen;
std::vector<double> m_gen;
size_type m_numPoints;
size_type m_level;
size_type map(size_type i) const { return numPoints() <= 1 ? i : (base() + 1) * (i + 1) / base(); }
void updateGen()
{
for (size_type j = 0; j < m_gen.size(); j++)
m_gen[j] = double(m_intGen[j]) / m_numPoints;
}
};
#endif