33#ifndef _USE_MATH_DEFINES
34#define _USE_MATH_DEFINES
63 return gcd(iB, iA % iB);
74 for (qint32 i = 0; i < n; ++i) {
88 int t_iNumOfCombination =
static_cast<int>(n * (n - 1) * 0.5);
90 return t_iNumOfCombination;
99 const double a = 0.5 * dof;
100 auto upperTail = [a](
double chi2) {
101 const double x = 0.5 * chi2;
104 for (
int n = 1; n < 100000 && term > 1e-17 * sum; ++n) {
108 return 1.0 - sum * std::exp(a * std::log(x) - x - std::lgamma(a + 1.0));
111 double hi = dof + 10.0 * std::sqrt(2.0 * dof) + 50.0;
112 while (upperTail(hi) > p)
114 for (
int i = 0; i < 200 && hi - lo > 1e-14 * hi; ++i) {
115 const double mid = 0.5 * (lo + hi);
116 (upperTail(mid) > p ? lo : hi) = mid;
118 return 0.5 * (lo + hi);
124 const RowVectorXf& times,
125 const QPair<float, float>& baseline,
128 return rescale(data, times, std::pair<float, float>(baseline.first, baseline.second), mode.toStdString());
134 const RowVectorXf& times,
135 const std::pair<float, float>& baseline,
136 const std::string& mode)
138 MatrixXd data_out = data;
139 const QStringList valid_modes{
"logratio",
"ratio",
"zscore",
"mean",
"percent"};
140 if (!valid_modes.contains(QString::fromStdString(mode))) {
141 qWarning().noquote() <<
"[Numerics::rescale] Mode" << mode.c_str() <<
"is not supported. Supported modes are:" << valid_modes <<
"Returning input data.";
145 qInfo().noquote() << QString(
"[Numerics::rescale] Applying baseline correction ... (mode: %1)").arg(mode.c_str());
148 qint32 imax = times.size();
150 if (baseline.second == baseline.first) {
153 float bmin = baseline.first;
154 for (qint32 i = 0; i < times.size(); ++i) {
155 if (times[i] >= bmin) {
162 float bmax = baseline.second;
164 if (baseline.second == baseline.first) {
168 for (qint32 i = times.size() - 1; i >= 0; --i) {
169 if (times[i] <= bmax) {
176 qWarning() <<
"[Numerics::rescale] imax < imin. Returning input data.";
180 VectorXd mean = data_out.block(0, imin, data_out.rows(), imax - imin).rowwise().mean();
181 if (mode.compare(
"mean") == 0) {
182 data_out -= mean.rowwise().replicate(data.cols());
183 }
else if (mode.compare(
"logratio") == 0) {
184 for (qint32 i = 0; i < data_out.rows(); ++i)
185 for (qint32 j = 0; j < data_out.cols(); ++j)
186 data_out(i, j) = log10(data_out(i, j) / mean[i]);
187 }
else if (mode.compare(
"ratio") == 0) {
188 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
189 }
else if (mode.compare(
"zscore") == 0) {
190 MatrixXd std_mat = data.block(0, imin, data.rows(), imax - imin) - mean.rowwise().replicate(imax - imin);
191 std_mat = std_mat.cwiseProduct(std_mat);
192 VectorXd std_v = std_mat.rowwise().mean();
193 for (qint32 i = 0; i < std_v.size(); ++i)
194 std_v[i] = sqrt(std_v[i]);
196 data_out -= mean.rowwise().replicate(data_out.cols());
197 data_out = data_out.cwiseQuotient(std_v.rowwise().replicate(data_out.cols()));
198 }
else if (mode.compare(
"percent") == 0) {
199 data_out -= mean.rowwise().replicate(data_out.cols());
200 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
General numerical helpers: GCD, log2, histogram binning, baseline rescaling, sparsity tests.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
static int gcd(int iA, int iB)
static double chi2Isf(double p, int dof)
static bool issparse(Eigen::VectorXd &v)
static Eigen::MatrixXd rescale(const Eigen::MatrixXd &data, const Eigen::RowVectorXf ×, const QPair< float, float > &baseline, QString mode)
static int nchoose2(int n)