На прошлой неделе я сказал, что был там. Что ж, на этой неделе я также заинтересовался задачами, которые я должен выполнить на следующей неделе. А именно, переработка того, как работает рандомизация в 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. А именно, наличие генератора, который соответствует концепции генератора унифицированных случайных битов, и все остальные функции могут быть построены поверх него. Не только это, но и для безопасности потоков это не может быть синглтоном, вместо этого, если он нужен классу, он будет добавлен как миксин. Это познакомит вас с рядом интересных проблем, о которых я расскажу на следующей неделе, как только мы их решим.
Это все для сообщения в блоге на этой неделе, до следующего раза.