64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
/*
|
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
*/
|
|
|
|
#include <algorithm>
|
|
#include <cmath>
|
|
#include <cstdio>
|
|
|
|
extern "C" {
|
|
#include "nr_common.h"
|
|
}
|
|
|
|
struct rank_scenario_t {
|
|
const char *name;
|
|
float eigenvalues[NR_MAX_NB_LAYERS];
|
|
float noise_power;
|
|
};
|
|
|
|
static uint8_t legacy_rank(const float eigenvalues[NR_MAX_NB_LAYERS])
|
|
{
|
|
uint8_t rank = 1;
|
|
for (int layer = 1; layer < NR_MAX_NB_LAYERS; layer++) {
|
|
if (eigenvalues[layer] <= 0.0f
|
|
|| 10.0f * std::log10(eigenvalues[0] / eigenvalues[layer]) >= 8.0f)
|
|
break;
|
|
rank++;
|
|
}
|
|
return rank;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
const rank_scenario_t scenarios[] = {
|
|
{"dominant_one", {100.0f, 0.01f, 0.01f, 0.01f, 0.01f, 0.01f, 0.01f, 0.01f}, 1.0f},
|
|
{"four_modes", {100.0f, 80.0f, 60.0f, 40.0f, 0.01f, 0.01f, 0.01f, 0.01f}, 1.0f},
|
|
{"eight_modes", {100.0f, 95.0f, 90.0f, 85.0f, 80.0f, 75.0f, 70.0f, 65.0f}, 1.0f},
|
|
{"balanced_low_snr", {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, 10.0f},
|
|
{"legacy_false_high_rank", {1.0f, 0.16f, 0.16f, 0.16f, 0.16f, 0.16f, 0.16f, 0.16f}, 10.0f},
|
|
{"weak_eighth", {100.0f, 90.0f, 80.0f, 70.0f, 60.0f, 50.0f, 40.0f, 5.0f}, 1.0f},
|
|
};
|
|
|
|
std::puts("scenario,policy,selected_rank,selected_capacity_bps_hz");
|
|
for (const rank_scenario_t &scenario : scenarios) {
|
|
float scores[NR_MAX_NB_LAYERS] = {};
|
|
nr_pdsch_rank_capacity_scores(scenario.eigenvalues,
|
|
NR_MAX_NB_LAYERS,
|
|
scenario.noise_power,
|
|
scores);
|
|
const uint8_t capacity_rank = nr_pdsch_select_rank(scores, NR_MAX_NB_LAYERS, 0.05f);
|
|
const uint8_t legacy = legacy_rank(scenario.eigenvalues);
|
|
const uint8_t policies[] = {capacity_rank, legacy, 1, 4, 8};
|
|
const char *policy_names[] = {"capacity", "legacy", "fixed1", "fixed4", "fixed8"};
|
|
for (int policy = 0; policy < 5; policy++) {
|
|
const uint8_t rank = std::min<uint8_t>(policies[policy], NR_MAX_NB_LAYERS);
|
|
std::printf("%s,%s,%u,%.6f\n",
|
|
scenario.name,
|
|
policy_names[policy],
|
|
rank,
|
|
scores[rank - 1]);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|