/** * Test: End-to-end solve from C * * Creates a simple cycle and solves it. */ #include #include #include #include #include "entropyk.h" int main() { printf("Test: End-to-end solve\n"); /* Create system */ printf(" Creating system... "); EntropykSystem* sys = entropyk_system_create(); assert(sys != NULL); printf("OK\n"); /* Create components */ printf(" Creating components... "); double coeffs[10] = {0.85, 2.5, 500.0, 1500.0, -2.5, 1.8, 600.0, 1600.0, -3.0, 2.0}; EntropykComponent* comp = entropyk_compressor_create(coeffs, 10); EntropykComponent* cond = entropyk_condenser_create(5000.0); EntropykComponent* valve = entropyk_expansion_valve_create(); EntropykComponent* evap = entropyk_evaporator_create(3000.0); assert(comp && cond && valve && evap); printf("OK\n"); /* Add components (returns node index) */ printf(" Adding components... "); unsigned int comp_idx = entropyk_system_add_component(sys, comp); unsigned int cond_idx = entropyk_system_add_component(sys, cond); unsigned int valve_idx = entropyk_system_add_component(sys, valve); unsigned int evap_idx = entropyk_system_add_component(sys, evap); assert(comp_idx != UINT32_MAX); assert(cond_idx != UINT32_MAX); assert(valve_idx != UINT32_MAX); assert(evap_idx != UINT32_MAX); printf("OK (indices: %u, %u, %u, %u)\n", comp_idx, cond_idx, valve_idx, evap_idx); /* Verify counts */ printf(" Verifying node count... "); assert(entropyk_system_node_count(sys) == 4); printf("OK\n"); /* Add edges */ printf(" Adding edges... "); EntropykErrorCode err; err = entropyk_system_add_edge(sys, comp_idx, cond_idx); assert(err == ENTROPYK_OK); err = entropyk_system_add_edge(sys, cond_idx, valve_idx); assert(err == ENTROPYK_OK); err = entropyk_system_add_edge(sys, valve_idx, evap_idx); assert(err == ENTROPYK_OK); err = entropyk_system_add_edge(sys, evap_idx, comp_idx); assert(err == ENTROPYK_OK); printf("OK\n"); /* Verify edge count */ printf(" Verifying edge count... "); assert(entropyk_system_edge_count(sys) == 4); printf("OK\n"); /* Finalize */ printf(" Finalizing system... "); err = entropyk_system_finalize(sys); /* Empty system might fail to finalize - check but don't assert */ if (err != ENTROPYK_OK) { printf("Note: Finalize returned %d (expected for empty component stubs)\n", err); } else { printf("OK\n"); } /* Configure solver */ printf(" Configuring solver... "); EntropykFallbackConfig config = { .newton = { .max_iterations = 100, .tolerance = 1e-6, .line_search = false, .timeout_ms = 0 }, .picard = { .max_iterations = 500, .tolerance = 1e-4, .relaxation = 0.5 } }; printf("OK\n"); /* Solve (may not converge with stub components) */ printf(" Attempting solve... "); EntropykSolverResult* result = NULL; err = entropyk_solve_fallback(sys, &config, &result); if (err == ENTROPYK_OK && result != NULL) { printf("OK\n"); printf("Status: %d\n", entropyk_result_get_status(result)); printf(" Iterations: %u\n", entropyk_result_get_iterations(result)); printf(" Residual: %.2e\n", entropyk_result_get_residual(result)); entropyk_result_free(result); } else { printf("Error: %s (expected with stub components)\n", entropyk_error_string(err)); } /* Cleanup */ printf(" Cleaning up... "); entropyk_system_free(sys); printf("OK\n"); printf("End-to-end solve test PASSED\n"); return 0; }