Mercurial > hg > jgplsrc
view cp.c @ 0:e0bbaa717f41 draft default tip
lol J
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Mon, 25 Nov 2013 11:56:30 -0500 |
parents | |
children |
line wrap: on
line source
/* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */ /* License in license.txt. */ /* */ /* Conjunctions: Power Operator ^: and Associates */ #include "j.h" static DF1(jtpowseqlim){PROLOG;A x,y,z,*zv;I i,n; RZ(w); RZ(z=exta(BOX,1L,1L,20L)); zv=AAV(z); *zv++=x=w; i=1; n=AN(z); while(1){ if(n==i){RZ(z=ext(0,z)); zv=i+AAV(z); n=AN(z);} RZ(*zv++=x=df1(y=x,self)); if(equ(x,y)){AN(z)=*AS(z)=i; break;} ++i; } EPILOG(ope(z)); } /* f^:(<_) w */ static F2(jttclosure){A z;B b;I an,*av,c,d,i,wn,wr,wt,*wv,*zu,*zv,*zz; RZ(a&&w); wt=AT(w); wn=AN(w); wr=AR(w); if(B01&wt)RZ(w=cvt(INT,w)); wv=AV(w); av=AV(a); an=AN(a); RZ(z=exta(INT,1+wr,wn,20L)); zv=AV(z); zz=zv+AN(z); if(1==wn){ *zv++=c=*wv; d=1+c; while(c!=d){ if(zv==zz){i=zv-AV(z); RZ(z=ext(0,z)); zv=AV(z)+i; zz=AV(z)+AN(z);} d=c; if(0>c)c+=an; ASSERT(0<=c&&c<an,EVINDEX); *zv++=c=av[c]; }}else{ ICPY(zv,wv,wn); zu=zv; zv+=wn; while(1){ if(zv==zz){i=zv-AV(z); RZ(z=ext(0,z)); zv=AV(z)+i; zz=AV(z)+AN(z); zu=zv-wn;} b=1; DO(wn, d=c=*zu++; if(0>c)c+=an; ASSERT(0<=c&&c<an,EVINDEX); *zv++=c=av[c]; if(c!=d)b=0;); if(b)break; }} i=zv-AV(z); *AS(z)=d=i/wn-1; AN(z)=d*wn; ICPY(1+AS(z),AS(w),wr); R z; } /* {&a^:(<_) w */ static DF1(jtindexseqlim1){A fs; RZ(w); fs=VAV(self)->f; R AT(w)&B01+INT?tclosure(VAV(fs)->g,w):powseqlim(w,fs); } /* {&x^:(<_) w */ static DF2(jtindexseqlim2){ RZ(a&&w); R 1==AR(a)&&AT(a)&INT&&AT(w)&B01+INT?tclosure(a,w):powseqlim(w,amp(ds(CFROM),a)); } /* a {~^:(<_) w */ static DF1(jtpowseq){A fs,gs,x;I n=IMAX;V*sv; RZ(w); sv=VAV(self); fs=sv->f; gs=sv->g; ASSERT(!AR(gs),EVRANK); ASSERT(BOX&AT(gs),EVDOMAIN); x=*AAV(gs); if(!AR(x))RE(n=i0(vib(x))); if(0>n){RZ(fs=inv(fs)); n=-n;} if(n==IMAX||1==AR(x)&&!AN(x))R powseqlim(w,fs); R df1(w,powop(fs,IX(n))); } /* f^:(<n) w */ static DF1(jtfpown){A fs,z;AF f1;I n,old;V*sv; RZ(w); sv=VAV(self); switch(n=*AV(sv->h)){ case 0: R ca(w); case 1: fs=sv->f; R CALL1(VAV(fs)->f1,w,fs); default: fs=sv->f; f1=VAV(fs)->f1; z=w; old=jt->tbase+jt->ttop; DO(n, RZ(z=CALL1(f1,z,fs)); gc(z,old);); R z; }} /* single positive finite exponent */ static DF1(jtply1){PROLOG;DECLFG;A b,hs,j,x,*xv,y,z;B*bv,q;I i,k,m,n,*nv,old,p=0; hs=sv->h; m=AN(hs); RZ(x=ravel(hs)); RZ(y=from(j=grade1(x),x)); nv=AV(y); GA(x,BOX,m,1,0); xv=AAV(x); while(p<m&&0>nv[p])p++; if(p<m){ RZ(z=ca(w)); n=nv[m-1]; k=p; while(k<m&&!nv[k]){xv[k]=z; ++k;} RZ(b=eq(ainf,from(j,ravel(gs)))); bv=BAV(b); q=k<m?bv[k]:0; old=jt->tbase+jt->ttop; for(i=1;i<=n;++i){ RZ(z=CALL1(f1,y=z,fs)); if(q&&equ(y,z)){DO(m-k, xv[k]=z; ++k;); break;} while(k<m&&i==nv[k]){xv[k]=z; ++k; q=k<m?bv[k]:0;} if(!(i%10))gc3(x,z,0L,old); }} if(0<p){ RZ(fs=inv(fs)); f1=VAV(fs)->f1; RZ(z=ca(w)); n=nv[0]; k=p-1; RZ(b=eq(scf(-inf),from(j,ravel(gs)))); bv=BAV(b); q=bv[k]; old=jt->tbase+jt->ttop; for(i=-1;i>=n;--i){ RZ(z=CALL1(f1,y=z,fs)); if(q&&equ(y,z)){DO(1+k, xv[k]=z; --k;); break;} while(0<=k&&i==nv[k]){xv[k]=z; --k; q=0<=k?bv[k]:0;} if(!(i%10))gc3(x,z,0L,old); }} z=ope(reshape(shape(hs),from(grade1(j),x))); EPILOG(z); } #define DIST(i,x) if(i==e){v=CAV(x); \ while(k<m&&i==(e=nv[jv[k]])){MC(zv+c*jv[k],v,c); ++k;}} static DF1(jtply1s){DECLFG;A hs,j,y,y1,z;C*v,*zv;I c,e,i,*jv,k,m,n,*nv,r,*s,t,zn; RZ(w); hs=sv->h; m=AN(hs); nv=AV(hs); RZ(j=grade1(ravel(hs))); jv=AV(j); e=nv[*jv]; if(!e&&!nv[jv[m-1]])R reshape(over(shape(hs),shape(w)),w); RZ(y=y1=CALL1(f1,w,fs)); t=AT(y); r=AR(y); if(0>e||t==BOX)R ply1(w,self); if(!e){ if(HOMO(t,AT(w)))RZ(w=pcvt(t,w)); if(!(t==AT(w)&&AN(y)==AN(w)&&(r==AR(w)||1>=r&&1>=AR(w))))R ply1(w,self); } k=AR(hs); RE(zn=mult(m,AN(y))); GA(z,AT(y),zn,k+AR(y),0); zv=CAV(z); s=AS(z); ICPY(s,AS(hs),k); ICPY(k+s,AS(y),r); n=nv[jv[m-1]]; c=AN(y)*bp(t); s=AS(y); k=0; DIST(0,w); DIST(1,y); for(i=2;i<=n;++i){ RZ(y=CALL1(f1,y,fs)); if(t!=AT(y)||r!=AR(y)||ICMP(AS(y),s,r))R ply1(w,self); DIST(i,y); } R z; } /* f^:n w, non-negative finite n, well-behaved f */ static DF1(jtinv1){DECLFG;A z; RZ(w); FDEPINC(1); z=df1(w,inv(fs)); FDEPDEC(1); R z;} static DF2(jtinv2){DECLFG;A z; RZ(a&&w); FDEPINC(1); z=df1(w,inv(amp(a,fs))); FDEPDEC(1); R z;} static CS2(jtply2, df1(w,powop(amp(a,fs),gs))) static DF1(jtpowg1){A h=VAV(self)->h; R df1( w,*AAV(h));} static DF2(jtpowg2){A h=VAV(self)->h; R df2(a,w,*AAV(h));} static CS1(jtpowv1, df1( w,powop(fs, CALL1(g1, w,gs)))) static CS2(jtpowv2, df2(a,w,powop(fs, CALL2(g2,a,w,gs)))) static CS2(jtpowv2a, df1( w,powop(VAV(fs)->f,CALL2(g2,a,w,gs)))) F2(jtpowop){A hs;B b,r;I m,n;V*v; RZ(a&&w); switch(CONJCASE(a,w)){ default: ASSERTSYS(0,"powop"); case NV: ASSERT(0,EVDOMAIN); case NN: ASSERT(-1==i0(w),EVDOMAIN); R vger2(CPOWOP,a,w); case VV: v=VAV(a); b=(v->id==CAT||v->id==CATCO)&&ID(v->g)==CRIGHT; R CDERIV(CPOWOP,jtpowv1,b?jtpowv2a:jtpowv2,RMAX,RMAX,RMAX); case VN: if(BOX&AT(w)){A x,y;AF f1,f2; if(ARELATIVE(w))RZ(w=car(w)); if(!AR(w)&&(x=*AAV(w),!AR(x)&&NUMERIC&AT(x)||1==AR(x)&&!AN(x))){ f1=jtpowseq; f2=jtply2; v=VAV(a); if((!AN(x)||FL&AT(x)&&inf==*DAV(x))&& CAMP==v->id&&(CFROM==ID(v->f)&&(y=v->g,INT&AT(y)&&1==AR(y))))f1=jtindexseqlim1; if(CTILDE==v->id&&CFROM==ID(v->f))f2=jtindexseqlim2; R CDERIV(CPOWOP,f1,f2,RMAX,RMAX,RMAX); } R gconj(a,w,CPOWOP); } RZ(hs=vib(w)); b=0; m=AN(hs); n=m?*AV(hs):0; r=0<AR(hs); if(!r&&-1==n)R CDERIV(CPOWOP,jtinv1,jtinv2,RMAX,RMAX,RMAX); if(m&&AT(w)&FL+CMPX)RE(b=!all0(eps(w,over(ainf,scf(infm))))); R fdef(CPOWOP,VERB, b||!m?jtply1:!r&&0<=n?jtfpown:jtply1s,jtply2, a,w,hs, 0L,RMAX,RMAX,RMAX); }}