На прошлой неделе я сказал, что был там. Что ж, на этой неделе я также заинтересовался задачами, которые я должен выполнить на следующей неделе. А именно, переработка того, как работает рандомизация в Shogun. До сих пор моя работа заключалась в решении дизайнерских задач, что меня очень интригует. Итак, давайте представим главные из них этой недели.

Более простой API функций

Текущий API содержит такие методы, как:

float64_t dense_dot(int32_t vec_idx1, const float64_t* vec2, int32_t vec2_len) const;
void dense_dot_range(float64_t* output, int32_t start, int32_t stop, float64_t* alphas, float64_t* vec, int32_t dim, float64_t b) const;
void dense_dot_range_subset(int32_t* sub_index, int32_t num, float64_t* output, float64_t* alphas, float64_t* vec, int32_t dim, float64_t b) const;

Где dense_dot выполняет скалярное произведение между вектором признаков индекса vec_idx1 и вектором vec2 размера vec2_len. И dense_dot_range выполняет множественное скалярное произведение векторов признаков в диапазоне[start, end) И третий метод аналогичен второму, но на подмножестве вместо диапазона. Мы хотим избавиться от них и иметь только:

float64_t dot(int32_t vec_idx1, const SGVector<float64_t> vec2) const;
SGVector<ST> dot(const SGVector<ST>& other) const;

Здесь второй метод выполняет скалярное произведение между всеми векторами признаков и вектором other. И если мы хотим сделать это только с диапазоном, мы создаем «представление», которое содержит только интересующие нас векторы.

view(features, IntRange(start, end)).dot(vec);
view(features, subset_indices_vector).dot(vec);

Это приведет к более чистому API с той же функциональностью.

C++20-подобный PRNG

В Shogun есть класс CRandom, который не только действует как генератор псевдослучайных чисел, но также предоставляет множество других функций, таких как заполнение массива случайными числами, выборка из нормального распределения и многое другое. Существует единственный объект CRandom sg_rand, который все классы используют для удовлетворения своих потребностей.

Мы хотим избавиться от этого большого класса и вместо этого сделать то, что делает C++20. А именно, наличие генератора, который соответствует концепции генератора унифицированных случайных битов, и все остальные функции могут быть построены поверх него. Не только это, но и для безопасности потоков это не может быть синглтоном, вместо этого, если он нужен классу, он будет добавлен как миксин. Это познакомит вас с рядом интересных проблем, о которых я расскажу на следующей неделе, как только мы их решим.

Это все для сообщения в блоге на этой неделе, до следующего раза.