@Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        ResultGroup group = resultGroups.get(rowIndex);

        switch (columnIndex) {
        case 0:
            return group.toString();
        case 1:
            return result.getValue(group.minIteration);
        case 2:
            return String.format("%.4f", costFunction.result(result.getValue(group.minIteration)).cost);
        case 3:
            return String.format("%.4f", costFunction.result(result.getValue(group.minIteration)).averageSystemTime);
        case 4:
            return String.format("%.4f", costFunction.result(result.getValue(group.minIteration)).averageSystemCalls);
        case 5:
            return String.format("%.4f", costFunction.result(result.getValue(group.minIteration)).averageQueueTime);
        case 6:
            return String.format("%.4f", costFunction.result(result.getValue(group.minIteration)).averageQueueCalls);
        case 7:
            return result.getTimeOffset(group.minIteration);
        default:
            throw new RuntimeException("invalid row index");
        }
    }