neoml-lib/neoml

Clamp proposal

Closed this issue · 4 comments

Раз PR вы не принимаете, оформлю как issue.
Сделайте в namespace NeoML себе что-то такое и перестаньте писать многоэтажные сравнения:

#if __cplusplus >= 201703L
using std::clamp;
#else
template<typename T, typename Compare = std::less<T>> constexpr const T& clamp(const T &v, const T &lo, const T &hi, Compare comp = Compare()) {
    return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
}
#endif

Идея хорошая, но где именно нашлось столько многоэтажных сравнений?

Просто по некоторым причинам нам лучше минимизировать использование std:: вне NeoMathEngine.

if( element >= static_cast<int64_t>( INT_MAX ) ) {
value.Add( INT_MAX );
} else if( element <= static_cast<int64_t>( INT_MIN ) ) {
value.Add( INT_MIN );
} else {
value.Add( static_cast<int>( element ) );
}

if( element >= static_cast<int64_t>( INT_MAX ) ) {
value.Add( INT_MAX );
} else if( element <= static_cast<int64_t>( INT_MIN ) ) {
value.Add( INT_MIN );
} else {
value.Add( static_cast<int>( element ) );
}

if( value >= static_cast<TSrc>( (std::numeric_limits<TDst>::max)() ) ) {
dest[i] = (std::numeric_limits<TDst>::max)();
} else if( value <= static_cast<TSrc>( (std::numeric_limits<TDst>::lowest)() ) ) {
dest[i] = (std::numeric_limits<TDst>::lowest)();
} else {
dest[i] = static_cast<TDst>( value );
}

if( value >= static_cast<int64_t>( (std::numeric_limits<T>::max)() ) ) {
buffer[valueIndex] = (std::numeric_limits<T>::max)();
} else if( value <= static_cast<int64_t>( (std::numeric_limits<T>::lowest)() ) ) {
buffer[valueIndex] = (std::numeric_limits<T>::lowest)();
} else {
buffer[valueIndex] = static_cast<T>( value );
}

Бонус:
if( value >= static_cast<uint64_t>( std::numeric_limits<T>::max() ) ) {
buffer[valueIndex] = std::numeric_limits<T>::max();
} else {
buffer[valueIndex] = static_cast<T>( value );
}

Это - std::min

Любопытно, бОльшая часть STL это headers-only шаблоны, т.е. runtime-зависимости они не добавляют или у вас есть платформы где есть C++ компилятор но нет стандартной библиотеки? Поделитесь печалью.

P.S. Нет бога кроме С++ без STL и Страуструп - пророк его.

Можете переизобрести "велосипед" std::less и получится обойтись без std::...

Причиной, по некоторым причинам, предпочту не делиться)

Но в NeoOnnx думаю можно добавить clamp даже с std::