cwenzi/neuroflow-cpp
1
1/**2 * NeuroFlow Core Tests - Model Tests3 */4 5#include <iostream>6#include <cassert>7#include <cmath>8#include <chrono>9#include "../include/neuroflow/model.hpp"10#include "../include/neuroflow/memory.hpp"11 12using namespace neuroflow;13 14void test_model_creation() {15 std::cout << "Testing model creation..." << std::endl;16 17 NeuroFlowModel::Config cfg;18 cfg.input_dim = 512;19 cfg.hidden_dim = 256;20 cfg.output_dim = 10;21 22 NeuroFlowModel model(cfg);23 24 auto stats = model.get_stats();25 std::cout << " Total params: " << stats.total_params << std::endl;26 std::cout << " Memory (MB): " << stats.memory_bytes / 1024.0 / 1024.0 << std::endl;27 28 assert(stats.total_params > 0);29 30 std::cout << " PASSED: model creation" << std::endl;31}32 33void test_forward_pass() {34 std::cout << "Testing forward pass..." << std::endl;35 36 NeuroFlowModel::Config cfg;37 cfg.input_dim = 128;38 cfg.hidden_dim = 64;39 cfg.output_dim = 5;40 cfg.memory_slots = 16;41 cfg.memory_dim = 32;42 cfg.num_layers = 1;43 cfg.num_associations = 4;44 45 NeuroFlowModel model(cfg);46 47 // 创建输入48 Tensor input({2, cfg.input_dim});49 float* data = input.as_fp32();50 for (size_t i = 0; i < input.numel(); ++i) {51 data[i] = static_cast<float>(std::rand()) / RAND_MAX;52 }53 54 // 前向传播55 auto output = model.forward(input, nullptr, false, false);56 57 assert(output.output.shape_[0] == 2);58 assert(output.output.shape_[1] == cfg.output_dim);59 assert(output.decision.shape_[1] == cfg.output_dim);60 assert(output.value.shape_[1] == 1);61 62 std::cout << " Output shape: [" << output.output.shape_[0] << ", " << output.output.shape_[1] << "]" << std::endl;63 std::cout << " PASSED: forward pass" << std::endl;64}65 66void test_forward_with_manifold() {67 std::cout << "Testing forward with manifold..." << std::endl;68 69 NeuroFlowModel::Config cfg;70 cfg.input_dim = 128;71 cfg.hidden_dim = 64;72 cfg.output_dim = 5;73 74 NeuroFlowModel model(cfg);75 76 Tensor input({1, cfg.input_dim});77 auto output = model.forward(input, nullptr, false, true);78 79 assert(output.manifold.shape_[0] == 1);80 assert(output.manifold.shape_[1] == 32);81 82 std::cout << " Manifold shape: [" << output.manifold.shape_[0] << ", " << output.manifold.shape_[1] << "]" << std::endl;83 std::cout << " PASSED: forward with manifold" << std::endl;84}85 86void test_manifold_trajectory() {87 std::cout << "Testing manifold trajectory..." << std::endl;88 89 NeuroFlowModel::Config cfg;90 cfg.input_dim = 128;91 cfg.hidden_dim = 64;92 cfg.output_dim = 5;93 94 NeuroFlowModel model(cfg);95 96 Tensor input({1, cfg.input_dim});97 auto trajectory = model.get_manifold_trajectory(input, 5);98 99 assert(trajectory.size() == 5);100 for (auto& t : trajectory) {101 assert(t.shape_[0] == 1);102 assert(t.shape_[1] == 32);103 }104 105 std::cout << " Trajectory length: " << trajectory.size() << std::endl;106 std::cout << " PASSED: manifold trajectory" << std::endl;107}108 109void test_memory_module() {110 std::cout << "Testing memory module..." << std::endl;111 112 MemoryConsolidationModule memory(64, 16, 32);113 114 // 编码115 Tensor input({2, 64});116 float* data = input.as_fp32();117 for (size_t i = 0; i < input.numel(); ++i) {118 data[i] = static_cast<float>(std::rand()) / RAND_MAX;119 }120 121 Tensor encoded = memory.encode(input);122 assert(encoded.shape_[1] == 32);123 124 // 检索125 auto result = memory.retrieve(input);126 assert(result.retrieved.shape_[1] == 64);127 assert(result.attention.shape_[1] == 16);128 129 std::cout << " Memory slots: " << memory.memory_slots << std::endl;130 std::cout << " PASSED: memory module" << std::endl;131}132 133void test_memory_consolidation() {134 std::cout << "Testing memory consolidation..." << std::endl;135 136 MemoryConsolidationModule memory(64, 16, 32, 0.1f);137 138 // 多次巩固139 for (int i = 0; i < 5; ++i) {140 Tensor input({1, 64});141 float* data = input.as_fp32();142 for (size_t j = 0; j < input.numel(); ++j) {143 data[j] = static_cast<float>(std::rand()) / RAND_MAX;144 }145 memory.consolidate(input);146 }147 148 std::cout << " PASSED: memory consolidation" << std::endl;149}150 151void test_mla_cache() {152 std::cout << "Testing MLA (Latent KV Cache)..." << std::endl;153 154 LatentKVCache mla(64, 4, 16, 128); // model_dim=64, heads=4, latent=16155 156 // 第一次前向157 Tensor input({1, 64});158 float* data = input.as_fp32();159 for (size_t i = 0; i < input.numel(); ++i) {160 data[i] = static_cast<float>(std::rand()) / RAND_MAX;161 }162 163 Tensor output1 = mla.forward(input, true);164 size_t cache1 = mla.cache_len;165 166 // 第二次前向 (cache应该增长)167 Tensor input2({1, 64});168 Tensor output2 = mla.forward(input2, true);169 size_t cache2 = mla.cache_len;170 171 assert(cache2 >= cache1);172 173 // 检查内存节省比例174 float saving = mla.memory_saving_ratio();175 std::cout << " MLA memory saving: " << saving * 100 << "%" << std::endl;176 std::cout << " Cache size: " << mla.cache_size_bytes() << " bytes" << std::endl;177 178 // MLA应该节省至少50%179 assert(saving > 0.5f);180 181 std::cout << " PASSED: MLA cache" << std::endl;182}183 184void test_quantized_model() {185 std::cout << "Testing quantized model..." << std::endl;186 187 NeuroFlowModel::Config cfg;188 cfg.input_dim = 128;189 cfg.hidden_dim = 64;190 cfg.output_dim = 5;191 cfg.use_quantization = true;192 193 NeuroFlowModel model(cfg);194 195 auto stats = model.get_stats();196 std::cout << " Quantization ratio: " << stats.quantization_ratio * 100 << "%" << std::endl;197 198 // 前向传播应该仍然工作199 Tensor input({2, cfg.input_dim});200 auto output = model.forward(input);201 202 assert(output.output.shape_[1] == cfg.output_dim);203 204 std::cout << " PASSED: quantized model" << std::endl;205}206 207void test_performance_comparison() {208 std::cout << "Testing performance comparison..." << std::endl;209 210 NeuroFlowModel::Config orig_cfg;211 orig_cfg.input_dim = 512;212 orig_cfg.hidden_dim = 256;213 orig_cfg.output_dim = 10;214 215 NeuroFlowModel original(orig_cfg);216 217 NeuroFlowModel::Config lite_cfg;218 lite_cfg.input_dim = 512;219 lite_cfg.hidden_dim = 128;220 lite_cfg.output_dim = 10;221 lite_cfg.memory_dim = 64;222 lite_cfg.memory_slots = 32;223 lite_cfg.num_layers = 1;224 lite_cfg.num_associations = 4;225 lite_cfg.use_quantization = true;226 227 NeuroFlowModel lite(lite_cfg);228 229 auto orig_stats = original.get_stats();230 auto lite_stats = lite.get_stats();231 232 std::cout << " Original params: " << orig_stats.total_params << std::endl;233 std::cout << " Lite params: " << lite_stats.total_params << std::endl;234 std::cout << " Size reduction: " << (1.0 - static_cast<double>(lite_stats.total_params) / orig_stats.total_params) * 100 << "%" << std::endl;235 236 // 性能测试237 Tensor input({32, 512});238 float* data = input.as_fp32();239 for (size_t i = 0; i < input.numel(); ++i) {240 data[i] = static_cast<float>(std::rand()) / RAND_MAX;241 }242 243 // 预热244 original.forward(input);245 lite.forward(input);246 247 // 原始模型248 auto start = std::chrono::high_resolution_clock::now();249 for (int i = 0; i < 10; ++i) {250 original.forward(input);251 }252 auto end = std::chrono::high_resolution_clock::now();253 auto orig_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000.0 / 10;254 255 // Lite模型256 start = std::chrono::high_resolution_clock::now();257 for (int i = 0; i < 10; ++i) {258 lite.forward(input);259 }260 end = std::chrono::high_resolution_clock::now();261 auto lite_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000.0 / 10;262 263 std::cout << " Original time: " << orig_time << " ms" << std::endl;264 std::cout << " Lite time: " << lite_time << " ms" << std::endl;265 std::cout << " Speedup: " << orig_time / lite_time << "x" << std::endl;266 267 std::cout << " PASSED: performance comparison" << std::endl;268}269 270int main(int argc, char** argv) {271 std::cout << "========================================" << std::endl;272 std::cout << "NeuroFlow Core - Model Tests" << std::endl;273 std::cout << "========================================" << std::endl;274 275 test_model_creation();276 test_forward_pass();277 test_forward_with_manifold();278 test_manifold_trajectory();279 test_memory_module();280 test_memory_consolidation();281 test_mla_cache();282 test_quantized_model();283 test_performance_comparison();284 285 std::cout << "========================================" << std::endl;286 std::cout << "All tests PASSED!" << std::endl;287 std::cout << "========================================" << std::endl;288 289 return 0;290}