За последние две недели я работал над парой вопросов.

Окружающая среда сёгуна

В Shogun было несколько глобальных переменных и глобальных методов для инициализации этих переменных. Таким образом, пользователям пришлось сначала инициализировать глобальную среду, а затем начать использовать shogun, что кажется ненужным:

init_shogun();
// code
exit_shogun();

Мы заменили эти глобальные переменные/методы одноэлементным классом, который их инкапсулирует и устраняет необходимость инициализации и выхода из среды. Вы можете подумать, что синглтон ненамного лучше глобальных переменных! Но, в конце концов, нам нужны эти глобальные переменные, и нам нужен только один экземпляр из них, так что это кажется подходящим вариантом использования.

spdlog и fmtlib

Мы движемся к принятию новых функций C++. Одной из них является библиотека форматирования «fmtlib», которая частично подходит к C++20. Стандартный способ форматирования в C++ — использование iostreams. Проблема в том, что они довольно многословны. Возьмем, к примеру (взято со страницы fmtlib github):

std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n";
// vs
printf("%.2f\n", 1.23456);

Таким образом, мы фактически используем sprintf для форматирования. Проблема в том, что возможности регистрации SGIO (класс ввода-вывода сёгуна) ограничены в том смысле, что трудно перенаправить вывод в разные потоки. Здесь сияет spdlog, удивительно гибкая и быстрая библиотека ведения журналов, использующая «fmtlib». Теперь пользователи могут перенаправлять потоки с помощью гибкого интерфейса приемника spdlog.

Чтобы работать над этим, мне пришлось сначала включить эту библиотеку в кодовую базу, используя CMake, инструмент сборки, который мы используем. Удивительно, но это был самый трудоемкий шаг! CMake был для меня чертовски запутанным беспорядком!

Заключительные замечания

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