STATIC MYBOOL finalize_scaling(lprec *lp, REAL *scaledelta) { int i; /* Check if we should equilibrate */ if(is_scalemode(lp, SCALE_EQUILIBRATE) && !is_scaletype(lp, SCALE_CURTISREID)) { int oldmode; oldmode = lp->scalemode; lp->scalemode = SCALE_LINEAR + SCALE_EXTREME; scale(lp, scaledelta); lp->scalemode = oldmode; } /* Check if we should prevent rounding errors */ if(is_scalemode(lp, SCALE_POWER2)) { REAL *scalars; if(scaledelta == NULL) scalars = lp->scalars; else scalars = scaledelta; for(i = 0; i <= lp->sum; i++) scalars[i] = roundPower2(scalars[i]); } /* Then transfer the scalars to the model's data */ return( scale_rows(lp, scaledelta) && scale_columns(lp, scaledelta) ); }
template <typename T, typename X> bool scaler<T, X>::scale_with_log_balance() { T balance = get_balance(); T balance_before_scaling = balance; // todo : analyze the scale order : rows-columns, or columns-rows. Iterate if needed for (int i = 0; i < 10; i++) { scale_rows(); scale_columns(); T nb = get_balance(); if (nb < T(0.9) * balance) { balance = nb; } else { balance = nb; break; } } return balance <= balance_before_scaling; }
void scale_columns ( tensor& out, const tensor& m, const tensor& v ) { DLIB_CASSERT(have_same_dimensions(out,m)); DLIB_CASSERT(is_vector(v)); if (m.size() == 0 && v.size() == 0) return; DLIB_CASSERT(m.size() != 0); DLIB_CASSERT(m.size()/m.num_samples() == v.size()); #ifdef DLIB_USE_CUDA cuda::scale_columns(out, m, v); #else DLIB_CASSERT(false, "shouldn't be called right now"); out = scale_columns(mat(m), mat(v)); #endif }