| |
| |
| |
|
|
| #include <iostream> |
| #include <cassert> |
| #include <cmath> |
| #include <chrono> |
| #include "../include/neuroflow/model.hpp" |
| #include "../include/neuroflow/memory.hpp" |
|
|
| using namespace neuroflow; |
|
|
| void test_model_creation() { |
| std::cout << "Testing model creation..." << std::endl; |
| |
| NeuroFlowModel::Config cfg; |
| cfg.input_dim = 512; |
| cfg.hidden_dim = 256; |
| cfg.output_dim = 10; |
| |
| NeuroFlowModel model(cfg); |
| |
| auto stats = model.get_stats(); |
| std::cout << " Total params: " << stats.total_params << std::endl; |
| std::cout << " Memory (MB): " << stats.memory_bytes / 1024.0 / 1024.0 << std::endl; |
| |
| assert(stats.total_params > 0); |
| |
| std::cout << " PASSED: model creation" << std::endl; |
| } |
|
|
| void test_forward_pass() { |
| std::cout << "Testing forward pass..." << std::endl; |
| |
| NeuroFlowModel::Config cfg; |
| cfg.input_dim = 128; |
| cfg.hidden_dim = 64; |
| cfg.output_dim = 5; |
| cfg.memory_slots = 16; |
| cfg.memory_dim = 32; |
| cfg.num_layers = 1; |
| cfg.num_associations = 4; |
| |
| NeuroFlowModel model(cfg); |
| |
| |
| Tensor input({2, cfg.input_dim}); |
| float* data = input.as_fp32(); |
| for (size_t i = 0; i < input.numel(); ++i) { |
| data[i] = static_cast<float>(std::rand()) / RAND_MAX; |
| } |
| |
| |
| auto output = model.forward(input, nullptr, false, false); |
| |
| assert(output.output.shape_[0] == 2); |
| assert(output.output.shape_[1] == cfg.output_dim); |
| assert(output.decision.shape_[1] == cfg.output_dim); |
| assert(output.value.shape_[1] == 1); |
| |
| std::cout << " Output shape: [" << output.output.shape_[0] << ", " << output.output.shape_[1] << "]" << std::endl; |
| std::cout << " PASSED: forward pass" << std::endl; |
| } |
|
|
| void test_forward_with_manifold() { |
| std::cout << "Testing forward with manifold..." << std::endl; |
| |
| NeuroFlowModel::Config cfg; |
| cfg.input_dim = 128; |
| cfg.hidden_dim = 64; |
| cfg.output_dim = 5; |
| |
| NeuroFlowModel model(cfg); |
| |
| Tensor input({1, cfg.input_dim}); |
| auto output = model.forward(input, nullptr, false, true); |
| |
| assert(output.manifold.shape_[0] == 1); |
| assert(output.manifold.shape_[1] == 32); |
| |
| std::cout << " Manifold shape: [" << output.manifold.shape_[0] << ", " << output.manifold.shape_[1] << "]" << std::endl; |
| std::cout << " PASSED: forward with manifold" << std::endl; |
| } |
|
|
| void test_manifold_trajectory() { |
| std::cout << "Testing manifold trajectory..." << std::endl; |
| |
| NeuroFlowModel::Config cfg; |
| cfg.input_dim = 128; |
| cfg.hidden_dim = 64; |
| cfg.output_dim = 5; |
| |
| NeuroFlowModel model(cfg); |
| |
| Tensor input({1, cfg.input_dim}); |
| auto trajectory = model.get_manifold_trajectory(input, 5); |
| |
| assert(trajectory.size() == 5); |
| for (auto& t : trajectory) { |
| assert(t.shape_[0] == 1); |
| assert(t.shape_[1] == 32); |
| } |
| |
| std::cout << " Trajectory length: " << trajectory.size() << std::endl; |
| std::cout << " PASSED: manifold trajectory" << std::endl; |
| } |
|
|
| void test_memory_module() { |
| std::cout << "Testing memory module..." << std::endl; |
| |
| MemoryConsolidationModule memory(64, 16, 32); |
| |
| |
| Tensor input({2, 64}); |
| float* data = input.as_fp32(); |
| for (size_t i = 0; i < input.numel(); ++i) { |
| data[i] = static_cast<float>(std::rand()) / RAND_MAX; |
| } |
| |
| Tensor encoded = memory.encode(input); |
| assert(encoded.shape_[1] == 32); |
| |
| |
| auto result = memory.retrieve(input); |
| assert(result.retrieved.shape_[1] == 64); |
| assert(result.attention.shape_[1] == 16); |
| |
| std::cout << " Memory slots: " << memory.memory_slots << std::endl; |
| std::cout << " PASSED: memory module" << std::endl; |
| } |
|
|
| void test_memory_consolidation() { |
| std::cout << "Testing memory consolidation..." << std::endl; |
| |
| MemoryConsolidationModule memory(64, 16, 32, 0.1f); |
| |
| |
| for (int i = 0; i < 5; ++i) { |
| Tensor input({1, 64}); |
| float* data = input.as_fp32(); |
| for (size_t j = 0; j < input.numel(); ++j) { |
| data[j] = static_cast<float>(std::rand()) / RAND_MAX; |
| } |
| memory.consolidate(input); |
| } |
| |
| std::cout << " PASSED: memory consolidation" << std::endl; |
| } |
|
|
| void test_mla_cache() { |
| std::cout << "Testing MLA (Latent KV Cache)..." << std::endl; |
| |
| LatentKVCache mla(64, 4, 16, 128); |
| |
| |
| Tensor input({1, 64}); |
| float* data = input.as_fp32(); |
| for (size_t i = 0; i < input.numel(); ++i) { |
| data[i] = static_cast<float>(std::rand()) / RAND_MAX; |
| } |
| |
| Tensor output1 = mla.forward(input, true); |
| size_t cache1 = mla.cache_len; |
| |
| |
| Tensor input2({1, 64}); |
| Tensor output2 = mla.forward(input2, true); |
| size_t cache2 = mla.cache_len; |
| |
| assert(cache2 >= cache1); |
| |
| |
| float saving = mla.memory_saving_ratio(); |
| std::cout << " MLA memory saving: " << saving * 100 << "%" << std::endl; |
| std::cout << " Cache size: " << mla.cache_size_bytes() << " bytes" << std::endl; |
| |
| |
| assert(saving > 0.5f); |
| |
| std::cout << " PASSED: MLA cache" << std::endl; |
| } |
|
|
| void test_quantized_model() { |
| std::cout << "Testing quantized model..." << std::endl; |
| |
| NeuroFlowModel::Config cfg; |
| cfg.input_dim = 128; |
| cfg.hidden_dim = 64; |
| cfg.output_dim = 5; |
| cfg.use_quantization = true; |
| |
| NeuroFlowModel model(cfg); |
| |
| auto stats = model.get_stats(); |
| std::cout << " Quantization ratio: " << stats.quantization_ratio * 100 << "%" << std::endl; |
| |
| |
| Tensor input({2, cfg.input_dim}); |
| auto output = model.forward(input); |
| |
| assert(output.output.shape_[1] == cfg.output_dim); |
| |
| std::cout << " PASSED: quantized model" << std::endl; |
| } |
|
|
| void test_performance_comparison() { |
| std::cout << "Testing performance comparison..." << std::endl; |
| |
| NeuroFlowModel::Config orig_cfg; |
| orig_cfg.input_dim = 512; |
| orig_cfg.hidden_dim = 256; |
| orig_cfg.output_dim = 10; |
| |
| NeuroFlowModel original(orig_cfg); |
| |
| NeuroFlowModel::Config lite_cfg; |
| lite_cfg.input_dim = 512; |
| lite_cfg.hidden_dim = 128; |
| lite_cfg.output_dim = 10; |
| lite_cfg.memory_dim = 64; |
| lite_cfg.memory_slots = 32; |
| lite_cfg.num_layers = 1; |
| lite_cfg.num_associations = 4; |
| lite_cfg.use_quantization = true; |
| |
| NeuroFlowModel lite(lite_cfg); |
| |
| auto orig_stats = original.get_stats(); |
| auto lite_stats = lite.get_stats(); |
| |
| std::cout << " Original params: " << orig_stats.total_params << std::endl; |
| std::cout << " Lite params: " << lite_stats.total_params << std::endl; |
| std::cout << " Size reduction: " << (1.0 - static_cast<double>(lite_stats.total_params) / orig_stats.total_params) * 100 << "%" << std::endl; |
| |
| |
| Tensor input({32, 512}); |
| float* data = input.as_fp32(); |
| for (size_t i = 0; i < input.numel(); ++i) { |
| data[i] = static_cast<float>(std::rand()) / RAND_MAX; |
| } |
| |
| |
| original.forward(input); |
| lite.forward(input); |
| |
| |
| auto start = std::chrono::high_resolution_clock::now(); |
| for (int i = 0; i < 10; ++i) { |
| original.forward(input); |
| } |
| auto end = std::chrono::high_resolution_clock::now(); |
| auto orig_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000.0 / 10; |
| |
| |
| start = std::chrono::high_resolution_clock::now(); |
| for (int i = 0; i < 10; ++i) { |
| lite.forward(input); |
| } |
| end = std::chrono::high_resolution_clock::now(); |
| auto lite_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000.0 / 10; |
| |
| std::cout << " Original time: " << orig_time << " ms" << std::endl; |
| std::cout << " Lite time: " << lite_time << " ms" << std::endl; |
| std::cout << " Speedup: " << orig_time / lite_time << "x" << std::endl; |
| |
| std::cout << " PASSED: performance comparison" << std::endl; |
| } |
|
|
| int main(int argc, char** argv) { |
| std::cout << "========================================" << std::endl; |
| std::cout << "NeuroFlow Core - Model Tests" << std::endl; |
| std::cout << "========================================" << std::endl; |
| |
| test_model_creation(); |
| test_forward_pass(); |
| test_forward_with_manifold(); |
| test_manifold_trajectory(); |
| test_memory_module(); |
| test_memory_consolidation(); |
| test_mla_cache(); |
| test_quantized_model(); |
| test_performance_comparison(); |
| |
| std::cout << "========================================" << std::endl; |
| std::cout << "All tests PASSED!" << std::endl; |
| std::cout << "========================================" << std::endl; |
| |
| return 0; |
| } |