Table<V,A>::Table(const std::vector<A>& aa, const std::vector<V>& vv, interpolant in) : iType(in), isReady(false) { v.reserve(aa.size()); if (vv.size() != aa.size()) throw TableError("input vector lengths don't match"); if (iType == spline && vv.size() < 3) throw TableError("input vectors are too short to spline interpolate"); if (vv.size() < 2 && (iType == linear || iType == ceil || iType == floor)) throw TableError("input vectors are too short for interpolation"); typename std::vector<A>::const_iterator aptr=aa.begin(); typename std::vector<V>::const_iterator vptr=vv.begin(); for (size_t i=0; i<aa.size(); i++, ++aptr, ++vptr) { Entry e(*aptr,*vptr); v.push_back(e); } }
void Table<V,A>::setup() const { if (isReady) return; if (v.size() <= 1) throw TableError("Trying to use a null Table (need at least 2 entries)"); sortIt(); lastIndex = 1; // Start back at the beginning for the next search. // See if arguments are equally spaced // ...within this fractional error: const double tolerance = 0.01; dx = (v.back().arg - v.front().arg) / (v.size()-1); if (dx == 0.) throw TableError("First and last Table entry are equal."); equalSpaced = true; for (int i=1; i<int(v.size()); i++) { if ( std::abs( ((v[i].arg-v[0].arg)/dx - i)) > tolerance) equalSpaced = false; if (v[i].arg == v[i-1].arg) throw TableError("Table has repeated arguments."); } switch (iType) { case linear: interpolate = &Table<V,A>::linearInterpolate; break; case spline : setupSpline(); interpolate = &Table<V,A>::splineInterpolate; break; case floor: interpolate = &Table<V,A>::floorInterpolate; break; case ceil: interpolate = &Table<V,A>::ceilInterpolate; break; default: throw TableError("interpolation method not yet implemented"); } isReady = true; }
Table<V,A>::Table(const std::vector<A>& aa, const std::vector<V>& vv, interpolant in) : iType(in), isReady(false) { v.reserve(aa.size()); if (vv.size() != aa.size()) throw TableError("input vector lengths don't match"); typename std::vector<A>::const_iterator aptr=aa.begin(); typename std::vector<V>::const_iterator vptr=vv.begin(); for (size_t i=0; i<aa.size(); i++, ++aptr, ++vptr) { Entry e(*aptr,*vptr); v.push_back(e); } }