Государственный регистратор для задач оптимизации


Я работаю над проектом C++ для решения класса задач оптимизации. Проект будет только заголовков, и для Теперь, я хотел бы остаться с C++11 (так, не Кратье-выражений).

Чтобы быть в состоянии поддерживать некоторые базовые функции входа, я начал писать ниже класса логгера. Любой комментарий/обратная связь приветствуется. Однако, я хотел бы спросить конкретно про ваши предложения о том, как перестроить код, если на все, чтобы сделать ее более эффективной.

#ifndef LOGGER_HPP_
#define LOGGER_HPP_

#include <chrono>
#include <cstdint>
#include <type_traits>
#include <vector>

namespace utility {
namespace logger {

template <class float_t, bool log_x_v, bool log_g_v> struct logger_t {
  template <class InputIt1, class InputIt2>
  void operator()(const std::size_t k, const float_t fval, InputIt1 xbegin,
                  InputIt1 xend, InputIt2 gbegin, InputIt2 gend) {
    tend = std::chrono::high_resolution_clock::now();
    const auto telapsed =
        std::chrono::duration<float_t, std::chrono::milliseconds::period>(
            tend - tstart);
    iterations.push_back(k);
    times.push_back(telapsed.count());
    fvalues.push_back(fval);
    log_x(xbegin, xend, std::integral_constant<bool, log_x_v>{});
    log_g(gbegin, gend, std::integral_constant<bool, log_g_v>{});
    tstart = std::chrono::high_resolution_clock::now();
  }

private:
  template <class InputIt>
  void log_x(InputIt xbegin, InputIt xend, std::true_type) {
    xvalues.emplace_back(xbegin, xend);
  }
  template <class InputIt> void log_x(InputIt, InputIt, std::false_type) {}
  template <class InputIt>
  void log_g(InputIt gbegin, InputIt gend, std::true_type) {
    gvalues.emplace_back(gbegin, gend);
  }
  template <class InputIt> void log_g(InputIt, InputIt, std::false_type) {}

  std::vector<std::size_t> iterations;
  std::vector<float_t> times;
  std::vector<float_t> fvalues;
  std::vector<std::vector<float_t>> xvalues, gvalues;
  std::chrono::time_point<std::chrono::high_resolution_clock> tstart{
      std::chrono::high_resolution_clock::now()},
      tend;
};

template <class float_t> using value = logger_t<float_t, false, false>;
template <class float_t> using decision = logger_t<float_t, true, false>;
template <class float_t> using gradient = logger_t<float_t, false, true>;
template <class float_t> using full = logger_t<float_t, true, true>;

} // namespace logger
} // namespace utility

#endif

В принципе, класс не полный, еще. Я буду добавлять поддержка итераторов, читать/писать в CSV/двоичных функций и некоторые их фиксацией, позже, чтобы иметь возможность поддерживать поточно-лесозаготовки ценностей внутри регистратора.

Конкретно, что я хотел бы спросить, если мне нужно иметь некоторый уровень абстракции, чтобы сделать неиспользуемые частные переменные-члены исчезают. Тег отправке log_x и log_g функции-члены, кажется, быть в порядке, когда дело доходит до оптимизации пустых вызовов функций, я надеюсь. Но тогда, когда нет в области лесозаготовок необходима для x и gчастные переменные-члены xvalues и gvalues являются избыточными. Я должен заботиться о них, или я должен оставить все как есть ради ремонтопригодности и удобства чтения кода?



Комментарии
1 ответ

Вы могли бы использовать лучшее имя для аргумента шаблона float_tможет value_t

Может быть, вы могли бы объединить обе функции log, так как они очень похожи:

template <typename Container, typename InputIt>
void log(Container &c, InputIt begin, InputIt end, std::true_type) {
c.emplace_back(begin, end);
}

0
ответ дан 28 февраля 2018 в 01:02 Источник Поделиться