21 #ifndef SRC_TIMING_LOOKUP_TABLE_H_
22 #define SRC_TIMING_LOOKUP_TABLE_H_
24 #include <boost/units/io.hpp>
25 #include <boost/units/systems/si.hpp>
26 #include <boost/units/systems/si/prefixes.hpp>
32 template<
class RowType,
class ColumnType,
class ValueType>
34 std::vector<RowType> m_row_values;
35 std::vector<ColumnType> m_column_values;
36 std::vector<std::vector<ValueType> > m_values;
41 return (m_row_values == lut.m_row_values)&&(m_column_values==lut.m_column_values)&&(m_values==lut.m_values);
44 lookup_table(std::size_t rows=0, std::size_t columns=0) :
45 m_row_values(rows), m_column_values(columns), m_values(rows,
46 std::vector<ValueType>(columns)) {
53 std::size_t row_count()
const {
54 return m_row_values.size();
56 void row_value(std::size_t column, RowType value) {
57 m_row_values[column] = value;
60 RowType row_value(std::size_t column)
const {
61 return m_row_values[column];
64 std::size_t column_count()
const {
65 return m_column_values.size();
68 void column_value(std::size_t row, ColumnType value) {
69 m_column_values[row] = value;
72 ColumnType column_value(std::size_t row)
const {
73 return m_column_values[row];
76 ValueType at(std::size_t row, std::size_t column)
const {
77 return m_values.at(row).at(column);
80 void at(std::size_t row, std::size_t column, ValueType value) {
81 if(row >= m_values.size() || column >= m_values.front().size())
82 std::cout <<
"ERROO!!!" << std::endl;
83 m_values.at(row).at(column) = value;
86 ValueType compute(RowType rv, ColumnType cv)
const {
88 if (m_values.size() == 1)
89 if (m_values.front().size() == 1)
90 return m_values.front().front();
92 double wTransition, wLoad;
97 std::size_t row1, row2, column1, column2;
101 row1 = m_row_values.size() - 2;
102 row2 = m_row_values.size() - 1;
104 y1 = m_row_values[row1];
105 y2 = m_row_values[row2];
108 for (
size_t i = 0; i < m_row_values.size() - 1; i++) {
109 if (rv >= m_row_values[i] && rv <= m_row_values[i + 1]) {
112 y1 = m_row_values[row1];
113 y2 = m_row_values[row2];
118 if (cv < m_column_values[0]) {
121 x1 = m_column_values[column1];
122 x2 = m_column_values[column2];
124 > m_column_values[m_column_values.size() - 1]) {
125 column1 = m_column_values.size() - 2;
126 column2 = m_column_values.size() - 1;
127 x1 = m_column_values[column1];
128 x2 = m_column_values[column2];
130 for (
size_t i = 0; i < m_column_values.size() - 1; i++) {
131 if (cv >= m_column_values[i]
132 && cv <= m_column_values[i + 1]) {
135 x1 = m_column_values[column1];
136 x2 = m_column_values[column2];
142 wTransition = (cv - x1) / (x2 - x1);
143 wLoad = (rv - y1) / (y2 - y1);
145 t[0][0] = m_values[row1][column1];
146 t[0][1] = m_values[row1][column2];
147 t[1][0] = m_values[row2][column1];
148 t[1][1] = m_values[row2][column2];
150 return boost::units::quantity<boost::units::si::time>(((1 - wTransition) * (1 - wLoad) * t[0][0])
151 + (wTransition * (1 - wLoad) * t[0][1])
152 + ((1 - wTransition) * wLoad * t[1][0])
153 + (wTransition * wLoad * t[1][1]));
Definition: lookup_table.h:33