#include <stdio.h>
#include <math.h>
#include "exp_rs.h"
#include "common_allocator.h"
int main() {
init_memory_tracking();
printf("=== Pattern Isolation Test ===\n\n");
ExprContext* ctx = expr_context_new();
if (!ctx) {
printf("Failed to create context\n");
return 1;
}
printf("1. Context created (shared native functions only):\n");
printf(" - Expression functions are now batch-specific only\n");
printf("\n2. Creating pattern channels with unique functions:\n");
ExprBatch* audio_pattern = expr_batch_new(16384);
expr_batch_add_expression_function(audio_pattern, "amplify", "signal,gain", "signal*gain");
expr_batch_add_expression_function(audio_pattern, "fade", "signal,factor", "signal*factor");
expr_batch_add_expression_function(audio_pattern, "mix", "a,b,ratio", "a*(1-ratio)+b*ratio");
expr_batch_add_expression_function(audio_pattern, "normalize", "x,min,max", "(x-min)/(max-min)");
printf(" - Audio pattern: amplify, fade, mix, normalize\n");
ExprBatch* video_pattern = expr_batch_new(16384);
expr_batch_add_expression_function(video_pattern, "brightness", "pixel,factor", "min(pixel*factor,1)");
expr_batch_add_expression_function(video_pattern, "contrast", "pixel,factor", "((pixel-0.5)*factor)+0.5");
expr_batch_add_expression_function(video_pattern, "gamma", "pixel,g", "pixel^(1/g)");
expr_batch_add_expression_function(video_pattern, "normalize", "x,min,max", "(x-min)/(max-min)");
printf(" - Video pattern: brightness, contrast, gamma, normalize\n");
ExprBatch* sensor_pattern = expr_batch_new(16384);
expr_batch_add_expression_function(sensor_pattern, "smooth", "prev,curr,alpha", "prev*(1-alpha)+curr*alpha");
expr_batch_add_expression_function(sensor_pattern, "threshold", "value,thresh", "value>thresh?1:0");
expr_batch_add_expression_function(sensor_pattern, "scale", "value,factor,offset", "value*factor+offset");
expr_batch_add_expression_function(sensor_pattern, "normalize", "x,min,max", "(x-min)/(max-min)");
printf(" - Sensor pattern: smooth, threshold, scale, normalize\n");
printf("\n3. Testing pattern-specific functions:\n");
expr_batch_add_variable(audio_pattern, "input", 0.5);
expr_batch_add_expression(audio_pattern, "amplify(input, 2.0)");
expr_batch_add_expression(audio_pattern, "fade(input, 0.7)");
expr_batch_add_expression(audio_pattern, "mix(0.3, 0.8, 0.4)");
expr_batch_evaluate(audio_pattern, ctx);
printf(" Audio results:\n");
printf(" - amplify(0.5, 2.0) = %.2f (expected 1.00)\n", expr_batch_get_result(audio_pattern, 0));
printf(" - fade(0.5, 0.7) = %.2f (expected 0.35)\n", expr_batch_get_result(audio_pattern, 1));
printf(" - mix(0.3, 0.8, 0.4) = %.2f (expected 0.50)\n", expr_batch_get_result(audio_pattern, 2));
expr_batch_add_variable(video_pattern, "pixel", 0.6);
expr_batch_add_expression(video_pattern, "brightness(pixel, 1.5)");
expr_batch_add_expression(video_pattern, "contrast(pixel, 2.0)");
expr_batch_add_expression(video_pattern, "gamma(0.5, 2.2)");
expr_batch_evaluate(video_pattern, ctx);
printf("\n Video results:\n");
printf(" - brightness(0.6, 1.5) = %.2f (expected 0.90)\n", expr_batch_get_result(video_pattern, 0));
printf(" - contrast(0.6, 2.0) = %.2f (expected 0.70)\n", expr_batch_get_result(video_pattern, 1));
printf(" - gamma(0.5, 2.2) = %.2f (expected 0.73)\n", expr_batch_get_result(video_pattern, 2));
expr_batch_add_variable(sensor_pattern, "prev", 10.0);
expr_batch_add_variable(sensor_pattern, "curr", 12.0);
expr_batch_add_expression(sensor_pattern, "smooth(prev, curr, 0.3)");
expr_batch_add_expression(sensor_pattern, "threshold(curr, 11.0)");
expr_batch_add_expression(sensor_pattern, "scale(curr, 0.1, -0.2)");
expr_batch_evaluate(sensor_pattern, ctx);
printf("\n Sensor results:\n");
printf(" - smooth(10, 12, 0.3) = %.2f (expected 10.60)\n", expr_batch_get_result(sensor_pattern, 0));
printf(" - threshold(12, 11) = %.2f (expected 1.00)\n", expr_batch_get_result(sensor_pattern, 1));
printf(" - scale(12, 0.1, -0.2) = %.2f (expected 1.00)\n", expr_batch_get_result(sensor_pattern, 2));
printf("\n4. Testing function isolation between patterns:\n");
expr_batch_add_expression(video_pattern, "amplify(0.5, 2.0)");
int result = expr_batch_evaluate(video_pattern, ctx);
printf(" - Video pattern trying audio function: %s\n",
result != 0 ? "failed as expected" : "unexpectedly succeeded");
expr_batch_add_expression(sensor_pattern, "brightness(0.5, 2.0)");
result = expr_batch_evaluate(sensor_pattern, ctx);
printf(" - Sensor pattern trying video function: %s\n",
result != 0 ? "failed as expected" : "unexpectedly succeeded");
printf("\n5. Testing batch-specific normalize functions:\n");
expr_batch_add_expression(audio_pattern, "normalize(5, 0, 10)");
expr_batch_add_expression(video_pattern, "normalize(128, 0, 255)");
expr_batch_add_expression(sensor_pattern, "normalize(25, 20, 30)");
expr_batch_evaluate(audio_pattern, ctx);
expr_batch_evaluate(video_pattern, ctx);
expr_batch_evaluate(sensor_pattern, ctx);
printf(" - Audio: normalize(5, 0, 10) = %.2f (expected 0.50)\n",
expr_batch_get_result(audio_pattern, 3));
printf(" - Video: normalize(128, 0, 255) = %.2f (expected 0.50)\n",
expr_batch_get_result(video_pattern, 4));
printf(" - Sensor: normalize(25, 20, 30) = %.2f (expected 0.50)\n",
expr_batch_get_result(sensor_pattern, 4));
printf("\n6. Testing function override in specific pattern:\n");
expr_batch_add_expression_function(audio_pattern, "normalize", "x,min,max",
"2*((x-min)/(max-min))-1");
expr_batch_add_expression(audio_pattern, "normalize(5, 0, 10)");
expr_batch_add_expression(video_pattern, "normalize(5, 0, 10)");
expr_batch_evaluate(audio_pattern, ctx);
expr_batch_evaluate(video_pattern, ctx);
printf(" - Audio (overridden): normalize(5, 0, 10) = %.2f (expected 0.00)\n",
expr_batch_get_result(audio_pattern, 4));
printf(" - Video (original): normalize(5, 0, 10) = %.2f (expected 0.50)\n",
expr_batch_get_result(video_pattern, 5));
printf("\n7. Testing dynamic pattern loading:\n");
ExprBatch* dynamic_pattern = expr_batch_new(16384);
expr_batch_add_expression_function(dynamic_pattern, "process", "x", "x*x+1");
expr_batch_add_expression(dynamic_pattern, "process(3)");
expr_batch_evaluate(dynamic_pattern, ctx);
printf(" - Dynamic pattern: process(3) = %.2f (expected 10.00)\n",
expr_batch_get_result(dynamic_pattern, 0));
expr_batch_free(dynamic_pattern);
printf(" - Dynamic pattern unloaded\n");
expr_batch_free(audio_pattern);
expr_batch_free(video_pattern);
expr_batch_free(sensor_pattern);
expr_context_free(ctx);
printf("\n=== Pattern Isolation Test Completed ===\n");
return 0;
}