{VERSION 6 0 "IBM INTEL NT" "6.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 1 }{CSTYLE "2D Comment" 2 18 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 } {CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 } {PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }1 1 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "Heading 1" -1 3 1 {CSTYLE "" -1 -1 "Times" 1 18 0 0 0 1 2 1 2 2 2 2 1 1 1 1 }1 1 0 0 8 4 1 0 1 0 2 2 0 1 }{PSTYLE "Heading 2" -1 4 1 {CSTYLE "" -1 -1 "Times " 1 14 0 0 0 1 2 1 2 2 2 2 1 1 1 1 }1 1 0 0 8 2 1 0 1 0 2 2 0 1 } {PSTYLE "Text Output" -1 6 1 {CSTYLE "" -1 -1 "Courier" 1 10 0 0 255 1 2 2 2 2 2 1 2 1 3 1 }1 1 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "Maple Out put" -1 11 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }3 3 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "Maple Output" -1 12 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }1 3 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "Title" -1 18 1 {CSTYLE "" -1 -1 "Times" 1 18 0 0 0 1 2 1 1 2 2 2 1 1 1 1 }3 1 0 0 12 12 1 0 1 0 2 2 19 1 } {PSTYLE "Author" -1 19 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }3 1 0 0 8 8 1 0 1 0 2 2 0 1 }{PSTYLE "Normal" -1 256 1 {CSTYLE "" -1 -1 "Times" 1 18 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }3 1 0 0 0 0 1 0 1 0 2 2 0 1 }} {SECT 0 {PARA 18 "" 0 "" {TEXT -1 54 "Partition Trees, WHT Algorithms, and Cache Performance" }}{PARA 19 "" 0 "" {TEXT -1 14 "Jeremy Johnson " }}{PARA 0 "" 0 "" {TEXT -1 404 "\nA partition tree is a tree is a tr ee whose nodes are labeled by positive integers with the property that the sum of the labels of the children of a node sum to the label at \+ the node. A partition tree can be stored using Maple lists. A node i s a list containing the label and a list of the children. A leaf node is indicated by having an empty list of children. E.G. [3,[[1,[]],[ 2,[[1,[]],[1,[]]]] " }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 " " {TEXT -1 528 "Partition trees can be used to model algorithms for co mputing the Walsh-Hadamard transform (WHT). Let x be a vector of size N = 2^n (input signal), then the WHT of x is the matrix vector produc t y = W_N x, where W_N is the N x N WHT matrix. Algorithms for comput ing the WHT can be obtained by factoring the W_N matrix and these fact orizations correspond to partition trees. In fact, corresponding to e ach partition tree there is a WHT algorithm and the space of WHT trees will be used to describe the space of WHT algorithms." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 1029 "This worksheet rev iews the defintion and key properties of the WHT, provides routines fo r manipulating and generating partition trees and an implementation of the WHT whose behavior is governed by a partition tree. The WHT impl ementation performs the computation of y = W_N x in-place. This means that the input vector x is modified so that after the computation x = y. No additional storage is required. After providing routines for \+ computing the WHT, a memory trace generator is given which produces th e list of memory addresses (actually indices into the array containing the data) accessed by all read accesses made by the WHT algorithm whe n accessing the array containing the input data. A cache simulator is provided that, given a sequence of addresses, returns the number of c ache misses for a cache with specified size, associativity, and block \+ size. Finally, a formula is derived which computes the number of cach e misses for a given cache design and WHT algorithm (determined by the corresponding partition tree)." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }} {SECT 0 {PARA 3 "" 0 "" {TEXT -1 24 "Walsh-Hadamard Transform" }} {PARA 0 "" 0 "" {TEXT -1 128 "This section provides Maple procedures f or creating the WHT matrix and exploring some of the basic properties \+ of the WHT matrix." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 " > " 0 "" {MPLTEXT 1 0 13 "with(linalg);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#7^r%.BlockDiagonalG%,GramSchmidtG%,JordanBlockG%)LUdecompG%)QRde compG%*WronskianG%'addcolG%'addrowG%$adjG%(adjointG%&angleG%(augmentG% (backsubG%%bandG%&basisG%'bezoutG%,blockmatrixG%(charmatG%)charpolyG%) choleskyG%$colG%'coldimG%)colspaceG%(colspanG%*companionG%'concatG%%co ndG%)copyintoG%*crossprodG%%curlG%)definiteG%(delcolsG%(delrowsG%$detG %%diagG%(divergeG%(dotprodG%*eigenvalsG%,eigenvaluesG%-eigenvectorsG%+ eigenvectsG%,entermatrixG%&equalG%,exponentialG%'extendG%,ffgausselimG %*fibonacciG%+forwardsubG%*frobeniusG%*gausselimG%*gaussjordG%(geneqns G%*genmatrixG%%gradG%)hadamardG%(hermiteG%(hessianG%(hilbertG%+htransp oseG%)ihermiteG%*indexfuncG%*innerprodG%)intbasisG%(inverseG%'ismithG% *issimilarG%'iszeroG%)jacobianG%'jordanG%'kernelG%*laplacianG%*leastsq rsG%)linsolveG%'mataddG%'matrixG%&minorG%(minpolyG%'mulcolG%'mulrowG%) multiplyG%%normG%*normalizeG%*nullspaceG%'orthogG%*permanentG%&pivotG% *potentialG%+randmatrixG%+randvectorG%%rankG%(ratformG%$rowG%'rowdimG% )rowspaceG%(rowspanG%%rrefG%*scalarmulG%-singularvalsG%&smithG%,stackm atrixG%*submatrixG%*subvectorG%)sumbasisG%(swapcolG%(swaprowG%*sylvest erG%)toeplitzG%&traceG%*transposeG%,vandermondeG%*vecpotentG%(vectdimG %'vectorG%*wronskianG" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 67 "First we provide a function to construct the n X n i dentity matrix." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 18 "delta := proc(i,j)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 43 "if (i = j) then return 1 else return 0; fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>% &deltaGf*6$%\"iG%\"jG6\"F)F)@%/9$9%O\"\"\"O\"\"!F)F)F)" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "Identity := proc(n) " }}{PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 47 " return linalg[matrix](n,n,(i,j)->delta(i,j)) ;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%)IdentityGf*6#%\"nG6\"F(F(O-&%'linalgG6#%'matrixG6%9$ F0f*6$%\"iG%\"jGF(6$%)operatorG%&arrowGF(-%&deltaG6$F09%F(F(F(F(F(F(" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "Identity(3);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7%7%\"\"\"\"\"!F)7%F)F(F)7%F)F)F(Q( pprint36\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 320 "The Kronecker product of two matrices is the block matrix obta ined by replacing each element of the first matrix, by that element mu ltiplied by the second matrix. If A is an m X m matrix and B is an n \+ X n matrix, then KroneckerProduct(A,B) is an mn X mn matrix. The Kron ecker product is also called the tensor product." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 342 "It is not difficult to s how that the Kronecker product is associative but not generally commut ative. Moreover, it satisfies the multiplicative property: Kronecker Product(A*B,C*D) = KroneckerProduct(A,C) * KroneckerProduct(B,D). In \+ particular, KroneckerProduct(A,B) = KroneckerProduct(AI,IB) = Kroneck erProduct(A,I) *KroneckerProduct(I,B)." }}{PARA 0 "" 0 "" {TEXT -1 0 " " }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 330 "KroneckerProduct := pro c(A,B) \n local m,n,p,q,i,j,L; \n m := linalg[rowdim](A); n := linal g[coldim](A); \n p := linalg[rowdim](B); q := linalg[coldim](B); \n \+ L := []; \n for i from m by -1 to 1 do \n for j from n by -1 to 1 \+ do \n L := [scalarmul(B,A[i,j]),op(L)]; \n od; \n od; \nretur n linalg[blockmatrix](m,n,L); \nend; \n" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%1KroneckerProductGf*6$%\"AG%\"BG6)%\"mG%\"nG%\"pG%\"qG%\"iG%\" jG%\"LG6\"F1C)>8$-&%'linalgG6#%'rowdimG6#9$>8%-&F76#%'coldimGF:>8&-F66 #9%>8'-F?FE>8*7\"?(8(F4!\"\"\"\"\"%%trueG?(8)F=FOFPFQ>FK7$-%*scalarmul G6$FF&F;6$FNFS-%#opG6#FKO-&F76#%,blockmatrixG6%F4F=FKF1F1F1" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 35 "A := matrix([[a11,a12],[a21, a22]]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"AGK%'matrixG6#7$7$%$a11 G%$a12G7$%$a21G%$a22GQ(pprint46\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 35 "B := matrix([[b11,b12],[b21,b22]]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"BGK%'matrixG6#7$7$%$b11G%$b12G7$%$b21G%$b22GQ(pp rint56\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 35 "C := matrix([[c 11,c12],[c21,c22]]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"CGK%'matri xG6#7$7$%$c11G%$c12G7$%$c21G%$c22GQ(pprint66\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 255 "The following provides a n example of the Kronecker product and shows that it is not commutativ e. Note that it is almost commutative in that the entries of Kronecke rProduct(B,A) are the same as those of KroneckerProduct(A,B) except th at they are permuted." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "KroneckerProduct(A,B);" }}{PARA 11 "" 1 " " {XPPMATH 20 "6#K%'matrixG6#7&7&*&%$a11G\"\"\"%$b11GF**&F)F*%$b12GF** &%$a12GF*F+F**&F/F*F-F*7&*&F)F*%$b21GF**&F)F*%$b22GF**&F/F*F3F**&F/F*F 5F*7&*&%$a21GF*F+F**&F:F*F-F**&%$a22GF*F+F**&F=F*F-F*7&*&F:F*F3F**&F:F *F5F**&F=F*F3F**&F=F*F5F*Q(pprint76\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "KroneckerProduct(B,A);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7&7&*&%$a11G\"\"\"%$b11GF**&%$a12GF*F+F**&F)F*%$b12G F**&F-F*F/F*7&*&%$a21GF*F+F**&%$a22GF*F+F**&F3F*F/F**&F5F*F/F*7&*&F)F* %$b21GF**&F-F*F:F**&F)F*%$b22GF**&F-F*F=F*7&*&F3F*F:F**&F5F*F:F**&F3F* F=F**&F5F*F=F*Q(pprint86\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 161 "As indicated KroneckerProduct(A,B) can be obta ined by permuting the rows and columns of KroneckerProduct(B,A). The \+ following computation illustrates this point." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 55 "P := matrix( [[1,0,0,0],[0,0,1,0],[0,1,0,0],[0,0,0,1]]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"PGK%'matrixG6#7&7&\"\"\"\"\"!F+F+7&F+F+F*F+7&F+F*F+ F+7&F+F+F+F*Q(pprint96\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 39 "evalm(P &* KroneckerProduct(B,A) &* P);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7&7&*&%$a11G\"\"\"%$b11GF**&F)F*%$b12GF**&%$a12GF*F+ F**&F/F*F-F*7&*&F)F*%$b21GF**&F)F*%$b22GF**&F/F*F3F**&F/F*F5F*7&*&%$a2 1GF*F+F**&F:F*F-F**&%$a22GF*F+F**&F=F*F-F*7&*&F:F*F3F**&F:F*F5F**&F=F* F3F**&F=F*F5F*Q)pprint106\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 88 "The following computation illustrates the assoc iative property of the Kronecker product." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 42 "KroneckerProduct(A,Kr oneckerProduct(B,C));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7 *7**(%$a11G\"\"\"%$b11GF*%$c11GF**(F)F*F+F*%$c12GF**(F)F*%$b12GF*F,F** (F)F*F0F*F.F**(%$a12GF*F+F*F,F**(F3F*F+F*F.F**(F3F*F0F*F,F**(F3F*F0F*F .F*7**(F)F*F+F*%$c21GF**(F)F*F+F*%$c22GF**(F)F*F0F*F9F**(F)F*F0F*F;F** (F3F*F+F*F9F**(F3F*F+F*F;F**(F3F*F0F*F9F**(F3F*F0F*F;F*7**(F)F*%$b21GF *F,F**(F)F*FDF*F.F**(F)F*%$b22GF*F,F**(F)F*FGF*F.F**(F3F*FDF*F,F**(F3F *FDF*F.F**(F3F*FGF*F,F**(F3F*FGF*F.F*7**(F)F*FDF*F9F**(F)F*FDF*F;F**(F )F*FGF*F9F**(F)F*FGF*F;F**(F3F*FDF*F9F**(F3F*FDF*F;F**(F3F*FGF*F9F**(F 3F*FGF*F;F*7**(%$a21GF*F+F*F,F**(FXF*F+F*F.F**(FXF*F0F*F,F**(FXF*F0F*F .F**(%$a22GF*F+F*F,F**(FgnF*F+F*F.F**(FgnF*F0F*F,F**(FgnF*F0F*F.F*7**( FXF*F+F*F9F**(FXF*F+F*F;F**(FXF*F0F*F9F**(FXF*F0F*F;F**(FgnF*F+F*F9F** (FgnF*F+F*F;F**(FgnF*F0F*F9F**(FgnF*F0F*F;F*7**(FXF*FDF*F,F**(FXF*FDF* F.F**(FXF*FGF*F,F**(FXF*FGF*F.F**(FgnF*FDF*F,F**(FgnF*FDF*F.F**(FgnF*F GF*F,F**(FgnF*FGF*F.F*7**(FXF*FDF*F9F**(FXF*FDF*F;F**(FXF*FGF*F9F**(FX F*FGF*F;F**(FgnF*FDF*F9F**(FgnF*FDF*F;F**(FgnF*FGF*F9F**(FgnF*FGF*F;F* Q)pprint116\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 42 "KroneckerP roduct(KroneckerProduct(A,B),C);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K% 'matrixG6#7*7**(%$a11G\"\"\"%$b11GF*%$c11GF**(F)F*F+F*%$c12GF**(F)F*%$ b12GF*F,F**(F)F*F0F*F.F**(%$a12GF*F+F*F,F**(F3F*F+F*F.F**(F3F*F0F*F,F* *(F3F*F0F*F.F*7**(F)F*F+F*%$c21GF**(F)F*F+F*%$c22GF**(F)F*F0F*F9F**(F) F*F0F*F;F**(F3F*F+F*F9F**(F3F*F+F*F;F**(F3F*F0F*F9F**(F3F*F0F*F;F*7**( F)F*%$b21GF*F,F**(F)F*FDF*F.F**(F)F*%$b22GF*F,F**(F)F*FGF*F.F**(F3F*FD F*F,F**(F3F*FDF*F.F**(F3F*FGF*F,F**(F3F*FGF*F.F*7**(F)F*FDF*F9F**(F)F* FDF*F;F**(F)F*FGF*F9F**(F)F*FGF*F;F**(F3F*FDF*F9F**(F3F*FDF*F;F**(F3F* FGF*F9F**(F3F*FGF*F;F*7**(%$a21GF*F+F*F,F**(FXF*F+F*F.F**(FXF*F0F*F,F* *(FXF*F0F*F.F**(%$a22GF*F+F*F,F**(FgnF*F+F*F.F**(FgnF*F0F*F,F**(FgnF*F 0F*F.F*7**(FXF*F+F*F9F**(FXF*F+F*F;F**(FXF*F0F*F9F**(FXF*F0F*F;F**(Fgn F*F+F*F9F**(FgnF*F+F*F;F**(FgnF*F0F*F9F**(FgnF*F0F*F;F*7**(FXF*FDF*F,F **(FXF*FDF*F.F**(FXF*FGF*F,F**(FXF*FGF*F.F**(FgnF*FDF*F,F**(FgnF*FDF*F .F**(FgnF*FGF*F,F**(FgnF*FGF*F.F*7**(FXF*FDF*F9F**(FXF*FDF*F;F**(FXF*F GF*F9F**(FXF*FGF*F;F**(FgnF*FDF*F9F**(FgnF*FDF*F;F**(FgnF*FGF*F9F**(Fg nF*FGF*F;F*Q)pprint126\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 " " 0 "" {TEXT -1 144 "Since the Kronecker product is associative, we ca n write a function that takes a sequence of matrices as input and retu rns the Kronecker product" }}{PARA 0 "" 0 "" {TEXT -1 226 "of the sequ ence of matrices. This procedure takes advantage of Maple's mechanism for accessing a variable number of arguments [they are stored in a li st called args and the number of arguments is stored in the variable n args." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "KP := proc()" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 13 " \+ local i, C;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 29 " C := linalg[matrix ]([[1]]);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " for i from 1 to narg s do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 37 " C := KroneckerProduct(C ,args[i]);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 17 " return eval(C);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#KPGf*6\"6$%\"iG%\"CG F&F&C%>8%-&%'linalgG6#%'matrixG6#7#7#\"\"\"?(8$F5F59#%%trueG>F,-%1Kron eckerProductG6$F,&9\"6#F7O-%%evalG6#F,F&F&F&" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "KP(A,B);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'ma trixG6#7&7&*&%$a11G\"\"\"%$b11GF**&F)F*%$b12GF**&%$a12GF*F+F**&F/F*F-F *7&*&F)F*%$b21GF**&F)F*%$b22GF**&F/F*F3F**&F/F*F5F*7&*&%$a21GF*F+F**&F :F*F-F**&%$a22GF*F+F**&F=F*F-F*7&*&F:F*F3F**&F:F*F5F**&F=F*F3F**&F=F*F 5F*Q)pprint136\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 475 "KroneckerProduct(A,B) can be decomposed into the product of Kronecker products involving the identity matrix, which have a par ticularly simple form. In particular, KroneckerProduct(A,B) = Kroneck erProduct(A,I_n) * KroneckerProduct(I_m,B), where I_m and I_n are iden tity matrices of size m and n respectively. This property follows fro m the multiplicative property of the Kronecker product: simply write \+ A as A * I_m and B as I_n * B, and apply the multiplicative property. " }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 32 "KroneckerProduct(Identity(2),B);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7&7&%$b11G%$b12G\"\"!F*7&%$b21G%$b22GF*F*7&F*F*F(F)7 &F*F*F,F-Q)pprint146\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 32 "K roneckerProduct(A,Identity(2));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%' matrixG6#7&7&%$a11G\"\"!%$a12GF)7&F)F(F)F*7&%$a21GF)%$a22GF)7&F)F-F)F. Q)pprint156\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 74 "multiply(K roneckerProduct(A,Identity(2)),KroneckerProduct(Identity(2),B));" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7&7&*&%$a11G\"\"\"%$b11GF* *&F)F*%$b12GF**&%$a12GF*F+F**&F/F*F-F*7&*&F)F*%$b21GF**&F)F*%$b22GF**& F/F*F3F**&F/F*F5F*7&*&%$a21GF*F+F**&F:F*F-F**&%$a22GF*F+F**&F=F*F-F*7& *&F:F*F3F**&F:F*F5F**&F=F*F3F**&F=F*F5F*Q)pprint166\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 112 "The WHT matrix W_N, where N = 2^n, is the N X N matrix W_2 kronecker ... kronecker W_2, \+ where W_2 is the matrix" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 29 "W2 := matrix([[1,1],[1,-1]]);" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#>%#W2GK%'matrixG6#7$7$\"\"\"F*7$F*!\" \"Q)pprint176\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 30 "W4 := Kr oneckerProduct(W2,W2);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#W4GK%'mat rixG6#7&7&\"\"\"F*F*F*7&F*!\"\"F*F,7&F*F*F,F,7&F*F,F,F*Q)pprint186\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 30 "W8 := KroneckerProduct(W2 ,W4);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#W8GK%'matrixG6#7*7*\"\"\"F *F*F*F*F*F*F*7*F*!\"\"F*F,F*F,F*F,7*F*F*F,F,F*F*F,F,7*F*F,F,F*F*F,F,F* 7*F*F*F*F*F,F,F,F,7*F*F,F*F,F,F*F,F*7*F*F*F,F,F,F,F*F*7*F*F,F,F*F,F*F* F,Q)pprint196\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "WHT := p roc(n)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 20 " local W, W2, N, i;" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 " N := 2^n; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 32 " W2 := matrix([[1,1],[1,-1]]); " }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 36 " if n = 1 then return eval(W2); fi;" }}{PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 10 " W := W2;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 22 " for i from 2 to n do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 32 " W := KroneckerProduct(W2,W);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " od; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 17 " return eval(W);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%$WHT Gf*6#%\"nG6&%\"WG%#W2G%\"NG%\"iG6\"F-C(>8&)\"\"#9$>8%-%'matrixG6#7$7$ \"\"\"F;7$F;!\"\"@$/F3F;O-%%evalG6#F5>8$F5?(8'F2F;F3%%trueG>FE-%1Krone ckerProductG6$F5FEO-FB6#FEF-F-F-" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 7 "WHT(1);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6 #7$7$\"\"\"F(7$F(!\"\"Q)pprint206\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 7 "WHT(2);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6 #7&7&\"\"\"F(F(F(7&F(!\"\"F(F*7&F(F(F*F*7&F(F*F*F(Q)pprint216\"" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 7 "WHT(3);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7*7*\"\"\"F(F(F(F(F(F(F(7*F(!\"\"F(F*F(F*F( F*7*F(F(F*F*F(F(F*F*7*F(F*F*F(F(F*F*F(7*F(F(F(F(F*F*F*F*7*F(F*F(F*F*F( F*F(7*F(F(F*F*F*F*F(F(7*F(F*F*F(F*F(F(F*Q)pprint226\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 134 "Since the WHT is de fined by the tensor product, the WHT matrix can be factored using the \+ decomposition rule for the Kronecker product." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 31 "W2I2 := KP(W HT(1),Identity(2));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%%W2I2GK%'matr ixG6#7&7&\"\"\"\"\"!F*F+7&F+F*F+F*7&F*F+!\"\"F+7&F+F*F+F.Q)pprint236\" " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 31 "I2W2 := KP(Identity(2), WHT(1));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%%I2W2GK%'matrixG6#7&7&\" \"\"F*\"\"!F+7&F*!\"\"F+F+7&F+F+F*F*7&F+F+F*F-Q)pprint246\"" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "multiply(W2I2,I2W2);" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7&7&\"\"\"F(F(F(7&F(!\"\"F (F*7&F(F(F*F*7&F(F*F*F(Q)pprint256\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 " " }}{PARA 0 "" 0 "" {TEXT -1 194 "This decomposition can be generalize d to factor WHT(n) into the product of n factors of the form Kronecker Product(I,W,I), where W is a smaller WHT matrix. This is first illust rated with WHT(3)." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 " > " 0 "" {MPLTEXT 1 0 29 "WI := KP(WHT(1),Identity(4));" }}{PARA 11 " " 1 "" {XPPMATH 20 "6#>%#WIGK%'matrixG6#7*7*\"\"\"\"\"!F+F+F*F+F+F+7*F +F*F+F+F+F*F+F+7*F+F+F*F+F+F+F*F+7*F+F+F+F*F+F+F+F*7*F*F+F+F+!\"\"F+F+ F+7*F+F*F+F+F+F0F+F+7*F+F+F*F+F+F+F0F+7*F+F+F+F*F+F+F+F0Q)pprint266\" " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 42 "IWI := KP(Identity(2),W HT(1),Identity(2));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%$IWIGK%'matri xG6#7*7*\"\"\"\"\"!F*F+F+F+F+F+7*F+F*F+F*F+F+F+F+7*F*F+!\"\"F+F+F+F+F+ 7*F+F*F+F.F+F+F+F+7*F+F+F+F+F*F+F*F+7*F+F+F+F+F+F*F+F*7*F+F+F+F+F*F+F. F+7*F+F+F+F+F+F*F+F.Q)pprint276\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 29 "IW := KP(Identity(4),WHT(1));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#IWGK%'matrixG6#7*7*\"\"\"F*\"\"!F+F+F+F+F+7*F*!\"\"F +F+F+F+F+F+7*F+F+F*F*F+F+F+F+7*F+F+F*F-F+F+F+F+7*F+F+F+F+F*F*F+F+7*F+F +F+F+F*F-F+F+7*F+F+F+F+F+F+F*F*7*F+F+F+F+F+F+F*F-Q)pprint286\"" }}} {PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 114 "Verify t hat WHT(3) = WI * IWI * IW. Maple's evalm [evaluate matrix command is used - &* is matrix multiplication]" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 32 "evalm(WI &* IWI &* IW - WH T(3));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'matrixG6#7*7*\"\"!F(F(F(F (F(F(F(F'F'F'F'F'F'F'Q)pprint296\"" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 186 "In the last part of this secti on, we apply the WHT matrix to special vectors and note the result. T his will be used for debugging purposes when we write a function to co mpute y = WHT*x." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 283 "Note that if we apply WHT(n) to the vector with 2^n ones , we will always get a vector with 2^n is the first location and zeroe s elsewhere. This is due to the fact that there are an equal number o f 1's and -1's in every row of the WHT matrix except the first, where \+ there are N ones." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 "x := v ector([1$8]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"xGK%'vectorG6#7* \"\"\"F)F)F)F)F)F)F)Q)pprint306\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 "evalm(WHT(3) &* x);" }}{PARA 11 "" 1 "" {XPPMATH 20 " 6#K%'vectorG6#7*\"\")\"\"!F(F(F(F(F(F(Q)pprint316\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "x := vector([1$16]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"xGK%'vectorG6#72\"\"\"F)F)F)F)F)F)F)F)F)F)F)F)F)F)F )Q)pprint326\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 "evalm(WHT (4) &* x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'vectorG6#72\"#;\"\"!F (F(F(F(F(F(F(F(F(F(F(F(F(F(Q)pprint336\"" }}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}}{SECT 0 {PARA 3 "" 0 "" {TEXT -1 25 "Partition Tree Procedures " }}{PARA 0 "" 0 "" {TEXT -1 92 "This section collects procedures to p rint, generate, count, and investigate partition trees." }}{SECT 0 {PARA 4 "" 0 "" {TEXT -1 9 "BinToPart" }}{PARA 0 "" 0 "" {TEXT -1 532 "Write a Maple BinToPart(j,n) where n is a positive integer and 0 <= j < 2^(n-1), that returns a list of integers [n1,...,nt] with n1+...+nt = n. As j varies between 0 and 2^(n-1)-1 all posible such lists shou ld be generated. Such a function is obtained from the 1-1 mapping tha t maps a sequence of (n-1) 0's and 1's to an ordered partition of n. \+ Simply insert the zeros and ones in the (n-1) gaps between a string of all ones. Add adjacent ones in the string of ones until a 1 bit is e ncountered in the string of zeros and ones." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 173 "BinToPart:=proc(n ,j_in)\n local L,j,i;L:=[1];j:=j_in;\nfor i from 1 to n-1 do \nif(j mo d 2 = 1)then \nL:=[1,op(L)];\n else \nL:=subsop(1=L[1]+1,L);\nfi;\nj:= floor(j/2);\nend;\nL;\nend;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%*BinT oPartGf*6$%\"nG%%j_inG6%%\"LG%\"jG%\"iG6\"F-C&>8$7#\"\"\">8%9%?(8&F2F2 ,&9$F2F2!\"\"%%trueGC$@%/-%$modG6$F4\"\"#F2>F07$F2-%#opG6#F0>F0-%'subs opG6$/F2,&&F06#F2F2F2F2F0>F4-%&floorG6#,$*&#F2FBF2F4F2F2F0F-F-F-" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 74 "Let's confirm for ourselves that t his works by testing a few simple cases:" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "seq(BinToPart(3,i),i=0..3);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6&7#\"\"$7$\"\"#\"\"\"7$F'F&7%F'F'F'" }}}{EXCHG {PARA 0 " > " 0 "" {MPLTEXT 1 0 27 "seq(BinToPart(4,i),i=0..7);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6*7#\"\"%7$\"\"$\"\"\"7$\"\"#F)7%F)F'F'7$F'F&7%F'F)F '7%F'F'F)7&F'F'F'F'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 28 "seq( BinToPart(5,i),i=0..15);" }}{PARA 12 "" 1 "" {XPPMATH 20 "627#\"\"&7$ \"\"%\"\"\"7$\"\"$\"\"#7%F)F'F'7$F*F)7%F*F*F'7%F*F'F*7&F*F'F'F'7$F'F&7 %F'F)F'7%F'F*F*7&F'F*F'F'7%F'F'F)7&F'F'F*F'7&F'F'F'F*7'F'F'F'F'F'" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}{SECT 0 {PARA 4 "" 0 " " {TEXT -1 9 "PrintTree" }}{EXCHG {PARA 0 "" 0 "" {TEXT -1 149 "We'll \+ use a helper function so that the user of PrintTree doesn't need to wo rry about that initial empty string for the indentation of the root no de." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 43 "PrintTree:=proc(T)\nPrintTreeSub(T,\"\");\nend;" }}{PARA 11 "" 1 " " {XPPMATH 20 "6#>%*PrintTreeGf*6#%\"TG6\"F(F(-%-PrintTreeSubG6$9$Q!F( F(F(F(" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "PrintTreeSub:=pro c(T,ind)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " local i, root, childr en;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 34 " root := T[1]; children := T[2];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " printf(\"%s%d\\n\",ind, root);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 41 " for i from nops(childre n) by -1 to 1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 42 " PrintTreeSu b(children[i],ind || \" \");" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " o d;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 "end;\n" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%-PrintTreeSubGf*6$%\"TG%$indG6%%\"iG%%rootG%)children G6\"F-C&>8%&9$6#\"\"\">8&&F26#\"\"#-%'printfG6%Q&%s%d|+F-9%F0?(8$-%%no psG6#F6!\"\"F4%%trueG-F$6$&F66#F@(F>Q#~~F-F-F-F-" }}}{EXCHG {PARA 0 " " 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 71 "Let's confirm that this works on the example in the homework, at least:" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 46 "PrintTree([3,[[2,[[1,[]], [1,[]]]], [1,[]]]]);" }}{PARA 0 "" 0 "" {TEXT -1 261 "If we were guaranteed binary trees, we might want to do an in-order traversal. But it's a bother to decide w here to put the root when the tree isn't binary. A pre-order traversal works just fine: putting the root at the beginning is as good as any \+ other scheme." }}{PARA 0 "" 0 "" {TEXT -1 1 "." }}{PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 2" }}{PARA 6 "" 1 "" {TEXT -1 5 " 1" }}{PARA 6 "" 1 " " {TEXT -1 5 " 1" }}}}{SECT 0 {PARA 4 "" 0 "" {TEXT -1 8 "RandTree " }}{PARA 0 "" 0 "" {TEXT -1 45 "Routines to generate a random partiti on tree." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 31 "RandAux := rand(0..2^(31)-1); " }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%(RandAuxGf*6\"6#%\"tGF&F&C&>%&_seedG-%%iremG6$*&T#\" \"\"F+F1T%>8$F+?(F&F1F1T'%%trueGC$>F+F,>F4,&*&T)F1F4F1F1F+F1,&-F-6$F4T +F1T-F1F&6#F+6.%\"aG%\"aG%\"pG%\"pG%(concatsG%(concatsG%\"sG%\"sG%(div isorG%(divisorG%'offsetG%'offsetG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 15 "Rand := proc(n)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 25 " return RandAux() mod n;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%%RandGf*6#%\"nG6\"F(F(O-%$modG6$-% (RandAuxGF(9$F(F(F(" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" } {MPLTEXT 1 0 128 "RandTree:=proc(root)\nlocal part,children,i;\npart:= BinToPart(root,Rand(2^(root-1)));\nif nops(part) = 1 then return [root ,[]]; fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 15 "children := [];" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 31 "for i from 1 to nops(part) do " }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 45 " children:=[op(children),RandTree( part[i])];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 3 "od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 23 "return [root,children];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%)RandTreeGf* 6#%%rootG6%%%partG%)childrenG%\"iG6\"F,C'>8$-%*BinToPartG6$9$-%%RandG6 #)\"\"#,&F3\"\"\"F:!\"\"@$/-%%nopsG6#F/F:O7$F37\">8%FC?(8&F:F:F>%%true G>FE7$-%#opG6#FE-F$6#&F/6#FGO7$F3FEF,F,F," }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }{MPLTEXT 1 0 58 "RandExpandedTree:=proc(root,cutoff)\nl ocal part,children,i;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 44 "if root <= cutoff then return [root,[]]; fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 69 "part:=BinToPart(root,Rand(2^(root-1)-1)+1); # preclude part = [ro ot]" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 15 "children := [];" }}{PARA 0 " > " 0 "" {MPLTEXT 1 0 31 "for i from 1 to nops(part) do " }}{PARA 0 " > " 0 "" {MPLTEXT 1 0 60 " children:=[op(children),RandExpandedTree(p art[i],cutoff)];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 3 "od;" }}{PARA 0 " > " 0 "" {MPLTEXT 1 0 23 "return [root,children];" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%1RandExpan dedTreeGf*6$%%rootG%'cutoffG6%%%partG%)childrenG%\"iG6\"F-C'@$19$9%O7$ F17\">8$-%*BinToPartG6$F1,&-%%RandG6#,&)\"\"#,&F1\"\"\"FC!\"\"FCFCFDFC FCFC>8%F5?(8&FCFC-%%nopsG6#F7%%trueG>FF7$-%#opG6#FF-F$6$&F76#FHF2O7$F1 FFF-F-F-" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }{MPLTEXT 1 0 58 "Ra ndBinaryTree:=proc(root,cutoff)\nlocal part,children,i,k;" }}{PARA 0 " > " 0 "" {MPLTEXT 1 0 44 "if root <= cutoff then return [root,[]]; fi; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 51 "if root = 2 then return [root,[ [1,[]],[1,[]]]]; fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 46 "k := Rand(r oot-2)+1; # preclude trivial split" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "part:=[k,root-k];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 52 "children : = map((i)->RandBinaryTree(i,cutoff),part);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 23 "return [root,children];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%/RandBinaryT reeGf*6$%%rootG%'cutoffG6&%%partG%)childrenG%\"iG%\"kG6\"F.C(@$19$9%O7 $F27\"@$/F2\"\"#O7$F27$7$\"\"\"F6F=>8',&-%%RandG6#,&F2F>F9!\"\"F>F>F>> 8$7$F@,&F2F>F@FF>8%-%$mapG6$f*6#F,F.6$%)operatorG%&arrowGF.-F$6$F2T$F. F.6$F(F3FHO7$F2FLF.F.F." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 " T := RandBinaryTree(8,3);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"TG7$ \"\")7$7$\"\"#7\"7$\"\"'7$7$\"\"$F*F." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 "PrintTree(T);" }}{PARA 6 "" 1 "" {TEXT -1 1 "8" }} {PARA 6 "" 1 "" {TEXT -1 3 " 6" }}{PARA 6 "" 1 "" {TEXT -1 5 " 3" }}{PARA 6 "" 1 "" {TEXT -1 5 " 3" }}{PARA 6 "" 1 "" {TEXT -1 3 " 2 " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "T := RandExpandedTree(8 ,3);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"TG7$\"\")7&7$\"\"\"7\"F(7$ \"\"&7$7$\"\"#F*7$\"\"$F*F(" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 "PrintTree(T);" }}{PARA 6 "" 1 "" {TEXT -1 1 "8" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 5" }}{PARA 6 "" 1 "" {TEXT -1 5 " 3" }}{PARA 6 "" 1 "" {TEXT -1 5 " 2" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 195 "Let's try a couple examples. Since maple is so nicely interactive, \"a couple\" means we just execute these ne xt two lines until we feel comfortable that what we think is happening above really is." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "T := RandTree( 7);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"TG7$\"\"(7\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 "PrintTree(%);" }}{PARA 6 "" 1 "" {TEXT -1 1 "7" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}} {SECT 0 {PARA 4 "" 0 "" {TEXT -1 8 "GenTrees" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 43 "Routines to generate all partit ion trees. " }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 24 "with(combinat,cartprod):" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 61 "Given a root value, we generate all partitions for that root:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 39 "GenTrees := proc(root) option remember;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 45 " local S, T, part, trees, tree, children, j;" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 " S := \{[root,[]]\};" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 32 " if root = 1 then return S; fi;" }}{PARA 0 " > " 0 "" {MPLTEXT 1 0 33 " for j from 1 to 2^(root-1)-1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 32 " part := BinToPart(root,j); " }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 32 " trees := map(GenTrees,part);" } }{PARA 0 "> " 0 "" {MPLTEXT 1 0 35 " T := combinat[cartprod](trees) ;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " while not T[finished] do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 33 " children := T[nextvalue](); " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 30 " tree := [root,children]; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " S := S union \{tree\};" } }{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 11 " return S ;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%)GenTreesGf*6#%%rootG6)%\"SG%\"TG%%partG%&treesG%%tre eG%)childrenG%\"jG6#%)rememberG6\"C&>8$<#7$9$7\"@$/F8\"\"\"OF5?(8*F8&-%*BinToPartG6$F8F?>8'-%$mapG6$ F$FH>8%-&%)combinatG6#_FU%)cartprodG6#FM?(F2F 8)-&FR6#%*nextvalueGF2>8(7$F8F[o>F5-%&unionG6$F5<#FaoOF5F2F2F2" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 47 "GenExpandedTrees := proc(roo t) option remember;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 45 " local S, T , part, trees, tree, children, j;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 10 " S := \{\};" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 39 " if root = 1 t hen return \{[1,[]]\}; fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 33 " for j from 1 to 2^(root-1)-1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 32 " \+ part := BinToPart(root,j); " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 40 " \+ trees := map(GenExpandedTrees,part);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 35 " T := combinat[cartprod](trees);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " while not T[finished] do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 33 " children := T[nextvalue]();" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 30 " tree := [root,children];" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 26 " S := S union \{tree\};" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " od;" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 11 " return S;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%1GenExpanded TreesGf*6#%%rootG6)%\"SG%\"TG%%partG%&treesG%%treeG%)childrenG%\"jG6#% )rememberG6\"C&>8$<\"@$/9$\"\"\"O<#7$F:7\"?(8*F:F:,&)\"\"#,&F9F:F:!\" \"F:F:FE%%trueGC&>8&-%*BinToPartG6$F9F@>8'-%$mapG6$F$FI>8%-&%)combinat G6#_FV%)cartprodG6#FN?(F2F:F:F24&FS6#%)finishedGC%>8)-&FS6#%*nextvalue GF2>8(7$F9F\\o>F5-%&unionG6$F5<#FboOF5F2F2F2" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "GenTrees(2);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6# <$7$\"\"#7\"7$F%7$7$\"\"\"F&F)" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "S3 := GenTrees(3);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%#S3G<( 7$\"\"$7\"7$F'7$7$\"\"#7$7$\"\"\"F(F.F.7$F'7$F.7$F,F(7$F'7$F.F+7$F'7$F 2F.7$F'7%F.F.F." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "nops(S3); " }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"'" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 18 "S4 := GenTrees(4);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%#S4G<:7$\"\"%7%7$\"\"#7$7$\"\"\"7\"F,F,F,7$F'7$F,7$\"\"$F.7$F'7%F ,F,7$F*F.7$F'7%F,F,F)7$F'7&F,F,F,F,7$F'7$F,7$F27$F)F,7$F'7$F,7$F27$F,F 57$F'7$F,7$F27$F,F)7$F'7$F,7$F27$F5F,7$F'7$F,7$F27%F,F,F,7$F'7$FHF,7$F '7%F5F,F,7$F'7$F1F,7$F'7$F " 0 "" {MPLTEXT 1 0 9 "nops(S4);" }}{PARA 11 "" 1 " " {XPPMATH 20 "6#\"#C" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "fo r T in S3 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 30 " PrintTree(T); pr intf(\"\\n\");" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 3 "od;" }}{PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 0 "" }}{PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 " " 1 "" {TEXT -1 0 "" }}{PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 "" 1 " " {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 2" }}{PARA 6 "" 1 " " {TEXT -1 5 " 1" }}{PARA 6 "" 1 "" {TEXT -1 5 " 1" }}{PARA 6 " " 1 "" {TEXT -1 0 "" }}{PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 "" 1 " " {TEXT -1 3 " 2" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 " " {TEXT -1 0 "" }}{PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 "" 1 "" {TEXT -1 3 " 2" }}{PARA 6 "" 1 "" {TEXT -1 5 " 1" }}{PARA 6 "" 1 " " {TEXT -1 5 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 0 "" }}{PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 2" }}{PARA 6 "" 1 "" {TEXT -1 0 "" }}{PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 0 "" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 0 "" }}}}{SECT 0 {PARA 4 "" 0 "" {TEXT -1 38 "Gene rate Iterative and Recursive Trees" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }} {PARA 0 "" 0 "" {TEXT -1 126 "Routines to generate special families of partition trees that correspond to recursive, iterative, and balanced WHT algorithms." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 41 "GenerateRightRec := proc(L::list(posint))" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 " local n, root, i;" }}{PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 17 " n := nops(L);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 19 " if (n = 1) then" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 23 " return [L[1],[]];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 8 " \+ else" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 31 " root := add(L[i],i=1 ..n);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 59 " RETURN([root,[[L[1], []],GenerateRightRec(L[2..n])]]);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 " " {XPPMATH 20 "6#>%1GenerateRightRecGf*6#'%\"LG-%%listG6#%'posintG6%% \"nG%%rootG%\"iG6\"F1C$>8$-%%nopsG6#9$@%/F4\"\"\"O7$&F86#F;7\"C$>8%-%$ addG6$&F86#8&/FI;F;F4-%'RETURNG6#7$FC7$F=-F$6#&F86#;\"\"#F4F1F1F1" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 40 "GenerateLeftRec := proc(L::l ist(posint))" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 19 " local n, root, i; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 17 " n := nops(L);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 19 " if (n = 1) then" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 23 " return [L[1],[]];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 8 " else" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 31 " r oot := add(L[i],i=1..n);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 58 " R ETURN([root,[GenerateLeftRec(L[2..n]),[L[1],[]]]]);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%0GenerateLeftRecGf*6#'%\"LG-%%list G6#%'posintG6%%\"nG%%rootG%\"iG6\"F1C$>8$-%%nopsG6#9$@%/F4\"\"\"O7$&F8 6#F;7\"C$>8%-%$addG6$&F86#8&/FI;F;F4-%'RETURNG6#7$FC7$-F$6#&F86#;\"\"# F4F=F1F1F1" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 42 "GenerateItera tive := proc(L::list(posint))" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 32 " \+ local n, root, children, i, T;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 15 " \+ n := nops(L);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 27 " root := add(L[i ],i=1..n);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 38 " children := [seq([L [i],[]],i=1..n)];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " return [root , children];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%2GenerateIterativeGf*6#'%\"LG-%%listG6#%'posintG 6'%\"nG%%rootG%)childrenG%\"iG%\"TG6\"F3C&>8$-%%nopsG6#9$>8%-%$addG6$& F:6#8'/FB;\"\"\"F6>8&7#-%$seqG6$7$F@7\"FCO7$F " 0 "" {MPLTEXT 1 0 27 "GenerateBalanced := proc(n)" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 16 " local root, i;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 19 " if (n = 1) then" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 20 " return [1,[]];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 8 " \+ else" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 76 " return [n,[GenerateBa lanced(ceil(n/2)),GenerateBalanced(floor(n/2))]];" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 7 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" } }{PARA 12 "" 1 "" {XPPMATH 20 "6#>%1GenerateBalancedGf*6#%\"nG6$%%root G%\"iG6\"F+@%/9$\"\"\"O7$F/7\"O7$F.7$-F$6#-%%ceilG6#,$*&#F/\"\"#F/F.F/ F/-F$6#-%&floorGF:F+F+F+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "Generate34Rule := proc(n)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 16 " loc al root, k;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 19 " if (n = 1) then " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 20 " return [1,[]];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 8 " else" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 39 " k := ceil(simplify(log[2](n))); " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " if n/2^k >= 3/4 then" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 71 " return [n,[Generate34Rule(2^(k-1)),Generate34 Rule(n-2^(k-1))]];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 10 " else" } }{PARA 0 "> " 0 "" {MPLTEXT 1 0 71 " return [n,[Generate34Rule( n-2^(k-2)),Generate34Rule(2^(k-2))]];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>% /Generate34RuleGf*6#%\"nG6$%%rootG%\"kG6\"F+@%/9$\"\"\"O7$F/7\"C$>8%-% %ceilG6#-%)simplifyG6#-&%$logG6#\"\"#6#F.@%1#\"\"$\"\"%*&F.F/)F@F5!\" \"O7$F.7$-F$6#)F@,&F5F/F/FI-F$6#,&F.F/FOFIO7$F.7$-F$6#,&F.F/)F@,&F5F/F @FIFI-F$6#FZF+F+F+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 31 "Tr := GenerateLeftRec([1,1,1]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#TrG7$ \"\"$7$7$\"\"#7$7$\"\"\"7\"F+F+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "PrintTree(Tr);" }}{PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 2" }}{PARA 6 "" 1 "" {TEXT -1 5 " 1" }}{PARA 6 "" 1 "" {TEXT -1 5 " 1" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 33 "Ti := GenerateIterative([1,1 ,1]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#TiG7$\"\"$7%7$\"\"\"7\"F(F (" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "PrintTree(Ti);" }} {PARA 6 "" 1 "" {TEXT -1 1 "3" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }} {PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }} }{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 "Tb := GenerateBalanced(8); " }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#TbG7$\"\")7$7$\"\"%7$7$\"\"#7$7 $\"\"\"7\"F.F+F(" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "PrintTr ee(Tb);" }}{PARA 6 "" 1 "" {TEXT -1 1 "8" }}{PARA 6 "" 1 "" {TEXT -1 3 " 4" }}{PARA 6 "" 1 "" {TEXT -1 5 " 2" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 " " {TEXT -1 5 " 2" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 4" }} {PARA 6 "" 1 "" {TEXT -1 5 " 2" }}{PARA 6 "" 1 "" {TEXT -1 7 " \+ 1" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 5 " 2" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "Tp : = Generate34Rule(11);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%#TpG7$\"#67 $7$\"\"(7$7$\"\"%7$7$\"\"#7$7$\"\"\"7\"F1F.7$\"\"$7$F.F1F+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "PrintTree(Tp);" }}{PARA 6 "" 1 "" {TEXT -1 2 "11" }}{PARA 6 "" 1 "" {TEXT -1 3 " 4" }}{PARA 6 "" 1 "" {TEXT -1 5 " 2" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 " " 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 5 " 2" }} {PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 7 " \+ 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 7" }}{PARA 6 "" 1 "" {TEXT -1 5 " 3" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 7 " 2" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 "" {TEXT -1 5 " 4" }}{PARA 6 "" 1 "" {TEXT -1 7 " 2" }}{PARA 6 "" 1 "" {TEXT -1 9 " \+ 1" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 "" {TEXT -1 7 " 2" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "Tp := Generate34Rule(12);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#> %#TpG7$\"#77$7$\"\")7$7$\"\"%7$7$\"\"#7$7$\"\"\"7\"F1F.F+F+" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "PrintTree(Tp);" }}{PARA 6 " " 1 "" {TEXT -1 2 "12" }}{PARA 6 "" 1 "" {TEXT -1 3 " 4" }}{PARA 6 " " 1 "" {TEXT -1 5 " 2" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }} {PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 5 " \+ 2" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 7 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 8" }}{PARA 6 "" 1 "" {TEXT -1 5 " 4" }}{PARA 6 "" 1 "" {TEXT -1 7 " 2" }}{PARA 6 " " 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1 " }}{PARA 6 "" 1 "" {TEXT -1 7 " 2" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 " " {TEXT -1 5 " 4" }}{PARA 6 "" 1 "" {TEXT -1 7 " 2" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1 " }}{PARA 6 "" 1 "" {TEXT -1 7 " 2" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}{PARA 6 "" 1 "" {TEXT -1 9 " 1" }}}}}{SECT 0 {PARA 3 "" 0 "" {TEXT -1 11 "WHT Program" }}{PARA 0 "" 0 "" {TEXT -1 116 "An algorithm to compute the WHT using a specified partition tree. The Maple function EvalWHT computes x = WHT(n) x." }}{PARA 0 "" 0 " " {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 198 "Recall that for N = 2^ n, an algorithm to compute x = WHT(n) x can be obtained from a partiti on tree of n. The algorithm corresponds to recursive factorizations o f the WHT matrix of size N. If n = " }{XPPEDIT 18 0 "n[1]" "6#&%\"nG6 #\"\"\"" }{TEXT -1 8 "+ ... + " }{XPPEDIT 18 0 "n[t]" "6#&%\"nG6#%\"tG " }{TEXT -1 6 " then " }{XPPEDIT 18 0 "WHT(n) = Product(KP(Identity(N( i-1)),WHT(n[i]),Identity(N/N(i))),i = 1 .. t);" "6#/-%$WHTG6#%\"nG-%(P roductG6$-%#KPG6%-%)IdentityG6#-%\"NG6#,&%\"iG\"\"\"F6!\"\"-F%6#&F'6#F 5-F/6#*&F2F6-F26#F5F7/F5;F6%\"tG" }{TEXT -1 8 ", where " }{XPPEDIT 18 0 "N(i) = Product(2^n[i],i = 1 .. t);" "6#/-%\"NG6#%\"iG-%(ProductG6$) \"\"#&%\"nG6#F'/F';\"\"\"%\"tG" }{TEXT -1 210 ". This factorization l eads to a program with a triply nested loop to compute x = WHT(n) x. \+ The outer loop iteratively applies the factors in the product to the i nput vector x, and the inner two loops compute " }{XPPEDIT 18 0 "x = K P(Identity(R),WHT(n[i]),Identity(S))" "6#/%\"xG-%#KPG6%-%)IdentityG6#% \"RG-%$WHTG6#&%\"nG6#%\"iG-F)6#%\"SG" }{TEXT -1 113 " for R = N(i-1) a nd S = N/N(i). The middle loop corresponds to Identity(R) and iterate s over the blocks of size " }{XPPEDIT 18 0 "2^n[i]*S" "6#*&)\"\"#&%\"n G6#%\"iG\"\"\"%\"SGF*" }{TEXT -1 4 " in " }{XPPEDIT 18 0 "KP(Identity( R),WHT(n[i]),Identity(S));" "6#-%#KPG6%-%)IdentityG6#%\"RG-%$WHTG6#&% \"nG6#%\"iG-F'6#%\"SG" }{TEXT -1 34 ". The innder loop corresponds to " }{XPPEDIT 18 0 "KP(WHT(n[i]),Identity(S)) " "6#-%#KPG6$-%$WHTG6#&% \"nG6#%\"iG-%)IdentityG6#%\"SG" }{TEXT -1 25 "and computes S copies of " }{XPPEDIT 18 0 "WHT(n[i])" "6#-%$WHTG6#&%\"nG6#%\"iG" }{TEXT -1 103 " where the data is accessed at stride S. The algorithm applies i tself recursively for each to compute " }{XPPEDIT 18 0 "WHT(n[i])" "6# -%$WHTG6#&%\"nG6#%\"iG" }{TEXT -1 443 ". Since the recursive call is \+ applied to a subvector of x whose elements are accessed at stride S, i t is necessary to provide input parameters base and stride which indic ate the starting element and stride of the subvector that is used. Wh en the above factorization is applied to the recursive computation of \+ the subvector, additional strides are introduced and these strides mus t be multiplied by the stride used to specify the subvector. " }} {PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 764 "Leaf nod es in the partition tree correspond to the base case of the recursion. In a high-performance implementation the base case, would be compute d by straight-line code that avoids the overhead of loops and recursio n. In the case, where the base case corresponds to WHT(1), the code s imply adds and subtracts the appropriate elements of the input vector. In our implementation, EvalSmall is used to compute the base case. \+ EvalSmall actually constructs the appropriate WHT matrix and performs \+ the computation using a matrix-vector product. This approach works, b ut is inefficient for base cases larger than n = 1, since it uses an o rder N^2 algorithm (when the above factorization is used recursively d own to a base case of n=1, the algorithm requires order " }{XPPEDIT 18 0 "N*log[2](N)" "6#*&%\"NG\"\"\"-&%$logG6#\"\"#6#F$F%" }{TEXT -1 12 " operations." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 423 "# Evaluate WHT by definition. Used for the b ase case of the WHT recursion\n# Inputs:\n# n : log of the size of th e transform. N = 2^n.\n# x : input array\n# base : starting index o f subvector of x\n# stride : access stride for subvector of x\n# Side Effect:\n# The subvector x^N_\{base,stride\} is modified to be equal to WHT_N x^N_\{base,stride\}\n# where x^N_\{base,stride\} = [x(base) ,x(base+stride),...,x(base+(N-1)*stride)]." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 34 "EvalSmall := proc(n,x,base,stride)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 17 " local N,W,xt,i;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 27 " N := 2^n; W := WHT(n);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " xt := linalg[vector](N);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " for i from 0 to N-1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 34 " \+ xt[i+1] := x[base+i*stride];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " \+ od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 25 " xt := evalm(W &* xt); " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " for i from 0 to N-1 do" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 34 " x[base+i*stride] := xt[i+1]; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%*EvalSmallGf *6&%\"nG%\"xG%%baseG%'strideG6&%\"NG%\"WG%#xtG%\"iG6\"F0C(>8$)\"\"#9$> 8%-%$WHTG6#F6>8&-&%'linalgG6#%'vectorG6#F3?(8'\"\"!\"\"\",&F3FGFG!\"\" %%trueG>&F=6#,&FEFGFGFG&9%6#,&9&FG*&FEFG9'FGFG>F=-%&evalmG6#-%#&*G6$F8 F=?(FEFFFGFHFJ>FOFLF0F0F0" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "x := array(0..15);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"xG-%&arr ayG6$;\"\"!\"#:7\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 21 "for i from 0 to 15 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 12 " x[i] := 1;" } }{PARA 0 "> " 0 "" {MPLTEXT 1 0 3 "od:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "convert(x,vector);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6 #K%'vectorG6#72\"\"\"F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'Q)pprint436\"" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 "EvalSmall(4,x,0,1);" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "convert(x,vector);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6 #K%'vectorG6#72\"#;\"\"!F(F(F(F(F(F(F(F(F(F(F(F(F(F(Q)pprint446\"" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 21 "for i from 0 to 15 do" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 " x[i] := 1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 3 "od:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "conv ert(x,vector);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'vectorG6#72\"\"\" F'F'F'F'F'F'F'F'F'F'F'F'F'F'F'Q)pprint456\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 "EvalSmall(3,x,1,2);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "convert(x,ve ctor);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'vectorG6#72\"\"\"\"\")F' \"\"!F'F)F'F)F'F)F'F)F'F)F'F)Q)pprint466\"" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 15 "# Evaluate WHT." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "# Inputs:" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 34 "# W : partition tr ee with root n." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "# x : array" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 38 "# base : base index of subarray of x." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 50 "# stride : stride that suba rray of x is accessed." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "# Side Ef fect." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 85 "# The subvector x^N_\{bas e,stride\} is modified to be equal to WHT_N x^N_\{base,stride\}" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 76 "# where x^N_\{base,stride\} = [x(b ase),x(base+stride),...,x(base+(N-1)*stride" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 32 "EvalWHT := proc(W,x,base,stride)" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 53 " local n, N, children, W1, N1, n1, t, R, S, i, j, \+ k;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 64 " n := W[1]; N := 2^n; chil dren := W[2]; t := nops(children);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 15 " if t = 0 then" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 40 " EvalSmal l(n,x,base,stride); return;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " fi ;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 18 " R := N; S := 1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " for i from t by -1 to 1 do" }}{PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 61 " W1 := children[i]; n1 := W1[1]; N1 := 2^ n1; R := R/N1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " for j from 0 to R-1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " for k from 0 to S-1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 54 " EvalWHT(W1,x,bas e+(j*N1*S+k)*stride,S*stride);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 " \+ od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 14 " S := S*N1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%(EvalWHTGf*6&%\"WG%\"xG%%baseG%'strideG6.%\"nG%\"N G%)childrenG%#W1G%#N1G%#n1G%\"tG%\"RG%\"SG%\"iG%\"jG%\"kG6\"F8C*>8$&9$ 6#\"\"\">8%)\"\"#F;>8&&F=6#FC>8*-%%nopsG6#FE@$/FI\"\"!C$-%*EvalSmallG6 &F;9%9&9'OF8>8+FA>8,F??(8-FI!\"\"F?%%trueGC(>8'&FE6#Fgn>8)&F\\oF>>8()F CF`o>FY*&FYF?FcoFhn?(8.FOF?,&FYF?F?FhnFin?(8/FOF?,&FenF?F?FhnFin-F$6&F \\oFT,&FUF?*&,&*(FhoF?FcoF?FenF?F?F[pF?F?FVF?F?*&FenF?FVF?>Fen*&FenF?F coF?F8F8F8" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "x := array(0. .15);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"xG-%&arrayG6$;\"\"!\"#:7 \"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 37 "for i from 0 to 15 do x[i] := 1; od:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "convert (x,vector);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'vectorG6#72\"\"\"F'F 'F'F'F'F'F'F'F'F'F'F'F'F'F'Q)pprint496\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 38 "W := [4,[[3,[[2,[]],[1,[]]]],[1,[]]]];" }}{PARA 11 " " 1 "" {XPPMATH 20 "6#>%\"WG7$\"\"%7$7$\"\"$7$7$\"\"#7\"7$\"\"\"F-F." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 "PrintTree(W);" }}{PARA 6 "" 1 "" {TEXT -1 1 "4" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 " " 1 "" {TEXT -1 3 " 3" }}{PARA 6 "" 1 "" {TEXT -1 5 " 1" }}{PARA 6 "" 1 "" {TEXT -1 5 " 2" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "EvalWHT(W,x,0,1);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#;" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "convert(x,vector);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#K%'vectorG6#72\"#;\"\"!F(F(F(F(F(F(F(F(F(F(F (F(F(F(Q)pprint506\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }} }}{SECT 0 {PARA 3 "" 0 "" {TEXT -1 9 "WHT Trace" }}{PARA 0 "" 0 "" {TEXT -1 429 "This section provides Maple functions that return the se quence of addresses used by the WHT algorithm from the previous sectio n. The first version, TraceSmall, assumes that EvalSmall only access es the input/output vector once. The second version TraceSmallRW, pr oduces address for two sequences of interleaved reads followed by one \+ sequence of writes. This is the access pattern used by the WHT packag e (see www.spiral.net)." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "TraceSmall := " }{TEXT -1 0 "" } {MPLTEXT 1 0 19 "proc(n,base,stride)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 17 " local N,i,addr;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 13 " N := 2 ^n; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 38 " addr := seq(base+i*strid e,i=0..N-1);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 16 " return [addr];" } }{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%+TraceSmallGf*6%%\"nG%%baseG%'strideG6%%\"NG%\"iG%%addrG6\"F.C %>8$)\"\"#9$>8&-%$seqG6$,&9%\"\"\"*&8%F<9&F;\"\"!,&F1F " 0 "" {MPLTEXT 1 0 18 "TraceSmall(2,1 ,4);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7&\"\"\"\"\"&\"\"*\"#8" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "TraceSmall(2,0,1);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7&\"\"!\"\"\"\"\"#\"\"$" }}}{EXCHG {PARA 0 " > " 0 "" {MPLTEXT 1 0 16 "TraceSmallRW := " }{TEXT -1 0 "" }{MPLTEXT 1 0 19 "proc(n,base,stride)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " lo cal N,i, waddr, raddr;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 13 " N := 2^ n; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 120 " raddr := map((x)->op(x), [seq([base+2*i*stride,base+(2*i+1)*stride,base+2*i*stride,base+(2*i+1) *stride],i=0..N/2-1)]); " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 39 " waddr := seq(base+i*stride,i=0..N-1);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 27 " return [op(raddr),waddr];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end; " }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%-TraceSmallRWGf*6%%\"nG%%baseG%' strideG6&%\"NG%\"iG%&waddrG%&raddrG6\"F/C&>8$)\"\"#9$>8'-%$mapG6$f*6#% \"xGF/6$%)operatorG%&arrowGF/-%#opG6#F5F/F/F/7#-%$seqG6$7&,&9%\"\"\"*( F4FK8%FK9&FKFK,&FJFK*&,&*&F4FKFMFKFKFKFKFKFNFKFKFIFO/FM;\"\"!,&*&#FKF4 FKF2FKFKFK!\"\">8&-FF6$,&FJFK*&FMFKFNFKFK/FM;FU,&F2FKFKFYO7$-FB6#F7Fen F/F/F/" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "TraceSmallRW(2,0, 1);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7.\"\"!\"\"\"F$F%\"\"#\"\"$F&F' F$F%F&F'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "TraceSmallRW(2, 1,4);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7.\"\"\"\"\"&F$F%\"\"*\"#8F&F 'F$F%F&F'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 31 "TraceWHT := pr oc(W,base,stride)" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 59 " local n, N, \+ children, W1, N1, n1, t, R, S, i, j, k, addr;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 64 " n := W[1]; N := 2^n; children := W[2]; t := nops (children);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 15 " if t = 0 then" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 38 " return TraceSmall(n,base,stride ); " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 31 " addr := []; R := N; S := 1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " for i from t by -1 to 1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 61 " W1 := children[i]; n1 := W1[1]; N1 := 2^n1; R \+ := R/N1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " for j from 0 to R-1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " for k from 0 to S-1 do " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 76 " addr := [op(addr),op(Tr aceWHT(W1,base+(j*N1*S+k)*stride,S*stride))];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " od; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 14 " S := S*N1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 14 " ret urn addr;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 " " {XPPMATH 20 "6#>%)TraceWHTGf*6%%\"WG%%baseG%'strideG6/%\"nG%\"NG%)ch ildrenG%#W1G%#N1G%#n1G%\"tG%\"RG%\"SG%\"iG%\"jG%\"kG%%addrG6\"F8C,>8$& 9$6#\"\"\">8%)\"\"#F;>8&&F=6#FC>8*-%%nopsG6#FE@$/FI\"\"!O-%+TraceSmall G6%F;9%9&>807\">8+FA>8,F??(8-FI!\"\"F?%%trueGC(>8'&FE6#Fhn>8)&F]oF>>8( )FCFao>FZ*&FZF?FdoFin?(8.FOF?,&FZF?F?FinFjn?(8/FOF?,&FfnF?F?FinFjn>FW7 $-%#opG6#FW-Fap6#-F$6%F]o,&FTF?*&,&*(FioF?FdoF?FfnF?F?F\\pF?F?FUF?F?*& FfnF?FUF?>Ffn*&FfnF?FdoF?OFWF8F8F8" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 33 "TraceWHTRW := proc(W,base,stride)" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 59 " local n, N, children, W1, N1, n1, t, R, S, i, j, \+ k, addr;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 64 " n := W[1]; N := 2^n; children := W[2]; t := nops(children);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 15 " if t = 0 then" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 40 " return TraceSmallRW(n,base,stride); " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 31 " addr := \+ []; R := N; S := 1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " for i fr om t by -1 to 1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 61 " W1 := chi ldren[i]; n1 := W1[1]; N1 := 2^n1; R := R/N1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " for j from 0 to R-1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " for k from 0 to S-1 do" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 78 " addr := [op(addr),op(TraceWHTRW(W1,base+(j*N1 *S+k)*stride,S*stride))];" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 " o d;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 14 " S := S*N1;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " \+ od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 14 " return addr;" }}{PARA 0 " > " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%+Tr aceWHTRWGf*6%%\"WG%%baseG%'strideG6/%\"nG%\"NG%)childrenG%#W1G%#N1G%#n 1G%\"tG%\"RG%\"SG%\"iG%\"jG%\"kG%%addrG6\"F8C,>8$&9$6#\"\"\">8%)\"\"#F ;>8&&F=6#FC>8*-%%nopsG6#FE@$/FI\"\"!O-%-TraceSmallRWG6%F;9%9&>807\">8+ FA>8,F??(8-FI!\"\"F?%%trueGC(>8'&FE6#Fhn>8)&F]oF>>8()FCFao>FZ*&FZF?Fdo Fin?(8.FOF?,&FZF?F?FinFjn?(8/FOF?,&FfnF?F?FinFjn>FW7$-%#opG6#FW-Fap6#- F$6%F]o,&FTF?*&,&*(FioF?FdoF?FfnF?F?F\\pF?F?FUF?F?*&FfnF?FUF?>Ffn*&Ffn F?FdoF?OFWF8F8F8" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 38 "W := [4 ,[[3,[[2,[]],[1,[]]]],[1,[]]]];" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>% \"WG7$\"\"%7$7$\"\"$7$7$\"\"#7\"7$\"\"\"F-F." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 "PrintTree(W);" }}{PARA 6 "" 1 "" {TEXT -1 1 "4" }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}{PARA 6 "" 1 "" {TEXT -1 3 " 3" }}{PARA 6 "" 1 "" {TEXT -1 5 " 1" }}{PARA 6 "" 1 "" {TEXT -1 5 " \+ 2" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "T1 := TraceWHT(W,0,1) ;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%#T1G7R\"\"!\"\"\"\"\"#\"\"$\"\" %\"\"&\"\"'\"\"(\"\")\"\"*\"#5\"#6\"#7\"#8\"#9\"#:F&F(F*F,F.F0F2F4F&F* F.F2F(F,F0F4F'F)F+F-F/F1F3F5F'F+F/F3F)F-F1F5" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 40 "W := [4,[ [1,[]], [3,[[1,[]],[2,[]]]]]];" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"WG7$\"\"%7$7$\"\"\"7\"7$\"\"$7$F(7 $\"\"#F*" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 "PrintTree(W);" }}{PARA 6 "" 1 "" {TEXT -1 1 "4" }}{PARA 6 "" 1 "" {TEXT -1 3 " 3" }} {PARA 6 "" 1 "" {TEXT -1 5 " 2" }}{PARA 6 "" 1 "" {TEXT -1 5 " 1 " }}{PARA 6 "" 1 "" {TEXT -1 3 " 1" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "T2 := TraceWHT(W,0,1);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%#T2G7R\"\"!\"\"\"\"\"#\"\"$\"\"%\"\"&\"\"'\"\"(F&F*F'F+F(F,F)F -\"\")\"\"*\"#5\"#6\"#7\"#8\"#9\"#:F.F2F/F3F0F4F1F5F&F.F'F/F(F0F)F1F*F 2F+F3F,F4F-F5" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}} {SECT 0 {PARA 3 "" 0 "" {TEXT -1 15 "Cache Simulator" }}{PARA 0 "" 0 " " {TEXT -1 338 "This section provides a simple cache simulator, which \+ takes three cache design parameters [size, associativity, and block si ze] and a sequence of addresses and returns the number of cache misses . The simulator only simulates a single level unified cache [the addr ess sequence does not distinguish reads, writes or instructions vs. da ta]." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 448 " Create a data structure for the Cache simulator. An array, indexed by the cache index and set, is returned. Each entry in the array stores the tag and a clock tick, which is used to keep track of the time [in dex into the address list that is passed to the simulator] that the el ement is accessed. A zero entry in the clock field indicates that the cache entry is invalid. The clock information is used to implement t he lru replacement strategy." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "Cache := proc(C,A,B)" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 " local i, j, cache, slots;" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 21 " slots := C/(B*A); " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 36 " cache := array(0..slots-1,0..A-1);" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 28 " for i from 0 to slots-1 do" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " for j from 0 to A-1 do" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 43 " cache[i,j] := table([tag=0,cl ock=0]);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 21 " ret urn eval(cache);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 2 " " }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%&Cac heGf*6%%\"CG%\"AG%\"BG6&%\"iG%\"jG%&cacheG%&slotsG6\"F/C&>8'*(9$\"\"\" 9&!\"\"9%F7>8&-%&arrayG6$;\"\"!,&F2F5F5F7;F?,&F8F5F5F7?(8$F?F5F@%%true G?(8%F?F5FBFE>&F:6$FDFG-%&tableG6#7$/%$tagGF?/%&clockGF?O-%%evalG6#F:F /F/F/" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "cache := Cache(8,1 ,1);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%&cacheGK%&ARRAYG6$7$;\"\"!\" \"(;F*F*7*/6$F*F*K%&TABLEG6#7$/%$tagGF*/%&clockGF*Q)pprint406\"/6$\"\" \"F*KF1F2Q)pprint41F9/6$\"\"#F*KF1F2Q)pprint44F9/6$\"\"$F*KF1F2Q)pprin t39F9/6$\"\"%F*KF1F2Q)pprint42F9/6$\"\"&F*KF1F2Q)pprint43F9/6$\"\"'F*K F1F2Q)pprint38F9/6$F+F*KF1F2Q)pprint45F9Q)pprint46F9" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 34 "CacheSim := proc(addr,C,A,B,TRACE)" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 82 " local cache, slots, i, j, n, bloc k, offset, index, found, rep, minclock, misses;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 57 " cache := Cache(C,A,B); slots := C/(A*B); misses : = 0;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 73 " printf(\"Cache size = %d, Associativity = %d, Block size = %d\\n\",C,A,B);" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 41 " printf(\"Number of slots = %d\\n\",slots);" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 " n := nops(addr);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 24 " for i from 1 to n do " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 56 " block := floor(addr[i]/B); offset := addr[i] mod B;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 46 " index := block mod slots ; found := false;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 75 " if TRACE \+ then printf(\"%d-th address = %d -> %d\\n\",i,addr[i],index); fi;" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 " for j from 0 to A-1 do" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 71 " if block = cache[index,j][tag ] and cache[index,j][clock] > 0 then" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 54 " found := true; cache[index,j][clock] := i; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 43 " if TRACE then printf(\"hit\\n\") ; fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 21 " \+ if not found then" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 41 " if TRAC E then printf(\"miss\\n\"); fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 46 " misses := misses + 1; minclock := n+1; " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 35 " for j from 0 to A-1 do " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 50 " if cache[index,j][clock] < minclock then " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 55 " minclock := cache[i ndex,j][clock]; rep := j;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 11 " \+ fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 37 " cache[index,rep][tag] := block;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 35 " cache[index,rep][clock] := i;" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 7 " fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " od;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 16 " return m isses;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "end;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%)CacheSimGf*6'%%addrG%\"CG%\"AG%\"BG%&TRACEG6.%&cache G%&slotsG%\"iG%\"jG%\"nG%&blockG%'offsetG%&indexG%&foundG%$repG%)mincl ockG%'missesG6\"F9C*>8$-%&CacheG6%9%9&9'>8%*(F@\"\"\"FA!\"\"FBFG>8/\" \"!-%'printfG6&QVCache~size~=~%d,~Associativity~=~%d,~Block~size~=~%d| +F9F@FAFB-FL6$Q6Number~of~slots~=~%d|+F9FD>8(-%%nopsG6#9$?(8&FFFFFS%%t rueGC)>8)-%&floorG6#*&&FW6#FYFFFBFG>8*-%$modG6$F\\oFB>8+-Fao6$FgnFD>8, %&falseG@$9(-FL6&Q:%d-th~address~=~%d~->~%d|+F9FYF\\oFdo?(8'FJFF,&FAFF FFFGFZ@$3/Fgn&&F<6$FdoF`p6#%$tagG2FJ&Ffp6#%&clockGC%>FhoFZ>F[qFY@$F[p- FL6#Q%hit|+F9@$4FhoC(@$F[p-FL6#Q&miss|+F9>FI,&FIFFFFFF>8.,&FSFFFFFF?(F `pFJFFFapFZ@$2F[qF_rC$>F_rF[q>8-F`p>&&F<6$FdoFgrFhpFgn>&FjrF\\qFYOFIF9 F9F9" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 3 "T1;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7R\"\"!\"\"\"\"\"#\"\"$\"\"%\"\"&\"\"'\"\"(\"\")\" \"*\"#5\"#6\"#7\"#8\"#9\"#:F$F&F(F*F,F.F0F2F$F(F,F0F&F*F.F2F%F'F)F+F-F /F1F3F%F)F-F1F'F+F/F3" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "nop s(T1);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#[" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 25 "CacheSim(T1,8,1,1,false);" }}{PARA 6 "" 1 "" {TEXT -1 49 "Cache size = 8, Associativity = 1, Block size = 1" }} {PARA 6 "" 1 "" {TEXT -1 19 "Number of slots = 8" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#[" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "Cach eSim(T1,8,1,2,false);" }}{PARA 6 "" 1 "" {TEXT -1 49 "Cache size = 8, \+ Associativity = 1, Block size = 2" }}{PARA 6 "" 1 "" {TEXT -1 19 "Numb er of slots = 4" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#S" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "CacheSim(T1,8,2,1,false);" }}{PARA 6 "" 1 "" {TEXT -1 49 "Cache size = 8, Associativity = 2, Block size = 1" }}{PARA 6 "" 1 "" {TEXT -1 19 "Number of slots = 4" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#[" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 3 " T2;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7R\"\"!\"\"\"\"\"#\"\"$\"\"%\" \"&\"\"'\"\"(F$F(F%F)F&F*F'F+\"\")\"\"*\"#5\"#6\"#7\"#8\"#9\"#:F,F0F-F 1F.F2F/F3F$F,F%F-F&F.F'F/F(F0F)F1F*F2F+F3" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 25 "CacheSim(T2,8,1,1,false);" }}{PARA 6 "" 1 "" {TEXT -1 49 "Cache size = 8, Associativity = 1, Block size = 1" }}{PARA 6 " " 1 "" {TEXT -1 19 "Number of slots = 8" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#K" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "CacheSim(T2,8 ,1,2,false);" }}{PARA 6 "" 1 "" {TEXT -1 49 "Cache size = 8, Associati vity = 1, Block size = 2" }}{PARA 6 "" 1 "" {TEXT -1 19 "Number of slo ts = 4" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#C" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 24 "CacheSim(T2,8,2,1,true);" }}{PARA 6 "" 1 "" {TEXT -1 49 "Cache size = 8, Associativity = 2, Block size = 1" }} {PARA 6 "" 1 "" {TEXT -1 19 "Number of slots = 4" }}{PARA 6 "" 1 "" {TEXT -1 21 "1-th address = 0 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss " }}{PARA 6 "" 1 "" {TEXT -1 21 "2-th address = 1 -> 1" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 21 "3-th address = 2 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 21 "4-th address = 3 -> 3" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }} {PARA 6 "" 1 "" {TEXT -1 21 "5-th address = 4 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 21 "6-th address = 5 -> 1 " }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 21 "7 -th address = 6 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 " " 1 "" {TEXT -1 21 "8-th address = 7 -> 3" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 21 "9-th address = 0 -> 0" }} {PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 22 "10-th \+ address = 4 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 " " {TEXT -1 22 "11-th address = 1 -> 1" }}{PARA 6 "" 1 "" {TEXT -1 3 "h it" }}{PARA 6 "" 1 "" {TEXT -1 22 "12-th address = 5 -> 1" }}{PARA 6 " " 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 22 "13-th address = 2 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 22 "14-th address = 6 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }} {PARA 6 "" 1 "" {TEXT -1 22 "15-th address = 3 -> 3" }}{PARA 6 "" 1 " " {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 22 "16-th address = 7 -> 3" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 22 " 17-th address = 8 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "18-th address = 9 -> 1" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "19-th address = 10 -> 2" }} {PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "20-th address = 11 -> 3" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "21-th address = 12 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "22-th address = 13 -> 1" }} {PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "23-th address = 14 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "24-th address = 15 -> 3" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "25-th address = 8 -> 0" }} {PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 23 "26-th \+ address = 12 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 " " {TEXT -1 22 "27-th address = 9 -> 1" }}{PARA 6 "" 1 "" {TEXT -1 3 "h it" }}{PARA 6 "" 1 "" {TEXT -1 23 "28-th address = 13 -> 1" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 23 "29-th address \+ = 10 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 23 "30-th address = 14 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }} {PARA 6 "" 1 "" {TEXT -1 23 "31-th address = 11 -> 3" }}{PARA 6 "" 1 " " {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 23 "32-th address = 15 - > 3" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 22 "33-th address = 0 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "34-th address = 8 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "35-th address = 1 -> \+ 1" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 " 36-th address = 9 -> 1" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "37-th address = 2 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "38-th address = 10 -> 2" }} {PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "39-th address = 3 -> 3" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "40-th address = 11 -> 3" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "41-th address = 4 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "42-th addre ss = 12 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "43-th address = 5 -> 1" }}{PARA 6 "" 1 "" {TEXT -1 4 "mis s" }}{PARA 6 "" 1 "" {TEXT -1 23 "44-th address = 13 -> 1" }}{PARA 6 " " 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 22 "45-th address \+ = 6 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "46-th address = 14 -> 2" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }} {PARA 6 "" 1 "" {TEXT -1 22 "47-th address = 7 -> 3" }}{PARA 6 "" 1 " " {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 23 "48-th address = 15 \+ -> 3" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#K" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 16 "T3 := [0,8,0, 8];" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#T3G7&\"\"!\"\")F&F'" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 24 "CacheSim(T3,8,1,1,true);" }} {PARA 6 "" 1 "" {TEXT -1 49 "Cache size = 8, Associativity = 1, Block \+ size = 1" }}{PARA 6 "" 1 "" {TEXT -1 19 "Number of slots = 8" }}{PARA 6 "" 1 "" {TEXT -1 21 "1-th address = 0 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 21 "2-th address = 8 -> 0" }} {PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 21 "3-th \+ address = 0 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 " " {TEXT -1 21 "4-th address = 8 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "mi ss" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"%" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 24 "CacheSim(T3,4,2,1,true);" }}{PARA 6 "" 1 "" {TEXT -1 49 "Cache size = 4, Associativity = 2, Block size = 1" }}{PARA 6 " " 1 "" {TEXT -1 19 "Number of slots = 2" }}{PARA 6 "" 1 "" {TEXT -1 21 "1-th address = 0 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }} {PARA 6 "" 1 "" {TEXT -1 21 "2-th address = 8 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 4 "miss" }}{PARA 6 "" 1 "" {TEXT -1 21 "3-th address = 0 -> 0 " }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 6 "" 1 "" {TEXT -1 21 "4- th address = 8 -> 0" }}{PARA 6 "" 1 "" {TEXT -1 3 "hit" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}}{MARK "11 7 1 0" 0 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 } {PAGENUMBERS 0 1 2 33 1 1 }