K _0m(K a) { I t=a->t; P(4!=t && 3!=ABS(t), TE) I b=0,s=0; S v=0; K z=0; S m; if(3==ABS(t))m=CSK(a); struct stat sb; I ff=0; if(3==ABS(t) && strcmp(m,"/dev/fd/0") && strcmp(m,"/dev/stdin") ){ if(stat(m,&sb)==-1)R FE; if((sb.st_mode & S_IFMT)==S_IFIFO)ff=1;} if(ff){ //read FIFO I fn,i,j; C buf[256]; z=newK(0,0); fn= open(m, O_RDONLY); while (read(fn,&buf,256)>0) { j=256; K y=0; for(i=0;i<256;i++){ if(i>j){buf[j]='\0'; break;} if(buf[i]=='\r'||buf[i]=='\n')j=i; } I n=strlen(buf); y=newK(n<2?3:-3,n); memcpy(kC(y),&buf,n); kap(&z,&y); cd(y); } GC; } else if( 4==t && !**kS(a) ){ char ss[300]; S adr=fgets(ss,sizeof(ss),stdin); if(adr==NULL)R newK(6,1); //read stdin 0:` I i,j; for(i=0;i<300;++i){if(ss[i]=='\012')break;} I k=0; for(j=0;j<=i;j++){if(ss[j]!='\004')ss[k++]=ss[j];} z=newK(-3,k-1); for(j=0;j<k-1;++j){kC(z)[j]=ss[j];} GC; } else if( (3==ABS(t) && (!strcmp(m,"/dev/fd/0") || !strcmp(m,"/dev/stdin"))) //read stdin || 4==t && (!strcmp(*kS(a),"/dev/fd/0") || !strcmp(*kS(a),"/dev/stdin")) ){ b=getdelim_(&v,&s,EOF,stdin); P(freopen_stdin() == NULL, FE) if(b==-1){z=newK(0,0); GC;} }
K kclone(K a)//Deep copy -- eliminate where possible { if(!a) R 0; I t=a->t,n=a->n; K z= 7==t?Kv():newK(t,n); if (4==ABS(t)) DO(n, kS(z)[i]=kS(a)[i]) //memcpy everywhere is better else if(3==ABS(t)) DO(n, kC(z)[i]=kC(a)[i]) else if(2==ABS(t)) DO(n, kF(z)[i]=kF(a)[i]) else if(1==ABS(t)) DO(n, kI(z)[i]=kI(a)[i]) else if(0== t ) DO(n, kK(z)[i]=kclone(kK(a)[i])) else if(5== t ) DO(n, kK(z)[i]=kclone(kK(a)[i])) else if(7== t ) { I k=0; z->t=a->t; I vt=z->n = a->n; K kv; V*v; SW(vt) { CS(1, k=((K)kV(a)[CODE])->n-1; M(z,kv=newK(-4,k+1)) v=(V*)kK(kv); //v[k]=0;//superfluous reminder DO(k, V w=kW(a)[i]; if(VA(w))v[i]=w; //TODO: is this ok for NAMES? see similar code in capture() else { K r=kclone(*(K*)w); //oom V q=newE(LS,r); //oom kap((K*) kV(z)+LOCALS,&q);//oom cd(q);//kap does ci q=EVP(q); //oom free z etc. kap needs checking v[i]=q; } ) ) CS(2, M(z,kv=newK(-4,3)) v=(V*)kK(kv); memcpy(v,kW(a),3*sizeof(V)); )
K times(K a, K b)//TODO: Float results will respect intermediate OI or Oi. Other functions too. (& casts.) { SCALAR_INIT(2) K z=newK(zt,zn);U(z) #define TIMES(x, y) ((x) * (y)) SCALAR_OP(TIMES,times) #undef TIMES R z; }
K mod(K a, K b) //In K4: {x-y*x div y} { I at=a->t, an=a->n, bt=b->t; P(ABS(at) > 2,TE) //Know bt in 1,2 and at in -2,-1,0,1,2 I t=(0==at)?0:MAX(ABS(at),ABS(bt))*(at>0?1:-1); K z=newK(t,an); U(z) I c,d,e; F f,g,h; #define FMOD h=g?f-g*floor(f/g):f; kF(z)[i]=h; if (2==ABS(at) && 2==bt) { g=*kF(b); DO(an, f=kF(a)[i]; FMOD) }
K plus(K a, K b) //compare plus() to times() or minus() { SCALAR_INIT(2) K z=newK(zt,zn);U(z) //Finally, we know what we're going to make #define PLUS(x, y) ((x) + (y)) SCALAR_OP(PLUS,plus) #undef PLUS R z; }
TEST_F(fisheyeTest, DISABLED_undistortImage) { cv::Matx33d theK = this->K; cv::Mat theD = cv::Mat(this->D); std::string file = combine(datasets_repository_path, "/calib-3_stereo_from_JY/left/stereo_pair_014.jpg"); cv::Matx33d newK = theK; cv::Mat distorted = cv::imread(file), undistorted; { newK(0, 0) = 100; newK(1, 1) = 100; cv::fisheye::undistortImage(distorted, undistorted, theK, theD, newK); cv::Mat correct = cv::imread(combine(datasets_repository_path, "new_f_100.png")); if (correct.empty()) CV_Assert(cv::imwrite(combine(datasets_repository_path, "new_f_100.png"), undistorted)); else EXPECT_MAT_NEAR(correct, undistorted, 1e-10); } { double balance = 1.0; cv::fisheye::estimateNewCameraMatrixForUndistortRectify(theK, theD, distorted.size(), cv::noArray(), newK, balance); cv::fisheye::undistortImage(distorted, undistorted, theK, theD, newK); cv::Mat correct = cv::imread(combine(datasets_repository_path, "balance_1.0.png")); if (correct.empty()) CV_Assert(cv::imwrite(combine(datasets_repository_path, "balance_1.0.png"), undistorted)); else EXPECT_MAT_NEAR(correct, undistorted, 1e-10); } { double balance = 0.0; cv::fisheye::estimateNewCameraMatrixForUndistortRectify(theK, theD, distorted.size(), cv::noArray(), newK, balance); cv::fisheye::undistortImage(distorted, undistorted, theK, theD, newK); cv::Mat correct = cv::imread(combine(datasets_repository_path, "balance_0.0.png")); if (correct.empty()) CV_Assert(cv::imwrite(combine(datasets_repository_path, "balance_0.0.png"), undistorted)); else EXPECT_MAT_NEAR(correct, undistorted, 1e-10); } }
K _0m(K a) { I t=a->t; P(4!=t && 3!=ABS(t), TE) I b=0,s=0; S v=0; K z; if(4==t && !**kS(a)){ b=getdelim_(&v,&s,EOF,stdin); P(freopen_stdin() == NULL, FE) if(b==-1){z=newK(0,0); GC;} }
K grade_updown(K a, I r) { I at=a->t, an=a->n; P(0< at, RE) if(-4==at)R symGrade(a,r); if(-3==at)R charGrade(a,r); if(-1==at||-2==at){ K z; if(an<2){z=newK(-1,an);M(z);DO(an,kI(z)[i]=i);R z;} else{ K x=0;uI y,u=(uI)-1,v=0,h=0,k;//MIN,MAX if(-2==at){x=newK(-1,an);M(x);} //trst(); //elapsed("x=newK"); if(-1==at)DO(an,y=kI(a)[i];h|=y;if(y<u)u=y;if(y>v)v=y) else DO(an,kU(x)[i]=(y=FtoI(kF(a)[i]));h|=y;if(y<u)u=y;if(y>v)v=y) //elapsed("fill x"); //O("u:%016llx v:%016llx\n",u,v); if((r&&-1==at)||((u&MSB)!=(v&MSB))){ u=(uI)-1;v=0;h=0; if(-1==at){ x=newK(-1,an);M(x); DO(an,kU(x)[i]=(y=ItoU(kI(a)[i]));h|=y;if(y<u)u=y;if(y>v)v=y)} else DO(an,kU(x)[i]=(y=ItoU(kI(x)[i]));h|=y;if(y<u)u=y;if(y>v)v=y)}
K mod(K a, K b) //In K4: {x-y*x div y} { I at=a->t, an=a->n, bt=b->t; P(ABS(at) > 2,TE) //Know bt in 1,2 and at in -2,-1,0,1,2 I t=(0==at)?0:MAX(ABS(at),ABS(bt))*(at>0?1:-1); K z=newK(t,an); U(z) I c,d,e; F f,g,h; #if __INT_MAX__ == 2147483647 F ct=1e-13; // Comparison tolerance for 32 bit #else F ct=0; // Not needed for 64 bit #endif #define FMOD h=g?f-g*floor(ct+f/g):f; kF(z)[i]=(ABS(h)>ct)?h:0; if (2==ABS(at) && 2==bt) { g=*kF(b); DO(an, f=kF(a)[i]; FMOD) }
K read_tape(I i, I type) // type in {0,1} -> {select loop, 4: resp reader} { I c=CP[i].r, m=sizeof(M1),g; K z=0; S b = c<m?c+(S)&CP[i].m1:c+kC(CP[i].k); g = c<m?m-c:CP[i].m1.n; I nbytes = recv(i,b,g,0); if(nbytes <= 0) { if (nbytes == 0);//printf("server: socket %ld hung up\n", i); else perror("recv"); GC; } //fill struct data + k data CP[i].r += nbytes; //DO(nbytes, O("b%ld : %o\n",i,(UC)b[i])) if(m == CP[i].r) //We've read enough bytes to fill our struct m1 with transmission data (it's also the _db header) { //TODO: so that we get the right sizes, etc, in the M1, rearrange bytes based on little-endianness indicator CP[i].m1.a //if(sizeof(M1)+CP[i].m1.n > 987654321) GC; //protect against too big? K k = newK(-3, m+CP[i].m1.n); if(!(CP[i].k=k))GC; memcpy(kC(k),&CP[i].m1,m); //cpy data from our struct to the corresponding spot on the '_bd' object } if(CP[i].r == m + CP[i].m1.n) //the k for the _db is completed. perform modified execution, potentially respond { //TODO: (here or in _db?) rearrange bytes based on little-endianness indicator CP[i].m1.a M1*p=(V)kC(CP[i].k); I msg_type = p->d; //p->d dissappears after wipe_tape K h = _db(CP[i].k); if(!h) GC; wipe_tape(i); //blocking read inside 4: receives response //response sent by server to client after a 4: request is not executed by client if(2==msg_type && 1==type) R h; //Modified execution of received K value. First received transmission in a 3: or 4: z=modified_execute(h); cd(h); //indicates received communication from 4: synchronous method which expects response if(z) if(1==msg_type && 0==type) ksender(i,z,2); cd(z); z=0; } R z; cleanup: close_tape(i); R (K)-1; }
//TODO: for derived verbs like +/ you can add the sub-pieces in parallel Z K overDyad(K a, V *p, K b) { V *o=p-1; K(*f)(K,K); K k=0; if(VA(*o) && (f=DT[(L)*o].alt_funcs.verb_over))k=f(a,b); //k==0 just means not handled. Errors are not set to come from alt_funcs P(k,k) K u=0,v=0; K y=a?v=join(u=enlist(a),b):b; //oom u (TODO: need to unroll to 'x f/y' and 'f/y' to optimize?) K z=0,g=0; if(yt > 0){z=ci(y); GC;} if(yn == 0){if(VA(*o))z=LE; GC; } //Some verbs will handle this in alt_funcs K c=first(y),d;//mm/o //TODO: this reuse of g should be implemented in other adverbs if(0 >yt) DO(yn-1, d=c; if(!g)g=newK(ABS(yt),1); memcpy(g->k,((V)y->k)+(i+1)*bp(yt),bp(yt)); c=dv_ex(d,p-1,g); if(2==g->c){cd(g);g=0;} cd(d); if(!c) GC;) //TODO: oom err/mmo unwind above - oom-g if(0==yt) DO(yn-1, d=c; c=dv_ex(d,p-1,kK(y)[i+1]); cd(d); if(!c) GC;) //TODO: err/mmo unwind above
K power(K a, K b) { I at=a->t, an=a->n, bt=b->t, bn=b->n; I type = MAX(ABS(at),ABS(bt)); P(at <= 0 && bt <= 0 && an != bn, LE) P(type > 2, TE); I zt=type; if(MIN(at,bt) < 1) zt=-zt; if(!at || !bt) zt=0; if(1==zt*zt)zt*=2; I zn=at>0?bn:an; K z=newK(zt,zn); U(z) F x,y; //K3.2 silently yields 0n for -3^0.5 , even though some Kx documentation says domain error. #define FPOWER kF(z)[i]=(0==y)?1:(0==x)?0:pow(x,y); //x^0==1; 0^y==0 for y!=0; rest should be same as pow SCALAR_EXPR(FPOWER,power,x,y) R z; }
K gi(I x) {K z=newK(1,1); Ki(z)=x; R z;}
K gc(C x) {K z=newK(3,1); Kc(z)=x; R z;}
K gs(S x) {K z=newK(4,1); Ks(z)=x; R z;}
K gn() {K z=newK(6,1); R z;}
K gf(F x) {K z=newK(2,1); Kf(z)=x; R z;}
K gtn(I t, I n) { R newK(t,n); }