/* Phase 2f: full ScMoE decoder layer in C, validated vs layer0_target.f32 (clean f32 ref). * Composes the 5 proven ops: RMSNorm, matmul, MLA attention, dense MLP (SwiGLU), MoE. * Weights pre-dumped f32 (native shard streaming = Phase 3). Build: gcc -O2 -o phase2f_layer phase2f_layer.c -lm */ #include #include #include #include #include #define T 5 #define HID 6144 #define H 64 #define NOPE 128 #define ROPE 64 #define HD 192 #define VD 128 #define QLORA 1536 #define KVLORA 512 #define FFN 12288 /* dense mlp intermediate */ #define EFFN 2048 /* expert intermediate */ #define K 12 #define NR 512 #define EPS 1e-5f #define SQ 2.0f #define SKV 3.4641016151377544f #define ASC 0.07216878364870322f #define RSCALE 6.0f static const char* DIR = "ref"; static float* Lf(const char* n, long c){char p[512];snprintf(p,sizeof p,"%s/%s.f32",DIR,n);FILE*f=fopen(p,"rb");if(!f){perror(p);exit(1);}float*b=malloc(c*4);if(fread(b,4,c,f)!=(size_t)c){fprintf(stderr,"short %s\n",n);exit(1);}fclose(f);return b;} static int32_t* Li(const char* n, long c){char p[512];snprintf(p,sizeof p,"%s/%s.i32",DIR,n);FILE*f=fopen(p,"rb");if(!f){perror(p);exit(1);}int32_t*b=malloc(c*4);fread(b,4,c,f);fclose(f);return b;} static long Lcount(const char* n){char p[512];snprintf(p,sizeof p,"%s/%s.i32",DIR,n);FILE*f=fopen(p,"rb");if(!f)return 0;fseek(f,0,SEEK_END);long b=ftell(f);fclose(f);return b/4;} static void mv(const float*W,const float*x,float*o,int M,int Kd){for(int i=0;imx)mx=sc[ki];} double sum=0;for(int ki=0;ki<=qi;ki++){sc[ki]=expf(sc[ki]-mx);sum+=sc[ki];} for(int d=0;dmx)mx=lg[i]; double sum=0;float sf[768];for(int i=0;i<768;i++){sf[i]=expf(lg[i]-mx);sum+=sf[i];} for(int i=0;i<768;i++)sf[i]/=sum; /* topk-12 by (softmax + bias) */ int idx[K];float chosen[768];for(int i=0;i<768;i++)chosen[i]=sf[i]+bias[i]; for(int j=0;jbv){bv=chosen[i];bi=i;}}idx[j]=bi;} for(int j=0;j=NR){for(int i=0;idmax)dmax=dd;} printf("layer0[0,:6]: ");for(int i=0;i<6;i++)printf("%.4f ",x[i]);printf("\n"); printf("FULL C LAYER max abs diff vs clean Python: %.3e\n",dmax); printf("VERDICT: %s\n",dmax<0.1?"PASS — full ScMoE layer works in C":"FAIL"); return dmax<0.1?0:1; }