view vt.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.                                   */
/*                                                                         */
/* Verbs: Take and Drop                                                    */

#include "j.h"


F1(jtbehead ){R drop(one,    w);}
F1(jtcurtail){R drop(num[-1],w);}

F1(jtshift1){R drop(num[-1],over(one,w));}

static A jttk0(J jt,B b,A a,A w){A z;I k,m=0,n,p,r,*s,*u;
 r=AR(w); n=AN(a); u=AV(a); 
 if(!b){RE(m=prod(n,u)); ASSERT(m>IMIN,EVLIMIT); RE(m=mult(ABS(m),prod(r-n,n+AS(w))));}
 GA(z,AT(w),m,r,AS(w)); 
 s=AS(z); DO(n, p=u[i]; ASSERT(p>IMIN,EVLIMIT); *s++=ABS(p););
 if(m){k=bp(AT(w)); mvc(k*m,AV(z),k,jt->fillv);}
 R z;
}

static F2(jttks){PROLOG;A a1,q,x,y,z;B b,c;I an,m,r,*s,*u,*v;P*wp,*zp;
 an=AN(a); u=AV(a); r=AR(w); s=AS(w); 
 GA(z,AT(w),1,r,s); v=AS(z); DO(an, v[i]=ABS(u[i]););
 zp=PAV(z); wp=PAV(w);
 if(an<=r){RZ(a=vec(INT,r,s)); ICPY(AV(a),u,an);}
 a1=SPA(wp,a); RZ(q=paxis(r,a1)); m=AN(a1);
 RZ(a=from(q,a       )); u=AV(a);
 RZ(y=from(q,shape(w))); s=AV(y);
 b=0; DO(r-m, if(b=u[i+m]!=s[i+m])break;);
 c=0; DO(m,   if(c=u[i  ]!=s[i  ])break;);
 if(b){jt->fill=SPA(wp,e); x=irs2(vec(INT,r-m,m+u),SPA(wp,x),0L,1L,-1L,jttake); jt->fill=0; RZ(x);}
 else x=SPA(wp,x);
 if(c){A j;C*xv,*yv;I d,i,*iv,*jv,k,n,t;
  d=0; t=AT(x); k=bp(t)*aii(x);
  q=SPA(wp,i); n=IC(q);
  GA(j,INT,AN(q),AR(q),AS(q)); jv= AV(j); iv= AV(q);
  GA(y,t,  AN(x),AR(x),AS(x)); yv=CAV(y); xv=CAV(x);
  for(i=0;i<n;++i){
   c=0; DO(m, t=u[i]; if(c=0>t?iv[i]<t+s[i]:iv[i]>=t)break;);
   if(!c){++d; MC(yv,xv,k); yv+=k; DO(m, t=u[i]; *jv++=0>t?iv[i]-(t+s[i]):iv[i];);}
   iv+=m; xv+=k;
  }
  SPB(zp,i,d<n?take(sc(d),j):j); SPB(zp,x,d<n?take(sc(d),y):y);
 }else{SPB(zp,i,ca(SPA(wp,i))); SPB(zp,x,b?x:ca(x));}
 SPB(zp,a,ca(SPA(wp,a)));
 SPB(zp,e,ca(SPA(wp,e)));
 EPILOG(z);
}    /* take on sparse array w */

static F2(jttk){PROLOG;A y,z;B b=0;C*yv,*zv;I c,d,dy,dz,e,i,k,m,n,p,q,r,*s,t,*u;
 n=AN(a); u=AV(a); r=AR(w); s=AS(w); t=AT(w);
 if(t&SPARSE)R tks(a,w);
 DO(n, if(!u[i]){b=1; break;}); if(!b)DO(r-n, if(!s[n+i]){b=1; break;});
 if(b||!AN(w))R tk0(b,a,w);
 k=bp(t); z=w; c=q=1;
 for(i=0;i<n;++i){
  c*=q; p=u[i]; q=ABS(p); m=s[i];
  if(q!=m){
   RE(d=mult(AN(z)/m,q)); GA(y,t,d,r,AS(z)); *(i+AS(y))=q;
   if(q>m)mvc(k*AN(y),CAV(y),k,jt->fillv);
   d=AN(z)/(m*c)*k; e=d*MIN(m,q);
   dy=d*q; yv=CAV(y); if(0>p&&q>m)yv+=d*(q-m);
   dz=d*m; zv=CAV(z); if(0>p&&m>q)zv+=d*(m-q);
   DO(c, MC(yv,zv,e); yv+=dy; zv+=dz;);
   b=1; z=y;
 }}
 if(!b)z=ca(w); 
 EPILOG(RELOCATE(w,z));
}

