3
c operations on boolean sparse matrices
11
integer star,dstar,dot,colon
12
integer less,great,equal,ou,et,non
17
data star/47/,dstar/62/,dot/51/,colon/44/
18
data less/59/,great/60/,equal/50/
19
data ou/57/,et/58/,non/61/
20
data insert/2/,extrac/3/
28
write(buf(1:4),'(i4)') fin
29
call basout(io,wte,' lspops op: '//buf(1:4))
34
if(op.eq.extrac) goto 70
35
if(op.eq.insert) goto 80
38
goto (04,03,02,01) rhs
42
01 il4=iadr(lstk(top))
43
if(istk(il4).lt.0) il4=iadr(istk(il4+1))
47
if(istk(il4).eq.6) then
58
02 il3=iadr(lstk(top))
59
if(istk(il3).lt.0) il3=iadr(istk(il3+1))
63
if(istk(il3).eq.6) then
74
03 il2=iadr(lstk(top))
75
if(istk(il2).lt.0) il2=iadr(istk(il2+1))
79
if(istk(il2).eq.6) then
90
04 il1=iadr(lstk(top))
92
if(istk(il1).lt.0) il1=iadr(istk(il1+1))
96
if(istk(il1).eq.6) then
107
c operations binaires et ternaires
108
c --------------------------------
115
c column concatenation
120
goto(07,07,07,07,07,07,130,05,05,60) op+1-colon
121
if(op.eq.ou.or.op.eq.et) goto 20
122
if(op.eq.non) goto 30
124
05 if(op.eq.dstar) goto 07
125
if(op.ge.3*dot+star) goto 07
126
if(op.ge.2*dot+star) goto 07
127
if(op.ge.less+equal) goto 130
128
if(op.ge.dot+star) goto 07
129
if(op.ge.less) goto 130
139
20 if(istk(il1).ne.6.or.istk(il2).ne.6) then
144
if(mn1.eq.1.and.mn2.gt.1) then
148
elseif(mn2.eq.1.and.mn1.gt.1) then
152
else if (n1 .ne. n2.or.m1.ne.m2) then
157
nelmx=iadr(lstk(bot))-irc-m1-10
158
lw=sadr(irc+m1+nelmx)
166
call lspasp(m1,n1,nel1,istk(irc1),nel2,istk(irc2),nel,
169
call lspxsp(m1,n1,nel1,istk(irc1),nel2,istk(irc2),nel,
178
call icopy(m1+nel,istk(irc),1,istk(irc1),1)
186
err=sadr(lw+m1*n1-nel1+m1)-lstk(bot)
192
istk(il1+4)=m1*n1-nel1
200
do 32 j=1,istk(irc1+i)
201
istk(ij2+istk(ij1+j-1)-1)=0
205
if(istk(ij2+j-1).ne.0) then
207
istk(ij2+j1-1)=istk(ij2+j-1)
212
istk(irc1+i)=n1-istk(irc1+i)
214
call icopy(ij2-lw,istk(lw),1,istk(irc1+m1),1)
215
lstk(top+1)=sadr(irc1+m1+ij2-lw)
230
call iset(n1,0,istk(il1+5),1)
245
istk(ia+i)=istk(ia+i-1)+istk(irc1+i-1)
247
call lspt(m1,n1,nel1,istk(irc1),istk(ia),
248
$ istk(iat),istk(irc))
249
call icopy(n1+nel1,istk(irc),1,istk(irc1),1)
250
l1=sadr(irc1+n1+nel1)
254
c concatenation [a b]
256
if(m1.lt.0.or.m2.lt.0) then
263
call icopy(5+m2+nel2,istk(il2),1,istk(il1),1)
264
l1=sadr(il1+5+m2+nel2)
267
elseif(m1.ne.m2) then
271
if(istk(il1).ne.6.or.istk(il2).ne.6) then
288
call lspcsp(0,m1,n1,nel1,istk(irc1),
289
$ m2,n2,nel2,istk(irc2),
291
call icopy(m1+nelr,istk(irc),1,istk(irc1),1)
292
l1=sadr(irc1+m1+nelr)
296
c concatenation [a;b]
298
if(n1.lt.0.or.n2.lt.0) then
305
call icopy(5+m2+nel2,istk(il2),1,istk(il1),1)
306
l1=sadr(il1+5+m2+nel2)
309
elseif(n1.ne.n2) then
313
if(istk(il1).ne.6.or.istk(il2).ne.6) then
325
lw=sadr(irc+m1+m2+nelr)
331
call lspcsp(1,m1,n1,nel1,istk(irc1),
332
$ m2,n2,nel2,istk(irc2),
334
call icopy(m1+m2+nelr,istk(irc),1,istk(irc1),1)
335
l1=sadr(irc1+m1+m2+nelr)
346
if(istk(il2).lt.0) il2=iadr(istk(il2+1))
352
l2=sadr(irc2+m2+nel2)
358
if(istk(il1).lt.0) il1=iadr(istk(il1+1))
368
lstk(top+1)=sadr(ilrs+4)+1
375
c . arg2(:), just reshape to column vector
377
call icopy(5+m2+nel2,istk(il2),1,istk(ilrs),1)
378
l1=sadr(ilrs+5+m2+nel2)
381
c . reshape to column vector
389
l1=sadr(ilrs+5+m2*n2+nel2)
399
call lspmat(m2,n2,nel2,istk(irc2),m2*n2,istk(ircr),istk(iw))
400
call icopy(m2*n2+nel2,istk(ircr),1,istk(irc1),1)
404
elseif(m2.gt.1.and.n2.gt.1) then
405
c . call macro coded operation
410
c check and convert indices variable
411
call indxg(il1,mn2,ilr,mi,mx,lw,1)
424
lstk(top+1)=sadr(ilrs+4)+1
428
if (m2 .gt. 1.or.m1.lt.0) then
444
nelr=iadr(lstk(bot))-iadr(lw)
453
call lspe2(m2,n2,nel2,istk(irc2),
454
$ istk(ilr),m,istk(ilr),n,mr,nr,
455
$ nelr,istk(irc),istk(lptr),ierr)
462
call icopy(m+nelr,istk(irc),1,istk(ilrs+5),1)
463
l1=sadr(ilrs+5+mr+nelr)
475
if(istk(il3).lt.0) il3=iadr(istk(il3+1))
481
l3=sadr(irc3+m3+nel3)
486
if(istk(il2).lt.0) il2=iadr(istk(il2+1))
492
if(istk(il1).lt.0) il1=iadr(istk(il1+1))
502
lstk(top+1)=sadr(ilrs+4)+1
509
c check and convert indices variables
510
call indxg(il1,m3,ili,mi,mxi,lw,1)
517
call indxg(il2,n3,ilj,nj,mxj,lw,1)
528
c . arg1=[] or arg2=[]
534
lstk(top+1)=sadr(ilrs+4)+1
540
nelr=iadr(lstk(bot))-iadr(lw)
548
call lspe2(m3,n3,nel3,istk(irc3),istk(ili),mi,
549
$ istk(ilj),nj,mr,nr,nelr,istk(irc),istk(lptr),ierr)
556
call icopy(mr+nelr,istk(irc),1,istk(ilrs+5),1)
557
l1=sadr(ilrs+5+mr+nelr)
567
if(istk(il3).lt.0) il3=iadr(istk(il3+1))
571
if(istk(il3).eq.6) then
574
l3=sadr(irc3+m3+nel3)
585
if(istk(il2).lt.0) il2=iadr(istk(il2+1))
589
if(istk(il2).eq.6) then
592
l2=sadr(irc2+m2+nel2)
593
elseif(istk(il2).eq.4) then
596
elseif(istk(il2).eq.1.and.m2*n2.eq.0) then
612
if(istk(il1).lt.0) il1=iadr(istk(il1+1))
618
c . arg3(arg1)=[] -->[]
626
lstk(top+1)=sadr(ilrs+4)+1
629
c . arg3([])=[] --> arg3
630
call icopy(5+m3+nel3,istk(il3),1,istk(ilrs),1)
631
l=sadr(ilrs+5+m3+nel3)
636
if(istk(il1).eq.4.and.m3.eq.m1.and.n3.eq.n1) then
637
if(.not.isany(il1)) then
638
c . arg3([])=[] --> arg3
639
call icopy(5+m3+nel3,istk(il3),1,istk(ilrs),1)
640
l=sadr(ilrs+5+m3+nel3)
645
c . arg3(arg1)=[] -->arg3(compl(arg1),:)
646
if(m3.gt.1.and.n3.gt.1) then
647
c . call macro coded op to reshape and insert
652
call indxgc(il1,mn3,ilr,mi,mx,lw)
665
elseif(m2.lt.0.or.m3.lt.0) then
666
c . arg3=eye,arg2=eye
670
c . arg3(:)=arg2 reshape arg2 according to arg3
684
call icopy(2+m2+nel2,istk(il2+3),1,istk(ilrs+3),1)
685
l1=sadr(ilrs+5+m2+nel2)
688
elseif(m3.gt.1.and.n3.gt.1) then
689
c . arg3(arg1)=arg2 with arg3 not a vector
694
call indxg(il1,mn3,ili,mi,mxi,lw,1)
706
if (n3.gt.1.and.m3.gt.1) then
707
c . arg3 is not a vector
708
if(n2.gt.1.and.m2.gt.1) then
712
if(mxi.gt.m3*n3) then
718
elseif (n3.le.1.and.n2.le.1) then
719
c . arg3 and arg2 are column vectors
722
elseif (m3.le.1.and.m2.le.1) then
727
c . arg3 and arg2 dimensions dont agree
733
if (m3 .gt. 1.or.m1.lt.0) then
749
nelr=iadr(lstk(bot))-irc-mr
757
if(istk(il3).eq.6) then
758
if(istk(il2).eq.6) then
759
call lspisp(m3,n3,nel3,istk(irc3),istk(ili),m,istk(ili),n,m2
760
$ ,n2,nel2,istk(irc2),mr,nr,nelr,istk(irc),istk(lptr)
762
elseif(istk(il2).eq.4) then
763
call lspis(m3,n3,nel3,istk(irc3),istk(ili),m,istk(ili),n,m2
764
$ ,n2,istk(l2),mr,nr,nelr,istk(irc),ierr)
768
buf='not enough memory'
778
call icopy(mr+nelr,istk(irc),1,istk(ilrs+5),1)
779
l1=sadr(ilrs+5+mr+nelr)
784
c arg4(arg1,arg2)=arg3
787
if(istk(il4).lt.0) il4=iadr(istk(il4+1))
791
if(istk(il4).eq.6) then
794
l4=sadr(irc4+m4+nel4)
804
if(istk(il3).lt.0) il3=iadr(istk(il3+1))
808
if(istk(il3).eq.6) then
811
l3=sadr(irc3+m3+nel3)
812
elseif(istk(il3).eq.4) then
815
elseif(istk(il3).eq.1.and.m3*n3.eq.0) then
829
if(istk(il2).lt.0) il2=iadr(istk(il2+1))
835
if(istk(il1).lt.0) il1=iadr(istk(il1+1))
839
c . arg4(arg1,arg2)=[]
840
if(m1.eq.-1.and.m2.eq.-1) then
841
c . arg4(:,:)=[] -->[]
847
lstk(top+1)=sadr(ilrs+4)+1
849
elseif(m1.eq.0.or.m2.eq.0) then
850
c . arg4([],arg2)=[], arg4(arg1,[])=[] --> arg4
851
call icopy(5+m4+nel4,istk(il4),1,istk(ilrs),1)
852
l=sadr(ilrs+5+m4+nel4)
855
elseif(m2.eq.-1) then
856
c . arg3(arg1,:)=[] --> arg3(compl(arg1),:)
857
call indxgc(il1,m4,ili,mi,mxi,lw)
860
call indxg(il2,n4,ilj,nj,mxj,lw,1)
876
elseif(m1.eq.-1) then
877
c . arg3(:,arg2)=[] --> arg3(:,compl(arg2))
878
call indxgc(il2,n4,ilj,nj,mxj,lw)
881
call indxg(il1,m4,ili,mi,mxi,lw,1)
898
c . arg4(arg1,arg2)=[]
900
call indxgc(il2,n4,ilj,nj,mxj,lw)
904
c . arg4(arg1,1:n4)=[]
905
call indxgc(il1,m4,ili,mi,mxi,lw)
911
c . arg4(1:m4,1:n4)=[]
917
lstk(top+1)=sadr(ilrs+4)+1
920
c . arg4(arg1,1:n4)=[]
921
c . replace arg2 by ":"
929
call indxg(il2,n4,ilj,nj,mxj,lw,1)
948
call indxgc(il1,m4,ili,mi,mxi,lw)
951
c . arg4(1:m4,arg2)=[]
952
call indxg(il1,m4,ili,mi,mxi,lw,1)
974
elseif(m3.lt.0.or.m4.lt.0) then
975
c . arg3=eye , arg4=eye
978
elseif(m1.eq.-1.and.m2.eq.-1) then
989
c . reshape arg3 according to arg4
994
call icopy(2+m3+nel3,istk(il3+3),1,istk(ilrs+3),1)
995
l1=sadr(ilrs+5+m3+nel3)
1000
call indxg(il1,m4,ili,mi,mxi,lw,1)
1007
call indxg(il2,n4,ilj,mj,mxj,lw,1)
1014
if(mr1.eq.0.or.nr1.eq.0) then
1018
if(mr1.ne.m3.or.nr1.ne.n3) then
1019
c . sizes of arg1 or arg2 dont agree with arg3 sizes
1028
nelr=iadr(lstk(bot))-irc-mr
1034
lw=sadr(irc+mr+nelr)
1036
if(istk(il4).eq.6) then
1037
if(istk(il3).eq.6) then
1038
call lspisp(m4,n4,nel4,istk(irc4),istk(ili),mi,istk(ilj),mj,
1039
$ m3,n3,nel3,istk(irc3),mr,nr,nelr,istk(irc),istk(lptr)
1041
elseif(istk(il3).eq.4) then
1043
call lspis(m4,n4,nel4,istk(irc4),istk(ili),mi,istk(ilj),mj
1044
$ ,m3,n3,istk(l3),mr,nr,nelr,istk(irc),ierr)
1048
buf='not enough memory'
1052
ilrs=iadr(lstk(top))
1058
call icopy(mr+nelr,istk(irc),1,istk(ilrs+5),1)
1059
l1=sadr(ilrs+5+mr+nelr)
1065
if(mn2.eq.0.and.mn1.eq.0) then
1066
if(op.eq.equal.or.op.eq.less+great) then
1072
if(op.eq.less+great) istk(il1+3)=0
1073
lstk(top+1)=sadr(il1+4)
1080
if(mn1.ne.1.and.mn2.ne.1) then
1081
if(n1.ne.n2.or.m1.ne.m2) then
1082
if(op.eq.equal.or.op.eq.less+great) then
1088
if(op.eq.less+great) istk(il1+3)=1
1089
lstk(top+1)=sadr(il1+4)
1097
if(istk(il1).ne.4.and.istk(il1).ne.6.or.istk(il2).ne.4.and
1098
$ .istk(il2).ne.6) then
1111
nelmx=(iadr(lstk(bot))-irc-mr-10)
1112
lw=sadr(irc+mr+nelmx)
1119
if(istk(il1).eq.4) then
1121
call lsosp(op,m1,n1,istk(l1),m2,n2,nel2,istk(irc2),nel,istk(irc
1123
elseif(istk(il2).eq.4) then
1125
call lspos(op,m1,n1,nel1,istk(irc1),
1126
$ m2,n2,istk(l2),nel,istk(irc),ierr)
1128
call lsposp(op,m1,n1,nel1,istk(irc1),
1129
$ m2,n2,nel2,istk(irc2),
1130
$ nel,istk(irc),ierr)
1133
buf='not enough memory'
1144
call icopy(mr+nel,istk(irc),1,istk(irc1),1)
1145
l1=sadr(irc1+mr+nel)