F2(jttake){A s,t;D*av,d;I acr,af,ar,n,*tv,*v,wcr,wf,wr;
 RZ(a&&w);
 if(SPARSE&AT(a))RZ(a=denseit(a));
 if(!(SPARSE&AT(w)))RZ(w=setfv(w,w)); 
 ar=AR(a); acr=jt->rank?jt->rank[0]:ar; af=ar-acr;
 wr=AR(w); wcr=jt->rank?jt->rank[1]:wr; wf=wr-wcr; jt->rank=0;
 if(af||1<acr)R rank2ex(a,w,0L,af?acr:1L,wcr,jttake);
 n=AN(a); 
 ASSERT(!wcr||n<=wcr,EVLENGTH);
 if(AT(a)&B01+INT)RZ(s=a=vi(a))
 else{
  RZ(t=vib(a));
  if(!(AT(a)&FL))RZ(a=cvt(FL,a));
  av=DAV(a); tv=AV(t); v=wf+AS(w);
  DO(n, d=av[i]; if(d==IMIN)tv[i]=(I)d; else if(INF(d))tv[i]=wcr?v[i]:1;)
  s=a=t;
 }
 if(!wcr||wf){
  RZ(s=vec(INT,wf+n,AS(w))); v=wf+AV(s); 
  if(!wcr){DO(n,v[i]=1;); RZ(w=reshape(s,w));}
  ICPY(v,AV(a),n);
 }
 R tk(s,w);
}

F2(jtdrop){A s;I acr,af,ar,d,m,n,*u,*v,wcr,wf,wr;
 RZ((a=vib(a))&&w);
 ar=AR(a); acr=jt->rank?jt->rank[0]:ar; af=ar-acr; 
 wr=AR(w); wcr=jt->rank?jt->rank[1]:wr; wf=wr-wcr; jt->rank=0;
 if(af||1<acr)R rank2ex(a,w,0L,af?acr:1L,wcr,jtdrop);
 n=AN(a); u=AV(a);
 ASSERT(!wcr||n<=wcr,EVLENGTH);
 if(wcr){RZ(s=shape(w)); v=wf+AV(s); DO(n, d=u[i]; m=v[i]; v[i]=d<-m?0:d<0?d+m:d<m?d-m:0;);}
 else{GA(s,INT,wr+n,1,0); v=AV(s); ICPY(v,AS(w),wf); v+=wf; DO(n, v[i]=!u[i];); RZ(w=reshape(s,w));}
 R tk(s,w);
}


static F1(jtrsh0){A x,y;I wcr,wf,wr,*ws;
 wr=AR(w); wcr=jt->rank?jt->rank[1]:wr; wf=wr-wcr; jt->rank=0;
 ws=AS(w);
 RZ(x=vec(INT,wr-1,ws)); ICPY(wf+AV(x),ws+wf+1,wcr-1);
 RZ(w=setfv(w,w)); GA(y,AT(w),1,0,0); MC(AV(y),jt->fillv,bp(AT(w)));
 R reshape(x,y);
}

F1(jthead){I wcr,wf,wr;
 RZ(w);
 wr=AR(w); wcr=jt->rank?jt->rank[1]:wr; wf=wr-wcr;
 R !wcr||*(wf+AS(w))? from(num[ 0],w) : 
     SPARSE&AT(w)?irs2(num[0],take(num[ 1],w),0L,0L,wcr,jtfrom):rsh0(w);
}

F1(jttail){I wcr,wf,wr;
 RZ(w);
 wr=AR(w); wcr=jt->rank?jt->rank[1]:wr; wf=wr-wcr;
 R !wcr||*(wf+AS(w))?from(num[-1],w) :
     SPARSE&AT(w)?irs2(num[0],take(num[-1],w),0L,0L,wcr,jtfrom):rsh0(w);
}