PKu E toeblitz-1.0/PKu Etoeblitz-1.0/decomp/PK CI**$toeblitz-1.0/decomp/decompToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % John P Cunningham, 2009 % Modified by William Zhang, 2013 % % decompToeplitz() % % Invert a symmetric, real, positive definite Toeplitz matrix % using either inv() or the Trench algorithm, which % uses Zohar 1969, finding the log determinant along the way. % This is slightly different than % Algorithm 4.7.3 of Golub and Van Loan % "Matrix Computations," the 1996 version, because the Zohar % version produces the log determinant essentially for free, which % is often useful in cases where one actually needs the full matrix inverse. % % If Zohar or the MATLAB implementation of the Trench algorithm is called, % the inversion is done in O(n^2) time, which is considerably better % than the O(n^3) that inv() offers. This follows the Trench % algorithm implementation of Zohar 1969. See that paper for % all explanation, as the C code is just an implementation of % the algorithm of p599 of that paper. See Algorithm 4.7.3 of Golub and Van Loan % for an explanation of the MATLAB version of this algorithm, which is slower % due to for loops (slower than inv(), up to about n=300). % Thus, if the C can be used, always use it. % % This function also computes the log determinant, which is % calculated essentially for free as part of the calculation of % the inverse when Zohar is used. This is often useful in applications when one really % needs to represent the inverse of a Toeplitz matrix. If Zohar is not used, the computation % is reasonably costly. % % Usage: [ld, Ti] = decompToeplitz(T, logdetMode, [runMode]); % % Inputs: % T the positive definite symmetric Toeplitz matrix to be inverted % logdetMode if this is set to 1, we skip the building of the inverse for efficiency, % and only compute the log determinant. If it is 0, we still compute both % the log determinant and the inverse % runMode OPTIONAL: to force this inversion to happen using a particular method. This % will NOT roll over to a method (by design), so it will fail if something is amuck. % % Outputs: % ld the log determinant of T, log(det(T)) % Ti the inverted matrix, also symmetric (and persymmetric), NOT TOEPLITZ % % NOTE: We bother with this method because we % need this particular matrix inversion to be % as fast as possible. Thus, no error checking % is done here as that would add needless computation. % Instead, the onus is on the caller to make sure % the matrix is toeplitz and symmetric and real. % % NOTE: Algorithm 4.7.3 in the Golub book has a number of typos % Do not use Alg 4.7.3, use the equations on p197-199. % % Run time tests (testToeplitz) suggest that Zohar is the fastest method across % the board. (2-3 orders of magnitude at sizes from 200-1000). Classical Trench is 13/4n^2 flops, % whereas inv() is probably 2/3n^3. However, the overhead for the MEX calls, etc., % may make the crossover point very MATLAB dependent. % % NOTE: The interested numerical linear algebra geek can dig into all this stuff by % running that testToeplitz to find the crossover % point him/herself. Some tinkering is required. This will run three inversion methods: inv(), decompToeplitzFastZohar (MEX Zohar), % decompToeplitz (Matlab Zohar). This version of decompToeplitz has been pared down to % be more user friendly, so it only includes a call to C/MEX Zohar, inv(), and vectorized MATLAB Zohar. % % MEX NOTE: This function will call a MEX routine. % A try block is included to default back to the best non-MEX solver (either inv() % or a vectorized Trench/Zohar version in native MATLAB), so hopefully the user will % not experience failures. We have also included the compiled .mex in a number of % different architectures (hopefully all). However, the user should really compile % this code on his/her own machine to ensure proper use of MEX. That can be done % from the MATLAB prompt with "mex decompToeplitzFastZohar.c". This C code does nothing % fancy, so if you can run MEX at all, this should work. See also 'help mex' and % 'mexext('all')'. % % MEX NOTE 2: The try-catch block is to hopefully fail MEX gracefully. If the mex % code is not compiled or in the wrong architecture, this will default to the next % best MATLAB implementation, which, depending on n, is inv() or vectorized Trench/Zohar. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [ld, Ti] = decompToeplitz(T_row, logdetMode, runMode) n = size(T_row, 2); % Dimension of the matrix % If runMode is specified, just run with that (for testing, etc.). Otherwise, do automated determination of runMode. if nargin < 3 % If runMode is not specified, do the automated determination of runMode, based on runtime tests tryMode = 0; % Always try C/MEX Zohar first. If MEX fails, use inv() or vectorized Zohar Trench in MATLAB. if n < 150 % The n=150 is a rough estimate based on tests on 64 and 32 bit linux systems catchMode = -1; % inv() is the best failure option when n < 150. else catchMode = 1; % n is >= 150, so vectorized Zohar is the best failure option. end else % If specified, force it. tryMode = runMode; catchMode = runMode; end % Invert T with the specified method. try [Ti, ld] = decompToeplitzMode(T_row, logdetMode, tryMode); catch [Ti, ld] = decompToeplitzMode(T_row, logdetMode, catchMode); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Subfunction for try-catch block. This contains the actual Matlab algorithm, and calls the wrapper for the C/MEX function. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [Ti, ld] = decompToeplitzMode(T_row, logdetMode, runMode) switch (runMode) % Invert T to produce Ti, the inverse, and ld, the log determinant, by the specified method (or, if logdetMode is on, only the log determinant). case -1 T = convertToeplitz(T_row); % Convert our usual row vector notation into a full Toeplitz matrix. if not(logdetMode) Ti = inv(T); % Just call MATLAB inv(). elseif logdetMode Ti = 0; % Set an arbitrary (incorrect) value for Ti so that everything works smoothly. end ld = logdet(T); % Calculate the log determinant separately. case 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Here is the fast C-MEX implementation of this inversion, using Zohar % invToeplitzFastZohar.c should be MEX-compiled with a command from the MATLAB % prompt of "mex invToeplitzFastZohar.c" This should just work. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if not(logdetMode) [Ti, ld] = decompToeplitzFast(T_row); % Call the MEX wrapper. elseif logdetMode ld = logdetToeplitzFastZohar(T_row); % Call the C/MEX function. Ti = 0; % Set an arbitrary (incorrect) value for Ti so that everything works smoothly. end case 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % A Matlab implementation of the Zohar algorithm. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% scale_factor = T_row(1, 1); % Save the scaling factor. T_row = T_row/scale_factor; % Normalize using the value on the central diagonal so that we can use the Zohar algorithm. n = size(T_row, 2)-1; r = transpose(T_row(1, 2:end)); % Intialize the value of r. In our code we have combined the variables r and rho from the paper, since they contain the same information. lambda = zeros(n, 1); % Initialize the vector of lambda values. % Initialize the algorithm. lambda(1, 1) = 1-r(1, 1)^2; % Obtain the first value of lambda. ghatold(1, 1) = -r(1, 1); % Obtain the first value of ghat, which is the same as g for the length-one case. ghat = ghatold; % Initialize ghat as ghatold. % Recursion to compute the values of gamma and lambda, and g and ghat. In our code we have combined the g and ghat variables, since they contain the same information. for i = 1:n-1 gamma(i, 1) = -(r(i+1, 1) + transpose(r(1:i, 1))*ghatold); % Compute gamma according to the Zohar algorithm. ghat = vertcat(gamma(i, 1)/lambda(i, 1), ghatold + gamma(i, 1)/lambda(i, 1)*ghatold(end:-1:1, 1)); % Compute the next value of ghat according to the Zohar algorithm. lambda(i+1, 1) = lambda(i, 1) - gamma(i, 1)^2/lambda(i, 1); % Compute lambda according to the Zohar algorithm. ghatold = ghat; % Save the new value of ghat in ghatold in preparation for the next recursive step. end if not(logdetMode) % If we're not in logdetMode, then construct and output the inverse, Ti. Ti(1, 1) = 1/lambda(n, 1); % Fill out the first element (upper left) of Ti. Ti(2:n+1, 1) = ghat(n:-1:1, 1)/lambda(n, 1); % Fill out the first column (left) of Ti. Ti(1, 2:n+1) = transpose(Ti(2:n+1, 1)); % Fill out the first row (top) of Ti by symmetry. Ti(n+1, 2:n+1) = Ti(1, n:-1:1); % Fill out the last row (bottom) of Ti by persymmetry and symmetry. Ti(2:n, n+1) = Ti(n:-1:2, 1); % Fill out the last column (right) of Ti by persymmetry and symmetry. % Fill out the rest of Ti using the equations from Zohar and symmetry. for j = 1:floor(n/2); Ti(j+1:n-j+1, j+1) = Ti(j:n-j, j) + 1/lambda(n, 1)*(ghat(n+1-j)*ghat(n+1-j:-1:1+j)-ghat(j:n-j)*ghat(j)); % Apply the Zohar equation to fill in one-fourth of the Ti output matrix. Ti(j+1, j+1:n-j+1) = Ti(j+1:n-j+1, j+1); % Use symmetry of Ti to fill out another quarter of the matrix. Ti(n+1-j:-1:j+1, n+2-(j+1)) = Ti(j+1:n-j+1, j+1); % Use persymmetry to fill out another quarter of the matrix. Ti(n+2-(j+1), n+2-(j+1):-1:n+2-(n-j+1)) = Ti(j+1, j+1:n-j+1); % Use persymmetry to fill out the final quarter of the matrix. end Ti = Ti/scale_factor; % Rescales Ti to produce the correct inverse. elseif logdetMode % If we are in logdetMode, then give an arbitrary filler value for Ti. Ti = 0; % Set an arbitrary (incorrect) value for Ti so that everything works smoothly. end ld = sum(log(lambda)) + log(scale_factor)*(n+1); % Calculates log(det(T)) for free (essentially, when the inverse is also computed) using the lambdas from our recursion. end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%PK CpJ (toeblitz-1.0/decomp/decompToeplitzFast.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % John P Cunningham, 2009 % modified by William Zhang, 2013 % % decompToeplitzFast() % % This function is simply a wrapper for the C-MEX % function decompToeplitzFastZohar.mexa64 (or .mexglx, etc), % which is just a compiled version of invToeplitzFastZohar.c, % which should also be in this folder. Please see % that code for details. % % This algorithm inverts a positive definite (symmetric) % Toeplitz matrix in O(n^2) time, which is considerably better % than the O(n^3) that inv() offers. This follows the Trench % algorithm implementation of Zohar 1969. See that paper for % all explanation, as the C code is just an implementation of % the algorithm of p599 of that paper. % % This function also computes the log determinant, which is % calculated essentially for free as part of the calculation of % the inverse. This is often useful in applications when one really % needs to represent the inverse of a Toeplitz matrix. % % This function should be called from within decompToeplitz.m, % which adds a try block so that it can default to a native % MATLAB inversion (either inv() or a vectorized version of % the Zohar/Trench algorithm, depending on the size of the matrix) % should the MEX interface not work. This will happen, for example, % if you move to a new architecture and do not compile for .mexmaci % or similar (see mexext('all') and help mex for some info on this). % % Inputs: % T_row the first row of a positive definite (symmetric) Toeplitz matrix T, which % does NOT need to be scaled to be 1 on the main diagonal. % % Outputs: % Ti the inverse of T % ld the log determinant of T, NOT Ti. % % % NOTE: This code is used to speed up the Toeplitz inversion as much % as possible. Accordingly, no error checking is done. The onus is % on the caller (which should be decompToeplitz.m) to pass the correct args. % % NOTE: Whenever possible, do not actually invert a matrix. This code is % written just in case you really need to do so. Otherwise, for example % if you just want to solve inv(T)*x for some vector x, you are better off % using a fast inversion method, like PCG with fast matrix multiplication (used in solveToeplitz.m), % which could be something like an FFT method for the Toeplitz matrix. To % learn about this, see Cunningham, Sahani, Shenoy (2008), ICML, "Fast Gaussian % process methods for point process intensity estimation." %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [Ti, ld] = decompToeplitzFast(T_row) [Ti, ld] = decompToeplitzFastZohar(T_row); end PK CpI -toeblitz-1.0/decomp/decompToeplitzFastZohar.c/*================================================================= * Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices * Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) *=================================================================*/ /*================================================================= * * decompToeplitzFastZohar.c completes the inversion of a symmetric * positive definite Toeplitz matrix. This * function is a subroutine of the decompToeplitz.m, which follows the * algorithm of Zohar 1969, a modification of the algorithm of W.F. Trench. * * The calling syntax is: * * [ Ti , logdetT ] = decompToeplitzFastZohar(T_row) * * T_row is the first row of the positive definite symmetric Toeplitz matrix T of dimension n+1 * (following the convention of p599 in the Zohar paper) * Ti is the inverse of T, same as inv(T) in MATLAB. * logdet is the log determinant of T, NOT of Ti. * * NOTE: This code is used to speed up the Toeplitz inversion as much * as possible. Accordingly, no error checking is done. The onus is * on the caller (which should be decompToeplitz.m) to pass the correct arguments. * * NOTE: This is superior to the Trench algorithm in Golub and * Van Loan's "Matrix Computations", since the Zohar version * also computes the log determinant for free, which is essential in the * application for which this algorithm was coded. * * John P Cunningham * 2009 * Modified by William Zhang, 2013 *=================================================================*/ /* Required Packages */ #include #include /* Input Arguments */ #define T_row_IN prhs[0] /* Output Arguments */ #define Ti_OUT plhs[0] #define LD_OUT plhs[1] void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[] ) { /* Declare variables */ double *T_row, *Ti, *logdet, *r, *lambda, *ghat, *ghatold, *gamma; unsigned int n; int i,j; /* Check for proper number of arguments*/ if (nrhs != 1) { mexErrMsgTxt("1 input arg required."); } else if (nlhs > 2) { mexErrMsgTxt("2 output args required."); } /* Check the dimensions of the arguments */ /* This expects T to be an n+1 by n+1 matrix */ n = mxGetN(T_row_IN)-1; /* Create a matrix for the return argument */ Ti_OUT = mxCreateDoubleMatrix(n+1, n+1, mxREAL); LD_OUT = mxCreateDoubleScalar(0); /* LD_OUT is a pointer to a 1x1 mxArray double initialized to 0. */ /* Assign pointers to some input and output parameters */ Ti = mxGetPr(Ti_OUT); logdet = mxGetPr(LD_OUT); T_row = mxGetPr(T_row_IN); /*Allocate space on heap for various variables.*/ r = (double*) mxMalloc(n*sizeof(double)); if (r == NULL) { mexErrMsgTxt("Inadequate space on heap for r."); } lambda = (double*) mxMalloc(n*sizeof(double)); if (lambda == NULL) { mexErrMsgTxt("Inadequate space on heap for lambda."); } ghat = (double*) mxMalloc(n*sizeof(double)); if (ghat == NULL) { mexErrMsgTxt("Inadequate space on heap for ghat."); } ghatold = (double*) mxMalloc(n*sizeof(double)); if (ghatold == NULL) { mexErrMsgTxt("Inadequate space on heap for ghatold."); } gamma = (double*) mxMalloc(n*sizeof(double)); if (gamma == NULL) { mexErrMsgTxt("Inadequate space on heap for gamma."); } /* Define r, the normalized row from T_row(1,2) to T_row(1,n+1) */ for (i = 0; i < n ; i++) { r[i] = T_row[0*(n+1) + (i+1)]/T_row[0*(n+1) + 0]; } /* Initialize the values of lambda and g for the algorithm */ lambda[0] = 1 - pow(r[0],2); ghat[0] = -r[0]; /* Recursion to build g and lambda */ for (i=0 ; i < n-1 ; i++) { /* Calculate gamma */ gamma[i] = -r[i+1]; /* Note that ghat, g_i, etc are i+1 elements long */ for (j=0 ; j < i+1 ; j++) { gamma[i] -= r[j]*ghat[j]; } /* Calculate next ghat */ /* First store ghatold, which is i+1 elts long */ for (j=0 ; j < i+1 ; j++) { ghatold[j] = ghat[j]; } /* The first element of the new ghat is derived from gamma and lambda. */ ghat[0] = gamma[i]/lambda[i]; /* The rest of the new ghat is formed from the old ghat, ghatold, as described on page 599 of the Zohar paper. */ for (j=1 ; j < i+2 ; j++) { ghat[j] = ghatold[j-1] + gamma[i]/lambda[i]*ghatold[i+1-j]; } /* Calculate lambda */ lambda[i+1] = lambda[i] - pow(gamma[i],2)/lambda[i]; } /* There are n lambdas, n g values, and n-1 gammas */ /* Note that n is not the dimension of the matrix, but one less. */ /* This corresponds with Zohar notation. */ /* Evaluate the matrix Ti (B_{n+1} in Zohar) */ /* NOTE ON MEX MATRIX INDEXING */ /* indexing is always (colidx * colLen + rowidx) */ /* Assign first upper left element */ Ti[ 0*(n+1) + 0 ] = 1/lambda[n-1]; /* Assign the first row and column*/ for (i = 1; i < n+1; i++) { /* First row */ Ti[ 0*(n+1) + i] = ghat[ n-1-(i-1) ]/lambda[ n-1 ]; /* First column */ Ti[ i*(n+1) + 0] = ghat[ n-1-(i-1) ]/lambda[ n-1 ]; } /* Fill in last row and column by persymmetry and symmetry with first row and column.*/ for (i = 1; i < n ; i++) { /* Last row */ Ti[ n*(n+1) + i ] = ghat[ n-1-(n-i-1) ]/lambda[ n-1 ]; /* Last column */ Ti[ i*(n+1) + n ] = ghat[ n-1-(n-i-1) ]/lambda[ n-1 ]; } /* Assign the last (bottom right) element by persymmetry */ Ti[ n*(n+1) + n ] = Ti[ 0*(n+1) + 0]; /* Fill in the interior of Ti_OUT */ for (i = 0; i < n/2 ; i++) { for (j = i; j < n-i-1; j++) { /* Calculate the value using equations on page 599 of Zohar. */ Ti[ (j+1)*(n+1) + (i+1) ] = (Ti[ j*(n+1) + i ] + (1/lambda[n-1])*(ghat[n-1-i]*ghat[n-1-j] - ghat[n-1-(n-1-i)]*ghat[n-1-(n-1-j)])); /* Use symmetry */ Ti[ (i+1)*(n+1) + (j+1) ] = Ti[ ((j+1)*(n+1)) + (i+1) ]; /* Use persymmetry: Recall there are n+1 elements, so 0<->n, 1<->n-1, and so on */ Ti[ (n-(i+1))*(n+1) + (n-(j+1)) ] = Ti[ ((j+1)*(n+1)) + (i+1) ]; Ti[ (n-(j+1))*(n+1) + (n-(i+1)) ] = Ti[ ((j+1)*(n+1)) + (i+1) ]; } } /* Normalize the entire matrix by T(1,1) so it is the properly scaled inverse */ for (i = 0; i < n+1 ; i++) { for (j = 0; j < n+1 ; j++) { Ti[ j*(n+1) + i ] = Ti[ j*(n+1) + i ]/T_row[ 0*(n+1) + 0]; } } /* Calculate the log determinant for free (essentially) by summing the logs of the lambdas. */ logdet[0] = 0; for (i=0 ; i < n; i++) { logdet[0] += log(lambda[i]); } /* Renormalize based on T_row(1,1) */ logdet[0] += (n+1)*log(T_row[ 0*(n+1) + 0 ]); /* Free allocated arrays */ mxFree(gamma); mxFree(ghatold); mxFree(ghat); mxFree(lambda); mxFree(r); return; }PK C]+5+5/toeblitz-1.0/decomp/decompToeplitzFastZohar.mexELF4L)4 ($!HH$$QtdRtdttGNUVU`~ڱz6X     ` |CEqX4K _+ "Xt4 , , ?@F    __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesmexFunctionmexErrMsgTxtmxGetNmxCreateDoubleMatrixmxCreateDoubleScalarmxGetPrmxMalloclogmxFreeliboctinterp.soliboctave.solibcruft.soliblapack.so.3gflibblas.so.3gflibfftw3.so.3libfftw3f.so.3libreadline.so.6libncurses.so.5libdl.so.2libhdf5.so.6libz.so.1libgfortran.so.3libstdc++.so.6libm.so.6libgcc_s.so.1libc.so.6_edata__bss_start_endGLIBC_2.0GLIBC_2.1.3n ii si (           $  US[Lt.=X[ hhhhh h($h0(h8p,h@`0hHPUVSj8u]t4$h<)9s <<9rƃ8[^]US.tt $Ѓ[]Ë$ÐUWVSu à}}x$g$D$EȃEEȉD$$]$F$tEԋF$fE$YtEE$"E2U$ E/M $-}<$E*E$E'Mt11}uܐ4׉19EwUM}uȃ}}ثUEU1ҍEЋ}MljE܋EM1Mf ƃ9~؋M19~M܃1MU1M܋MĉUU2U \9EuȋM܋U؋}̋EE;ULMU}ыM2UvF}Ⱥu}؋}uE)֍u77U9Mu֋u܃}vS}}ȉu܉}؍u܃}؍֋uUU6u9M}7։w͋u܋EUԋMEM}ȋUȋMȋEȃ}}|UȉMفE1UEExMu؍U+Ũ9ЉUu؍H}4֋U؉uu̍u܋u11&M$ݝhE9݅hw֋u܋t$ݝhE1҉UM}Em݅h<$E$4$U$M $ļ[^_]Ã}$y}EEEث $@$h$$n$[UVSZt&Ћu[^]US[ Y[1 input arg required.2 output args required.Inadequate space on heap for r.Inadequate space on heap for lambda.Inadequate space on heap for ghat.Inadequate space on heap for ghatold.Inadequate space on heap for gamma.? ,7DN_nx  o  PL, oooo"2BRbr( GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3@FmexFunction@  int!95s&ni2 ]1@  1(, A1X 1( K1 W4* Ti4S 4u r4 P4uF44 4u n5Df i6(y j6(==6% $ > $ > : ; $ >  : ; ( .? : ; ' @ : ; I 4: ; I 4: ; I 4: ; I 4: ; I4: ; I I&I /home/cunni/toeplitz/wemmick/toeplitz/decomp/usr/include/octave-3.2.3/octavedecompToeplitzFastZohar.cmex.hmxarray.h@1D ֢~-=k-=k-/k-=k-=m>,5jbNicP(dZH dz?U[9[c^dt<dX)fH9?"}A7 t#9?rU?>|j8T@~~<<~<E~f:0H ;Y-/0:>:0z8$~=.gջ[4444| @FAB LnlhslogdetmxREALnrhsunsigned charshort unsigned intmxArrayplhsghatprhslambdaT_rowmexFunctionlong long unsigned intgammaghatoldmxCOMPLEXlong long intGNU C 4.4.3short intlong double/home/cunni/toeplitz/wemmick/toeplitz/decomp/decompToeplitzFastZohar.cttFuuF''Vu Vu  V Fu ''Fu' 'WuWu W FuBQW-QWV-V!zPzR<R<\P\QWQWPEsPsQ~PP.symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc$2.o<8  @Ho$Uo@d ,, m LLP v0q|H  H 4( ( , , 0, %Q q " 8"#$4*0$5%  (@.P#4 <3,L     ( ,   (5 K, Z0 h t  7 (   !., :4 ? N, Uj ~"@F  crtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.7021dtor_idx.7023frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxdecompToeplitzFastZohar.c__i686.get_pc_thunk.bx_GLOBAL_OFFSET_TABLE__DYNAMIC__DTOR_END____dso_handle_finimexErrMsgTxt__bss_start_end__gmon_start___edatamxCreateDoubleMatrix_Jv_RegisterClassesmxMalloc__cxa_finalize@@GLIBC_2.1.3mexFunctionmxGetPr_initlog@@GLIBC_2.0mxGetNmxCreateDoubleScalarmxFreePK CEe2#2#2toeblitz-1.0/decomp/decompToeplitzFastZohar.mexa64ELF>@@8@    HH H $$PtdQtdGNU=qbv(>6 @  5 8L  l"?S 3 __gmon_start____cxa_finalize_Jv_RegisterClassesmexFunctionmexErrMsgTxtmxGetNmxCreateDoubleMatrix_700mxCreateDoubleScalarmxGetPrmxMalloclogmxFreelibmx.solibmex.solibmat.solibm.so.6libstdc++.so.6libpthread.so.0libc.so.6decompToeplitzFastZohar.mexa64MEXGLIBC_2.2.5$Q  ui ui @ @ H P X x             HJH5 % @% h% h% h% h% h% h% h% hp% h`HHM HtHÐU= HATSubH=0 t H= ZH L% H} L)HHH9s DHH] AHR H9r> [A\fH= UHtH HtH= @ÐUHAWAVAUATSHHI΃tH=~ H=I>nAAUUƉHLcfWVI$H;*HI<$HhI>H`EHHEH5IHpHu H=O:H}HEHu H=QH}IIHu H=YH}HEHXHu H=\H}HEHu H=f}}LpH`Hcȃ^A9wHpY 7\LUA  .fWAEEDHcL4HMLLCDfWDHE~8LA AY \HH9uLI<H<HH9uLuA^HUP~-LA^HcAYXADHuf(YA^\HMBHD;MLuH]DmELUIHE^AvEDEHuD)I Ή^A^ӃA9w̓}vN}AuLEI D :A^BAA^Ӄ9wʋEEHHËE艅|@AUUDىMEUDxEDUEEEED؃ADH AEDMf(LUA^ DUA)ACYAA$CY\YBXEÉL L ÉH H Eu;UyEEEDmUU9|vR‰ЋM+MȉM9sӉM<΋MM$DBEDUGD֋}}uAx+MEtIL`+AHA^A9w߃A9vHhH}tKLuDuIELmA$EHcADXEA$A9wLuELhAEL`AnEI*YXEHhH}HX LH}HpHĈ[A\A]A^A_HpY \HM  fWAE}ALXLuH]H]DmLpFUHSHH HtH HHHuH[ÐHH1 input arg required.2 output args required.Inadequate space on heap for r.Inadequate space on heap for lambda.Inadequate space on heap for ghat.Inadequate space on heap for ghatold.Inadequate space on heap for gamma.?; 0zRx ,AC S A @  8 oH  ` `` ooooodoH fvGCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3).symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_d.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.ctors.dtors.jcr.data.rel.ro.dynamic.got.got.plt.bss.comment$.o(8 h@HHHoddUo8do@s`}`` 88PPL ( (8 8@ @H HH H` `` 0XX2 @!Hd ` 8 P   ( 8 @ H H `    *( 88 E [ j x   8  P ` @ 0   " )H 2 88@G V jn" call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6349dtor_idx.6351frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxdecompToeplitzFastZohar.c_fini_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END____bss_start_end_edata_DYNAMIC_initmxGetPrmxGetN__gmon_start___Jv_RegisterClassesMEXmxCreateDoubleScalar__cxa_finalize@@GLIBC_2.2.5mxMallocmxFreemexFunctionmexErrMsgTxtmxCreateDoubleMatrix_700log@@GLIBC_2.2.5PK C^!!5toeblitz-1.0/decomp/decompToeplitzFastZohar.mexmaci64x__TEXT__text__TEXT.__stubs__TEXT 0 __stub_helper__TEXT ` __const__TEXTP P__cstring__TEXTpp__unwind_info__TEXT\P\__eh_frame__TEXTP__DATA__dyld__DATA__la_symbol_ptr__DATA@H__LINKEDIT  H 8! P  99e3 MA$  0@rpath/libmx.dylib 0@rpath/libmex.dylib 0@rpath/libmat.dylib 84/usr/lib/libstdc++.6.dylib 8/usr/lib/libgcc_s.1.dylib 8{/usr/lib/libSystem.B.dylib&@ )H ASLgAS%_ %^ UHAWAVAUATSHHIt H= | H=H;IL}1DDIfIFI>II~HhH;HEAGHPHHEHHEHu H=5rH}cHEHu H=7TH}EHEHu H=A6H}'HEHu H=KH} HEHu H=UHPt,HEȍ@1@HUD^HUHH9uHEY \HM fWHEHEȃHH@HFHHMHMHIHM1ɺL]DHu fWHuL~uHH}LEf.AY\LMALIHHuۅ~7HH}LEfDfDAIHHuHuLHu^LHu|`HHLELMDfDLUALLUA^LII CY AXA ILIIHuHuLH}TY^\ HHHuHtHHHEȍHHMLHU^A$rOID$HMȍQLEH}@HuB^B^ljAHMHHHRuHPw0HEȍ@HPA$AHEȅM1 HEȍHHUHRt@HLEDfDH}B^ACB^ljAHuHHHuHEȍ@HPA$AăaHHHHGH`HMȍAHEHXHEQAI|1HpHMHufHpH<0D|IALUIHMDfDf(LmL}C^ L}CACYAY\YACXACACC EC C EC HuLUHHIIIsHpHuHXHu|HHHuHHuH9`Hu9fHMȉʉAHu^AHuuH9uHhHHPusfEHEHEȉH*YXMHhH}H}H}xH}oH}HĈ[A\A]A^A_]UHEȉfELufDANXEHhIHOE%L%N%P%R%T%V%X%ZLLL|L pL dLXLLL@?1 input arg required.2 output args required.Inadequate space on heap for r.Inadequate space on heap for lambda.Inadequate space on heap for ghat.Inadequate space on heap for ghatold.Inadequate space on heap for gamma.44 4  XzRx 4 __  ,8D (08@H  .;@Nh~   dyld_stub_binding_helper__dyld_func_lookup_mexFunction_log_mexErrMsgTxt_mxCreateDoubleMatrix_700_mxCreateDoubleScalar_mxFree_mxGetN_mxGetPr_mxMallocPK CkM,,2toeblitz-1.0/decomp/decompToeplitzFastZohar.mexw64MZ@ !L!This program cannot be run in DOS mode. $`wwwwww܃wywvww݃wwwwwRichwPEd R"  #cJ@7]3d`P p 0.text `.rdata0@@.data`@$@.pdata P&@@.rsrc`(@@.reloc p*@BHSUVWATAWHLhLp)xD)@IHD)HAt H ! ~ H !<HM-E3DhL$Au֋Ή$XHfWHHGHOHHD$8HMH$EL$IHIHD$`HH$Hu H !IuLHu H IYLHD$XHu H ^I8H$Hu H @ =ILH$Hu H E3E3A|oAEHHMH+DD LAH I^ED I^ML A^ED I^ML uE;s*LAJ L+A+ADHH^EAuD 4fA(^ =AUf(HD$0A\ȉT$(A $DfAWA`H$H$I)$IHLH+I+MHD$@L+AHL$PL+HD$HfffHD9E3BT(3fAWAAAIHKH+DDHfDD H IYA\L YI\D YA\L YI\uE;},MAH L+A+BHHYA\uE3E3A|[AAIHNH+DDLHD H IHAHD HAHD HAHD HAuE;}!MAJ L+A+JHHHAuEQHDHD$ D$`A^>AD;AHD$PLIOHT8AAM+DDHHD$ H H IA^>YB0AXDAA^ >YJ(AXLIA^>YB AXDAA^ >YJAXLIuE;}GI HD$0LH+D$ EM+HTE+HHIA^>YBBXD AuA4>fA( HL$PHT$@^HD$0D$`HD9HHL$H\tH\$8$XHl$`($L$T$(AD($D($f(EMcIA^F!BA$`CD-E++FKTD$`GDmLS$XH ffBA(I H C^DABJ0C^L B(C0C^DABJ(C^L B A0C^DABJ C^LB BEHC^DABJC^L SHl$`L|$XD$XD;sMILˋH+AI NjA+DIHC^DA@IC^L IuIAAE*BADƍHDPCD-Eʼn$XA+AEE+IWD$XD HHD$ BA@H C^DJA*C^L BC2C^DBJC^L BA@C^DBA@AC^DBJC^L BA2EHC^DJHl$`L|$XHL$ E;sIDMAAEAC AIC^DA@C^DE;rHAME3E3LL$PAHA艄$DFKTID$XHT$0L|$ AAMA+LL$HɉL$(D; A+ƃL|$0DQƉD$|BD$lHEAHD$8FDT$tABT0IGHD$@AF$`+ȍAQƉ$֍BT$p$AƉ$ȉ$AD$xA@D$`D$hAA+I HD$8HL$HHL$@@QD$xDT$hDL$|AAYYEf(\DD+EC^LAIYf(XBEŋD+ABHHA@A+BL(HӋ$`HHD$@AIC^LHD$8@AYYE$\Yf(XBHHA@A+BL(HӋ$`HHD$@AIC^LPHD$8AYYEB\YXË$‹ABHHA@A+f(σBL(HӋ$`HHD$@AIC^LPHD$8@AYYE$\YXË$‹ABHHA@D$`DD$lA+BL(HӋT$pHHD$8HL$@H H D$`HD$8HL$@;|$tL|$XL$(HT$0D$XLL$PLT$H;l$(O Ɖ$`GDFT0IDEH+D$HM|AHD$ f(IIC^L$XYAYAHT$0\YBXDBË$`+BL(JHA+A+BL(JDH;nL|$XHl$ D$XLL$PDIHHAD$XLL$PHT$0Hl$ D;$Hl$`($E3ۅfD3CD-AABTD+ЍFE+F4D<B^EB ^EӍ2^EAI^Eu;s"΋A+^EHuAD;?H$L$EL$PHt*L$IHIXuL|$XEH$fH*YX9H$,I$IH$HA_A\_^][%%%%r%d%V%@%%@SH HHH H HuC#H#H H 3H [HHXHhHxL` AUAVAWH 3ML8#DeH%0HXH;t3HuAtcH LHH MLHHI;rZH9}tH9EtHMTHHEH V8H AH(L;uL;tLLIEGHH=EH=3eH%0HXH;t3Hut ;>H|H ekuHCH 4Eu HH?H9=Pt!H GtMĺI-H\$@Hl$HH|$PLd$XH A_A^A]HHXHpHxATH0ILXu9u 3ۉXtu7HHtЋ؉D$ LƋI0؉D$ LƋI؉D$ u5u1L3IL3IL9Mt L3IAӅtu7LƋI#ˋىL$ tHHtLƋIЋ؉D$ 3ۉ\$ H\$@Ht$HH|$PH0A\H\$Ht$WH IHuoLNjHH\$0Ht$8H _H M@SH HH `B HD$8Hu H ~H 2 HD$8H  HD$@H HLD$@HT$8HHL$8 HHL$@ HWHH [H(GHH(H\$WH H H= HHtHH;rH\$0H _H\$WH H H=x HHtHH;rH\$0H _HMZf9t3HcH6F6V6d6|66666606555555x5?@Inadequate space on heap for gamma.Inadequate space on heap for ghatold.Inadequate space on heap for ghat.Inadequate space on heap for lambda.Inadequate space on heap for r.2 output args required.1 input arg required.!3!2!2!2!h2! 2!x2!"*3# p`P020  t T 42t d 4R%"i#&i#}"o# 'd42 p20%$}$:'  4 2p2P B%%%`'%B  4 2p@550055046P0`470v7`7J7:7 7766666$65>6F6V6d6|66666606555555x5mxFree5mxMallocmxGetPrQmxCreateDoubleScalarOmxCreateDoubleMatrix_700mxGetNlibmx.dll1mexErrMsgTxtlibmex.dllpowlogMSVCR100.dll_malloc_crt_initterm_initterm_ecfree_encoded_null_amsg_exit__C_specific_handler__CppXcptFilter@__clean_type_info_names_internal[_unlockH__dllonexit_lock_onexitEncodePointerDecodePointerSleepDisableThreadLibraryCallsQueryPerformanceCounterGetTickCountGetCurrentThreadIdGetCurrentProcessIdGetSystemTimeAsFileTimeKERNEL32.dll R77777decompToeplitzFastZohar.mexw64mexFunctionu2-+] f32222222fx2$3U",3X"#H3##3#$3$$3$$3$%3%%3&#&3$&&3&'3 ':'3:'U'3`''30 HX`Z PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD0 0PK C7qtoeblitz-1.0/decomp/logdet.m% log(det(A)) where A is positive-definite. % This is faster and more stable than using log(det(A)). % Written by Tom Minka % (c) Microsoft Corporation. All rights reserved. % Additional comments added by William Zhang, 2013. function [y] = logdet(A) U = chol(A); % Standard Cholesky decomposition A = U'*U y = 2*sum(log(diag(U))); % The product of the diagonal % of any triangular matrix is the determinant. endPK CFF-toeblitz-1.0/decomp/logdetToeplitzFastZohar.c/*================================================================= * Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices * Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) *=================================================================*/ /*================================================================= * * Adapted from decompToeplitzFastZohar.c. * logdetToeplitzFastZohar uses the Zohar algorithm to determine * the log determinant of a positive definite Toeplitz matrix, without * performing the computationally costly task of constructing the inverse. This * function is a subroutine of the logdetToeplitz.m, which follows the * algorithm of Zohar 1969, a modification of the algorithm of W.F. Trench. * * The calling syntax is: * * [ logdetT ] = logdetToeplitzFastZohar(T_row) * * T_row is the first row of the positive definite symmetric Toeplitz matrix T of dimension n+1 * (following the convention of p599 in the Zohar paper) * logdet is the log determinant of T. * * NOTE: This code is used to speed up the Toeplitz inversion as much * as possible. Accordingly, no error checking is done. The onus is * on the caller (which should be decompToeplitz.m) to pass the correct arguments. * * NOTE: This is superior to the Trench algorithm in Golub and * Van Loan's "Matrix Computations", since the Zohar version * also computes the log determinant for free, which is essential in the * application for which this algorithm was coded. * * John P Cunningham * 2009 * Modified by William Zhang, 2013 *=================================================================*/ /* Required Packages */ #include #include /* Input Arguments */ #define T_row_IN prhs[0] /* Output Arguments */ #define LD_OUT plhs[0] void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[] ) { /* Declare variables */ double *T_row, *logdet, *r, *lambda, *ghat, *ghatold, *gamma; unsigned int n; int i,j; /* Check for proper number of arguments*/ if (nrhs != 1) { mexErrMsgTxt("1 input arg required."); } else if (nlhs > 2) { mexErrMsgTxt("2 output args required."); } /* Check the dimensions of the arguments */ /* This expects T to be an n+1 by n+1 matrix */ n = mxGetN(T_row_IN)-1; /* Create a matrix for the return argument */ LD_OUT = mxCreateDoubleScalar(0); /* LD_OUT is a pointer to a 1x1 mxArray double initialized to 0. */ /* Assign pointers to some input and output parameters */ logdet = mxGetPr(LD_OUT); T_row = mxGetPr(T_row_IN); /*Allocate space on heap for various variables.*/ r = (double*) mxMalloc(n*sizeof(double)); if (r == NULL) { mexErrMsgTxt("Inadequate space on heap for r."); } lambda = (double*) mxMalloc(n*sizeof(double)); if (lambda == NULL) { mexErrMsgTxt("Inadequate space on heap for lambda."); } ghat = (double*) mxMalloc(n*sizeof(double)); if (ghat == NULL) { mexErrMsgTxt("Inadequate space on heap for ghat."); } ghatold = (double*) mxMalloc(n*sizeof(double)); if (ghatold == NULL) { mexErrMsgTxt("Inadequate space on heap for ghatold."); } gamma = (double*) mxMalloc(n*sizeof(double)); if (gamma == NULL) { mexErrMsgTxt("Inadequate space on heap for gamma."); } /* Define r, the normalized row from T_row(1,2) to T_row(1,n+1) */ for (i = 0; i < n ; i++) { r[i] = T_row[0*(n+1) + (i+1)]/T_row[0*(n+1) + 0]; } /* Initialize the values of lambda and g for the algorithm */ lambda[0] = 1 - pow(r[0],2); ghat[0] = -r[0]; /* Recursion to build g and lambda */ for (i=0 ; i < n-1 ; i++) { /* Calculate gamma */ gamma[i] = -r[i+1]; /* Note that ghat, g_i, etc are i+1 elements long */ for (j=0 ; j < i+1 ; j++) { gamma[i] -= r[j]*ghat[j]; } /* Calculate next ghat */ /* First store ghatold, which is i+1 elts long */ for (j=0 ; j < i+1 ; j++) { ghatold[j] = ghat[j]; } /* The first element of the new ghat is derived from gamma and lambda. */ ghat[0] = gamma[i]/lambda[i]; /* The rest of the new ghat is formed from the old ghat, ghatold, as described on page 599 of the Zohar paper. */ for (j=1 ; j < i+2 ; j++) { ghat[j] = ghatold[j-1] + gamma[i]/lambda[i]*ghatold[i+1-j]; } /* Calculate lambda */ lambda[i+1] = lambda[i] - pow(gamma[i],2)/lambda[i]; } /* There are n lambdas, n g values, and n-1 gammas */ /* Note that n is not the dimension of the matrix, but one less. */ /* This corresponds with Zohar notation. */ /* NOTE ON MEX MATRIX INDEXING */ /* indexing is always (colidx * colLen + rowidx) */ /* Calculate the log determinant for free (essentially) by summing the logs of the lambdas. */ logdet[0] = 0; for (i=0 ; i < n; i++) { logdet[0] += log(lambda[i]); } /* Renormalize based on T_row(1,1) */ logdet[0] += (n+1)*log(T_row[ 0*(n+1) + 0 ]); /* Free allocated arrays */ mxFree(gamma); mxFree(ghatold); mxFree(ghat); mxFree(lambda); mxFree(r); return; } PK CR##/toeblitz-1.0/decomp/logdetToeplitzFastZohar.mexELF44 ($!T T HH$$QtdRtdttGNU\y H|20Ax[`'nt     ` |CEqX4K + |"tX_0 {( ( ?A 0 H  __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesmexFunctionmexErrMsgTxtmxGetNmxCreateDoubleScalarmxGetPrmxMalloclogmxFreeliboctinterp.soliboctave.solibcruft.soliblapack.so.3gflibblas.so.3gflibfftw3.so.3libfftw3f.so.3libreadline.so.6libncurses.so.5libdl.so.2libhdf5.so.6libz.so.1libgfortran.so.3libstdc++.so.6libm.so.6libgcc_s.so.1libc.so.6_edata__bss_start_endGLIBC_2.0GLIBC_2.1.3Y ii qsi $           US[øt.)X[ hhhhh h($h0(h8p,h@`UVS4u]t0$l8)9s 889rƃ4[^]US.ktt $Ѓ[]Ë$ÐUWVSlu#}tp$$E$EU $E$}<$EYEs<$FEs<$3t<$!Et<$EUM11}ĉu܍v4׉19EwEċUԋMuȃMثX}1E}ȍv}ЋEЋM}܋}}E1t& ƃ9~؋M19~E܃EM0E1UЉUU2U \;EuȋM܋}̃E9EUMLE}t5؉u܋u11Uԃ$]M9Ew܋u܋}$]E1҉UUEEmE$M $4$}ԉ<$Eĉ$l[^_]Ã}$}UċMEثXPE4$$z$z$y $tyUVSt&Ћu[^]US[àY[1 input arg required.2 output args required.Inadequate space on heap for r.Inadequate space on heap for lambda.Inadequate space on heap for ghat.Inadequate space on heap for ghatold.Inadequate space on heap for gamma.?"/9JYcq 0 H op  H ooofov$ GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3AmexFunction}  int25lgbV1 ]1(,:1]X 1(D1iP4z  4zu r4z I4zuT ?4z 4z y4zu n5D i6(/ j6(n c = o u= 6% $ > $ > : ; $ > .? : ; ' @: ; I4: ; I 4: ; I 4: ; I 4: ; I 4: ; I  I&I! /home/cunni/toeplitz/wemmick/toeplitz/decomp/usr/include/octave-3.2.3/octavelogdetToeplitzFastZohar.cmex.h1n *@8@@Y-=k-=k-/k-=k-=m>,5jbNbic&(dZH dz?9[9[^dfd*f;Y-/:>Lr^x8$;.gs,Gh.444| AAB Inlhslogdetnrhsunsigned charshort unsigned intmxArrayplhsghatprhslambdaT_rowmexFunctionlong long unsigned intgammaghatoldlong long intGNU C 4.4.3/home/cunni/toeplitz/wemmick/toeplitz/decomp/logdetToeplitzFastZohar.cshort intlong doublettAuuAu Au !!Au! !VuVuVAuQ/VP+RR2W2?R\P.symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc$2X.opp<8 @Hoff"Uo@d  m H v000q``|HH H d d P P H 0$ $( (0(%M m"%4*0$5"@@#4 !pf 0 `  H  d P $ (   (5 K( Z, h tP    $ H  !.( :0 ? N( U ir"A 0 crtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.7021dtor_idx.7023frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxlogdetToeplitzFastZohar.c__i686.get_pc_thunk.bx_GLOBAL_OFFSET_TABLE__DYNAMIC__DTOR_END____dso_handle_finimexErrMsgTxt__bss_start_end__gmon_start___edata_Jv_RegisterClassesmxMalloc__cxa_finalize@@GLIBC_2.1.3mexFunctionmxGetPr_initlog@@GLIBC_2.0mxGetNmxCreateDoubleScalarmxFreePK CO!2toeblitz-1.0/decomp/logdetToeplitzFastZohar.mexa64ELF>@@8@      $$Ptd QtdGNUu,L B @  5 hL  S"p}?y3 \__gmon_start____cxa_finalize_Jv_RegisterClassesmexFunctionmexErrMsgTxtmxGetNmxCreateDoubleScalarmxGetPrmxMalloclogmxFreelibmx.solibmex.solibmat.solibm.so.6libstdc++.so.6libpthread.so.0libc.so.6logdetToeplitzFastZohar.mexa64MEXGLIBC_2.2.5 Q ui ui      ( H P X ` h p  x    H:%H52 %4 @%2 h%* h%" h% h% h% h% h% hpHH} HtHÐU= HATSubH=` t H=? jH# L% H L)HHH9s DHH AHz H9rf [A\fH= UHtH HtH= @ÐUHAWAVAUATSHXIH˃tH=~ H=H;EEfWI$HSHEH;GHEEHHEHpIIHu H=yH}PHEHu H=[H}2HHEHu H=:H}IIHu H=H}HEHu H=}}HUHcȃ^A9wAY \HEA fWHEEEDHcLHMLL CfWDBE~8LA Y \HH9uLH<I|HH9uL]A^HEB~.LA^HcAYAXDDHuf(YA^\HEBHD;EHEH}tELuDuLmIA$EHcADjXEA$A9wLuHEEHE9EH*YXEHEH}LH}H}LHX[A\A]A^A_AY \HEA fWHEEAHEHLuDuLmIUHSHH HtH HHHuH[ÐHOH1 input arg required.2 output args required.Inadequate space on heap for r.Inadequate space on heap for lambda.Inadequate space on heap for ghat.Inadequate space on heap for ghatold.Inadequate space on heap for gamma.?;0zRx ,AC P) A    X o0  0 (` oPoooo4o &6FVfvGCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3).symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_d.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.ctors.dtors.jcr.data.rel.ro.dynamic.got.got.plt.bss.comment$.o(8 P@00Ho44UoPP8do@s`}(( X X p p   L         0 0X 0X 2 04P (    X p         0    * 8 E [ j x 0     X 0     " ) 2 8@G V jn" \call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6349dtor_idx.6351frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxlogdetToeplitzFastZohar.c_fini_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END____bss_start_end_edata_DYNAMIC_initmxGetPrmxGetN__gmon_start___Jv_RegisterClassesMEXmxCreateDoubleScalar__cxa_finalize@@GLIBC_2.2.5mxMallocmxFreemexFunctionmexErrMsgTxtlog@@GLIBC_2.2.5PK C=F(!!5toeblitz-1.0/decomp/logdetToeplitzFastZohar.mexmaci64x__TEXT__text__TEXT  __stubs__TEXT * __stub_helper__TEXT T __const__TEXTP P__cstring__TEXTpp__unwind_info__TEXT\P\__eh_frame__TEXTP__DATA__dyld__DATA__la_symbol_ptr__DATA8H__LINKEDIT  @ ! P  k'6پI$  0@rpath/libmx.dylib 0@rpath/libmex.dylib 0@rpath/libmat.dylib 84/usr/lib/libstdc++.6.dylib 8/usr/lib/libgcc_s.1.dylib 8{/usr/lib/libSystem.B.dylib&8 )@ ASLAS%%UHAWAVAUATSHHHIt H= | H=%H;jIL}fNIHUHEH;IHEAGHEHH3HEHu H=$HIMu H=HHEHu H=HIMu H=HHHu H=HEt0HE@1HUD^HUHH9uHEY \AfWHEHE[HH@HFHHMHMHIHM1ɺ|HfH} fWL~fHLELMAAY\LIIHu߅~(HMLMАA AIIHuLA^LH}|CHIMLUfLA^LMI CY AX A IIIHuALTY^\A HHH}H|HHHEHHEujfEHEHEH*YXMHEH}LuH}lLdH}HH[A\A]A^A_]MHEAAfEMDAEEXEHEIIZE%>%@%B%D%F%H%JL L L LLLL?1 input arg required.2 output args required.Inadequate space on heap for r.Inadequate space on heap for lambda.Inadequate space on heap for ghat.Inadequate space on heap for ghatold.Inadequate space on heap for gamma. 44 4  XzRx 4`  __ (4@ (08@  $ .0 ;@Ndlt}   dyld_stub_binding_helper__dyld_func_lookup_mexFunction_log_mexErrMsgTxt_mxCreateDoubleScalar_mxFree_mxGetN_mxGetPr_mxMallocPK Cz &$$2toeblitz-1.0/decomp/logdetToeplitzFastZohar.mexw64MZ@ !L!This program cannot be run in DOS mode. $vvvv݃v޹vwv܃vvvRichvPEd R"  4p@@']#dP@` .text" `.rdata @@.data`0@.pdata@@@.rsrcP @@.reloc `"@BHHXHhHp WATAUAVAWH)xIHD)@At H  ~ H H fWpHt$PHHH HHD$HHLHHD$XHl$`oLHu H PsHSHD$ Hu H UH5LHu H 9HLHu H HHHD$8Hu H 9E3E3҃|vFIIMI+DD L@AH IA^ED IA^ML AA^ED IA^ML uD;s*MŋK M+A+ADHHA^EAuDsAfA(: THL$ FHDŽ$\ A=fWA$&HHMI+֋M+)$HT$@IAH+LHL$0HT$(H+HDE3BT(3fWAAAIIOI+DDHfDD H IYA\L YI\D YA\L YI\uE;},MAI M+A+BHHYA\uE3E3A|[AAIINI+DDLHDH IHAHDHAHDHAHDHAuE;}!MAK M+A+JHHHAuAyD^+A$;AHD$(IIL$LTAAI+DDH4H I I^+AYB0XD A ^ +AYJ(XL I^+AYB XD A ^ +AYJXL IuD;}GH$MDH+M+I ITE+HHI^+YBBXD Au4+fA()HT$(HL$@^H$HDHHL$0D\t5Ll$XH|$HHt$P($Hl$`HL$ D(D$p($Ht$HHHXuAENfH*HL$8YXCI;I3HL$ )IL$I[0Ik@IsHIA_A^A]A\_% % % % % % % %. @SH  HH HHHuC#H#H H 3H [HHXHhHxL` AUAVAWH 3ML8Q#D>eH%0HXH;t/ 3H4uAtcH  LHH MLHHI;rZH9}tH9EtHMHHEH H HL;uL;tLLIHpHq=SEH=K3eH%0HXH;t3H ut ;>HH uHH u HHH9=t!H tMĺIOH\$@Hl$HH|$PLd$XH A_A^A]HHXHpHxATH0ILXu9u 3ۉXtu7H HtЋ؉D$ LƋI0؉D$ LƋI؉D$ u5u1L3IL3ILMt L3IAӅtu7LƋI#ˋىL$ tH^HtLƋIЋ؉D$ 3ۉ\$ H\$@Ht$HH|$PH0A\H\$Ht$WH IHuoLNjHH\$0Ht$8H _H @SH HH HD$8Hu H~H |HD$8H xjHD$@HTHLD$@HT$8HHL$84HEHL$@"H+WHH [H(GHH(H\$WH HH=HHtHH;rH\$0H _H\$WH HH=HHtHH;rH\$0H _HMZf9t3HcH PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD (PK C|7toeblitz-1.0/invToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This is simply a wrapper function that calls decompToeplitz in a way that produces both ld, the log determinant of T, and Ti, the inverse. Note that the log determinant is computed essentially for free when the inverse is also obtained. We can specify a runMode here to run decompToeplitz in the desired mode. Here are the accepted values of runMode: % runMode = 0 % This calls the C/MEX implementation of Zohar's modification of the Trench algorithm. % runMode = 1 % This calls the backup Matlab implementation of Zohar's modification of the Trench algorithm. % runMode = -1 % This calls the generic MATLAB function logdet. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[Ti, ld] = invToeplitz(T_row, runMode) if nargin < 2 % Handles the case when runMode is not specified. [ld, Ti] = decompToeplitz(T_row, 0); % This allows decompToeplitz to automatically choose the best method. else % Handles the case when runMode is specified. [ld, Ti] = decompToeplitz(T_row, 0, runMode); % This forces decompToeplitz to use the specified method. end end PK Ci}}toeblitz-1.0/license.txtGNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONSPK C69ۯtoeblitz-1.0/logdetToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This is simply a wrapper function that calls decompToeplitz in a way that computes only the log determinant, and does not waste computations and memory constructing and storing the inverse. We can specify a runMode here to run decompToeplitz in the desired mode. Here are the accepted values of runMode: % runMode = 0 % This calls the C/MEX implementation of Zohar's modification of the Trench algorithm. % runMode = 1 % This calls the backup Matlab implementation of Zohar's modification of the Trench algorithm. % runMode = -1 % This calls the generic MATLAB function logdet. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[ld] = logdetToeplitz(T_row, runMode) if nargin < 2 % Handles the case when runMode is not specified. ld = decompToeplitz(T_row, 1); % This allows decompToeplitz to automatically choose the best method. else % Handles the case when runMode is specified. ld = decompToeplitz(T_row, 1, runMode); % This forces decompToeplitz to use the specified method. end endPK CTCk00toeblitz-1.0/README==================================================================== William Zhang, Washington University in St. Louis John P. Cunningham, Columbia University Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices Copyright (C) 2013 William B. Zhang and John P. Cunningham This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ==================================================================== ==================================================================== Basic Usage Example ==================================================================== Here, we present a basic example of how to use our Toeblitz toolkit, with some random matrices and variables: T_row = genPDToeplitz(50); % This creates the variable T_row, the first row of a random 50 x 50 symmetric positive definite Toeplitz matrix T, which we will study. A = randn(50, 50); % This creates a random 50 x 50 matrix to use in computing the trace of a product of a Toeplitz matrix with an arbitrary matrix. b = randn(50, 1); % This creates a random 50 x 1 vector to use in the matrix Tx = b for testing solveToeplitz. tr = traceToeplitz(A, T_row); % This computes the trace of the product of A and T in a fast way. [invT, ldT] = invToeplitz(T_row); % This computes the inverse of T and the log determinant of T in a fast way. x = solveToeplitz(T_row, b); % This solves the system Tx = b for x. ==================================================================== ==================================================================== C/MEX: MEX functions are programs written in C, C++, or FORTRAN that are callable from Matlab. This allows bottlenecks in native Matlab code to be optimized through the use of a compiled language. In this package, we have pre-compiled Matlab MEX functions from C code for several popular operating systems. If we do not have a precompiled version for your operating system, the startup.m file will automatically attempt create one for your operating system. This requires a C compiler. Supported compilers can be found at . More information on C/MEX can be found at . Note: We have also pre-compiled MEX files for Octave, but have only done so (and tested our C functions) on an Ubuntu distribution of Linux. ==================================================================== ==================================================================== Startup.m This script will run by default if Matlab starts in the /toeplitz directory. If Matlab does not start in the /toeplitz directory, you should switch to it using "cd .../toeplitz", where .../toeplitz is the full directory path of the directory on your system. Then, you should run startup.m manually by simply typing "startup" into Matlab. It adds the locations of all the functions contained in our script to Matlab's search path, and attempts to create the relevant MEX files for your operating system, if it does not already exist. ==================================================================== ==================================================================== solveToeplitz.m solveToeplitz allows us to solve a Toeplitz system Tx = b for the unknown vector x. We call solveToeplitz with the following syntax: x = solveToeplitz(T_row, b [, runMode]) where b is the column vector b from our equation, T_row is the first row of the Toeplitz matrix T, x is the desired vector from our equation, and runMode is an optional argument forcing the code to use a particular method to obtain the solution x. Valid values of runMode are presented in the documentation in the main solveToeplitz function. ==================================================================== ==================================================================== logdetToeplitz.m logdetToeplitz allows us to compute the log determinant of a Toeplitz matrix T. logdetToeplitz is faster than obtaining the log determinant as a secondary output from invToeplitz, since it wastes no memory constructing the full inverse. It is linear in memory and quadratic in runtime. The calling syntax for logdetToeplitz is ldT = logdetToeplitz(T_row [, runMode]) where ldT is the log determinant of T, T_row is the first row of the Toeplitz matrix T, and runMode is an optional argument forcing the code to use a particular method to obtain the log determinant ldT. Valid values of runMode are presented in the documentation in the main logdetToeplitz function. ==================================================================== ==================================================================== traceToeplitz.m This function takes the trace of the product of a Toeplitz matrix T and an arbitrary matrix A in a smart way. The calling syntax is tr = traceToeplitz(A, T_row [, T_col, runMode]) where A is the arbitrary matrix, T_row is the first row of T, tr is the trace of the product A*T, T_col is an optional argument giving the first column of T (when T is asymmetric), and runMode is an optional argument forcing the code to use a particular method to obtain the trace. Valid values of runMode are presented in the documentation in the main traceToeplitz function. Note that in our tests, trace(A*T) is used as the MATLAB built-in function. sum(sum(transpose(A).*T)) is actually equivalent, and gives the answer faster than trace(A*T). However, our implementation exploits Toeplitz structure to perform the computation in the minimum (n^2 + n - 1) floating point operations, whereas sum(sum(transpose(A).*T)) requires (2n^2 - 1) operations. In our analysis we choose trace(A*T) as the comparison in order to illustrate the contrast between its O(n^3) complexity and the O(n^2) complexity of our traceToeplitz method. ==================================================================== ==================================================================== invToeplitz.m invToeplitz computes the inverse of a Toeplitz matrix T, and gives the log determinant of T for free in an optional second output argument. The calling syntax for invToeplitz is [invT [, ldT]] = invToeplitz(T_row [, runMode]) where invT is the inverse of T, ldT is an optional output argument giving the log determinant of T, T_row is the first row of the Toeplitz matrix T, and runMode is an optional argument forcing the code to use a particular method to obtain the inverse invT. Valid values of runMode are presented in the documentation in the main invToeplitz function. ==================================================================== ==================================================================== testToeplitz.m You can use this script to test the accuracy and speed of the supported functions in this package. The calling syntax is testToeplitz(method, sizes_vec, runs, save_flag)". where method is a string giving the name of the method to be tested (valid values of method are described in the documentation of the main function, testToeplitz), sizes_vec is a row vector of matrix sizes for which to test that method, runs is the number of iterations to average over for each data point, and save_flag is a Boolean indicating whether the results of the test should be saved, or simply displayed. To display the results without saving, save_flag can be set to 0 (false), or simply omitted. To save your results, save_flag must be set to 1. In this case, the figures will not be displayed, but will be saved as both .pdf files and .fig files to /toeplitz/results/XXX/, where XXX is a number assigned to that set of data, ranging from 001 to 999. ==================================================================== ==================================================================== recreateToeblitzPlots.m This script, when run with no input parameters, will generate and save to disk the three plots presented in the Toeblitz paper. It should be able to complete running overnight on a modern laptop. For a quicker verification, the -1 argument can be used, as follows: recreateToeblitzPlots(-1) Other options exist to only produce one of the three plots in the Toeblitz paper, and these are documented in the recreateToeblitzPlots.m file itself. ==================================================================== ==================================================================== convertToeplitz.m convertToeplitz is provided in the case that the user wishes to convert between our abbreviated representation of a Toeplitz matrix as its first row (and sometimes also its first column, in the asymmetric case) and the full explicit representation. Its calling syntax is T = convertToeplitz(T_row [, T_col]) [T_row [, T_col]] = convertToeplitz(T) where T is the explicit full representation of the Toeplitz matrix, and T_row and T_col are the first row and column, respectively. We see that T_col is an optional input used to specify asymmetric Toeplitz matrices, and that it is only given as an output when an asymmetric Toeplitz matrix is given as the input argument. ==================================================================== ==================================================================== The BibTeX citations for the primary papers used in this project are below: @book{golub1996matrix, title={Matrix computations}, author={Golub, Gene H and Van Loan, Charles F}, volume={3}, year={2012}, publisher={The Johns Hopkins University Press} } @book{rasmussen2006gaussian, title={Gaussian processes for machine learning}, author={Rasmussen, Carl E and Williams, Christopher KI}, year={2006}, publisher={MIT Press} } @article{levinson1947wiener, title={The {W}iener {R}{M}{S} (root mean square) error criterion in filter design and prediction}, author={Levinson, Norman}, journal = {Journal of Mathematics and Physics}, volume={25}, number={4}, pages={261–-278}, year={1947} publisher={MIT Press} } @article{durbin1960fitting, title={The fitting of time-series models}, author={Durbin, James}, journal={Revue de l'Institut International de Statistique}, pages={233--244}, year={1960}, publisher={JSTOR} } @article{holmes1989random, title={On random correlation matrices {I}{I}: the {T}oeplitz case}, author={Holmes, Robert B}, journal={Communications in Statistics-Simulation and Computation}, volume={18}, number={4}, pages={1511--1537}, year={1989}, publisher={Taylor \& Francis} } @article{zohar1969toeplitz, title={Toeplitz matrix inversion: the algorithm of {W}{F} {T}rench}, author={Zohar, Shalhav}, journal={Journal of the Association for Computing Machinery (JACM)}, volume={16}, number={4}, pages={592--601}, year={1969}, publisher={ACM} } @article{chan1996conjugate, title={Conjugate gradient methods for {T}oeplitz systems}, author={Chan, Raymond H and Ng, Michael K}, journal={SIAM review}, volume={38}, number={3}, pages={427--482}, year={1996}, publisher={SIAM} } @article{shewchuk1994introduction, title={An introduction to the conjugate gradient method without the agonizing pain}, author={Shewchuk, Jonathan R}, year={1994}, journal={CMU Technical Report} publisher={Carnegie Mellon University, Pittsburgh, PA} } @article{minka2003lightspeed, title={The lightspeed {MATLAB} toolbox}, author={Minka, Tom}, journal={Efficient operations for Matlab programming, Version}, volume={2}, year={2003} } ====================================================================PKϹ Ctoeblitz-1.0/results/PKu Etoeblitz-1.0/solve/PK C\ \ toeblitz-1.0/solveToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This solves a system Tx = b for x, where x and b are column vectors and T is a toeplitz matrix. It uses the method specified by runMode, or chooses a method based on the size of the matrix and vector. % Accepted values of runMode are: % % runMode = 'LD' This directs the code to execute the Levinson-Durbin algorithm, which works in % runMode = 'PCG' This directs the code to execute the preconditioned conjugate gradient method with automatic choice of preconditioner. The code will always choose Chan. % runMode = 'Mldivide' This directs the code to use the built-in MATLAB mldivide method. % runMode = 'PCG_Chan' This explicitly directs the code to use the preconditioned conjugate gradient method with the Chan preconditioner. % runMode = 'PCG_Circulant_Embedding' This explicitly directs the code to use the preconditioned conjugate gradient method with a preconditioner produced by embedding our Toeplitz matrix in a circulant matrix and adding it to the other block. This is described more fully in the "Conjugate gradient methods for Toeplitz systems" 1996 article we reference in the paper accompanying this software package. % runMode = 'PCG_None' This explicitly directs the code to use the unconditioned conjugate gradient method. % % The calling syntax for solveToeplitz is % % solveToeplitz(T_row, b [, runMode]) % % where % % T_row is the first row of the Toeplitz matrix T % b is a the column vector % runMode (optional) is the method used to solve for x. % % The output of solveToeplitz is a single variable % % x, which is the solution to the matrix equation Tx = b. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x] = solveToeplitz(T_row, b, runMode) size_T_row = size(T_row, 2); % Finds the size of the Toeplitz matrix. This is used for determining which method to use (different methods are fastest at different matrix sizes). if nargin < 3 if size_T_row < 500 runMode = 'mldivide'; % Uses Mldivide for smaller matrices. elseif size_T_row >= 500 runMode = 'pcg'; % Uses the Chan-preconditioned conjugate gradient method for larger matrices. end end x = solveToeplitzMode(T_row, b, runMode); end function [x] = solveToeplitzMode(T_row, b, runMode) %This function links the runMode handles to the actual function which implement the different methods. if strcmp(lower(runMode), 'ld') x = solveToeplitzLD(T_row, b); elseif strcmp(lower(runMode), 'mldivide') x = solveToeplitzMldivide(T_row, b); elseif strcmp(lower(runMode(1, 1:3)), 'pcg') if length(runMode) == 3 %This case allows our code to choose the preconditioner automatically. x = solveToeplitzPCG(T_row, b, 'auto'); elseif runMode(1, 4) == '_' %This case forces solveToeplitzPCG to run with a specified preconditioner. x = solveToeplitzPCG(T_row, b, runMode(5:end)); else error('Invalid runMode value given.') end else error('Invalid runMode value given.') end endPK Ci(toeblitz-1.0/solve/PCG_Chan.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function builds the first column of the Chan circulant preconditioner as described in 2.1.2 (T. Chan's Preconditioner) of Conjugate gradient methods for Toeplitz systems (1996) by Raymond H. Chan and Michael K. Ng. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[c] = PCG_Chan(T_row) n = size(T_row, 2); % Gets the size of the Toeplitz matrix we are dealing with. c(1, 1) = T_row(1, 1); % Obtains the first entry of our column vector directly from the Toeplitz matrix. % Non-vectorized version. %for i = 1:n-1 % Loops over all following entries. % c(i+1, 1) = ((n-i)*T_row(1, i+1) + i*T_row(1, n-i+1))/n; % Computes following entries according to equation 2.4 from Chan (1996). %end % Vectorized version. This should be somewhat faster, but is more costly in terms of memory requirements. n_vec = transpose(zeros(1, n-1)); % Initializes n_vec as a vector of all zeros. n_vec(1:n-1, 1) = n; % Sets the value of every entry of n_vec to n. i_vec = transpose([1:n-1]); % Creates a vector with the desired indices we want to loop over. c(2:n, 1) = ((n_vec-i_vec).*transpose(T_row(1, 2:n)) + i_vec.*transpose(T_row(1, n:-1:2)))/n; % % Computes following entries according to equation 2.4 from Chan (1996). endPK CL-ˆ,toeblitz-1.0/solve/PCG_Circulant_Embedding.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % Given a symmetric positive definite Toeplitz matrix, T, this function returns the first column of the circulant preconditioner formed by circulant embedding as in 2.1.3 (Preconditioners by embedding) of Conjugate gradient methods for Toeplitz systems (1996) by Raymond H. Chan and Michael K. Ng. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [r] = PCG_Circulant_Embedding(T_row) b = vertcat(T_row(1, 1), transpose(T_row(1, end:-1:2))); % Generate the first column of the matrix B, which is embedding in a circulant matrix along with our original matrix T. r = b + transpose(T_row(1, 1:end)); % Add the first column of T to the first column of B to generate the first column of our desired preconditioner. endPK Co8>>$toeblitz-1.0/solve/solveToeplitzLD.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This solves a system Tx = b for x, where x and b are column vectors and T is a positive definite Toeplitz matrix. It uses the Levinson-Durbin algorithm. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x] = solveToeplitzLD(T_row, b) f_v = 1/T_row(1, 1); % This is the first forward vector. b_v = 1/T_row(1, 1); % This is the first backward vector. x = b(1, 1)/T_row(1, 1); % This is the first vector in the sequence x_n leading up to x_N = x, x_1. for i = 2:size(T_row, 2) %Obtaining the forward and backward vectors. f_error = T_row(1, i:-1:2)*f_v; %Computing the error terms that arise when we multiply T_n by the temporary vector. b_error = T_row(1, 2:i)*b_v; x_error = T_row(1, i:-1:2)*x; f_v = (1/(1-f_error*b_error))*(vertcat(f_v, 0) - f_error*vertcat(0, b_v)); %Computes new values for the forward and backwards vectors, as well as the next vector in the x_n sequence. b_v = f_v(end:-1:1); %b_v = (1/(1-f_error*b_error))*b_temp - (b_error/(1-f_error*b_error))*f_temp; %This is commented out, since we are working with symmetric matrices; so we can obtain the backward vector simply by reversing the forward vector. x = vertcat(x, 0) + (b(i, 1)-x_error)*b_v; %Ti*f_v % You can use this to check if the forward vectors are correct; this line of code should produce a vector with a one in the first entry and all zeroes following if they are. end endPK C*toeblitz-1.0/solve/solveToeplitzMldivide.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This solves a system Tx = b for x, where x and b are column vectors and T is a toeplitz matrix. It uses the built-in Matlab method. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x] = solveToeplitzMldivide(T_row, b) x = mldivide(toeplitz(T_row), b); endPK Cs s %toeblitz-1.0/solve/solveToeplitzPCG.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This solves a system Tx = b for x, where x and b are column vectors and T is a positive definite toeplitz matrix. It uses the Conjugate Gradient method from page 529 of "Matrix Computations" by Golub. It also has a second (optional) output argument, k, which tells us the number of iterations it took to converge to our result. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x, k] = solveToeplitzPCG(T_row, b, preconditioner) n = size(T_row, 2); % Get the size of the matrix we are dealing with. epsilon = 10^(-6); % Set a reasonable error bound for use in stopping condition. kmax = 400; % Set a maximum number of iterations. If it's taking more than 400, something is probably wrong. % Here we automatically set the preconditioner if not specified. if nargin < 3 preconditioner = 'auto'; end % Here we define our preconditioner, m. m is actually just the first column of our full circulant preconditioner M, but for speed we omit the rest of the matrix from explicit representation. if strcmp(lower(preconditioner), 'circulant_embedding') m = PCG_Circulant_Embedding(T_row); elseif or(strcmp(lower(preconditioner), 'chan'), strcmp(lower(preconditioner), 'auto')) m = PCG_Chan(T_row); elseif strcmp(lower(preconditioner), 'none') m = zeros(n, 1); m(1, 1) = 1; end if strcmp(lower(preconditioner), 'matlab') [x, foo1, foo2, k] = pcg(toeplitz(T_row), b); % Calls Matlab's default preconditioned conjugate gradient algorithm. We include this here primarily for testing purposes. Note foo used instead of ~ for octave compatibility else x = zeros(n, 1); % Here we choose an initial guess for x. The solution in this method is fairly insensitive to our initial guess, so we just choose the zero vector. k = 0; % Here we initialize k, the number of iterations, at zero. % Initialize the values of a bunch of other variables. r = b - multiplyToeplitz(T_row, x); d = multiplyinvCirculant(m, r); delta_new = transpose(r)*d; delta_old = delta_new; %The following loop runs the preconditioned conjugate gradient method. while and(sqrt(delta_old) > epsilon, k < kmax) q = multiplyToeplitz(T_row, d); alpha = delta_new/(transpose(d)*q); x = x + alpha*d; if mod(k, 50) == 0 r = b - multiplyToeplitz(T_row, x); else r = r - alpha*q; end s = multiplyinvCirculant(m, r); delta_old = delta_new; delta_new = transpose(r)*s; beta = delta_new/delta_old; d = s + beta*d; k = k + 1; end % Prints a warning message if the maximum number of iterations is reached. if k == kmax fprintf('WARNING: %d (maximum number) iterations taken, the residual is %g.', k, delta_old); end end end PK CWtoeblitz-1.0/startup.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This is a startup file which initializes Matlab's settings to allow for better use of the toeplitz package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% path(sprintf('%s/util', pwd), path) % Adds the subdirectories of the root folder to the path, allowing us to call functions from them. path(sprintf('%s/test', pwd), path) path(sprintf('%s/decomp', pwd), path) path(sprintf('%s/solve', pwd), path) path(sprintf('%s/trace', pwd), path) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The following code checks for the relevant MEX files (such as .mexa64 % or .mexglx, depending on the machine architecture), and it creates the % mex file if it can not find the right one. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Create the mex file if necessary. startup_checkMEX('decomp', 'decompToeplitzFastZohar') % Toeplitz inversion startup_checkMEX('decomp', 'logdetToeplitzFastZohar') % Toeplitz log determinant startup_checkMEX('trace', 'traceToeplitzFast') % Toeplitz trace %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %This simply clears all variables and closes all windows opened by Matlab. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all % Clears all variables. close all % Closes all windows opened by Matlab.PKu Etoeblitz-1.0/test/PK CE|*--toeblitz-1.0/testToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, John P Cunningham % This tests a toeplitz function with different sizes of matrices and times it to evaluate performance and accuracy. It takes two required input arguments, method and sizes_vec, and two optional arguments, runs and save_flag. The calling syntax is % testToeplitz(method, sizes_vec[, runs, save_flag]). % If three arguments are given, the code will assume that the third argument is runs. To specify save_flag, runs must also be specified. % % Valid inputs: % method = 'decompToeplitz', 'traceToeplitz', 'solveToeplitz', or 'solveToeplitzPCG' % sizes = a row vector of positive integer sizes over which to evaluate the performance of that function; for example, [5:10] will cause testToeplitz to produce results for matrices at sizes 5, 6, 7, 8, 9, and 10, and display relevant plots. % runs = a positive integer which indicates the number of runs over which to average results for each matrix size and algorithm. More runs will give smoother results and nicer graphs, but will be more computationally costly. This defaults to 3 if not specified. % save_flag = a boolean value, 0 or 1, which indicates whether plots should be displayed (0) or saved to the ./results directory. This defaults to 0 (only display, no saving) if not specified. % % Some example calls: % testToeplitz('decompToeplitz', [2:10:202]) % testToeplitz('traceToeplitz', [500:600]) % testToeplitz('solveToeplitz', [5 10 100 10^3 10^4], 10) % testToeplitz('solveToeplitzPCG', [400:100:1000], 1, 1) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This is the main function. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [] = testToeplitz(method, sizes_vec, runs, save_flag) % The following code sets default values for runs and save_flag if they are not specified. if nargin < 4 % Check to see if any arguments are missing. save_flag = 0; % Default value for save_flag is false. if nargin < 3 runs = 3; % Default number of runs to average over. end end % The following code finds a folder to save the result plots in, if save_flag is set to 1. folder = '0'; if save_flag for i = 1:999 % Searches from 001 to 999 for an unused folder name of the form 'test_XXX', where XXX is the three-digit number. if folder == '0' % Runs the following code if we have not yet found a suitable folder. test_folder = sprintf('./results/test_%03d/', i); % Finds the subdirectory in which the files will be placed. if not(exist(test_folder)) % Checks to see if there is already a folder with that name in the ./results/ directory. If not, it creates the folder and proceeds. folder = test_folder; % Changes the value of folder, stopping future checks for folder names. mkdir(folder); % Actually creates the directory. fprintf(['Printing to directory ' folder '.\n']) % Informs the user where the output will be saved. end end end end % The following code tests the accuracy and speed of our traceToeplitz method. Routines for testing other functions work similarly, and are less extensively commented. if strcmp(method, 'traceToeplitz') % This checks if 'traceToeplitz' is the method specified for testing. trace_strs = cell(4, 1); % This creates a cell array of the names of our different methods for use in labeling plots and legends. trace_strs(1, 1) = cellstr('trace(A*T)'); trace_strs(2, 1) = cellstr('traceToeplitz (Automated Choice)'); trace_strs(3, 1) = cellstr('traceToeplitz (C/MEX)'); trace_strs(4, 1) = cellstr('traceToeplitz (Matlab)'); vals_times = zeros(8, length(sizes_vec)); % This initializes the matrix in which all our test results will be (temporarily) stored. for i = 1:length(sizes_vec) % This loops over each the sizes of matrices we want to test. current_size_str = num2str(sizes_vec(i)); % Finds the current matrix size being worked on. fprintf(['Working on matrix size ' current_size_str '.\n']) % Informs the user what matrix size we're up to. new_vals_times = zeros(8, 1); % This initializes new_vals_times (and resets it for each size of matrix tested). for j = 1:runs % For each size matrix, this loops 'runs' times to obtain an average result. run_str = num2str(j); % Finds the current run being worked on. fprintf(['Now on run number ' run_str '.\n']) % Informs the user which run we are on. T_row = genPDToeplitz(sizes_vec(i)); % This produces the first row of a (more or less) random positive definite Toeplitz matrix. new_vals_times = new_vals_times + test_traceToeplitz(T_row); % This calculates the trace of the product with an arbitrary matrix in various ways, and adds the timings and accuracy metrics to a cumulative total in new_vals_times (see test_traceToeplitz documentation for more detail). end vals_times(1:8, i) = new_vals_times(1:8, 1)/runs; % This saves the results in new_vals_times to the appropriate column in vals_times, dividing by the number of runs to obtain an average. end % Show or save results % These are results for computational time. test_plot('all', sizes_vec, vals_times(2:2:8, 1:end), trace_strs, 'Computation time (s)', save_flag, folder, 'test_trace_time', 0); % These are results for accuracy. test_plot('linear', sizes_vec, vals_times(1:2:7, 1:end), trace_strs, 'Norm difference vs. trace(A*T)', save_flag, folder, 'test_trace_norm', 0); elseif strcmp(method, 'decompToeplitz') decomp_strs = cell(4, 1); decomp_strs(1, 1) = cellstr('decompToeplitz (Automated Choice)'); decomp_strs(2, 1) = cellstr('inv(T)'); decomp_strs(3, 1) = cellstr('C/MEX Zohar'); decomp_strs(4, 1) = cellstr('Matlab Zohar'); vals_times = zeros(12, length(sizes_vec)); for i = 1:length(sizes_vec) current_size_str = num2str(sizes_vec(i)); % Finds the current matrix size being worked on. fprintf(['Working on matrix size ' current_size_str '.\n']) % Informs the user what matrix size we're up to. new_vals_times = zeros(12, 1); for j = 1:runs run_str = num2str(j); % Finds the current run being worked on. fprintf(['Now on run number ' run_str '.\n']) % Informs the user which run we are on. T_row = genPDToeplitz(sizes_vec(i)); % Make random positive definite symmetric toeplitz matrix. % Mow calculate the inverse in various ways, and save the timings and accuracy metrics (see test_decompToeplitz documentation for more detail). new_vals_times = new_vals_times + test_decompToeplitz(T_row, i); end vals_times(1:12, i) = new_vals_times(1:12, 1)/runs; % Update our array of results with the average of all trials, after each size matrix in sizes_vec is tested. end % Show or save results % These are results for computational time. test_plot('all', sizes_vec, vals_times(3:3:12, 1:end), decomp_strs, 'Computation time (s)', save_flag, folder, 'test_decomp_time', 0); % These are results for accuracy. test_plot('linear', sizes_vec, vals_times(1:3:10, 1:end), decomp_strs, 'Frobenius norm difference vs. inv(T)', save_flag, folder, 'test_decomp_invnorm', 0); test_plot('linear', sizes_vec, vals_times(2:3:11, 1:end), decomp_strs, 'Norm difference vs. logdet(T)', save_flag, folder, 'test_decomp_logdetnorm', 0); elseif strcmp(method, 'solveToeplitz') solve_strs = cell(4, 1); solve_strs(1, 1) = cellstr('Matlab mldivide'); solve_strs(2, 1) = cellstr('Levinson-Durbin'); solve_strs(3, 1) = cellstr('Unconditioned Conjugate Gradient'); solve_strs(4, 1) = cellstr('Preconditioned Conjugate Gradient'); vals_times = zeros(8, length(sizes_vec)); for i = 1:length(sizes_vec) current_size_str = num2str(sizes_vec(i)); % Finds the current matrix size being worked on. fprintf(['Working on matrix size ' current_size_str '.\n']) % Informs the user what matrix size we're up to. new_vals_times = zeros(8, 1); for j = 1:runs run_str = num2str(j); % Finds the current run being worked on. fprintf(['Now on run number ' run_str '.\n']) % Informs the user which run we are on. % Make a random positive definite symmetric toeplitz matrix. T_row = genPDToeplitz(sizes_vec(i)); % Generates an arbitrary vector b to use in the equation Tx = b when solving for x. b = [1:sizes_vec(i)]; b = b(:); % Now solve the system Tx = b in various ways, and return the timings and accuracy metrics. new_vals_times = new_vals_times + test_solveToeplitz(T_row, b); %Tests the accuracy and speed of our algorithms for this size matrix. end vals_times(1:8, i) = new_vals_times(1:8, 1)/runs; % Adds the results from new_vals_times to val_times. end % Show or save results %These are results for computational time. test_plot('all', sizes_vec, vals_times(2:2:8, 1:end), solve_strs, 'Computation time (s)', save_flag, folder, 'test_solve_time', 0); %These are results for accuracy. test_plot('linear', sizes_vec, vals_times(1:2:7, 1:end), solve_strs, 'Norm difference vs. Built-in mldivide', save_flag, folder, 'test_solve_norm', 0); elseif strcmp(method, 'solveToeplitzPCG') PCG_strs = cell(4, 1); PCG_strs(1, 1) = cellstr('Unconditioned Conjugate Gradient'); PCG_strs(2, 1) = cellstr('MATLAB pcg'); PCG_strs(3, 1) = cellstr('Chan Preconditioner'); PCG_strs(4, 1) = cellstr('Circulant Embedding Preconditioner'); vals_times = zeros(12, length(sizes_vec)); for i = 1:length(sizes_vec) current_size_str = num2str(sizes_vec(i)); % Finds the current matrix size being worked on. fprintf(['Working on matrix size ' current_size_str '.\n']) % Informs the user what matrix size we're up to. new_vals_times = zeros(12, 1); for j = 1:runs run_str = num2str(j); % Finds the current run being worked on. fprintf(['Now on run number ' run_str '.\n']) % Informs the user which run we are on. % Make random positive definite symmetric toeplitz matrix. T_row = genPDToeplitz(sizes_vec(i)); % Generates an arbitrary vector b to use in the equation Tx = b when solving for x. b = [1:sizes_vec(i)]; b = b(:); % Now solve the system Tx = b in various ways, and return the timings and accuracy metrics. new_vals_times = new_vals_times + test_solveToeplitzPCG(T_row, b); %Tests the accuracy and speed of our algorithms for this size matrix. end vals_times(1:12, i) = new_vals_times(1:12, 1)/runs; % Adds the results from new_vals_times to val_times. end % Show or save results % These are results for computational time. test_plot('all', sizes_vec, vals_times(2:3:11, 1:end), PCG_strs, 'Computation time (s)', save_flag, folder, 'test_PCG_time', 0); % These are results for accuracy. test_plot('linear', sizes_vec, vals_times(1:3:10, 1:end), PCG_strs, 'Norm difference vs. Built-in mldivide', save_flag, folder, 'test_PCG_norm', 0); %These are results for the number of iterations. test_plot('linear', sizes_vec, vals_times(3:3:12, 1:end), PCG_strs, 'Number of Iterations', save_flag, folder, 'test_PCG_iterations', 0); else error('No such method found.') end end PK CԂx x 'toeblitz-1.0/test/test_decompToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function takes a Toeplitz matrix T and its dimension i as input, and returns a structured array with rows containing accuracy results and timings for various methods of calculating the inverse, and columns corresponding to i, the sizes of the different matrices tested. For each method, the upper row contains the accuracy results for the inverse, while the middle row contains the accuracy results for the log determinant, and the lower row contains the timings for the inverse. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[new_vals_times] = test_decompToeplitz(T_row, i) new_vals_times = zeros(12, 1); % Initialize the vector of results with zeros. % Call decompToeplitz(T) and let the code figure out the best method automatically. t0 = clock; [TiInvT, ldT] = decompToeplitz(T_row, 0); new_vals_times(3, 1) = etime(clock,t0); % Saves the time taken to compute the inverse and log determinant in the third row containing information for this method. % Call to decompToeplitz(T,-1) and run the built-in Matlab functions, simple inv() and logdet(). t0 = clock; [TiInv, ld] = decompToeplitz(T_row, 0, -1); tInv(i) = etime(clock,t0); new_vals_times(6, 1) = etime(clock,t0); % Saves the time taken to compute the inverse and log determinant in the third row containing information for this method. % Call to decompToeplitz(T,0) and run the MEX implementation of Zohar. t0 = clock; [TiInvT0, ldT0] = decompToeplitz(T_row, 0, 0); new_vals_times(9, 1) = etime(clock,t0); % Saves the time taken to compute the inverse and log determinant in the third row containing information for this method. % Call to decompToeplitz(T,1) and run the native Matlab implementation of Zohar. t0 = clock; [TiInvT1, ldT1] = decompToeplitz(T_row, 0, 1); new_vals_times(12, 1) = etime(clock,t0); % Saves the time taken to compute the inverse and log determinant in the third row containing information for this method. new_vals_times(1, 1) = norm(TiInv(:) - TiInvT(:)); % Frobenius norm (The (:) linearizes the matrix into a vector and allows computation of the norm.) new_vals_times(4, 1) = norm(TiInv(:) - TiInv(:)); % Frobenius norm (The (:) linearizes the matrix into a vector and allows computation of the norm.) new_vals_times(7, 1) = norm(TiInv(:) - TiInvT0(:)); % Frobenius norm (The (:) linearizes the matrix into a vector and allows computation of the norm.) new_vals_times(10, 1) = norm(TiInv(:) - TiInvT1(:)); % Frobenius norm (The (:) linearizes the matrix into a vector and allows computation of the norm.) new_vals_times(2, 1) = norm(ld - ldT); % Since the ld is a scalar, the norm is much simpler to obtain. new_vals_times(5, 1) = norm(ld - ld); % Since the ld is a scalar, the norm is much simpler to obtain. new_vals_times(8, 1) = norm(ld - ldT0); % Since the ld is a scalar, the norm is much simpler to obtain. new_vals_times(11, 1) = norm(ld - ldT1); % Since the ld is a scalar, the norm is much simpler to obtain. endPK L C_  toeblitz-1.0/test/test_plot.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function plots results, given in data_mat, on a log axis against the vector/matrix sizes, given in sizes_vec, on a linear axis. data_labels contains strings which are used to label to axes. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This main function serves primarily to parse the plot_mode input and use it to call test_plotmode appropriately. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [] = test_plot(full_plot_mode, sizes_vec, data_mat, data_labels, yaxis_label, save_flag, folder, file_name, fig_save) if strcmp(lower(full_plot_mode), 'all') test_plotmode('linear', sizes_vec, data_mat, data_labels, yaxis_label, save_flag, folder, file_name, fig_save); test_plotmode('semilogy', sizes_vec, data_mat, data_labels, yaxis_label, save_flag, folder, file_name, fig_save); test_plotmode('loglog', sizes_vec, data_mat, data_labels, yaxis_label, save_flag, folder, file_name, fig_save); else test_plotmode(lower(full_plot_mode), sizes_vec, data_mat, data_labels, yaxis_label, save_flag, folder, file_name, fig_save); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % test_plotmode actually produces a plot from the input passed to it by test_plot. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a_graph] = test_plotmode(plot_mode, sizes_vec, data_mat, data_labels, yaxis_label, save_flag, folder, file_name, fig_save) data_series_num = size(data_mat, 1); % Figures out how many data series are being plotted; in this package, it will always be 3 or 4. a_graph = figure; % Creates a figure. % If there are three data series, produce the appropriate figure based on plot_mode. if data_series_num == 3 if strcmp(lower(plot_mode), 'linear') plot(sizes_vec, data_mat(1, 1:end), 'r', sizes_vec, data_mat(2, 1:end), 'b', sizes_vec, data_mat(3, 1:end), 'm', 'LineWidth',3); elseif strcmp(lower(plot_mode), 'semilogy') semilogy(sizes_vec, data_mat(1, 1:end), 'r', sizes_vec, data_mat(2, 1:end), 'b', sizes_vec, data_mat(3, 1:end), 'm', 'LineWidth',3); elseif strcmp(lower(plot_mode), 'loglog') loglog(sizes_vec, data_mat(1, 1:end), 'r', sizes_vec, data_mat(2, 1:end), 'b', sizes_vec, data_mat(3, 1:end), 'm', 'LineWidth',3); end % If there are four data series, produce the appropriate figure based on plot_mode. elseif data_series_num == 4 if strcmp(lower(plot_mode), 'linear') plot(sizes_vec, data_mat(1, 1:end), 'r', sizes_vec, data_mat(2, 1:end), 'b', sizes_vec, data_mat(3, 1:end), 'm', sizes_vec, data_mat(4, 1:end), 'g', 'LineWidth',3); elseif strcmp(lower(plot_mode), 'semilogy') semilogy(sizes_vec, data_mat(1, 1:end), 'r', sizes_vec, data_mat(2, 1:end), 'b', sizes_vec, data_mat(3, 1:end), 'm', sizes_vec, data_mat(4, 1:end), 'g', 'LineWidth',3); elseif strcmp(lower(plot_mode), 'loglog') loglog(sizes_vec, data_mat(1, 1:end), 'r', sizes_vec, data_mat(2, 1:end), 'b', sizes_vec, data_mat(3, 1:end), 'm', sizes_vec, data_mat(4, 1:end), 'g', 'LineWidth',3); end end % Label the axes appropriately and set the font to a fixed size. xlabel('Matrix Size','FontSize',18); ylabel(yaxis_label,'FontSize',18); set(gca,'fontsize',18); % Label the legend appropriately based on the number of data series. if data_series_num == 3 legend(char(data_labels(1, 1)), char(data_labels(2, 1)), char(data_labels(3, 1))); elseif data_series_num == 4 legend(char(data_labels(1, 1)), char(data_labels(2, 1)), char(data_labels(3, 1)), char(data_labels(4, 1))) end % Either saves or displays the plot, based on the value of save_flag. if save_flag print(a_graph, strcat(folder, file_name), '-dpdf'); if fig_save print(a_graph, strcat(folder, file_name), '-dfig'); end close all else a_graph; end end PK C_ug&toeblitz-1.0/test/test_solveToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function takes an n x n Toeplitz matrix T and a nx1 column vector b as input, and returns a structured array with rows containing accuracy results and timings for various methods of calculating solving the system Tx = b for x, and columns corresponding to i, the sizes of the different matrices tested. For each method, the upper row contains the accuracy results for the solution x, while the lower row contains the timings for the solution. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [new_vals_times] = test_solveToeplitz(T_row, b) new_vals_times = zeros(6, 1); % Initialize the vector of results with zeros. % Call solveToeplitz and specify the default Matlab mldivide algorithm. t = cputime; x = solveToeplitz(T_row, b, 'Mldivide'); new_vals_times(2, 1) = cputime-t; % Times the default algorithm. new_vals_times(1, 1) = norm(x(:) - x(:)); % Compares accuracy to built-in Matlab algorithm. % Call solveToeplitz and specify the Levinson-Durbin algorithm. t = cputime; xLD = solveToeplitz(T_row, b, 'LD'); new_vals_times(4, 1) = cputime-t; % Times my algorithm. new_vals_times(3, 1) = norm(x(:) - xLD(:)); % Compares accuracy to built-in Matlab algorithm. % Call solveToeplitz and specify the Conjugate Gradient method. t = cputime; xCG = solveToeplitz(T_row, b, 'PCG_None'); new_vals_times(6, 1) = cputime-t; % Times my algorithm. new_vals_times(5, 1) = norm(x(:) - xCG(:)); % Compares accuracy to built-in Matlab algorithm. % Call solveToeplitz and specify the Preconditioned Conjugate Gradient method with automatic choice of preconditioner. t = cputime; xPCG = solveToeplitz(T_row, b, 'PCG_Auto'); new_vals_times(8, 1) = cputime-t; % Times my algorithm. new_vals_times(7, 1) = norm(x(:) - xPCG(:)); % Compares accuracy to built-in Matlab algorithm. endPK Cw )toeblitz-1.0/test/test_solveToeplitzPCG.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function takes an n x n Toeplitz matrix T and a nx1 column vector b as input, and returns a structured array with rows containing accuracy results and timings for various preconditioners used for solving the system Tx = b for x by the conjugate gradient method, and columns corresponding to i, the sizes of the different matrices tested. For each method, the upper row contains the accuracy results for the solution x, while the middle row contains the timings for the solution, and the lower row contains the number of iterations required for the solution to converge. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [new_vals_times] = test_solveToeplitzPCG(T_row, b) new_vals_times = zeros(12, 1); % Intialize new_vals_times as a vector of zeros. x = solveToeplitzMldivide(T_row, b); % Get a standard against which to measure the accuracy of our preconditioned conjugate gradient methods. % Call solveToeplitzPCG and specify the unconditioned conjugate gradient method. t = cputime; [xPCG, k] = solveToeplitzPCG(T_row, b, 'None'); new_vals_times(2, 1) = cputime-t; % Times the default algorithm. new_vals_times(1, 1) = norm(x(:) - xPCG(:)); % Compares accuracy to built-in Matlab algorithm. new_vals_times(3, 1) = k; % Stores the number of iterations required to converge. % Call solveToeplitzPCG and specify built-in MATLAB preconditioned conjugate gradient method. t = cputime; [xPCG, k] = solveToeplitzPCG(T_row, b, 'Matlab'); new_vals_times(5, 1) = cputime-t; % Times the default algorithm. new_vals_times(4, 1) = norm(x(:) - xPCG(:)); % Compares accuracy to built-in Matlab algorithm. new_vals_times(6, 1) = k; % Stores the number of iterations required to converge. % Call solveToeplitzPCG and specify the Chan preconditioned conjugate gradient method. t = cputime; [xPCG, k] = solveToeplitzPCG(T_row, b, 'Chan'); new_vals_times(8, 1) = cputime-t; % Times the default algorithm. new_vals_times(7, 1) = norm(x(:) - xPCG(:)); % Compares accuracy to built-in Matlab algorithm. new_vals_times(9, 1) = k; % Stores the number of iterations required to converge. % Call solveToeplitzPCG and specify the Circulant Embedding preconditioned conjugate gradient method. t = cputime; [xPCG, k] = solveToeplitzPCG(T_row, b, 'Circulant_Embedding'); new_vals_times(11, 1) = cputime-t; % Times the default algorithm. new_vals_times(10, 1) = norm(x(:) - xPCG(:)); % Compares accuracy to built-in Matlab algorithm. new_vals_times(12, 1) = k; % Stores the number of iterations required to converge. endPK Ctrhuu&toeblitz-1.0/test/test_traceToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This compares the performance of traceToeplitz.m to the built-in trace function for a matrix of size n. For each method, the first row (among the rows its data occupies) contains the norm of the difference between a method and explicitly computing the product and then taking the trace, and the second contains the computational time used. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [new_vals_times] = test_traceToeplitz(T_row) n = size(T_row, 2); new_vals_times = zeros(8, 1); % Initializes new_vals_times. It is faster to modify a matrix than to concatenate two. A = randn(n, n); % This line generates an arbitrary random matrix, A, to use in computing the trace of the product of a Toeplitz matrix with an arbitrary matrix. t = cputime; tr = traceToeplitz(A, T_row, T_row, -1); new_vals_times(2, 1) = cputime-t; % Times the built-in Matlab algorithm. new_vals_times(1, 1) = norm(tr - tr); % Compares accuracy to built-in Matlab algorithm. t = cputime; trT = traceToeplitz(A, T_row, T_row, 0); new_vals_times(4, 1) = cputime-t; % Times my algorithm with automated choice of implementation. new_vals_times(3, 1) = norm(tr - trT); % Compares accuracy to built-in Matlab algorithm. t = cputime; trC = traceToeplitz(A, T_row, T_row, 1); new_vals_times(6, 1) = cputime-t; % Times my algorithm with the fast C implementation. new_vals_times(5, 1) = norm(tr - trC); % Compares accuracy to built-in Matlab algorithm. t = cputime; trM = traceToeplitz(A, T_row, T_row, 2); new_vals_times(8, 1) = cputime-t; % Times my algorithm with the backup Matlab implementation. new_vals_times(7, 1) = norm(tr - trM); % Compares accuracy to built-in Matlab algorithm. endPKu Etoeblitz-1.0/trace/PK Cѿ**toeblitz-1.0/traceToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This generates the trace of the product of a Toeplitz matrix T, and an % arbitrary square matrix of compatible size, A. A wrapper function tries to use the C implementation, % but falls back on a Matlab implementation if that fails for any reason. % % The calling syntax is % % traceToeplitz(A, T_row, T_col, runMode) % % where % A is the arbitrary matrix, % T_row is the first row of the Toeplitz matrix, % T_col is the (optional) first column of the Toeplitz matrix, written as a row vector, and % runMode is an optional argument, giving the method by which to calculate the trace, with the following accepted values: % % runMode = -1 This calls the default MATLAB matrix multiplication and trace functions. It's very slow and should only be used for testing. % runMode = 0 This is the default method, which first tries to use the C/MEX implementation of our algorithm, but uses the backup MATLAB code if it fails. % runMode = 1 This is for testing only. It forces the code into using the C/MEX implementation of our algorithm with no backup. % runMode = 2 This forces the code into using the MATLAB implementation of our algorithm with no backup. % % traceToeplitz has a single output argument, % % Tr, which gives the desired trace. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This function mainly serves to parse the input. A, the arbitrary matrix, and T_row, the first row of our Toeplitz matrix, are both required. However, T_col, the first column of our Toeplitz matrix, is not required. When it is absent, we simply assume that the matrix is symmetric. In addition, runMode, which specifies which method to use to compute the trace, is optional. It defaults to case 0, which attempts to use fast C code, and resorts to a Matlab backup if the C code fails. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [ Tr ] = traceToeplitz(A, T_row, T_col_or_perhaps_runMode, runMode) if nargin < 2 % In this case, we have too few input arguments, and at least one required argument is missing. error('Not enough input arguments') elseif nargin == 2 % In this case, both T_col and runMode are empty. So we assume the Toeplitz matrix is symmetric and use the default case 0 runMode. T_col = T_row; runMode = 0; elseif nargin == 3 % In this case, we need to determine whether the optional argument given is a runMode or a T_col. if size(T_row) == [1 1] % If we are looking at trivial 1x1 matrices, then it is difficult to distinguish T_col from runMode, and therefore we do not allow omitted arguments in this case. error('Not enough input arguments. For trivial 1x1 matrices, T_row, T_col, and runMode must all be explicitly specified to prevent confusion.') elseif size(T_row) == size(T_col_or_perhaps_runMode) % If T_row is the same size as the given optional argument, we can safely assume that it is the first column of our Toeplitz matrix. T_col = T_col_or_perhaps_runMode; runMode = 0; else % Otherwise, the third argument given must be the runMode. T_col = T_row; runMode = T_col_or_perhaps_runMode; end elseif nargin == 4; T_col = T_col_or_perhaps_runMode; end Tr = traceToeplitzMode(A, T_row, T_col, runMode); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This function calls the actual code which will do computations based on the runMode passed to it by traceToeplitz. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [ Tr ] = traceToeplitzMode(A, T_row, T_col, runMode) switch(runMode) case -1 % Trivial case: this uses built-in Matlab functions to compute the trace of the product. This is intended primarily for testing. T = toeplitz(T_col, T_row); Tr = trace(A*T); case 0 % Attempts to use the faster C code, but defaults back to the backup Matlab code if anything goes wrong. This is the default case. try % Here it attempts to call the MEX function compiled from the C source code. Tr = traceToeplitzFast(A, T_row, T_col); catch % Here it falls back on the native Matlab code when the C code fails. Tr = traceToeplitzBackup(A, T_row, T_col); end case 1 % Forces the use of the C code. If it fails, then it really fails. This mode is intended mostly for testing. Tr = traceToeplitzFast(A, T_row, T_col); case 2 % Forces the use of the Matlab code. This is more reliable across systems since Matlab is an interpreted language, but is slower. This is intended mostly for testing. Tr = traceToeplitzBackup(A, T_row, T_col); end endPK C`y\jj(toeblitz-1.0/trace/traceToeplitzBackup.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % % This generates the trace of the product of a Toeplitz matrix and any % arbitrary square matrix of compatible size. This is a backup function % in case the C/MEX implementation fails for any reason. This function % computes the trace from the contributions from different parts of the % original matrices. In this case both the first row and column vectors % have been specified. % % The calling syntax is % % traceToeplitzFast(A, T_row, T_col) % % where % A is the arbitrary matrix, % T_row is the first row of the Toeplitz matrix, and % T_col is the first column of the Toeplitz matrix, written as a row vector. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [ Tr ] = traceToeplitzBackup(A, T_row, T_col) Tr = 0; % Initializes the trace at zero. for i = 2:size(T_col, 2), Tr = Tr + T_col(1, i)*sum(diag(A, i-1)); % Adds the contributions from each diagonal of the bottom half of the toeplitz matrix. Tr = Tr + T_row(1, i)*sum(diag(A, -i+1)); % Adds the contributions from each diagonal of the upper triangle of the toeplitz matrix. end Tr = Tr + T_row(1, 1)*sum(diag(A)); % Adds the contributions from the main diagonal of the toeplitz matrix. endPK Cdv &toeblitz-1.0/trace/traceToeplitzFast.c/*================================================================= * Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices * Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) *=================================================================*/ /* William Zhang, 2013 * This simple C function simply computes the trace of the product of a Toeplitz matrix T and an arbitrary matrix A. * Mathematically, it is identical to traceToeplitzBackup.m. The calling syntax is * * traceToeplitzFast(A, T_row, T_col) * * where * A is the arbitrary matrix, * T_row is the first row of the Toeplitz matrix, and * T_col is the first column of the Toeplitz matrix, written as a row vector. */ #include #include /* Input Arguments */ #define A_IN prhs[0] #define T_row_IN prhs[1] #define T_col_IN prhs[2] /* Output Arguments */ #define Tr_OUT plhs[0] void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { double *A, Tr, *T_row, *T_col, temp_diag_sum, *Tr_Middle; int n, i, j; /*Get the size of the matrices we're dealing with.*/ n = mxGetN(A_IN); /* Create a scalar for the return argument */ Tr_OUT = mxCreateDoubleScalar(0); /*Assign pointers to variables we will use to pass along inputs and outputs.*/ A = mxGetPr(A_IN); T_row = mxGetPr(T_row_IN); T_col = mxGetPr(T_col_IN); Tr_Middle = mxGetPr(Tr_OUT); /*Add the contribution from the top half of the Toeplitz matrix (and therefore the bottom half of the arbitrary matrix A), not counting the principal diagonal.*/ for (i = 1; i < n; i++) { temp_diag_sum = 0; for (j = 0; j < i; j++) { temp_diag_sum += A[(n-1)*n - (i-1)*n + j*(n+1)]; } Tr += temp_diag_sum*T_row[n-i]; } /*Add the contribution from the bottom half of the Toeplitz matrix (and therefore the top half of the arbitrary matrix A), not counting the principal diagonal.*/ for (i = 1; i < n; i++) { temp_diag_sum = 0; for (j = 0; j < i; j++) { temp_diag_sum += A[n-1 - (i-1) + j*(n+1)]; } Tr += temp_diag_sum*T_col[n-i]; } /*Add the contribution from the principal diagonal of the Toeplitz matrix defined by T_row and coL_vec, and the principal diagonal of arbitrary matrix A.*/ for (i = 0; i < 1; i++) { temp_diag_sum = 0; for (j = 0; j < n; j++) { temp_diag_sum += A[j*(n+1)]; } Tr += T_row[0]*temp_diag_sum; *Tr_Middle = Tr; } return; } PK CȒ""(toeblitz-1.0/trace/traceToeplitzFast.mexELF44 (# HH$$QtdRtdttGNURXRt0ο 'ұSa     `  |CEqX4 + "gKRm Z a ?z l x __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesmexFunctionmxGetNmxCreateDoubleScalarmxGetPrliboctinterp.soliboctave.solibcruft.soliblapack.so.3gflibblas.so.3gflibfftw3.so.3libfftw3f.so.3libreadline.so.6libncurses.so.5libdl.so.2libhdf5.so.6libz.so.1libgfortran.so.3libstdc++.so.6libm.so.6libgcc_s.so.1libc.so.6_edata__bss_start_endGLIBC_2.1.3Psi r      US[|tX[ hhhhh UVS$u]t $()9s ((9rƃ$[^]US.ktt $Ѓ[]Ë$ÐUWVS\u!]} $$E]$EԋF$E̋F$Eċ$}EEEE}̃EЋEMЃU׋UEډU܋Uԍ‰E䍶U19|E܃E9uuًUԾ}U}؉UU19|m9uuًU1Mut&9uŰE \[^_]ËE}EِUVSmêt&Ћu[^]US[ppY[o)8BP l xo`l ~ (D$ oooo GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3ztmexFunctionp!: int5upk:P(P,(\y AmuT Tr6\ muL muD 6[ amuH n( i( j( V = b h = 6% $ > $ > : ; $ > .? : ; ' @: ; I : ; I 4: ; I 4: ; I 4: ; I  I &I /home/cunni/toeplitz/wemmick/toeplitz/trace/usr/include/octave-3.2.3/octavetraceToeplitzFast.cmex.h7AU?עp@mmf>>,jy.y.mJb.>,kx.x.b-<>,kx | zCB Ilong long intunsigned charprhs/home/cunni/toeplitz/wemmick/toeplitz/trace/traceToeplitzFast.cTr_Middlelong long unsigned intmxArrayGNU C 4.4.3nlhsT_colT_rowplhsshort unsigned intlong doublenrhsshort intmexFunctiontemp_diag_sumttzuW2u 24W4gu gzW V2u24V4gugzVAdV2V4AVP2P4YP.symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc$2H.o``<8 @ll~HoUo d $$ m DD( vll0q`|xxxH    0%= ]"t 4"0- 8"3 p `l$D l   x    (5 K Z h t@   x  ' , ; B V"rz ~l crtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.7021dtor_idx.7023frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxtraceToeplitzFast.c__i686.get_pc_thunk.bx_GLOBAL_OFFSET_TABLE__DYNAMIC__DTOR_END____dso_handle_fini__bss_start_end__gmon_start___edata_Jv_RegisterClasses__cxa_finalize@@GLIBC_2.1.3mexFunctionmxGetPr_initmxGetNmxCreateDoubleScalarPK C@ ==+toeblitz-1.0/trace/traceToeplitzFast.mexa64ELF>@@@ @8@ll pp p    $$PtdQtdGNUh.%ca:UCOo@  5 [?  F"3 __gmon_start____cxa_finalize_Jv_RegisterClassesmexFunctionmxGetNmxCreateDoubleScalarmxGetPrlibmx.solibmex.solibmat.solibm.so.6libstdc++.so.6libpthread.so.0libc.so.6traceToeplitzFast.mexa64MEXGLIBC_2.2.5DB4Qui         H_H5 % @% h% h% h% hHHU HtHÐU= HATSubH=8 t H= H L% H] L)HHH9s DHH= AH2 H9r [A\fH= UHtH HtH= @ÐUHAWAVAUATSH8HuIH9IAfWHUHI?HIIIIHEH8HEAEAAT$UAEžA|$AA3HcX˃9uD)HAYXEEȃEA9~LME~DDfWDEA|$AAM0HcX˃9uIcAYXEEȃAA9~LME~DDLUEfWE~%At$fWHcX˃A9AYXEHEH8[A\A]A^A_ÐUHSHH HtH HHHuH[ÐH_H;0zRx ,AC T  clv  o  `x` oooooo &6GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3).symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_d.gnu.version_r.rela.dyn.rela.plt.init.text.fini.eh_frame_hdr.eh_frame.ctors.dtors.jcr.data.rel.ro.dynamic.got.got.plt.bss.comment$.o(8 @HoUo8do s`}xx` P@@  Lp p      8 0 XH @X1  x   @  p         @p * 8 E `[ j x x h         # , 2:A P dh}" call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6349dtor_idx.6351frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxtraceToeplitzFast.c_fini_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END____bss_start_end_edata_DYNAMIC_initmxGetPrmxGetN__gmon_start___Jv_RegisterClassesMEXmxCreateDoubleScalar__cxa_finalize@@GLIBC_2.2.5mexFunctionPK C=NJ!!.toeblitz-1.0/trace/traceToeplitzFast.mexmaci64__TEXT__text__TEXT  __stubs__TEXT((__stub_helper__TEXT<$<__unwind_info__TEXT`P`__eh_frame__TEXTP__DATA__dyld__DATA__la_symbol_ptr__DATAH__LINKEDIT    h P  ce4X@d$  0@rpath/libmx.dylib 0@rpath/libmex.dylib 0@rpath/libmat.dylib 84/usr/lib/libstdc++.6.dylib 8/usr/lib/libgcc_s.1.dylib 8{/usr/lib/libSystem.B.dylib& ) ASLWAS%O%NUHAWAVAUATSHHIH;OIf=IH;>IH{2IH{&HI>AEGDAAw?fAщHcAXAuMcCYDXD)At fA~zAWA;ffAȉHcAXAuHcYXt0ff1AOf.HcAXAu EfAYEXH[A\A]A^A_]%%%LXLLL@ 44)4  XzRx 4h  __<HT    . ;QY dyld_stub_binding_helper__dyld_func_lookup_mexFunction_mxCreateDoubleScalar_mxGetN_mxGetPrPK C+toeblitz-1.0/trace/traceToeplitzFast.mexw64MZ@ !L!This program cannot be run in DOS mode. $3Gw)Lw)Lw)LLu)LLu)L~Lr)Lw(Ln)LL})LLv)LLv)LRichw)LPEd:| R"  xpq@0%W$"PP@` .textb   `.rdata @@.data`0@.pdata@@@.rsrcP@@.reloc `@BH\$UVWATAUAVAWHPI )t$@IHQHfWf(;HH*HOLH$HOLHD$8HLHD$($AHcE3LHD$0EL;NH$LLIBIIH+LHjHHILHHILOd"H$HHL$ fDf(I|vIHZJL)I+HMHxHpIAHHHHLfffffAXLXDXXDHHuH$H$M;}%HBMBIHH II+XIHuAY$HL$ IIMHIAXL;(L$Lt$(L|$0ESHL;H<MJt7M+f(II|UHRLJLI+IL+ILIBM4HHHAXMBXXXD9IHuE3I;})HBLGHI+HILIH+XIHuYIHXL;XH|THBHJLJHLHIII+HMLAX0MX4(X0BXtIHuL;}$HBLII+ILX1IHuHD$8H$Y0XA7(t$@HPA_A^A]A\_^]%^ %P %B @SH  HH HHHuC#H#H H 3H [HHXHhHxL` AUAVAWH 3ML8 #DeH%0HXH;t 3HuAt_H  LHH  MLHHI;rZH9}t H9EtHMh H HEH rL H ]H< L;uL;tLLI s H,H-=EH=3eH%0HXH;t 3Hut 7>H` H I uH' H  au HH[H9=lt!H ctMĺII H\$@Hl$HH|$PLd$XH A_A^A]HHXHpHxATH0ILXu9u 3ۉXtu7Hz HtЋ؉D$ LƋI0؉D$ LƋI؉D$ u5u1L3IL3IL Mt L3IAӅtu7LƋI#ˋىL$ tH HtLƋIЋ؉D$ 3ۉ\$ H\$@Ht$HH|$PH0A\H\$Ht$WH IHukLNjHH\$0Ht$8H _H i@SH HH |VHD$8Hu H~H N(HD$8H 4HD$@HHLD$@HT$8HHL$8HHL$@HSHH [H(GHH(H\$WH H{H=tHHtHH;rH\$0H _H\$WH HSH=LHHtHH;rH\$0H _HMZf9t3HcH PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD PKu Etoeblitz-1.0/util/PK C^% % #toeblitz-1.0/util/convertToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function automatically converts a Toeplitz matrix into a row vector containing all necessary information, or expands that row vector into a full Toeplitz matrix, depending on the input. For non-symmetric matrices, this function will output both the first row and first column. % % The calling syntax is % % T_row = convertToeplitz(T), where T is a symmetric Toeplitz matrix and T_row is its first row. % [T_row, T_col] = convertToeplitz(T), where T is an asymmetric Toeplitz matrix, T_row is its first row, and T_col is its first column. % T = convertToeplitz(T_row), where T_row is the first row of a symmetric Toeplitz matrix, and T is the full matrix. % T = convertToeplitz(T_row, T_col), where T_row is the first row of an asymmetric Toeplitz matrix T, T_col is the first column of that same matrix, and T is the full matrix. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [alt_form, alt_form2] = convertToeplitz(one_form, one_form2) if nargin == 1 % Fill in a value for one_form2 when it is not specified. one_form2 = 0; % Create a placeholder value for one_form2 when it is not specified in the input. This value is not used. end if size(one_form, 1) == size(one_form, 2) % This is the case in which the first input was a Toeplitz matrix. We only check that it is a square matrix, for the sake of efficiency. We leave it to the caller to make sure that the input is Toeplitz. alt_form = one_form(1, 1:end); if not(isequal(transpose(one_form(1:end, 1)), one_form(1, 1:end))) % This is the case in which the input was a non-symmetric Toeplitz matrix. alt_form2 = one_form(1:end, 1); % In this case we also output the first column of the original matrix as a second row in our output. end elseif size(one_form, 1) == 1 % This is the case in which the first input was a row vector. if nargin == 2 % If there were two input arguments, the Toeplitz matrix is not necessary symmetric. alt_form = toeplitz(one_form2, one_form); % We use the convention opposite that of the built-in toeplitz() method. So we reverse the order of our row and column vector to generate the correct Toeplitz matrix. elseif nargin == 1 % If there is only one input, generate a symmetric Toeplitz matrix. alt_form = toeplitz(one_form); % Generate a symmetric Toeplitz matrix. else error('Too many input arguments!') end else error('Invalid input!') end endPK C|1u !toeblitz-1.0/util/genPDToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function generates the first row of a random symmetric positive definite Toeplitz matrix of size n. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This is the main function. It generates a random positive definite Toeplitz matrix of size n from the algorithm given on page 4 of "On random correlation matrices: II. The Toeplitz case" (1989) by R. B. Holmes at the Lincoln Laboratories at the Massachusetts Institute of Technology. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [T_row] = genPDToeplitz(n) % Generate a random vector from the uniform distribution on the unit n-sphere. rand_vec = randn(n, 1); % Generate a random n-dimensional vector. This essentially generates the direction of our vector. rand_vec = rand_vec/norm(rand_vec, 2); % Normalize our direction to the desired magnitude, 1. % Now generate a positive definite Toeplitz matrix as a deterministic function of our psuedorandom vector. for j = 1:n % Loop over the entries in the first row of the Toeplitz matrix. T_row(1, j) = phi_k(abs(1-j), n, rand_vec); % Produce the first row of the Toeplitz matrix. end rand_mat_mag = abs(randn(1, 1)); % Produce a random positive number by which to scale this matrix (just for some additional variation). T_row = rand_mat_mag*T_row; % Scale the first row by this random positive number. end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This is a subfunction which generates an element of a positive definite Toeplitz matrix, given an integer k = abs(i-j), the absolute value of the difference between the indices of the entry in the matrix, an integer n, the desired size of the matrix, and rand_vec, a n x 1 random vector in the unit n-sphere. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[new_x] = phi_k(k, n, rand_vec) rand_vec(n+1:n+k+1, 1) = 0; % Extend our random vector with k more zeros. new_x = transpose(rand_vec(1:n, 1))*rand_vec(1+k:n+k, 1); % Compute the required sum in a vectorized way (from page 4 of "On random correlation matrices: II. The Toeplitz case" (1989) by R. B. Holmes). endPK C==%toeblitz-1.0/util/multiplyCirculant.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This uses a fast Fourier transform to compute the product y = Cx, where C is a circulant matrix and x is a column vector of appropriate size. This is a simplified version of the Toeplitz matrix multiplication on page 202 of "Matrix Computations", 3rd edition by Gene H. Golub. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [y] = multiplyCirculant(C, x) n = size(C, 2); %Gets the dimension of the circulant matrix. embed_circulant = C(1:end, 1); %Extracts information from first column of circulant matrix. y = ifft(fft(embed_circulant).*fft(x)); %Computes the result of the circulant matrix multiplication in a fast way. endPK Cc$(toeblitz-1.0/util/multiplyinvCirculant.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function solves the matrix equation C*x = b for x, where C is a circulant matrix. This is equivalent to left-multiplying b by the inverse of C, C^(-1). It takes c, the first column of c, as input. C is never explicitly required or stored. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x] = multiplyinvCirculant(c, b) x = ifft(fft(b)./fft(c)); % Performs the computation. The theoretical justification of this is a consequence of the fast Toeplitz multiplication method on page 202 of "Matrix Computations", 3rd edition by Gene H. Golub, and the properties of the Fourier transform. endPK C ;;$toeblitz-1.0/util/multiplyToeplitz.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This uses a fast Fourier transform to compute the product y = Tx, where T is a toeplitz matrix and x is a column vector of appropriate size. T is embedded in a circulant matrix and manipulated according to page 202 of "Matrix Computations", 3rd edition by Gene H. Golub. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [y] = multiplyToeplitz(T_row, x) n = size(T_row, 2); % Gets the dimension of the Toeplitz matrix. embed_circulant = T_row(1, end:-1:2); % Extracts information from first row of Toeplitz matrix. embed_circulant = vertcat(transpose(T_row(1, 1:end)), embed_circulant(:)); % Combines information from first column of Toeplitz matrix with the information from the first row extracted in the previous step. Note that these two steps can be condensed into a single faster step if the toeplitz matrix is known to be symmetric. y = ifft(fft(embed_circulant).*fft(vertcat(x, zeros(n-1, 1)))); % Computes the result of the circulant matrix multiplication in a fast way. y = y(1:n, 1); % Discards the extra trailing elements in the circulant matrix result, giving us the desired product of a Toeplitz matrix and a vector. endPK . C(oo)toeblitz-1.0/util/recreateToeblitzPlots.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang, 2013 % This function makes it convenient to reproduce all the plots included in the accompanying journal article at once. It's essentially a modified version of testToeplitz with no input arguments. You can just call it with no input variables and let it run. runMode is an optional variable, which if set to -1, will run the code for smaller matrices, making it easy to verify the code in a couple minutes, and allows one to run the code many times to find errors. If runMode is set to 0, it doesn't do anything, and the resulting behavior is equivalent to omitting it to begin with. Setting runMode to 1, 2, or 3 will run only a particular portion of the code needed to create one particular graph. A second optional input argument, fig_save, specifies whether we save the produced plots as MATLAB .fig files in addition to .pdf files. In order to specify the second input argument, runMode must be explicitly specified. fig_save defaults to 0 (only saves .pdf files) if not specified. % % In total, this function creates four plots when called in runMode 0 (default) or -1: one accuracy plot on a log-linear axis; one plot of iterations on a linear axis, and two loglog plots for complexity, one on a true loglog axis, and the other a linear plot of the logs of the two variables, used for regressions. When called in runMode 1, only the one accuracy plot is produced; when called in runMode 2, only the one iterations plot is produced; and when called in runMode 3, only the two complexity plots are produced. % % Calling syntax: % % recreateToeblitzPlots This simply runs the full recreateToeblitzPlots procedure. It should complete running overnight on a modern laptop computer. % recreateToeblitzPlots() This is equivalent to simply calling recreateToeblitzPlots. % recreateToeblitzPlots(0) This is equivalent to simply calling recreateToeblitzPlots. % recreateToeblitzPlots(-1) This runs a shorter version of the code to produce graphs for quick verification. % recreateToeblitzPlots(1) This produces only the accuracy check (full version) plot. % recreateToeblitzPlots(2) This produces only the iteration check (full version) for the various preconditioners. % recreateToeblitzPlots(3) This produces only the complexity testing (full version) plot for the various methods. % recreateToeblitzPlots(0, 0) This is equivalent to calling recreateToeblitzPlots(0) or simply recreateToeblitzPlots. % recreateToeblitzPlots(0, 1) This saves the produced figures as MATLAB .fig files in addition to .pdf files for editing and presentation. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [] = recreateToeblitzPlots(runMode, fig_save) % Set runMode to 0 by default. if nargin < 1 runMode = 0; end % Set fig_save to 0 by default. if nargin < 2 fig_save = 0; end % The following code sets default values for runs and save_flag if they are not specified. save_flag = 1; % Set save_flag to true. runs = 10; % Set the number of runs to 10. method = 'Placeholder'; % Set a placeholder for method at first. % For testing only: if runMode is -1 (quick verification), then only do a single run for each case, and do not save the output; instead, display it immediately. if runMode == -1 runs = 3; save_flag = 0; end % The following code finds a folder to save the result plots in, if save_flag is set to 1. folder = '0'; if save_flag for i = 1:999 % Searches from 001 to 999 for an unused folder name of the form 'test_XXX', where XXX is the three-digit number. if folder == '0' % Runs the following code if we have not yet found a suitable folder. test_folder = sprintf('./results/test_%03d/', i); % Finds the subdirectory in which the files will be placed. if not(exist(test_folder)) % Checks to see if there is already a folder with that name in the ./results/ directory. If not, it creates the folder and proceeds. folder = test_folder; % Changes the value of folder, stopping future checks for folder names. mkdir(folder); % Actually creates the directory. fprintf(['Printing to directory ' folder '.\n']) % Informs the user where the output will be saved. end end end end if or(or(runMode == 0, runMode == -1), runMode == 1) method = 'accuracyToeplitz'; % Sets the method to traceToeplitz. sizes_vec = [2:100:4502]; % Sets up a sizes_vec for small matrices. This will let us do a quick accuracy check. end % For testing only: if runMode == -1 sizes_vec = [100:20:200]; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The following code tests the accuracy of our methods. Routines for testing other functions work similarly. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if strcmp(method, 'accuracyToeplitz') % This checks if 'accuracyToeplitz' is the method specified for testing. accuracy_strs = cell(4, 1); % This creates a cell array of the names of our different methods for use in labeling plots and legends. accuracy_strs(1, 1) = cellstr('solveToeplitz'); accuracy_strs(2, 1) = cellstr('logdetToeplitz'); accuracy_strs(3, 1) = cellstr('invToeplitz'); accuracy_strs(4, 1) = cellstr('traceToeplitz'); vals_times = zeros(4, length(sizes_vec)); % This initializes the matrix in which all our test results will be (temporarily) stored. for i = 1:length(sizes_vec) % This loops over each the sizes of matrices we want to test. current_size_str = num2str(sizes_vec(i)); % Finds the current matrix size being worked on. new_vals_times = zeros(4, 1); % This initializes new_vals_times (and resets it for each size of matrix tested). for j = 1:runs % For each size matrix, this loops 'runs' times to obtain an average result. n = sizes_vec(i); run_str = num2str(j); % Finds the current run being worked on. fprintf(['Now on run number ' run_str ' of matrix size ' current_size_str ' for method ' method '.\n']) % Informs the user where we are in the program. T_row = genPDToeplitz(n); % This produces the first row of a (more or less) random positive definite Toeplitz matrix. b = transpose([1:n]); A = randn(n, n); new_vals_times = new_vals_times + test_accuracyToeplitz(T_row, A, b); % This calculates the trace of the product with an arbitrary matrix in various ways, and adds the timings and accuracy metrics to a cumulative total in new_vals_times (see test_traceToeplitz documentation for more detail). end vals_times(1:4, i) = new_vals_times(1:4, 1)/runs; % This saves the results in new_vals_times to the appropriate column in vals_times, dividing by the number of runs to obtain an average. end % Show or save results: These are results for accuracy. test_plot('semilogy', sizes_vec, vals_times(1:1:4, 1:end), accuracy_strs, 'Norm difference vs. built-in MATLAB methods', save_flag, folder, 'test_accuracy', fig_save); fprintf(['Printing to directory ' folder '.\n']) % Informs the user where the output will be saved. end if or(or(runMode == 0, runMode == -1), runMode == 2) method = 'iterToeplitz'; sizes_vec = [500:100:4500]; end % For testing only: if runMode == -1 sizes_vec = [50:50:250]; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The following code tests the number of iterations required for various preconditioned conjugate gradient methods. Routines for testing other functions work similarly. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if strcmp(method, 'iterToeplitz') % This checks if 'iterToeplitz' is the method specified for testing. iter_strs = cell(3, 1); % This creates a cell array of the names of our different methods for use in labeling plots and legends. iter_strs(1, 1) = cellstr('Unconditioned'); iter_strs(2, 1) = cellstr('Chan'); iter_strs(3, 1) = cellstr('Circulant Embedding'); vals_times = zeros(3, length(sizes_vec)); % This initializes the matrix in which all our test results will be (temporarily) stored. for i = 1:length(sizes_vec) % This loops over each the sizes of matrices we want to test. current_size_str = num2str(sizes_vec(i)); % Finds the current matrix size being worked on. new_vals_times = zeros(3, 1); % This initializes new_vals_times (and resets it for each size of matrix tested). for j = 1:runs % For each size matrix, this loops 'runs' times to obtain an average result. n = sizes_vec(i); run_str = num2str(j); % Finds the current run being worked on. fprintf(['Now on run number ' run_str ' of matrix size ' current_size_str ' for method ' method '.\n']) % Informs the user where we are in the program. T_row = genPDToeplitz(n); % This produces the first row of a (more or less) random positive definite Toeplitz matrix. b = transpose([1:n]); A = randn(n, n); new_vals_times = new_vals_times + test_iterToeplitz(T_row, b); % This calculates the trace of the product with an arbitrary matrix in various ways, and adds the timings and accuracy metrics to a cumulative total in new_vals_times (see test_traceToeplitz documentation for more detail). end vals_times(1:3, i) = new_vals_times(1:3, 1)/runs; % This saves the results in new_vals_times to the appropriate column in vals_times, dividing by the number of runs to obtain an average. end % Show or save results: These are results for accuracy. test_plot('linear', sizes_vec, vals_times(1:1:3, 1:end), iter_strs, 'Number of PCG Iterations', save_flag, folder, 'test_iter', fig_save); fprintf(['Printing to directory ' folder '.\n']) % Informs the user where the output will be saved. end if or(or(runMode == 0, runMode == -1), runMode == 3) method = 'complexityToeplitz'; % Sets the method to speedToeplitz. sizes_vec_small = floor(10.^[2.7:0.1:3.9]); % Sets up a sizes_vec_small for matrices large enough so that the computational time is measureable, but not so large that they break MATLAB. This will let us do a quick accuracy check. sizes_vec_large = floor(10.^[4:0.1:5]); % Sets up a sizes_vec_large for matrices large enough so that the computational time is measureable, but not so large that they break MATLAB. end % For testing only: if runMode == -1 sizes_vec_small = floor(10.^[2.7:0.2:3.5]); sizes_vec_large = floor(10.^[3.9:0.2:4.3]); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The following code tests the speed of our methods. Routines for testing other functions work similarly. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if strcmp(method, 'complexityToeplitz') % This checks if 'complexityToeplitz' is the method specified for testing. complexity_strs = cell(8, 1); % This creates a cell array of the names of our different methods for use in labeling plots and legends. complexity_strs(1, 1) = cellstr('solveToeplitz'); complexity_strs(2, 1) = cellstr('logdetToeplitz'); complexity_strs(3, 1) = cellstr('invToeplitz'); complexity_strs(4, 1) = cellstr('traceToeplitz'); complexity_strs(5, 1) = cellstr('MATLAB mldivide'); complexity_strs(6, 1) = cellstr('MATLAB logdet'); complexity_strs(7, 1) = cellstr('MATLAB inv'); complexity_strs(8, 1) = cellstr('MATLAB trace'); vals_times_small = zeros(8, length(sizes_vec_small)); % This initializes the matrix in which our test results for smaller matrices will be (temporarily) stored. vals_times_large = zeros(2, length(sizes_vec_large)); % This initializes the matrix in which our test results for larger matrices will be (temporarily) stored. for i = 1:length(sizes_vec_small) % This loops over each the sizes of matrices we want to test. n = sizes_vec_small(i); current_size_str = num2str(n); % Finds the current matrix size being worked on. new_vals_times = zeros(8, 1); % This initializes new_vals_times (and resets it for each size of matrix tested). for j = 1:runs % For each size matrix, this loops 'runs' times to obtain an average result. run_str = num2str(j); % Finds the current run being worked on. fprintf(['Now on run number ' run_str ' of matrix size ' current_size_str ' for method ' method '.\n']) % Informs the user where we are in the program. T_row = genPDToeplitz(n); % This produces the first row of a (more or less) random positive definite Toeplitz matrix. b = transpose([1:n]); A = randn(n, n); new_vals_times = new_vals_times + test_complexityToeplitz_small(T_row, A, b); % This calculates the trace of the product with an arbitrary matrix in various ways, and adds the timings and accuracy metrics to a cumulative total in new_vals_times (see test_traceToeplitz documentation for more detail). end vals_times_small(1:8, i) = new_vals_times(1:8, 1)/runs; % This saves the results in new_vals_times to the appropriate column in vals_times, dividing by the number of runs to obtain an average. end for i = 1:length(sizes_vec_large) % This loops over each the sizes of matrices we want to test. n = sizes_vec_large(i); current_size_str = num2str(n); % Finds the current matrix size being worked on. new_vals_times = zeros(2, 1); % This initializes new_vals_times (and resets it for each size of matrix tested). for j = 1:runs % For each size matrix, this loops 'runs' times to obtain an average result. run_str = num2str(j); % Finds the current run being worked on. fprintf(['Now on run number ' run_str ' of matrix size ' current_size_str ' for method ' method '.\n']) % Informs the user where we are in the program. T_row = genPDToeplitz(n); % This produces the first row of a (more or less) random positive definite Toeplitz matrix. b = transpose([1:n]); new_vals_times = new_vals_times + test_complexityToeplitz_large(T_row, b); % This calculates the trace of the product with an arbitrary matrix in various ways, and adds the timings and accuracy metrics to a cumulative total in new_vals_times (see test_traceToeplitz documentation for more detail). end vals_times_large(1:2, i) = new_vals_times(1:2, 1)/runs; % This saves the results in new_vals_times to the appropriate column in vals_times, dividing by the number of runs to obtain an average. end % Redistribute the data so that each actual data series is together in one row. vals_times_large = horzcat(vals_times_small(1:2, 1:end), vals_times_large); vals_times_small = vals_times_small(3:8, 1:end); % Show or save results: These are results for computational complexity. grand_loglogplot(sizes_vec_small, sizes_vec_large, vals_times_small, vals_times_large, complexity_strs, 'Computational Time', save_flag, folder, 'test_complexity', runMode, fig_save); grand_regressionplot(sizes_vec_small, sizes_vec_large, vals_times_small, vals_times_large, complexity_strs, 'Computational Time', save_flag, folder, 'test_complexityregression', runMode, fig_save); fprintf(['Printing to directory ' folder '.\n']) % Informs the user where the output will be saved. end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % test_accuracyToeplitz tests the accuracy of our Toeblitz method against built-in MATLAB functions and outputs the results in a column vector, new_vals_times. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[new_vals_times] = test_accuracyToeplitz(T_row, A, b) new_vals_times = zeros(4, 1); % Intialize new_vals_times as a vector of zeros. % Check the accuracy of our preconditioned conjugate gradient method. x = solveToeplitzMldivide(T_row, b); % Get a standard against which to measure the accuracy of our Chan preconditioned conjugate gradient method. xPCG = solveToeplitzPCG(T_row, b, 'Chan'); % Get the result using our method. new_vals_times(1, 1) = norm(x(:) - xPCG(:), 2); % Compares accuracy to built-in Matlab algorithm. % Check the accuracy of the inverse in our decompToeplitz method. [TiInvT, ldT] = decompToeplitz(T_row, 0, -1); % Get a standard against which to measure the accuracy of our decompToeplitz method. [TiInvT0, ldT0] = decompToeplitz(T_row, 0, 0); % Compute the inverse and log determinant using our decompToeplitz method. new_vals_times(3, 1) = norm(TiInvT(:) - TiInvT0(:), 2); % Compares accuracy to built-in Matlab algorithm. TiInvT = 0; % Clears some bulky variables for performance. clearvars is not used due to Octave incompatbility. TiInvT0 = 0; % Clears some bulky variables for performance. clearvars is not used due to Octave incompatbility. % Check the accuracy of the log determinant in our decompToeplitz method. new_vals_times(2, 1) = norm(ldT(:) - ldT0(:), 2); % Compares accuracy to built-in Matlab algorithm. % Check the accuracy of our traceToeplitz method. tr = traceToeplitz(A, T_row, T_row, -1); % Get a standard against which to measure the accuracy of our traceToeplitz method. trC = traceToeplitz(A, T_row, T_row, 1); % Compute the trace using our method. new_vals_times(4, 1) = norm(tr - trC, 2); % Compares accuracy to built-in Matlab algorithm. end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % test_iterToeplitz tests the number of iterations required for the preconditioned conjugate gradient method to converge using various preconditioners, and outputs the results in a column vector, new_vals_times. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [new_vals_times] = test_iterToeplitz(T_row, b) new_vals_times = zeros(3, 1); % Intialize new_vals_times as a vector of zeros. % Call solveToeplitzPCG and specify the unconditioned conjugate gradient method. [xPCG, k] = solveToeplitzPCG(T_row, b, 'None'); new_vals_times(1, 1) = k; % Stores the number of iterations required to converge. % Call solveToeplitzPCG and specify the Chan preconditioned conjugate gradient method. [xPCG, k] = solveToeplitzPCG(T_row, b, 'Chan'); new_vals_times(2, 1) = k; % Stores the number of iterations required to converge. % Call solveToeplitzPCG and specify the Circulant Embedding preconditioned conjugate gradient method. t = cputime; [xPCG, k] = solveToeplitzPCG(T_row, b, 'Circulant_Embedding'); new_vals_times(3, 1) = k; % Stores the number of iterations required to converge. end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % test_complexityToeplitz_small tests the complexity of built-in MATLAB and Toeblitz methods limited by O(n^2) storage, and outputs the results in a column vector, new_vals_times. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[new_vals_times] = test_complexityToeplitz_small(T_row, A, b); new_vals_times = zeros(8, 1); % Intialize new_vals_times as a vector of zeros. T = toeplitz(T_row); % Create the full matrix representation for built-in MATLAB methods. % Check the speed of our preconditioned conjugate gradient method. t = cputime; solveToeplitz(T_row, b); % Get the result using our method. new_vals_times(1, 1) = cputime - t; % Saves the time to our data matrix. % Check the speed of our logdetToeplitz method. t = cputime; logdetToeplitz(T_row); % Get the result using our method. new_vals_times(2, 1) = cputime - t; % Saves the time to our data matrix. % Check the speed of our invToeplitz method. t = cputime; invToeplitz(T_row); % Get the result using our method. new_vals_times(3, 1) = cputime - t; % Saves the time to our data matrix. % Check the speed of our traceToeplitz method. t = cputime; traceToeplitz(A, T_row, T_row, 1); % Compute the trace using our method. new_vals_times(4, 1) = cputime - t; % Saves the time to our data matrix. % Check the speed of the built-in matrix equation solver. t = cputime; mldivide(T, b); % Get the result using the built-in MATLAB method. new_vals_times(5, 1) = cputime - t; % Saves the time to our data matrix. % Check the speed of the built-in log determinant method. t = cputime; logdet(T); % Get the result using the built-in MATLAB method. new_vals_times(6, 1) = cputime - t; % Saves the time to our data matrix. % Check the speed of the built-in matrix inversion method. t = cputime; inv(T); % Get the result using the built-in MATLAB method. new_vals_times(7, 1) = cputime - t; % Saves the time to our data matrix. % Check the speed of the built-in matrix multiply and trace method. t = cputime; trace(A*T); % Get the result using the built-in MATLAB method. % sum(sum(A.*transpose(T))); % Get the result using the built-in MATLAB method. This line is actually a vast improvement over simply taking trace(A*T). new_vals_times(8, 1) = cputime - t; % Saves the time to our data matrix. end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % test_complexityToeplitz_large tests the complexity of Toeblitz methods that use O(n) storage, and outputs the results in a column vector, new_vals_times. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function[new_vals_times] = test_complexityToeplitz_large(T_row, b); new_vals_times = zeros(2, 1); % Intialize new_vals_times as a vector of zeros. % Check the speed of our preconditioned conjugate gradient method. t = cputime; solveToeplitz(T_row, b); % Get the result using our method. new_vals_times(1, 1) = cputime - t; % Saves the time to our data matrix. % Check the speed of our logdetToeplitz method. t = cputime; logdetToeplitz(T_row); % Compute just the log determinant using our logdetToeplitz method. new_vals_times(2, 1) = cputime - t; % Saves the time to our data matrix. end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % grand_loglogplot plots the computational time used for calculations vs. matrix size for several methods on a log-log axis, allowing us to compare the complexities of the various methods. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a_graph] = grand_loglogplot(sizes_vec_small, sizes_vec_large, data_mat_small, data_mat_large, data_labels, yaxis_label, save_flag, folder, file_name, runMode, fig_save) sizes_vec_large = horzcat(sizes_vec_small, sizes_vec_large); % Adds sizes_vec_small to the beginning of sizes_vec_large so that the full matrix size series in present. a_graph = figure; % Create a figure. loglog(sizes_vec_large, data_mat_large(1, 1:end), 'r', sizes_vec_large, data_mat_large(2, 1:end), 'b', sizes_vec_small, data_mat_small(1, 1:end), 'm', sizes_vec_small, data_mat_small(2, 1:end), 'g', sizes_vec_small, data_mat_small(3, 1:end), 'r--', sizes_vec_small, data_mat_small(4, 1:end), 'b--', sizes_vec_small, data_mat_small(5, 1:end), 'm--', sizes_vec_small, data_mat_small(6, 1:end), 'g--', 'LineWidth',3); % Plot our data. xlabel('Matrix Size', 'FontSize', 18); % Label the x-axis. ylabel(yaxis_label,'FontSize', 18); % Label the y-axis. set(gca,'fontsize', 18); % Set the general font size. legend(char(data_labels(1, 1)), char(data_labels(2, 1)), char(data_labels(3, 1)), char(data_labels(4, 1)), char(data_labels(5, 1)), char(data_labels(6, 1)), char(data_labels(7, 1)), char(data_labels(8, 1))) % Label the legend using the provided strings. % Save our plot if save_flag is on. Otherwise, display it. if save_flag print(a_graph, strcat(folder, file_name), '-dpdf'); if fig_save print(a_graph, strcat(folder, file_name), '-dfig'); end close all else a_graph; end %{ % View basic semilogy and linear plots of our data when in runMode == -1. This helps us see what's actually being plotted, since loglog has trouble with values at or near 0. Use for debugging. if runMode == -1 figure; semilogy(sizes_vec_large, data_mat_large(1, 1:end), 'r', sizes_vec_large, data_mat_large(2, 1:end), 'b', sizes_vec_small, data_mat_small(1, 1:end), 'm', sizes_vec_small, data_mat_small(2, 1:end), 'g', sizes_vec_small, data_mat_small(3, 1:end), 'r--', sizes_vec_small, data_mat_small(4, 1:end), 'b--', sizes_vec_small, data_mat_small(5, 1:end), 'm--', sizes_vec_small, data_mat_small(6, 1:end), 'g--', 'LineWidth',3); figure; plot(sizes_vec_large, data_mat_large(1, 1:end), 'r', sizes_vec_large, data_mat_large(2, 1:end), 'b', sizes_vec_small, data_mat_small(1, 1:end), 'm', sizes_vec_small, data_mat_small(2, 1:end), 'g', sizes_vec_small, data_mat_small(3, 1:end), 'r--', sizes_vec_small, data_mat_small(4, 1:end), 'b--', sizes_vec_small, data_mat_small(5, 1:end), 'm--', sizes_vec_small, data_mat_small(6, 1:end), 'g--', 'LineWidth',3); end %} end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % grand_regressionplot plots the log of the computational time used for calculations vs. the log of the matrix size for several methods on a linear axis, effectively producing the same figure as grand_loglogplot. However, this format allows us to use MATLAB's simple regression tools to determine the best fit slopes for each data series obtained. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a_graph] = grand_regressionplot(sizes_vec_small, sizes_vec_large, data_mat_small, data_mat_large, data_labels, yaxis_label, save_flag, folder, file_name, runMode, fig_save) sizes_vec_large = horzcat(sizes_vec_small, sizes_vec_large); % Adds sizes_vec_small to the beginning of sizes_vec_large so that the full matrix size series in present. % Get the log of all the data, so that a normal plot will look the same as a loglog plot. sizes_vec_large = log(sizes_vec_large); sizes_vec_small = log(sizes_vec_small); data_mat_large = log(data_mat_large); data_mat_small = log(data_mat_small); a_graph = figure; % Create a figure. plot(sizes_vec_large, data_mat_large(1, 1:end), 'r', sizes_vec_large, data_mat_large(2, 1:end), 'b', sizes_vec_small, data_mat_small(1, 1:end), 'm', sizes_vec_small, data_mat_small(2, 1:end), 'g', sizes_vec_small, data_mat_small(3, 1:end), 'r--', sizes_vec_small, data_mat_small(4, 1:end), 'b--', sizes_vec_small, data_mat_small(5, 1:end), 'm--', sizes_vec_small, data_mat_small(6, 1:end), 'g--', 'LineWidth',3); % Plot our data. xlabel('Matrix Size', 'FontSize', 18); % Label the x-axis. ylabel(yaxis_label,'FontSize', 18); % Label the y-axis. set(gca,'fontsize', 18); % Set the general font size. legend(char(data_labels(1, 1)), char(data_labels(2, 1)), char(data_labels(3, 1)), char(data_labels(4, 1)), char(data_labels(5, 1)), char(data_labels(6, 1)), char(data_labels(7, 1)), char(data_labels(8, 1))) % Label the legend using the provided strings. % Save our plot if save_flag is on. Otherwise, display it. if save_flag print(a_graph, strcat(folder, file_name), '-dpdf'); if fig_save print(a_graph, strcat(folder, file_name), '-dfig'); end close all else a_graph; end %{ % View basic semilogy and linear plots of our data when in runMode. This helps us see what's actually being plotted, since loglog has trouble with values at or near 0. if runMode == -1 figure; semilogy(sizes_vec_large, data_mat_large(1, 1:end), 'r--', sizes_vec_large, data_mat_large(2, 1:end), 'g--', sizes_vec_small, data_mat_small(1, 1:end), 'b--', sizes_vec_small, data_mat_small(2, 1:end), 'y--', sizes_vec_small, data_mat_small(3, 1:end), 'r', sizes_vec_small, data_mat_small(4, 1:end), 'g', sizes_vec_small, data_mat_small(5, 1:end), 'b', sizes_vec_small, data_mat_small(6, 1:end), 'y', 'LineWidth',3); figure; plot(sizes_vec_large, data_mat_large(1, 1:end), 'r--', sizes_vec_large, data_mat_large(2, 1:end), 'g--', sizes_vec_small, data_mat_small(1, 1:end), 'b--', sizes_vec_small, data_mat_small(2, 1:end), 'y--', sizes_vec_small, data_mat_small(3, 1:end), 'r', sizes_vec_small, data_mat_small(4, 1:end), 'g', sizes_vec_small, data_mat_small(5, 1:end), 'b', sizes_vec_small, data_mat_small(6, 1:end), 'y', 'LineWidth',3); end %} end PK C:& $toeblitz-1.0/util/startup_checkMEX.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Toeblitz: A Fast Toolkit for Manipulating Toeplitz Matrices % Copyright (C) 2013 William B. Zhang and John P. Cunningham (see full notice in README) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % William Zhang and John Cunningham, 2013 % The following code checks for the relevant MEX files (such as .mexa64 % or .mexglx, depending on the machine architecture), and it creates the % mex file if it can not find the right one. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [] = startup_checkMEX(file_directory, file_name) toeplitz_directory = sprintf('%s', pwd); % Finds the Toeplitz directory in a stable way. toeplitz_directory = strrep(toeplitz_directory, '\', '/'); % Replaces Windows backslashes with forward slashes. file_directory = [toeplitz_directory '/' file_directory]; % Creates the full file directory. if not(exist(sprintf([file_directory '/' file_name '.' mexext]), 'file')) % Check if the relevant files exist. try % If not, try to create them. if isOctave eval(sprintf(['mkoctfile --mex --output ' file_directory '/' file_name '.mex ' file_directory '/' file_name '.c'])) else eval(sprintf(['mex -outdir ' file_directory ' ' file_directory '/' file_name '.c'])); % This line actually compiles the C code and creates the MEX file. end fprintf(['NOTE: the relevant ' file_name ' mex files were not found. They have been created.\n']); % Success message. catch % If the files cannot be created, display the following error message. fprintf(['NOTE: the relevant ' file_name ' mex files were not found, and your machine failed to create them.\n']); fprintf(' This usually means that you do not have the proper C/MEX compiler setup.\n'); fprintf(' The code will still run identically, albeit slower (perhaps considerably).\n'); fprintf(' Please read the README file section on the use of C/MEX.\n'); end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The function isOctave detects whether the user is using Octave, returning true if this is the case, and false if it is not (meaning the user is using MATLAB, most likely). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [OctaveMode] = isOctave() OctaveMode = exist('OCTAVE_VERSION') ~= 0; end PKu Etoeblitz-1.0/written/PK Eӥ<<!toeblitz-1.0/written/toeblitz.pdf%PDF-1.5 % 3 0 obj << /Length 3749 /Filter /FlateDecode >> stream x[۶BFD "MqƗ'')ϗX ;ON_N$X`},3_^>k-LՂ%:N8[F6ߢ˦+'*nbRI=YVȨk5՛WMK_돈YTjvy޷{~6˦v 96aNDM\VU`n&/,m^_&) DH͡뫸<>rWF4yT,ڔk+XY,꾴 Di..aOv4^(PNœiOuhJ7eDY q;?ARX~z$t"1f[D(RjuKBOpk2ź2?~b"V-boU;8myN -v :j7tȝdI$&q3gEO=MR3B*R8]E ̞|g}j]tteWe Tyh󪺥k=vz ?`iTGUVaf[;(ZǕȺj:~o.*ǿ#:3J'! IH܏LH/u|=Е%|w+v0nv;b(>+~mA :Z #?t]EFW sGpc%fIԗ-\}'4 dAh p )5fPհ22wEu;J8MT`xlސ ̠ܕp ҃+k|M[</l֝<J,L&HcEf#T $9A22)ƌb$Ԯ5-ʶ(AI{) [JaRdO!_Lck{;o~nD͞ lޖ;]F7E_'5SfXV8`vQȈE[X͒P7oΊ#:>x?4L ֑""z}'_~bְ=|' }T`8nf n񖣃w  ~O\Wm꺸js:ild-PObWz^x^!f",,(qzKrG"xĝP1e<ٌH3if]VTXTF ~GuJ#cHO_#h4s*rJtsTtuh7m1tlҁ.}34slwG.KUhl/~Vu64U J_'%1[xGkQaJZyB.{Qƀ@rvί&uY[tv萊v7 /Ӂ]4)*0D =]Ş.R%cn6Q;5= nkh/ f y_TEZ~Z) pWk<= %1 D#ǔ9^{$$`H}F98Kutqqaґ׸sΙQo]bX 5#k(l\SABfPL5ZPaJw*)ǚ0ki\߅hLY6١!+/Bj˼^AcL #ASx渟wTD5/eB@Z;=.FF&uR B,Xgu`cpl=OrK]v"͠3foc[@@kFu_P%18ӻ=32^2zBfSHGC^ {u>JJҕTgKF- 3KxF =T^.xrvԼϠk?Bc#Lc`G&JCKE:!j8EGƦBiJ(0Ҧp\ء :ŘsL:=}ԅ XuDLpi²Q~\c,>Gɂ-x*c`b{b =3]X݈чZZ'BL_)LE˄6e^ņ_= YLHd:g6iK;23ԁz%6DtFV'AQZ+d%yޗ^cT?;Ry83 y !23e(PVڀgG!XE+C+ Mda LJYBҌ/N E" +҅=K+;I%bXr<`Ruo p3P:Vݽ8<b|Ā84"IbD 鳸'„XLWUzq{iX?uNĜ{Wר]e#>jT@4c+˩YL8?]#|MfQ5EHrc)=]?>>&vRW\A&:4%QP[>-CPlWIFs]$~-8LOlrBB}Nd=^'\*FO7+5E_= /#~rv|;}񩥫ݴ8~kφ\ ['ؾpéb}?e8횟;kTsjt64}6h a6 2Z"B endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 21 0 R >> endobj 1 0 obj << /Font << /F18 4 0 R /F17 5 0 R /F19 6 0 R /F21 7 0 R /F22 8 0 R /F8 9 0 R /F14 10 0 R /F11 11 0 R /F7 12 0 R /F41 13 0 R /F13 14 0 R /F56 15 0 R /F45 16 0 R /F48 17 0 R /F61 18 0 R /F42 19 0 R /F50 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 24 0 obj << /Length 3697 /Filter /FlateDecode >> stream xksܶ~}+5$ziM$:jI;Xǘ ɏ.|x' `؅jV;cW&4HVWBPGzxu[}|O˫ut;j<2+iqgc|ga#5 :B$8c F1 p(4!g1(&Ik9NlQHTLOPKyHL!T(!e  =*]9%*(ҶnYy.t\֍m O*'#ZcRE3Rݗ'I!6:Avo: 5lk"+SGYE@xЎ匈16mD(dp8)ױdNC(0Ԍ/OQ0 ]NY=_#C/98` $"jZ˳8Lg+0a*Q&bg}V;H@p@14g k5[u%Ϙ~ dA)gt52f+0h E@%;[g/$H[Ey~1h=d W)eI"a+I("N Z <`_Q{g1.ˬͪ2 Y>+l: 4LgVr[XR` <'}MYЎHr0zUx@G2$`/DN4:a6i;I1!GM0#:x{Yh:3(lQկ-MW:mEW/nd=dA_8U2͵$Iİ\!ZBp3f4_Qy8Nmm/a ęIL@-HAJFTh4hiHr*=zZ:,e,G<_@OήQ+iJX<&S̈#(G.Q59F2jP 6x3;"xN2xJ%Nm c!ZIvrkS b}e/ J 0]Ą2Hw+cKADq3U Z=q6]]W) \OsrfTb*7X(?OJCP"V:-(=7%$ қJ<"0#_ ~=*i$!:D&YB=/i 8N*f/^h<A-tos9`a9r1gDkHYtݷV_x%5M\/T]2FսQ)2Aw[_ImAw`l'Y '*oL T"L1EyT. -JwϹ4ۧ{k4V_}ZB΃a[!|h{c]ĉZuܮ64~wlOa};bbI n~gg;gLahn}LmGƠUڭmvW>U{[ h:KXpAT$ѩ ,4ϩ/}a8r3EKw& k"g}5bH,`Jr'a:9sTW{܃lى]KcMm41e l4r:Qa ؒhFtӸb!~>ێ; C33^#R_wꪘm h XѵUJǧ( e&q}Oh_ʀ/ XҀX:-,C5mR|Me.Â5`R *'Tr߬@SZ}{tj5⎾!~ǚ*%\73@:q_zQRim j Cmme C=&X]F&iSk@Mh(s?l& T&RԾ̀s"WTBiURZv-l/U΢YOJ&*~5]]u  #H*F*z yq*I z {6;pC]Jh)wGuN 6%^1ax{}mC@T!@Z0s #`P4uRQ]C_ldMқ%xӈ+E + &gICm|&1jp)n:DT1Pgݧ{B}m!>A*p]77! QkB%,TgW¼;SZK-8 +ݒ.܂ xz(h80Z;ׅ[Q}=U= {{9Ag₆!i3/У=vhWg%l\šl-)Bن@0YY]횂mIZJhLnGa jt2QoUm$-_Tixhh'x|w-kF]W Bqhq`b25%S.>Ky`@mdתPJ>fX}c?2ReK]Hk*} ݓ~+CU/nE?Yȉ4R={+>Wnz^o5Ӄ;bKe .F܈D#YȌGXߜ]}>l &sonwNn- =FB ˦*M&Y$ARpTi&^x76\"|\F Sr. Fۃ!>g'$!#]/{@!qEkw5=7n4Y ih1e+y endstream endobj 23 0 obj << /Type /Page /Contents 24 0 R /Resources 22 0 R /MediaBox [0 0 612 792] /Parent 21 0 R >> endobj 22 0 obj << /Font << /F21 7 0 R /F11 11 0 R /F48 17 0 R /F42 19 0 R /F61 18 0 R /F8 9 0 R /F19 6 0 R /F14 10 0 R /F45 16 0 R /F46 25 0 R /F41 13 0 R /F17 5 0 R /F68 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 30 0 obj << /Length 3100 /Filter /FlateDecode >> stream xڽZYo~h%2抗DNvlv`"wmaRS"u>aEdt[?_|s}{W+2oWpVʕbҫCrڛ~xYiqs%3YF;j_E!r:!_|9O*465DUΊ,)05m\8M@BN*\Ha3(3,L[H᎘{1FKNvS@r8@ڥg@k@u:[wW'`+{.woDEOcq9N)640='U3%7N09U0y#VرL'=e^kM #¹{WعJ1ݡX!^fҲh>MycVBA.baDv-=jZAV + B>\ r[ځGعХ4zұN{xHQڝ_D"I/+]6$p4G_Ud6Ge.RIG7 ~ͼ/#Ng·\+*?,j1]maB.LՃ[JR`W;yCfPYB +`x&;BPowbֻhڬN.Z qY`8Fbj2c΁" 75o읍P4 /=L-enLeIkkљ<:D !H'35Z[4}$<:HJ8uv@vnз_SG@-?fY^]E:$査>f7f]-~T& 纇T pV[.fi!;ݾjʠtߘ2l G*)+cBU8-hN,&Vݨ~+\DEڦnj(P4`v_BƋ4FUy5jwnN pfzJp=iO _8t{!ZqK#RI%+5@|[᮰{YắEhH4- J/]AQTߡcjكKu-;Ӡ5L_84y76 endstream endobj 29 0 obj << /Type /Page /Contents 30 0 R /Resources 28 0 R /MediaBox [0 0 612 792] /Parent 21 0 R >> endobj 28 0 obj << /Font << /F21 7 0 R /F8 9 0 R /F11 11 0 R /F42 19 0 R /F14 10 0 R /F17 5 0 R /F41 13 0 R /F68 26 0 R /F69 31 0 R >> /ProcSet [ /PDF /Text ] >> endobj 36 0 obj << /Length 908 /Filter /FlateDecode >> stream xڕVK6 ϯj~iEP`Ms ?&חG&,)DR8C>/gIMp)I%IJ]1L}JCu1mG#&(4a pT%)k(VEPk ,i +0 PL0Jj (."B^X˓W!R.˥T#.჋0;t>g/=6ΚѸ/}-!n]b8g9n!W|xbe⾤K]KRʨmW۴49%*BbR颣b&[QMdhq)]#%9NOq_dUQª-{EE8(ND*yeb(-d' l$JF~ukٮ# ;Fl;mz@96mh2N!qY̆@9|^rcx*|:ȰۆP,#e^Ws`6aVPRi %^t]>ne0A/ ac]zYl9hbx yI_]Wn 7$:Ƙ9b~K-FlC$n7:#)z\SـTE%ӳyo)*hvQI."؛ 0m iAkR>Ι RB_ h \Qz3c>tN^\{xX(̑:8yDe8n伓qgࠐ (y5v!vY{d:@1O_uTEX3̓79+a8'-IGc endstream endobj 35 0 obj << /Type /Page /Contents 36 0 R /Resources 34 0 R /MediaBox [0 0 612 792] /Parent 21 0 R >> endobj 27 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (C:/Google\040Drive/Washington\040University\040MSTP/Year\0402\040-\040MS2/Cunningham\040Rotation/Toeblitz/written/Figures/complexity_plots.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 37 0 R /BBox [0 0 657 470] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 38 0 R >>/Font << /R8 39 0 R>> >> /Length 2620 /Filter /FlateDecode >> stream x͚KE}"F[6_`f"ailaX>#3+Z3hcTYYU]_Ջo|w6l5Y^jq!筎_F/NHJnzBZ| (P_l[T%ԇ~emk@h\bWjze;þoy}X-޴Hy<,*n}&X UE.l@EP5Pd(52ZJɁ?0 [[ Z8TBjWá#՟EĴf񻒉9,_ݔ4MNM\h㷾 qaVeL{77wlhW]g}E wTa!O|ڥ/GG̀0Vi6HEa(k8EP5Pd(tA@j2P1N` &y"@$ Tʢ?R@A7D9ٔȹac(?7MpIErӫ< 8Z8Trjh(T Y*u-:>,cv(Jy QvA3*/F$ ZUD2i,FBܼ 9(Hg0:mgf̙ 'Op^?+K|-f]ڸ5g{ehzŻwt4m  5oJޘ Je~͛7g<;+t6}޲y= \T0ZàccabrLH DSSo"0C.jkDH !AƐD}3K.{۵iRiM>4ۭi X$ L*&kUL~Z"!^.B0yI^$O=ɼ'V͛pSu5~4;s>'|NwvI.8W$i?& ZdE܌ `b B`0ICi' !RaTL"1Y!0?E`<"D LĄ)a O`Oa S4Cl0Y$xKxV})O`PueLcfॏNʇ|L%Z獱L[jzm5X l+†k\;;k/0мd-jﱳж&NpI:uɡ#`D0`VglN֚7A{XqتKO[`ȀEFc<$cSO06 Ghyd c={%Ǣ5# c1*5GOks㱐S|Ϋhe; 0)88OeN9EH ѣ ʝZέ( ը4UQcS8D2yYvaQ /.W9"Ö!ҩqʻTb8 7SCO-:tG=ш&OV # Woc!&gcP<8/WS-gE;ez} VU[Ksw{7k_~ZŐ'2FZ<]n,㏏wۇ_wa˛o U_QTɆʕgڝ}]ЎmvGΖ%2^J_N%=?C43O?'6}ƾÚr= {=ΡL?[" F*}pbD=(cDxXV!ꢃV I l<%C hb`qkHL4*( endstream endobj 37 0 obj << /Producer (GPL Ghostscript 9.07) /CreationDate (D:20130731145432-05'00') /ModDate (D:20130731145432-05'00') /Creator (MATLAB, The MathWorks, Inc. Version 8.0.0.783 \(R2012b\). Operating System: Microsoft Windows 7.) /Title (C:\\Users\\Willie\\AppData\\Local\\Temp\\tp6b2dbbc6_53c4_4b39_87fb_3fb5b24e890b.eps) >> endobj 38 0 obj << /Type /ExtGState /OPM 1 >> endobj 39 0 obj << /BaseFont /SFLDAD+Helvetica /FontDescriptor 40 0 R /Type /Font /FirstChar 32 /LastChar 122 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 584 0 0 556 556 556 556 556 556 0 0 0 0 0 0 0 0 0 0 0 667 667 722 0 0 0 0 0 0 0 0 556 833 0 0 0 0 0 667 611 0 0 0 0 0 0 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 500 500 500] /Encoding 41 0 R /Subtype /Type1 >> endobj 40 0 obj << /Type /FontDescriptor /FontName /SFLDAD+Helvetica /FontBBox [ 0 -218 762 741] /Flags 4 /Ascent 741 /CapHeight 741 /Descent -218 /ItalicAngle 0 /StemV 114 /MissingWidth 278 /CharSet (/A/B/C/L/M/S/T/a/b/c/d/e/f/five/four/g/h/i/l/m/minus/n/o/one/p/r/s/space/t/three/two/u/v/x/y/z/zero) /FontFile3 42 0 R >> endobj 41 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus] >> endobj 42 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2793 >> stream xUiTg 6Rh7AAAwPYCw0,H5 1 CvCNtמjL&ǿsN{w{I؈ I3Jn8$?ň*BX;O%|N=KM d*BeSLqP>#IrO sm\3bbS,,[r[_,ݢb(yB"J&N-52 \lc*OzA@'3wGdTtLl\@\a`"{y1XK 3 ?"$`b=Bf2$>5%5Y1ަ@FgZp:vn0ze[ro; x|`kLNׇE<`ohZ)Z3aMfv!qjRb=!ⲔqԳloXݽpNVT,?d+U[ ИO[ jPcr;bG a9"7q'>O,k-냱0NV&'f3TTfBqs^ǟk=K3+Μ=r'yLvy{ss,жM n0٠KC{cT>sG{ :NvYqG.JӤ;?-W,v?*`8Bʌgވ祥[uU?ɴ󫊘f؆W\}JUc'+ldTX#H0^poOivt8c8d a\o7/-l wCm`7-꧝W!RUd? :hz,Ɗ " 6KH~X5 MμSV?F6)h#G d).b 67e!& $LZ;pnx=XdH@rS騣g;|Pߧ׳.=YqsPs<gt@ Dhsys{sGݽ?C$Զ";.@.N_tУ ̫Z=Nf}OZP~%DviPIiT ( (sb_ :fճ"5zp׋e4+P*lZd8jڷ?1adcQu!fY*i$ͼ2ϭYlNpHW_ .7 s0K%B0^2}NHjs'E0_sJaVą $kOL*r֡(Ll}\Ƚ&cgі&! ^PxGCmVƉmak zAt? ';΂=e05 A,y0O4 |?>{^׆H/ÑJts{xںRrİv(lfj Jya)63xOf iOIUy"xZpys 022N] Zy>O LSv0>H bِ?P|^eo-7J& ~qiOyGMrЕR.,+UE3b_&zldl7qMa/Z=dvvPsǩ\-Z^Suѧk=:c q7g LmZ\-cUo~2Hwa RWˏ.]-uCsH"cY.~C^3Ӛ[8;iiw:͖[iܭ[pI$7~5jH~N ~D})7gv ԗ& (+H(~9y`0,DTlUF1\V#AH' *NR2 (w՟>>f: o endstream endobj 32 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (C:/Google\040Drive/Washington\040University\040MSTP/Year\0402\040-\040MS2/Cunningham\040Rotation/Toeblitz/written/Figures/accuracy_plots.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 43 0 R /BBox [0 0 492 477] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 44 0 R >>/Font << /R8 45 0 R>> >> /Length 1939 /Filter /FlateDecode >> stream xMo6< H@ωN6صI:6~@pHR~PzJz~zۻWƠ6&v~WK\NYS\I@?Yn>ֶg컛 烖rll wI+0XU[Eˣ~Kkeq_.ٚ8*j}55Ek:ONκj$c1ѫHu`@14zl5 TwxN.jawdy$g+,}bPZ1>V|P3$#kl\|SYRf{9Y&P7OMnY'b֗Ó3'!Jmm/a. :Y$S2}~2pj*O+ aYƓOJb(dBDȽqBFVnY>>OJyd,^ƣȸ:T|O:>.q$>etycVaY>>=۝J+^yC!/^Kk]Ovң_]^uʝ |[G-ۧȫCHBcL69Ƀ60Dg @ M1ʭqq v:=llA6db#pіT; 2ق!9b_@%?DQ.XB#waG/gC,5<t4HP!]{dIe[truԊC1܍1PuR <bJ`FˡsDYg@|(8p-/Iue>,$XŎNު UZR;g /Ij/rxT{K0$ H@RA+&TyhI@mŅɀ#&X e. &nAE 1\PWsҜ g48E1ЀdVE'hi4~0 Wd *Xng,hJ(epA(E^  ԑ*``.P Wb.݌ ɺw-̹p^T Ҍ '0c;!7"0 =T) QO7 2--2$*Sp>%ZCnh4/# N(4%qVPK"Q@I (R>PVud90 ` ,}ySECA0* `()HO0zFzt|gdYiC@Kֱ09.Q89.0%7#9`aJQ4ykp0^7@.$ &0(ʊ7v=Axƃ~ƃա`-<)xv~ڜ@M3Y6I#Y C'(vq0S,J FwLqL=I ?#TLٳ>kK-ڦ_Yx}Ko?o3yv:r&\5ao7{un/6JݟmՋ_>S˻TMMZ+ټm?_>^_ook>drg+Tvh>0pJ4ß Νb\;*CSv@=ؖu8=mz#(1y Q,ۻݧ צLCOuX%>[cm(Sw5-ɏ8v7o/79/퉲 3_7/ Gg5r^zlL&SqIcO %b e`T+brk< endstream endobj 43 0 obj << /Producer (GPL Ghostscript 9.07) /CreationDate (D:20130731005046-05'00') /ModDate (D:20130731005046-05'00') /Creator (MATLAB, The MathWorks, Inc. Version 8.0.0.783 \(R2012b\). Operating System: Microsoft Windows 7.) /Title (C:\\Users\\Willie\\AppData\\Local\\Temp\\tp50a96819_ba90_4e1b_9db3_1c7b7bc44c78.eps) >> endobj 44 0 obj << /Type /ExtGState /OPM 1 >> endobj 45 0 obj << /BaseFont /ODQGAZ+Helvetica /FontDescriptor 46 0 R /Type /Font /FirstChar 32 /LastChar 122 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 584 278 0 556 556 556 556 556 556 556 0 556 0 0 0 0 0 0 0 0 667 667 0 0 0 611 0 0 0 0 0 556 833 722 0 0 0 0 667 611 0 0 0 0 0 0 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 500 500 500] /Encoding 47 0 R /Subtype /Type1 >> endobj 46 0 obj << /Type /FontDescriptor /FontName /ODQGAZ+Helvetica /FontBBox [ 0 -218 762 741] /Flags 4 /Ascent 741 /CapHeight 741 /Descent -218 /ItalicAngle 0 /StemV 114 /MissingWidth 278 /CharSet (/A/B/F/L/M/N/S/T/a/b/c/d/e/eight/f/five/four/g/h/i/l/m/minus/n/o/one/p/period/r/s/six/space/t/three/two/u/v/x/y/z/zero) /FontFile3 48 0 R >> endobj 47 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus] >> endobj 48 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3021 >> stream xV{TW1df >PPTyyYD.I@"XVu늢U Bi+> R %Ѐ&R[MƳ{8wə3w&})qMU|U$MtũW%k͛R!M [ʩ_wCLأ3#̚3eEfi^^^ ~SlL*g|:3KڨِL(CS,mv>loHJ:CλyXM/gb }7j؉>~BCy 2%7ϫxlK\pUlGÍ0'@17PӅG5(7djw!_ 8S9T)(݌ܼͶu#.t8- Ӱ3MYsXAESvv]E_`^'Xant`0Ɯā@qXPDFJ(}>Bo/xªn W7)d`^ۥsO;w,9xorXm_mhCZoD <@ Kmx S~ %`)yfdc8\5vD e_nI[!ReB_x2&wT|:-dUKO+ H{ |R]ǽzm> r $}x<(zMNO5Nv[nA\{eVb88 e=N|(Vx&wJxW.{[_/jϱ|;Y) ead{7YOTTB#*5_!F20_)t ϭ%hd2O3ЩO;Qe:" x*쾾ӂڴƐZ_\ CJ}=JbSh}\zepj?꼼L!3w#_Gă&I"H-`2kvXmbI- %ʺh1:`ξp[2ѧ YZ(=FA,QAULzsdդ.4^׾m:vEfq$ }+OKd #̜:vL$1O!EZ8,a='ZL$B`blP׊/l|,ex٣ 2>-ŠuU >ܾȗwgٻNEȘ&hG{Oﳅ!'!qb@%~@7^ V׉* KY~䫤wj>b[7D/5W۹,m_SRe' 8{947;Ykqx0˫qa0Լ;a ݢFݹU?EȢ;H^I:Ga5Μ^WeTn,L!7__.89| {ty>I٤OK?5klMdHħzsX%xD g 3W#V@sRQd$l Go Y{ q䦀4 #FwB]"go7NZXQZ'ŸGmh8J7; ^31xkVau Jz߅yğOXw7t|uV(/;)A֥*SYIqrukRUx7i]ZU6>@3ag̘!87$s´q .;qxG?f}% 1kyjSxM m_C/!ayO b>~<ʯ9#&  }&sjVb< j2&^CqQ9_Z&z˜Iί9lն=+8ڇG*+/q#FqmHu h}6YT9 *V9a̹RHS b\_}Ɉ#$*gd)CMo*՟6}3d3@nbJ/:|JwrM&,ݬI٢yO;t/7־MNz>&,|Mc q}0{,R~<n 8l;e`ԃt%qLQ=ygɞoO{=JP>/K r~spX蹖2(.q:/w+_qv碰a_ nIN,R8G*}pv"E o[\ endstream endobj 33 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (C:/Google\040Drive/Washington\040University\040MSTP/Year\0402\040-\040MS2/Cunningham\040Rotation/Toeblitz/written/Figures/iteration_plots.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 49 0 R /BBox [0 0 481 477] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 50 0 R >>/Font << /R8 51 0 R>> >> /Length 1246 /Filter /FlateDecode >> stream xWMo71- gC:RѳkɎIFd-;\jw[h4cGpqfI {ފS1[A=JI_ƊV&K\:#U Ea yc{]>NN?9Gw$39%8bVNjfʮN<␖}F2 "'Ԝjכ|Ӎmlҵ@L&NL6n[Q@1tGsnyERh\;\B^@] d.@wxǹnLΩuƐdr5 endstream endobj 49 0 obj << /Producer (GPL Ghostscript 9.07) /CreationDate (D:20130731005128-05'00') /ModDate (D:20130731005128-05'00') /Creator (MATLAB, The MathWorks, Inc. Version 8.0.0.783 \(R2012b\). Operating System: Microsoft Windows 7.) /Title (C:\\Users\\Willie\\AppData\\Local\\Temp\\tp238b831c_365e_4cd1_8b2b_7d02f08b9a31.eps) >> endobj 50 0 obj << /Type /ExtGState /OPM 1 >> endobj 51 0 obj << /BaseFont /JYYLCY+Helvetica /FontDescriptor 52 0 R /Type /Font /FirstChar 32 /LastChar 122 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 556 556 556 556 556 556 556 0 556 0 0 0 0 0 0 0 0 0 0 722 0 667 0 778 0 278 0 0 0 833 722 0 667 0 0 667 0 722 0 0 0 0 0 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 0 0 222 833 556 556 0 0 333 500 278 556 500 0 500 0 500] /Encoding /WinAnsiEncoding /Subtype /Type1 >> endobj 52 0 obj << /Type /FontDescriptor /FontName /JYYLCY+Helvetica /FontBBox [ 0 -218 762 741] /Flags 34 /Ascent 741 /CapHeight 741 /Descent -218 /ItalicAngle 0 /StemV 104 /MissingWidth 278 /XHeight 539 /CharSet (/C/E/G/I/M/N/P/S/U/a/b/c/d/e/eight/f/five/four/g/h/i/l/m/n/o/one/period/r/s/six/space/t/three/two/u/v/x/z/zero) /FontFile3 53 0 R >> endobj 53 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2957 >> stream xUkPWf :3> (@(yA0 @@|D]^hWb.jw@a$d&ch;H6[v{w,-(B3Ei敇H,s{㩈OF2k YKe8N{xilak%MωH9.f[`nކ̬B ooo ?(2 3sN(C)\Z@SPddUmEM /)\V~eZE3c㔪3Y[fc<^P/[c(7chixЊertA/`A3M-`ր3>$ ^;pcHqGӅVG `\<9(IWݟTحo27D3=g~^,- ,YzLd皜Y_d|P$.R7iTOPh87R4;|B%a*=Z @\{GN.ҀYmK^fW4MeQVѦjӆVoYLB![Ko-eoş*û+s B}c~ar{ 8xrc{+s%}}q Gbt 8Y:Ș,QS_k:>:A╪/И2H!fIJwPł.vxd<loui\32#Q'cK} v;fAs_ u͓K+Jv S/KĬѐ*z ,zeF[)&)E` R3M;-F1.3d-/c _/yr&12d;0 nh,7-`F1U0vr gol~LϪᬿы2t1ىR'szFeK_ B[K`?|w>\Hxix 0{Z)%`.L Ehyyu}ٮkVaܵS>DpNl$hxicAn-ވ8r6SRczZ-OA D=607^p=`.>< qNؙ@R04cl?cɐ4iHt[1$I{ͨMjYƒ|6%}č7,/|;Qg/[zTR\Si?7,Levqk~!aLroz9{1u?!lPX^\.yk4z Ϫg/.=Rқ CuO7\߮3|u%j:9ޭX6dzFH J%( K9|2KY>v?X<'x`N3[{%Fy27?3??-]qٌP~e0/Vxi5ԢD)<qG0J^<Rb_&`UV/ JcrV%&G yñLՒoj E@+ѿi.ӓ~xb1Cz w zcbVu\TN%m{tis5Ϯv҅7Rϥ[z,@ӣ3 ̞+]T#Ǿ,"S;Y{ú+vtًrBրF8KRf{.wwMrb1%i$TofWSg6ڱ#]?{PT~q T )? o~lz~tb?=K~/OdRqE8;M1R~t=p>pX2Aw-tHKLLi[__%1O|3:/|w5Vv &={SA1G<.!mjpe4|Αw^m!/ HHY ak#SCg 131$oi4C? A߹3kp;@c_c7.rEGq~ڬp/ QXVrh7f?@xv:, KLY ҃KrW`;wNTYQ7{z4,,K@̡%eƪok֣(꿆@_ endstream endobj 34 0 obj << /Font << /F21 7 0 R /F8 9 0 R /F17 5 0 R /F41 13 0 R >> /XObject << /Im1 27 0 R /Im2 32 0 R /Im3 33 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 2044 /Filter /FlateDecode >> stream xڕXKsFWa|[lz]"WeD`bjvOA[ gИn|uv._]:{/,afDY f֕]}U랽ьjj.xB -Yl {[rcxC Gl!BEL-K[/XU 6,-^"_[WbX!6ץ˻:mpvm #upUHqx,@]\긷`ªumںLszOⲭBi<Žy yмY56kfa4S"P[`n-P@%ɳ ]ʭGy)o"äa"C oE"< H7KYjsZ䟷*ikI;g˹$mj#w I&k۝e/j5-:puu$=٧ g1d_PDbD)D#")ǀ^zJA\Nv֙%)İj[p=V4n.zl> І%3w/:L@i]ہ 4! e}KӖi[A'?I". 1aHpV\WpBǪvSz*RGbƵ>S /mVrq !O<}Ÿn)jLK MÇ*Ѕ+a(誠m!Amqpu&-'I6NzCj@/JB* @bu,tq{ $f*1G=9(O\s̵&0a*c?WXA9OQeS!E0(AWM_7a~\P#a- ;XjuRGW_l ]mћt,]W]s HB [ Dr͇~ ޳OTt'*dcY~< aM;'nA`(]qOo鹥[ߐ4.GDb6cw<y܃=0<;FgKJŢaX? C}<|y&^g 1zuYD-*$& arE*@E)|k{+joxwCxWXoں۴TҟaރM{M<4*޹XB*+SY]ǔȕ oN<9i˃Bm-ڪr\!zԺ :* cbI{ 'ڴ r}zQ„Yt F-v " >BUp[6d8nkIv$o-.%j`YjgQ2_??@ޕp (8zֶ7ggOOOlӰ.ْvk.1r㐲^? " pY.|םMRT=Sale3U晿?ⷆ(k6컅QgKsW**0gXE0~}O?ˠvvmI~-d(6Lzn " endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 612 792] /Parent 21 0 R >> endobj 54 0 obj << /Font << /F21 7 0 R /F17 5 0 R /F8 9 0 R /F22 8 0 R /F41 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 57 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 58 0 obj [571 571 856.5 856.5 285.5 314 513.9 513.9 513.9 513.9 513.9 770.7 456.8 513.9 742.3 799.4 513.9 927.8 1042 799.4 285.5 285.5 513.9 856.5 513.9 856.5 799.4 285.5 399.7 399.7 513.9 799.4 285.5 342.6 285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4 742.3 542.4 542.4 456.8] endobj 59 0 obj [511.6] endobj 60 0 obj [736.1 736.1] endobj 61 0 obj [531.3 531.3 531.3 531.3 531.3 531.3] endobj 62 0 obj [590.3] endobj 63 0 obj [826.4 295.1 826.4 531.3 826.4 531.3 826.4 826.4 826.4 826.4 826.4 826.4 826.4 1062.5 531.3 531.3 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 1062.5 1062.5 826.4 826.4 1062.5 1062.5 531.3 531.3 1062.5 1062.5 1062.5 826.4 1062.5 1062.5 649.3 649.3 1062.5 1062.5 1062.5 826.4 288.2 1062.5 708.3 708.3 944.5 944.5 0 0 590.3 590.3 708.3 531.3 767.4 767.4 826.4] endobj 64 0 obj [495.7 376.2 612.3 619.8 639.2 522.3 467 610.1 544.1 607.2 471.5 576.4 631.6 659.7 694.5 660.7 490.6 632.1 882.1 544.1 388.9 692.4 1062.5 1062.5 1062.5 1062.5 295.1 295.1 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 295.1 295.1 826.4 531.3 826.4 531.3 559.7 795.8 801.4 757.3 871.7 778.7 672.4 827.9 872.8 460.7 580.4 896 722.6 1020.4 843.3 806.2 673.6 835.7 800.2 646.2 618.6 718.8 618.8 1002.4 873.9 615.8 720 413.2 413.2 413.2 1062.5 1062.5 434 564.4 454.5 460.2 546.7 492.9 510.4 505.6 612.3 361.7 429.7 553.2 317.1 939.8 644.7] endobj 65 0 obj [722.2 555.6 666.7 722.2 722.2 1000 722.2 722.2 666.7] endobj 66 0 obj [892.9] endobj 67 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 68 0 obj [569.5 569.5 569.5] endobj 69 0 obj [469.4 353.9 576.2 583.3 602.6 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5 490.3] endobj 70 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8] endobj 71 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000] endobj 72 0 obj [881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 73 0 obj [319.4 552.8 552.8 552.8 552.8 552.8 552.8 552.8 552.8 552.8 552.8 552.8 319.4 319.4 844.4 844.4 844.4 523.6 844.4 813.9 770.8 786.1 829.2 741.7 712.5 851.4 813.9 405.6 566.7 843.1 683.3 988.9 813.9 844.4 741.7 844.4 800 611.1 786.1 813.9 813.9 1105.5 813.9 813.9 669.4 319.4 552.8 319.4 552.8 319.4 319.4 613.3 580 591.1 624.4 557.8 535.6 641.1 613.3 302.2 424.4 635.6 513.3 746.7 613.3 635.6 557.8 635.6 602.2 457.8 591.1 613.3 613.3 835.6 613.3 613.3 502.2] endobj 74 0 obj [447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.5 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 75 0 obj [312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500] endobj 76 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 77 0 obj << /Length1 1796 /Length2 12492 /Length3 0 /Length 13618 /Filter /FlateDecode >> stream xڍt ǶhmI㤱flm۶mfcdac32{ݾn< tBƶ@q[':&zFn#\ 9ֆ_"@Ӈ @ `bffd032rց jbn HElM͜>@iD` d t0728?2XḿNɎՕڑjdP:\ƀ?( S#;P5qr5p>VF@gc#;@YJh_`g'2`bn|wrsah`hob`ne`agq!Eÿ9999;[0m189Q ?v 6@)ѿm>Dpl=fdGw;J?*fg htD][՟zʿ V[|쳳m~\5Uu¶VW'dq!B6VQ h`ddg m <8:&F9#ˏGcV')ll=揹88}<>nml>\&pL /`q 2 NƏ5/Sq}4>t 6NH``/` L?j2(_#տ V:lJ7 h_)ҿG>_u3}T/QG? u(#fmQӟ>@nuֈ'Т>Vϕno|_=cա :&ýPX?Ʈћi[#tH{bNj^~ tP,>盽%xh4y3'B>렄[PDҾA k]j_ya"  5ڕ>Gof_ o"Eshu.èAƁk L-h"־,7zzP)LٶoT.VK,UХcLHk,𢗠% RSGA*AQP&MJ>W-^Jh)A'ޏ'-\jEO.cNb*z43x1p>\̢I qt/ Tdda;%PZ# =3)2S7A-LErrkĶR(+ZigBPw,G-$P83V+܌1ׂVaКVAYi=Sǫ 2Q41,9Ҵ.*e,*wbk6<#~ϪB'&xTh~fHrEo[Txd>1ht1͆,16 "a? 7;xC~qq; N\ܑRIԦ W[^G1"0ig ׆ѐ+ZaH+'-?UpH/g۲5;8wۂX>S$^1l@CP&ݦ[|gKDLEArҿ=xYӖ>w_=݈ٛx Ne +u~`fc7=zq*U.0 BnsExE=G#jjmO$V6ȩ$ ĸ9cY$nf?׼VIƌĨai=:C.}Nnm0eb}_kC #w"I>|De2XM65R$!x͞ywGYg( nmxuڴK6ǬoIBF>üFVe×̈́ߔE$[dJ!'z6tf4rGLǻ,uR-A8Ar~l!ۡ: y }y.!Gbl(\;C0.BQ,Bc%k h ''NFs3C%銭z%*(z`wSK)}O* =<ˡ Ŭ̝xRh5G٨JƦC`4e5#ߥ|G;ڞ=%x-{ps!L۬R\YmWcdJ9]VjՈeB&M:|rL:4/1m<{ѾIBTUeg;G-!9|(Thsؐ%?/Qkv_%,V|Z?QIMVKdc"@Q#| J5Qe}Uhl 2!2Mic@FoYXQYBm9. ݸGk&4~JO[ Z;hO[BɁ~fuNU}FXè:Blmb :R*Dvq䴴5@~51Uwiv|gV4awƣj$BQOaj5?'{}%< BVtP6Y}>Sá xZ4asWM=t-$Q%duPlֈ]^{u'am*3uIpO]ciaEw;i,HhVG+e,ٰ2ǥ-_P] D77o4l{aӳ$P ; Ù?Nہ4h;Fq! U li>ДCȊu$Mєs`$?Gл̭P&yjK u ǖ6C>XT6 >-JC AaKs 9&bgpMMBSo~27dKy?C|’|WAXXɲ VW;TR qxD<\6s}{_լ²DžU z0MF}*4ѧ=uJݹ*W*bMyA\ k@~'LMpJEӥ<$1L#\ɣ  raf:lt˷`![{BŎivRY >_0eya|(+Wd9DNZ/b#8Cߵ~:yY=coP_FWExQ 7$m^ꥱR)`wmo&PcK)w JO|{,`G/jb#;4N^ؾT}$P.+oޱ}`ֲ\a }g0 e*i"W*Qz%%άV{Y DWRBd=ox0T[g{;]峟 [CnPT0g0 K): &3K&|]-҃Ě݋2xcsF}'8#8YGD3m,X# Ae1w I chZT+TTA)_dt{I~+G Pxr؇.JdoKH>$@AއZ"Z%R6D4=˴̄vT{efWawQ#J=vb`[BoU}]Ǚ1jV˂bg]ލ 3W>1i5)-"3X$0(OE|@Dqez iF\<C_0hXD(G(3f&]S)ŝڔ!rtDke1h4"S;^妡1L &e{ _*m=FLE H93( Ar6CRiysޯ({~C{r3.D"CKEv)t߆;Z~[ 6eIDRdl- J[!\\_<mD(?wV?s +*:^&Nk|{϶>^eq[ 3!rt7hXs HPQ7v\gFm=8e<}Wn0Sޔiۋjń%]~.djxWz-ѨOP{_\@Oôaf0iB]eDƃܖ8zM0>I`DQ)2E,MURn>d-PIZaM^?o=I(MEݢ46!a?68V_VC(W崶D|eӔ^}B'1F3&D/AGL"nzfil5NMZz5Y TeU*u 5wwݣ-[̑G33{BF)J6Ɣ?3~ۊN꫔K@lH|S2ظ'Px+XNDY> wxLՊb(}i)i[>MD N4 !)Gҭ3\: K~pzY݂)+O؆ᕁD$R9;lgJ!h\ԅR}L*pH;U lkxFq22}gzDM/hN @X K2oO$lF|~G'Kv[z|vz˺&",W&{6WVK<׭I?'!𰹃wy̲eʉ*jO0M񸉬"p5Ā>]תsxҌ,ƒ#*Z̸ ]X}H!ZFD>2$1`tCвJE_vD] D+U{pie.#Tâʦʈ-vdAtw']S'be-o2-*7yc,蚙c JD4CSI}('~OgKy?Xq t}QpDvunJ}Il`@EJwBwť9g&Ƙ=n{PP"1G`M@5@=zւGaK%2{Cs.4ldgQrfss뻹iĽ@Al/4nd_J*jUa̔^nfPZ_#!c+B@ 0fTe{&߿PYB?"KP]ʪ&@aB4e⎨ؽi|&3E_%2 n"+2ݘw| NpۚPˊ_>*s+Z[uX.^.M 6/%Wȸ뫰@*FCH^cRIj֑]V~1oN \ۄCF>:%hc%gF,uw#εt b/fcX,a|7Jr7!cmM-[v4 #FUMFZ=_0j>'^\-%zEa~`qrg.4r|%c[DC3Ocݰ7ޫ= gË T32L ɛU·:CD {GC4WNs .ᒿDl,ƨ6m"ޕo-?fl>%z*X* kˍ Sqڛϲ蘪AʻIp+X?+FjwSMc$JKJ>ՠ! f'] d֖EG뜙ŲK[RP~?|ۉ^sd G`jR:5SIr!~{}v'P *'y%q;6meަ LR>ׄѨCsis5 ӅHiI׏:!Nwp/O(g:]\xya2r]AQ#ҠP}]>eUnQGkpA ؉F+(yg)ʛ!71VvP_'5IImTI-kt{*,;W=̶,VzJqF3'0xT o"QV&o$;gG֐o3S=2ڵP /:Aw1&O"ƭ2&fF+ONC?=˥'vd po)%*51=,lѽUP G2mFPA1k3k(8lD0x+kx0\t^a ξR U C~͍9TBΠ HҒ8><]QLѺPo/8 KͰͰ/^:Z> JQx+-t.7up?m&pq?Y$❓ й̈xՈ Air@Аp tZUP3C jWPtaxhlX|?ߪF޳d4leΎ6L G\-xI?=S UGcY0Š}K >rrEp' Ǯ%劳T"I&d#X3 {MHO?bc-%aB-T-0^ofhBDQ\eԖ}/h} z΅H%9Xb6bu_Kvp{)Xα_6Fe׻ir{/~E 4.5PzVXY5!C /ŐVچA&  e7چ)g咤VV~Yhf\tt>V;ꛟPEndfHi]._ڱnE+KRaKA5~ 3cI2Uc!O\werw›$fC!mDٹwʭ|IKk&1HW OdG vTVpN򚅅Mȑ6Ԧ9H;SW"_F QCvN$#0jϘC =}{>@@?pW,zؐ`mM,NW JƗ>Ń chceAK>#|mI. 2""& s*Mx$ ~\NPU pEnwCEӘA" M)%eڢ.WZ7ARDWF-{`(T2H*Ɔ:c~&]ViܻqFT69X7+Fo:j'~Gj,$q}y|YpuE˚*oSgG;Ng9|j[SS7ޝ;2ar[(YD% #_De7QFQ#SћFWSEE2q;,|^ W3|=u~n'd<^򂺲1lsb2q;|CLb7K]}|"pNY2F YDG'6tpCmB:VjN54C? pRIm0 `=(BctvMOޗB;:lhMxnfeaAX&d<ޟ%W'RH 5c.Aa(9&^_CWk2uB6 Xޮ=lkFi# W'ʤZo% )F:\DccJoSHg+3S:=ܻe黕Ln Nj?#.s EWm2'(V?PM'*B~<; ̊|Kl27MtqBW ]o/HmH*I:x2bIz},̮gi7\e Jwr5r\O㛷W:E4?W .R.~vJ!Gl0z!Z ݭ3.J3UG"nm+(I CtƳ}Sb~dR {JP F d[w%0Fiw'JFyN]bVpN1b+n4Yf۔> =d6nAޝlks+ˌ_ ,|e.[`Dg8j\Rq*U-tyvO|PS*?^S![ Zi{'z3XKݣ6߄^22z\^𪬲Sc1/kU6H7UE1V@Ea"kYvg!%"uoW$N,aig O4gg5[IRreq73-u070K@XgRK,4N}еW%Z]?^{ZZů Ulې{,fe-O(OUI]@ .V, e FZ]z>rbe33C)cSyְ4d3w^vYz0^mV_jEFZfb .RLa7;Ǖ瑿KH/D ! ` .7^T'֊bog6n#d&NB NEG|-sӤ~6\INN}I wU/߶Uk[Ou/ R; ڬ% '.U-?B~J9(/6tl ]5J'eҍZb dWX`c?v("B܃A "w9Ge@Ԕaf'3Gnz<1Xٞ$n!F)(Rܗz"nW(y"$Ϻu  #>َ~~uCW~I[E9΄)Ȥp94JU^|T<+Bb8Kbq}=znVnJtʄ]7{4W@0˱IuqO;:`GwrwF{_OP)ƯV0yGzw`+&Uv >/y5HϷ7 \;#BG 8 y 1,])}ND0[yK{Gi /pr1#3+FL s6J㙯 spT%ڐμ$U6eM(d#y&#-!9_uf5@K3S} \rɧ,pύ[ƒ@ Ċ!IYC&c$Umז-|)~j;JFx,| N=R.-ύL+:|P; ڜQdÅ`/׌rQY?ɵk-Mۻi(+!A0fXlwğl&,0<ژX?,% _n ilSO<-U ƯVO\K#=Űu$՞ʆ̌h^xlCgy:e/W-/E8~4/;e{haVi ƄVdl;!ACq c7 R Ҡʖ{} endstream endobj 78 0 obj << /Type /FontDescriptor /FontName /PNMQNT+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/B/C/J/K/P/W/Z/a/colon/d/e/g/h/i/l/m/n/o/parenleft/parenright/period/r/s/u/v/w/y) /FontFile 77 0 R >> endobj 79 0 obj << /Length1 1965 /Length2 12550 /Length3 0 /Length 13754 /Filter /FlateDecode >> stream xڍP Cp'Ӹ 4.][pw`3gfUVWug~DIA$ig Sba03123SPY8[+9:YBt~ l.6 '/ /33翆vq @ kg rp03w~G1 Ow h P:l3v g Aolqbs4Y8T@N GW @_1S-P3uv:k cӻ *#d 5wda3haak0>I3:;&@ kѻԁIe¿s2vwvbtF?¼YDd?q G{=:\+[;7["S [?0qgRppɈe.Gfrp033sq@9 ~qhqpFVCpr,[]W>Cx.eQ (5ʚ!vf EtG=F,@sV襽8^ԃKCq6>C%z"UR'UdJ,؉t`%^/i V;gC!:Z5 -x I3r.1HhL5,?њ(Z((es 7ohw!O8a(Y tԔ-7gj`#dQsl>hóoCUhoV13,k7e= < #~ZtPw ^2)Ħ[B=E|95BP . R"Zny'fJg~T$zȔMH뻅+TO/X4{"ǧe8SpFNIqq+c~KA "lֶ3iKUu~ @?(VH1{xp@jNDթT!T +Tգd{hD! }Нp|yi|rn[\~Ns 1TOCɤ:*[šݮtv2vb /3meX8_#99Vy>es\ɻX1b%T%1֚Ԙ3AhmmV0(kkx .YT1ri2#/YlFe 8x0(q^ gBcͯA_pKF Q뢔MA,v?_'L]G|J3NԳ`&T<3( v эiHb Ռ~D0?5:n<76)|G-I#6᝶0\H|{R`3p٫/U5j`WNbc t\+YPzW)tܔ ˞A K'sk_^ڷJ|\]#چ/ $vT6A0\Wևxt,0ӛAA %mpxh2LzI8g~—G"Ws-!PŇTjCl -2vtKD-  "ٻfTݥ9=\ ekږq| #\w-mO ߗ}n}x[nR0`FBs'&YyM Еcp"UشFGÁnҬlC 4܁%Jf6* {'{-pg_GN69y؆[j''v%/nF~ҏl>:(6*?!t$rؽC=U4"3 dl̓@WT-:ŰY b.ye"3pn tdU a9Zΐ# _#N_k]E +m9AeJ/*4as$$ lERN~@g =v&Z`(>۫y 82tA1بrGQ+܄vYzj*7DwSBPSjX0Kg6T[% EX,@`ڙAsa!l& uGVח?dVFPd9d\#=_]zS8v>5&qZrӄ gq],h)Ur"7b Յ[KW0 V"֤ڍlQ)AO#P_ўywk$s4Yf5.H$MxmoRV^kiz %#1y!q{':p1kC= -DC\#MLԷ@i[ x%mҜQ71w{yVBl!@^-6AT6TvBsCl ̮6g,aSRmk+Y5-9&F0Xup{s n&=ËwK?I!_goۣM~Sѧ"s0jz/M\0E̤[֫̾Ɇy"8F7En/XbÕlzf{9肩̚Dz*ʯ{X=<~fVmwZNB3T\ //ek)lTMg!9l Pu"jgeUП+@.Q2o;aI'r~Ak sA/ k7e:H<xma]K[ SD)juʆ}!%oYrz$e؊BT"wV=^J}_əv)UBm;H ivsy00#Q\ ԲY)i@.2޷to ̥&ت0}UnH%/N$sPftHCܙ1> j{yl3 q}j҆k0R iΕx^E*fAp+wC{蘬Esf|1 `g!! MvlkkRth DIxn0yYtdӆba.-D(p&hT"%ORLb$ ;>9H r"ڼw9]H v>UʹQXIJ0X+/8+ z_.e;*\PBhU{7vH/x!N|'`)+Bྀ+K ';LC۩!F9򔙷L vR 򯍹x~)csO>UF*(wn6DL7񮯓!S)e6s&>+zEkP(D2$V֫`G>QFRD#Ĉ4"as2فk7؋7վnR#אE~ xRidb68rIoVVgf]_{7%$.>OFR4x .غS4$3BpO&~Hr8TZ2r zegF D4\\6 ?H)hzX.򵌓mL`8ԆR'm]E.f"[_ ? ^\ Vtgʋ=V021 \1KF@#`И=R k`ɳpD I`1QͱOj@J+ Hj]3׸`RQn|#@ƒ[P@XVDRTVGWr^ mv؁/AcA8eѦvNL6DHCg-3?lJl !\x Ҫ٧y#=?4 ɂW4$G GĉqFU@rFڸ[^W֬y5/˜ʳsjn?lVBQfGdHLK5ʫҞRL߭-=B\eRV|}$cuYAP|MѡŘO.Uo;Hh _ܟρ1_ֵpkh@$q[Ynʃ~M>T8[nr%1tcF'Sw~!@exxD 7hQzDLȗe :Wʺ. 9.Vh3hk u__cJ܍.N}APOI!\}n$3b"lUݨi;@&Z \1K¬wijC[ImG:2̛1\57 0xy(3sK`RSJS4vRV}CZ?V'kϳBR}|F{wD~0L4&dC$r&AbPؗ&M$L+MCyٵY%KҐs&))Tlv >o4 ŝ8tu7đ;bqڜm3KV*b/%"ӑ:>}y6% ԫ0rx ZF2a;FP}y QnD|SFl.~JqTn}ogɌǝc8|.يgvX+3sw(,G1m%q+HO#H3 TJtS6iy|3_T7QkX1 _zϦ`;̾ B@}>t Y)!,8-&BkY6:C_sggx0'"\ ݬ@ Gbv8=iFaY:"^Vw*z4G#WR3 >uA`I@[Pϟ-V:o4r U%)4{+ȳhUOvAB%~1=y'*mWgBBX@#kn\x[3ܟCOɉa/Jc}! Z5&LҠ:HKй %CW-I,M+U>ՍoĊj~(4տA&3 i ՗cE9_gVMVwFli4:jg5O@_1(/?k?`H@63/941>QԝPF8.3rV!ڀU[61 7X3Ѭ奤(/Bkϵau1Uy(%4-I`EjrJYI=EN )el.0%)ݝ4,ĦR#sZ9_,2Aٱk2ie8ћ|ĸoRqCk"\ʺnBV #K7Ue׉l 8㾀:ECT?PBjᦱ4&%$VoJqKj[}d'R2W-U vqOYKzK=zUzn6EuE0%#BòO#4mT.6~J]m~?YRۓx'O,aĶ R^f.^ocNljM >nQ$0o!$w\tr1.01]kкIK %<p/ v!:(מnqVJ&Z`J76( *MedO-x{# Vnkgut}p|U0EXL!˟uCsf?QC1x/N0hW0qK:w}ǽdsIcu/\B`O%k3]' Q4{)4yB ˕)NHH<.4$jPF#4za稍Ыb**E 70.euڿ/QzuDne%NHw&'&lU,dI'>;)[1e0%T8}L-C.u`ՅӾ6j P!ɨ\_r<8]Iw.1)ÇvPn q=oFرL00NnJ8` i7jF&LQ q).VVˀ䄩Ac줇4,1Y覧yT<'yvm'Bˣ{?uuhvn +21vV=TR! )ܺ+?8\sA1|Al?Q#aGn;GIN )=!R(uqlpUbuK{EidM {C 7Ѐeؔx8b)<nym&ʦivEɠq6/-#<=kQ'E e0:L-+?wKQ'CN=ؙz%Dˀ˙1׺^""ty(nWbgB_iF9VyAzb^2P?t& lÜk:%2FqoI'N7F.U8"EC*If£!D9]Ńw g7p?'0z7& HoKSV#N1iNGsǛi &p ~gSHGDۇ_7|M)nDB嫓9Ev |.}E '-V| 481ve!cgqg{S|rLַAk3:`ooMv?t(wt%/e[A!2xY=A &pYZ(=,S~M_7Ptx4*RM- UpDGWKe%|4;|4+D Gq/3:%,()_ 1!dp@Kcr $d37LK<@mf;Т:U1x=8cxwȶaty5:_$W0%TW'JPX-Hvm2aQ Jї/ l<.ȹmY&Iݗ(ݭr +%|'L\UAQP\A/' g;|ӭٕ: Nׁ!+Ef(A2|&'R3\hʥ{|*[`07GL ԔڛRF.@b2(c!ͳCU(qbCAQ?KKde z}XHz "'k2Z=Zmгѐp~ mCn BGV >|N_' #PSaZ rVEj_M,PXƴHMmBiOi)9]7Ή$W} +lEG(!Ϙ`#]t3> *:P@# f 8M4(h]GI:rT%NRN|#HLJCw)W-Wa- (F޶+$6w1kho+$rj kщ.P,0iVC^v3Ո{P^~K`3L`7¦QHCp!U+uA!V *v اxUmc{ UQ=q :v~A퟽@[!q$!JS,{9Fl+%⃢ &-yhCc> R]Zf4XbaMϰY6K]EJPwh 9TX js]9wXhUg ):/\,F○ZP~q|4oD)ݼ0%ZyŻJ#.E+}pOŷ1 GN3-wL  ;KgR"9U 9,CKqť_5g^~d~?v٠Xuw ^ %mO!|ҋ!\- 딥3$Ū1r@q3*v˘W6gB4SfuQ! W9=d"VRRX)R- Qz+9:FdM;@Z^|R0 ۽p Vw#I`odݨ?MgZ13 phjYqr6%H2g>"0Dph* 4(Mx?$ Ɯ/6eH{}1 H*] vF>6za&- !fX)/(򕣩 h~>Kfb:6DĒ5|!vr B`jtx$ rDȄFf "//(h=~Ǟl7JQw ('xEd◿I6\x2Y'.fdTBI{/M'wK[6ܷP~ ݂&&`a5^|CG+1̘Դ\Gy.1akOYo4dk;@PYmnH($"ʖw6{Ag"\1?P٪+.փ}'sT8ꢝIC덐Fd+NP3Ѻ(cPl9#/cV5mƯ AG쐵vN?,,S {XbEAĐ;oc.KO`Qm)lDu5h 3rGPwl w:.()>u*W3T=WTn,^GKϨ4q0ڠsxN/sD <t×+TzuF ߙxOIvH(pI3֔oFK*bux3BX=uC|/j"'G1'ՖݣאXV*Ux0* 3϶Sk^ӑzHQ7o^鎶V:B]&(9o<7 |$?J~SvR!Tu~zdMbzDFICxcф1!AYQJԼ clLߡ/<rԾ2>Ԡ,ja\EnD?u" ӈC*w.c'ކ7wd$ڽ[xf@Y'=gw=h 0~ly'8Y}lO›[+^MgQ{Ubi]#u-Ui !P/ZYm8bmO|h~jӘ h?} endstream endobj 80 0 obj << /Type /FontDescriptor /FontName /MKNZRP+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/B/D/F/I/M/O/P/R/T/a/b/c/colon/d/e/f/five/four/g/h/i/k/l/m/n/o/one/p/period/r/s/t/three/two/u/x/y/z) /FontFile 79 0 R >> endobj 81 0 obj << /Length1 1811 /Length2 10683 /Length3 0 /Length 11813 /Filter /FlateDecode >> stream xڍT., =twHt0C̐CKtwIK#!tttww]WZYy{kPQg3'fv6;Fd[JrpC!H8NO2IS ;9<ll66P$6(#*laG)=s-l N ۧ@: rr/tBNNv...,@[G0=d P9` 3J@[_4,ѨC͝\ l 8>8C@u9L?`gaݟֿ!MMv@b0ۀ ,NNL 7h}€`܁i1U? t4u998m~S fP[[w~`SX5!f 1scՄArD,@Nn6>^.6r5dB /;N /+N'1?i} dddfP??**)!Wkšv.37~_!U_ Pxj_\?O!O; sllO~?l'iDt&js֊ 3j圀O"`Gi+LdjMkOm `fgcZ?\o zNA b 5}< iz<ݮ@NO&rPSJ#~6? <1N(& ~wfV)k'_) 7/do/ͿS&f >er=qRsXQ?{ZbJa_OO#curKAx.@hqO \ASPSƫJ1b!W:Cyƌc3KvKjQ\>X&q`&޲ 7z$,[;QLС if+E: 'mULҼJͭIVԜMz5ֹ^fF$)RjFu\I+[?r’%B.a"#kŪ 0h-j tJ睁kX<7Q@- Կi(糹 d}biuqqD6y3%||`>t,oYkgx9W%_j;/;7݌3gD́ (]5 WU-)edK~ax*[+X2@(}sPƜYW]xH9Kjk׊:Sx/tK&6s‰ùэ >`\m*$՟jnR&00S}WCt dF>~L᰼^)@P;&FzڻXߘ-ƼǬ=rx:j[ jN@ oks,ݬ-3zhU~j\빷sFvYK{ ĥIEFfͧF9 " %d9i--2BB+mH8_b8HjX'ə \`s#EgBAQ7ʍfsЮ%[ tr4fc".MyY;$ќ\10)QM Bpn$5- VV& ("䉘4]41alҝیTa2EF_Vɢka/Ѣhn+/5=ICgL1^&O4ē8(Y?{'Gı<> VAٗ#(AߓsuP%V`\yݸ+npD#tW" D6̯g8,F f¨_/ʚs(zw dxL\r4,~8aLlԑ ?ϛBتV*?•mܫ(m [n>8T,؜,g1 ˹OpEGknnh\RZ=8<]sHDEemIX_iOoh{ َӰR}%07=-4p,&oSa§%^=NjQZQQ4"a/kD.M7p#7ĕ|lI %A l}7AX}hQXm]|J5G:gN&_T,Ts\Ft4$>Np5fmP(TMC:^2`nlL>U'5xZiBGUauzc@Kkb&t޴]yV\&s{^O慓~Kza8l3Pz҄%3GBi`I2\ ܯ?E*@!w5yeňNh,xأaZ6,Qwfܫ~R, ŅԒe/o}bg&8͆ΈoqϊZxg'xa//8b .*v\ԻԌ^qV˗ SR3L|exaE>[/t]Ưu+z7BG]r K"7ft~y48wY#QՋj+%9d0 bf/9 j!-ߘS?GiR+QR ~%N}IX,3njc7E uj[G( 71;>v̔1Cm&3DqKN82a` ][V\66]~gb֌iPẆud<thyF+|dIw.qƆz(߭kJ-"ޛMB+nOBme~?q"~>S ~tx] h%H2<]!~C;^k&Vѽ_tZ6Iu9:vxڇ, Da(zPvjoLɗ"YIF:w}S-R<Ӥk^"K2s#<#nS'F~:4/~y'`Dp1o җlKt|B;vvۏ ($ Z/b!xm>q|x/zKPKLwVigrêM~-:/e.9ld%0"NV&GoVNDAA2>쵊/YX!Dzl~-/6-F.=ۨ`4>ֿt[P 8O/SNٶbmB{`AoL#M[hEPKd-2c5J"q~sK|Wu.Ny֦U1Aִu<[n'Ӓ]} P/!K _!̳bbEEAn C=ܷU䲸QqYZ7,(O+V[|ΐ`zDNڙ {ckP)SPHw *WKnf%^mCyN @CFd"NKn~tD)3 H~"]ktC0H#pHpǏ,aߝE_>_( T+C{Uz6gVISFd4½/oIѮ%&:I.;ܩ 2'N.wv 畃蜲4\H5N06&ν[o+_hje! s5ŏ$xFͦlݒ0иiLh><{.&a@8qt߄s۝{ʣ֞S˘Λ [{@$Hx1dJÐ+6ʹy2 NZl>L;+|/HbpBV;z{FO;Hn/Ci6jB9?'ڶbpPD[~̛NK75SeIz$^". Җ{ofa7giKdU`*E"~SoKv+eXwaT×Ash Svld7TwVaURJl(+qy)=$~ʘ"{: *eÓ8V1ݸ{9\~=7F¥J,HQ +};OpH$3Icdۄ+2TIܥ@/Z(o͖3^3Ksi e1|"KoW6=$[ͣI@sY\Tƈ"%p(/UاQ.6/gPЂ)9LջSM#U_k1AH^5^'&!x.W$o/ gn; _j4ލ.+hl[2R/$ޙ;43᳾1Bv2RMKNsˎ(J__/,r=7,bc*]vސ xk̏|.Bg.' )2=n`eS+8M{=ub kK( jk01 t^Ljcdܞח<CJPmm>؝3"&+ݬlazG jq#_&6($KB$#Gv9bݲ𚤤w62kGe{t5W9& $6]H56u-4[E BӍ;e7T+$ a2~UM|F\.fW;,`k5f.xZl`=r".9SJ%=+B2;~g:R!%֍9)~x\#g.uUdҪnl$Kaάk@fU_=2{j88ۇI[kwzĂZq}څz2C!}a? j D#?g6\MIKK"fԼ :*C.\yA˛*܌17җ$ QKƿ }TՉ#!$9O = 1d(ѥ0v-`0/6d_R3/@;0WNfvwU|+5h)cߦeS!^2]O)s)XZϭ"8"W>":L=^;Q2E'pWvuX͂k/yttM; )4F e1YA)bK8^ cAZ"uW|c֒LEnq"yAՉ K.^(w)MKW7Cޱ2 6WBXk[v$>EJ?%E-& \J4$EZRi6^TʊA%di5(ƪ;=>R~)Ҹx pu`w YTq`A}.q⬇fZ WaӐv~2$(28W1-Y5TBD̎xo=fzOFBO伥y^e ʙ7UN-01z f[3&NpkT[RG=bSf>u ͵Q2$,#m_Yqv.`9)!jS3- q\eK[wn~dhp- 7op4*Rc10)#c^G;vGE) odW@ :1`t%`[6q+ajx#h//߱reQ)|Bٌᢀ Vg>Jאe^xNy =2Xy|ո| <}اdbEzIOv' Lݮ|1Ow@,1RЙ]po9[ YP`SKsܫqVt}Ti0z&wpY0Ӳ\:Xܼ͐ufFRvmR_? v~<ǾF$`9 _豁]iiın T#டը'BD=gR*] pĵR^9'4b .j3Ó짃4{_9ݛnyTajo9Ǵz[1G*W=ɬ> _8fԳtw@ |,ٟ }d+/HꚔrhl[_ B%P ts0%XuL"Y "c3cxQ:w%VSўԂgX*qYs3lu!OO;UGz/L5YئY/IP䭩2%c{F$Y=\E6G Ѣ=?$uyEkN[SkFӮNJ_m(JE]U.+"iybhzMDH&} Rpmeԟ~w 5bƊZ}oݩeVP|$U7yGq8=+ۢ_mm0$ԷƸ|G:{!fxȣRXEp"-Rq>Cl-DbS}굈nuڡ.$BLM5_'~w`RK|i_Wj`E B_eYVxZfQhJRŐTvڇ84[cB?Z`E6!MY/VCN:5Xz: 7:RBP){uf3+Y@AcK՗28Jsv/ۄK<ıs۶E#7wx$:xf9_ 4شE*ܑ!E\bi+_%-M8䂙DVHH_DǯȀL+u qhJgy7Wz!`sK =WQrT/>j =Y<՟ZW ygl(eU$s @Fs},f2IݯJǧ6;7K@̫iZ4% _,QiBz6P?R2߅&7E-e꿠gaXs&l}=ϔ*);R9/y3I+v^@yn&^mwI*5`!'?Xt+ QQZ{ʓ@@zJمJ羨..ɟ:CCe>xV-\ _eD;HףYI{+p KP-S:q"/Hi{RnEyの5!)?GA|% ~G=zF,'j#s8MLH M#k‘1#(Y}?Ұ(>F 83L2= uH{2uik7L1yU[hr!r>j@ט [X^&xfצ}47^'H$Io&G:~p =+QQgoy2A-u{E4ϐ^r:*O,MQ>X-k/2%4y%!BS[:]7 :9:Z#Ҁd{:;7BDFnnAө> endobj 83 0 obj << /Length1 1433 /Length2 6115 /Length3 0 /Length 7083 /Filter /FlateDecode >> stream xڍuT[.ҋ %{!$BI {/"MtA@T)ix޵]Zy=333ƬoīACUp/O@b PпlP' _ %$B۔A(4QhzB$PLR@ ( 7(a@z)!0G':ߟ0'(!!E 8@r3A#E+ .rC e9y>0 EzC!_ 7i|lc'_BBh+ {](0C"'_` 0+͇E@p/"y` {4AU>O0+ U%$?e F>W08 ; PAcs"b v25#h " yC(4(^ CapDGG|V~=|٠; jJ$**"|^A QPXD &&wo ؟p@/[37gE O[ ?)k_Q;RrusE?p^(p #oցB`^nj@!Q;s0OU/Cꣿ C_w( _z.{]=UN# OPDB"A~W" zN!P #PhZ^$US8};]({//D@B 7 M#R?jn|d0 Cvx$y{Wa.-]l^E?|ު6z=aY#EtY>dhb>wpG7L J,Wϧ+=[1`RI;PVT<ɜ~&gufrz.BGXU+*f)"GHޛ"nI=TҁhÎ~`ma]I6hSkU ^.$+z*(ԗK#KFq@JNT2z}s,&?%sOJͽ}%I|1tBrBid>~T1 2\d&9P ?z%t#᧦pywIя_W~My]y`2ش{vWM N2vZ9/)vj cOٕA{S@$'Uଗ?(^q.yi+d;"O)lt5Ղ4_dMy&~l5I^?`l/^:2:Txc Z=J@' -פM!&gYRkUa Q/kgG7ޝu!?t*/{gwg޼+\ mAj?}~EԑZ`[rtWfq8BիƘ UO/Rf~:#⿽b8"p;I*_e]9%Y)G')b5PW Knpy\J&yؤќAS1T^A3=ˬkN[gP X9H&`X?$a76z1rG tY51%|/zS]tp8uq1JkڇY= 9 (uYBEBeD]c2ݮ DH2i.oJ}%}UXW*GcEǹzT%fDQdBZ_`^[wu[Rg2~PT>gQ5.Nix"M{i7|95L2fN^T1 |ZhbE2 ֥'FͿ_]{MO.{|,=zU)PGk15vhѸKs(~DL1`2с'yY.{3x+nTR,q'{&%,m1Իڭ*n+To\2nyK4䰌=(_:?8;|xi1P'(`i`|4$H(Y#JH:ŸBV3{-"h'QE/K7W<'wmS}bܡsRզd+:^)I7AyCJH~~d;)\3|e|{Bԏ_ =I_SP_UĜ'%7tTFr&5W>dKˠ[RŠd$Z-\~ͽmE*oeg?f*[հQ(g/J|4LY-Pw̻S]7_~(ow9NVh8ߪVe,r;±?0S[u6#@[aNӳGZA"v\]n~M{ yq-Nek5< AkO:/(NGDckͰISڔmo,plf~VdۚF8 8ƻyI" 2LfA4=R{W*Wsx~q&U(:{ ;5  M|wRťME]3 xpY_gY  2ԈǻFt3~՜}N/.,ŏ\&3<ӢwY߲KU?|TF}b ЉeɊ~je)4GIhܞg 4O6"*e_k3TXc8A&}U3;c`c_]# y.iew 78:+3p%)"e?zРy%8oMQ-Dal5"LK0x"v\R:+]aぷ? $DLɯ[Ncf4fWRy rIV7kd-n5= KX'y2Ca0OWÃdzlڴjQ5޻Gw%3Ԩ,N"[01,1Vo Y#燨~JB^1C[tgkjqSdtYcl/|1F[?1o=1imim"V~TKۦh$0ɸL^%|.!WŽmwZ-w+DsѷU "!)|c^OXvmlh^Z1GO|q݋`( 4 7O N^(Ox>Ep 0s9wQ凬g3O2ݑ{L4(,SpӕP՞CB|Drݾp-_ ԈFMt]}|&L>XADDvqh◮>J=jjI (+aQih{c r?M'4M}+lN,WneB3nQ46&qv+x ܏ZϲXRozR$9,qmhfy^8#9ҒˀUm>H5.ۼMLNuU[lCڎ ~s_t>'yɩ^Gɝg3dKXS9^@ގl\OO/^yjXp*v+N'i؊ ㋵_~ N }r;`L柑L`B* /Qzd~K(NV!YBɰ8:iwb8eG/0*R6ecY-֭0^6 _ֱh Q}񽏔ҳŤ%3݊g0ℱS,3uUzr&Mj%;vckD eQ sR?q^{2ӡ*sǥ5£5r Kø?vJN+KhfjJQo Kzv-;#w#xC^x:9ΧoWo&02.-Z`szcǕd,ƋBK2"Z{Ug(E!+v iMO@s*awCVFm{`Ǝ^W+]uVc NauMWؘ~6NMF=,"S5B9H ~L'm Y2'0Ȟ$kHX6)XZw5l1(d֦/,hT@RkY8Op^.LxRޒgGKX5)̹3UВ 2{̾Jh/JB&ϐTscXc`RW+>N")X =qbz. Oг7}|y7ق 0[^ґR^J@hS?(Q+ASѝ3F 3T$1@'a'a'M9q 5W.scR۹Q14 ]|@*O)PbjSZ[VKAo^<†>.<_i-]6G;vǗ0y9\ Z&r?]V|rE T.p]˓ƄX09@LBA/=D܎0-uٱ>S9>#fJZUSiͩUt)6NWQ˞Bv/n/ `nwh`Yn׾B SVk U'3x;Yioץ{rT%+uz(x͔^^:q3%>ˣO$7k5*%B\OwrӹJ]lna(_n&Un |b{5V fz]pE~q3c/'!3@V31.B׹G({\܎V61UɹC+I/JE{zO=Dvm>HEmɱL lKCY/VdҥV"茂z UjzG#A8/Ze1\ed+h24eNWKdžx25 蒘qWqk}=g`~?n]TWR|𣇍3ubۥkn6aE#4DYx DkG_39)ǛFT?MQrݾoMpr!5Au j^H=RjʄKVI 4+~ߘO^NܶD;7t[gbC2^%4;чI/G`aϊF75E4Xdz_N0>.`^蒁pBs4X+a'8 `[yc|69s`{aj J(x:'#h#BHϕ?'k|_5:rBes1iV7sUd?|yrQuIMV}_ D endstream endobj 84 0 obj << /Type /FontDescriptor /FontName /ZPGVCH+CMEX10 /Flags 4 /FontBBox [-24 -2960 1454 772] /Ascent 40 /CapHeight 0 /Descent -600 /ItalicAngle 0 /StemV 47 /XHeight 431 /CharSet (/parenleftbigg/parenrightbigg) /FontFile 83 0 R >> endobj 85 0 obj << /Length1 1661 /Length2 9064 /Length3 0 /Length 10160 /Filter /FlateDecode >> stream xڍT64(]Ҩ 534Hw7HJ#!))%- H795kC?"*9XR5;q SPX!Ph?oo?V$lg[Gڹe"3j0Ԋ8>ύVX@WD Et.?7O9!uX<"ͭ$ߧau_ZCfk'y`'';($n@ 9:hA/o$B* a~?0$Hyܨes?b߶b0;7yNd ~#"^ĝVD^t& )wVgR=E l6)pBGHð7OT/]+WIz"]7$rt+s f!4S ܳ-]aKQ?83z̚)dmh qIO_$Nu X ahpN*~X.Bo>?=Y%Eէ@VNx۲omQ.-T%lqPdz[1e.MNnyV4׀ZKS~3Oviy(HE7o@<Ӫ#e<\μ*֌TaW?DGD Y%QT-aO{BOZ^QZ\"l]/_mk Є/RrY|I\3 ^/jID+9.It-?-]:X;z)&68,͡P3(D{} to t1>O2y~} !{Qlb+#.7Zy876(voR7< 5'陊,7Z p_3İ/Έrx|zx ԃ@9 g& RjU!f MljZ67ڨdm;[f69g2"N{Ii VYL9GFC=%?i6j{NgKhg'ޠAիg~du:9}-7k"x!!xQ?f)zOUwLNS6.NGq=wN͔;J.}'BH; BatqgD]!j" dN}/ ^;??qJ{Pimޥ2Wex2"̕Fm/'E]Bʪ':Bȋ7ޱ%*}*y;_lCn/}Q|UՇBF!Ŕ$݌1kRp&'C|2dvF=j"D]u .kW!*M]@E S+ܟATQNhS[[LN*LXj/g;_ly+X*N|(ZQ}7~W@agrS55 z;Uc.TBt&n{ }}w?AR >Q/#@QGߒzKM´.H>)hҽOL<*v-Wsqj\yjٙ̒l*v5T째hb׳9PJdm+7P?`弢XL%MlľʒZ]oGIq㻊 VC#e)w)9ik Pz<%Fu.隫q+D!3V$3g sAJu-mi4$BO硛6aΔގ`::z(28tK3 jgВbu^q7cZ8Ո}n[953 ŨwK"sQ_q0˽*(ivJPіTE:T _'wl$d҂Oɾ(ꌂ:8 6XL;iѮ.d#5x|q;|,aB!oXvUtϊ(@ qTF>:%߻[Bf+AZ魵8Lp rξndxZn*Mw%&;RQf4<ٵMA\O(gAFJO7^=S̫B.yE>28#tMts/nL":&wQhl+|XeMhLӝ&\m_K~^`HAǸzvͶ2+l6w!0pS !ڣ8~2bߦr]\gu |@PuL˟559|pBV0}vC"8e*Yo R1 >rį8YP%}̰}]]2Ӭu: a f3R۠LBKL~kW>>Tmi]C@.ҏڃ2pV;&un]j 5RIhmVbٖx#[5M\|8f(I1B#\W4Knf3(^RFec6gT V? wbǼ?3ŷ$+[xWj DYA/NV~m^mMja0͊F4I$ ZySC;4>G,[*;?ĺ|4`GVn`XIKGDө- ZDjdw1BݨVT"F®ƜtycN.=Cg&xc{ͳ鹂3K! XV LmרCd2wY-/A^oN2 >y{Tww6ޭ9̍[q_4(5W12x[PDH*9#ѥS?NN2@D}'{-^+RFq%A QnЪpw↛*Kˉg_ﹺf,"xo%g TD=OOu;?LbXu)Yˉ9t; Z.QW0`­J7wqo]ňE# -j5x>˺ީ-Hօees"ŗbM3Yy:!*ۉZoEpP|#B$_k1,I]nЦr9226kGBmcV=;i\ QW1lX:ڒc0qdw͖q)$^R;KDܛ3qEWBVw((?&?a|ٗ~,7:LJjgkho)y轪;Miбd¶bfIֳB9c*,x i;YklO7F$q S#j)k ^ש'f_?@WSC>Mks孠NDDMYQhqtOe:0ƛE\HLWʻ`ŭ7 %ɲ.ˤ?6vzg2,9Nt|1L.pBS mйW`;-baJVՇ m:kM?Zs?p ܻEyI'.6({27V%nFy:X@:rF?Zޮi3ӱ5G彐O5\o*r}w+͓ܠw 濽P41 M{GK%;jXVZO~W*1fI&I;Z+`rCґ+M8,~:B¯}BbS'V:>3EY>i\BkMsk1Ż}%}aDS6d%@n}7;(8craԶvtZp )kt=RM`ӚXz_j,2,]~:5ߴᾶhRp2|w>f$ESasZ㢀@rJX(=ĈZ1jz.r~]DdQ]g*{#ntgSԡ;VFc6)5^p^+t1Dݎυ'SLC̭XVw/4 aby,+RĂ~Lp3D5J)H Hȍ[ ?p+;7}bL4HU3x~Ѡ=3G37_A⃾qZ\aɲiV+8~9`_e*pyTwaiChUG71w9qfb'+1\V0rq?)7ܓ9Fi):o䇨wB88ݶiyQ.:{.)(Y>#0ܗBR>S-cђR󏀱$%"uAc7ʢ.?fzi+14PmmBօ@֗_X?|h2Nu|o7IkACp8w =75ͫ)t_ĔxVC&55.ϬY:h8\qwp`z g~$&ThWoG]o6&s9~$b0*عM|pE Df YK_ڹVk!]:S~5[$lurܪp/Rr$KT`pb!\gɱጜ7P@1_TH٣,ZZ0Ee-I:V;wB3㻗G}Ae?k'$g] M4)e*ݙk ~\l"Hg-CY0&*wk7JwNMF $Ruf"YbOlAäBRg#i L&"V;v… o 38(7h?;^eDχȞ8ʪ]e+:@J&{#Ol0b9(d}eEujqlzG^kUS0 L:ۛ@Jg_}ROi>:yZY aŮ@y2}PaÂQ4JL=MFH] o;X櫴e[X6)~@ZUwJpT(贴@tF):)ݘ}I} f+{t _.>N~((_Psʢ|Яf%Li!eڵs.v#$ؘJK@ɬ?@v%S-#O2~њ3oSX^Z:;^A2L OJPtm'iH6l̶+yb}ŕN@ gKήUkҥT§څy{N?~2.*q*9&Ʌ|㿓piCixwM1>-V'RK]ς0.cPPwO'eh""| |FI By&Rqj{{T/>-KV\&{2uIXtޥ]YIϺwM\CBФzum #V/h*|fN/$w574FA8w?So=/߁1ЏnؚѢ̂0h !^.fū`ڋ)q6Mի+/1/~4C㈌È[r zQaTR 9~)D饫"qt5dG9;YhPn#Q@Z.+|Hc*0E50\(N/$̃x,t/(7x',$89=^F#y!%mu5Yw,&O%_k5~*>xoSQt'3²<e=] AF:k]OZwvE [&f3K(nTe]ZPDru0'ʵ2-9t'y)kh^ [ݖK7YRݼG㶢¸Uyb&&s3Vo[jݚYȆu9dЬ#\PW /qȜ0VT~:\Ϡڪ#e`sٹTW_ 1Υr\͝g\y6K] Nd\hIY&yrBs9.Cy)7[zYϺ &j N&<7*xi'z;ZYe]t[uˆ/1?]%3sݻY[TW"+>/HcrO8Vϗ(dTcJ92'/x |!ZA uC) y-~rqsd_T p[&lNNc=DsV-wtO"#$ eMt L.=x(Q 󂨣GJO.A%}ruSD:fx+cL/13Oj kwЛ >`6 (hexEFLWͥKE+Eu+o>~pa @,;߫õ?~>:sxnnņxp<.}9[iٰ8}H\~"ncDZS:Z[>$EL#v4=o)AcXvB;uo? F scc_w^HViyD1'LydmpR7ayD@d(߉wZafwt{={~wi0'6 ;څW?M>c]%f,zCйh0qD!z:I]lUú5k̚6.^SßN3vbUq󃢧a|}3TH*z/6(y3YQSչ_ЧԞ:hYx4lxfϮwYrc@kCZB^oWV %` %K󎪳j\$Jyog1&yL,ĝYO.O"p>G~NOUlQ%Qc|Ļ2xyg8fR?}ZsyOX84 endstream endobj 86 0 obj << /Type /FontDescriptor /FontName /ZPXYAI+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/A/K/T/b/comma/greater/k/n/p/partialdiff/period/pi/t/theta/x/y) /FontFile 85 0 R >> endobj 87 0 obj << /Length1 1407 /Length2 6013 /Length3 0 /Length 6965 /Filter /FlateDecode >> stream xڍt 45 Bkd,#k13 c){5Nc!;ٲE!-"?{s9߹nC[$Ɖ%@@u}}m9 $-IQ8g_j) : u0Ox8@"X^J@ ;b@ ' ԗ`Hw:w} E`y@ @}B90p8]Wzp;Hw$ 4 PF; (8N@#X 8H[xA +W"w0 Ǹ>(=ނIqb@!j"?W+Ў鏲C~0O$@oÿ% D8-FǢ "@ЯNB`>.TW!ljjo,gކ OBm@qxE VF"@oW!ooa}r RG\ } q9jH忭8q= h{"2 ?z;DF,5Qhm;׋CF:Uq'N N\A%wh8kd0, (A\[7߁h $ba_c䀒t{`¿@,{Ho$05+8V>pz/ )SnK=O^H4Κ%@jn9\[#/ ]絍8'}wuy$,EGCr;K#AB]I^WJ:-m/dp)n,5/ .H5ȸvH87s#*P3h@R ULb ?[-Fu#|;l>'M[lVTYIu6ւ& HZ3Zjˏ#ʳ;mMLQv}9,YΣo FQip q <c~7U/8I t'-TA,t=x%PKL[^MP'B^z8Q_9qP1F‹V KaTpfO㨵j3( U^'sjrLNK:xu]m8Ζk%gxH V3 O^K&$( {cW{^nlB[G*"K*e6RojsG݈Ny<>QՑ-?ľ9q}:%/d}=hcR(kqF)% nJʘLy_ `N›՛r*FbM</ӦZ:p3xRp.&ebN;V"v)z>+~\;' )E[z3e(_"mJ,>gn½o{Fuv r@z?H|rMʴpy2YDzV4/'-F$OڽW!y3ҵ#h5{բrbÒ7e]k.j 'Zo&x`r#~,ݏtVE2{ǎgن0(Y&A^qj*U\@T&{0ja 4;ܴ)5*ƥ+8LE6U`Kv.ƺwu(¼iԖg*fz]˸~=崰3Q:wr8e3e vX[~fj$)vlEjFL7v=7W&K_cgZ)Ĉkuq3Qg_%nSq]xERS^O{]-:\V,ybGV91G+ցg7*w믚ɷ>n`fD)xO86qz H|_N 醏hh3;PvW9L ŷ6)x3A"]{wosYO=ve;^1j'MX*HFc&dJ5_.r9]&]2]Bg-!EqAO5pBm]*pqgc}Of,1z0ŌP$¯Fc 6˨YsS4="4}gIer"Mʹ\c`+i2j7Z}/hu9=ch_>-1J-ԓiF.ʝob?9>/fVU;Y]r2`84ث}nǾEï|\|Xg4Oro8y}INDuwS3p,,:KE1 ިN8 XI^F~\Nj5UD*rBzb7hePP;s\5aBMJR{I!n_#꧝t2JNwɏM#T@IrwJxº3!*4[~駮Da?o 3=ko[Lm䛉Olc|tYe,4=+8NI<18'K b0+Kp >Z.UϤ= R^a"E,3' wVy׫cy+4zF kPN{"Qx oFs"ȕD@#6p]#g:;{Lv IȀt(|(͉ 3KܺGjjь^mW{L|=L6 ͊}/̧\jM~g?3KR@p<3G5ܖ6)DN~شdYmm(K (.pQϡN(c K;%]|{h2w&UG,@rpAC҇_W˼fxĘT¡o3\="cOPȴmTȥhijɅר k_$&Pf{Q´'jOtRχcٮz͑5 ĭPk_B?z}0ˆ4b,4neb?-t4\N|]  mdЧؙdHXE=<iP=O64N :%a~0Y!ȟiIk!c&";lwsV\ۤMo[>N^{5h\9m˷1}0lg8\,bTŊ>w83ڨ&j8W @fLufZ ^|qE:$h`M35Sԃ lN7"84-I{L1ID30*^bԛpTIbLpm!Paubn8`ePZ$[m"T.x3GPpmcoz/#\H*PQ8 /7O Q&pgH["QS6UӔ(R0'^Qrv!E0uN< wNc_(Q\k "dO n!XE9ԺgQZ7 2~Wz\3d1g%1PJZe!o8۹:w>#Ky_e2uMկt9bnk*6A}|njhՕlkƯ(-;E[:p}2ݜI ::B7@62*ͭ,vDǶB" KmOgimZY7w}`gq,#,Zlm)Q?(U@vÅVHT|,e¥G!.c{%}P]'@Q;bP^B@ܗ$E{gh},1i .t,IkL2{y@[K\WM B-w%%2<땋8$L馴Cސu:ʀۂPo,< ԅ?+o9*,E;Fgݹ2mdB8a}$rg^U>ǀs3-ir  h% .x뉟^+NKaeS7yrN WFL[v vՠ'$9ooXBhsK&>|}BGP>><*h RNƒ]^Ȕ(W3nt<[jϚH.WtE]Sii}w@THF[S3[t-Amݘc|A RWA'dH݉HÀ>ѻљXG@ꉑ H]G) j/HɍE/R+]ٙk8GRz^$g0\S@@y#DF}l*Acu|a9GIxV;ߒ g1*_hQyX)80J՜?bږs<׵Xȯ&ڭ@4֫  g;neVsV1+Vm=#j`gy125'q5駅9k< %j-%zZSroh SQ鄱e)>®7?K%޼/0V܌ fw%.V^p|׻@>oT|wtUV]^Ty~u'a6M%I*&aVfcxX&?fءJc^#Nj|\J+Mp,xĵ7 EF`6b)=n.>/,|pw6K3op`'^-'wbc7%Z󦹐*v덫$u׺gʏifY'DvW ǥ8D{Ču9=,Jʮ0q?5j%a +'xkz y~V]h nqFVe,X'=MZ 85SꊎCĭ,8\diQD&r>jo9( py0-ZN.6z6 8UtOK%b2&F4sU+95cRdl[;Z62 0Sϧ`͞*pǰ.|nlӍB11^9$RSV x1t/a@DV>l *kTJ l5j3 [(d(}?Wي endstream endobj 88 0 obj << /Type /FontDescriptor /FontName /KFKJAD+CMMI6 /Flags 4 /FontBBox [11 -250 1241 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 85 /XHeight 431 /CharSet (/j) /FontFile 87 0 R >> endobj 89 0 obj << /Length1 1512 /Length2 7312 /Length3 0 /Length 8335 /Filter /FlateDecode >> stream xڍtT_.Ht 3!)5 0Cw#! 4) -!4}]5k콟y~ae㕵EYÔPH /$P@| !+>&d5(ȻO4PH;" @r(@= >* Cʣ\6/6t3 nE43vG(0QCq:PnR<O8 C<`_Pgf|}8_eXnCH[9@OECO#'CmlP.P7i#`-%u>EBh6#XCJ:(_6np  G (gg&u>{:Dy"}2H[_$l] pWw__= DEE0WƁWy}o Ò`?B_4}w?-B0` ap$ձn|7=0+/[/wU4L0'&' x  D ,MW p+ Pl$7tps MV0ǿ7A@6{~߄K} %wwwCX-csNF?;wT·,q^HV{l?J=p$LzrY Űcg}V؎ An/<"ek ԛ+sk -x?v(7_m~~[1?vx ,La&V1La! "lvvDضc۸a NOl$_5z~81Tlq ӭ8b=V4VplՔs=ɝ<]c:eTZgN:6{L@־[ďeT'۽r%f͖lu :1oK7ֽTyK˱f53$[N h 7p>9VO?b+OKF&Q ]Nw!r rle35щݷT1cDy0זzIq$(g[HV}4KJiN?FG6Q}[HmAFkVd " }A3 Gx㔚0mz&|C\0QQ.>YJ9+ΏhM. O;SGіV*mգˏ\].yǷ蚔[O66ԘD)Cyga וy`+!x\@zEʺB?nZ ?27~&}N,}|GuTh({(l d*x,ŝӷ[NkGмyήn]*sc8~1h^潘6cJv ~Mv9cڬ2Z5xݼ쒝J>+G9V~VZ#ߚX}Xp:׮" Ó_'L]9Ƨ ܙZBTFH'Tҍ16TϮTҿH`#3;K и3uuj0qz*,B]#.WjwO",FX;fe YnRĀ?\M'ƌuД4i@>`]8+R%ҫsaR M$1Ay<=hƟ,_/5-=鿭7:=FUأl0KiԍP^4:>ϿߗƼ8aAU@@9\FL82jn$O?7耺 ARWS;eI1J:*?Jɋ&dyZŒ,7^&m'2(?mSX+Xg5ږX+BO.ϿFIpahp@_~VyO}b$C+l*c)96~Tjc0$\͞fq xn8<Ȗvy;Ŷpۛy1)x oyG86\9y=ٚz<T`7:6S D!p)kIS؄CpW r 2#6?`ڠRU;[2u +ԝmf &mMr9a%FTՄ$/im%DM,&,~w|v9d=R4gsoF1Ô7FJ<۟ϤRŢWYMpM5/% n7|m+̤2|1ƛŹM_p5O,b~LGq\2:dDgm 2yEc}\QK2^N<2~^m+aã}iZd coG ;Ng$^ fP-3i6\ǝΡ9/"R6ϸ`% ~vה=5 n +g#t m-L,|GmtjyqnE\ROгC=a{o[DqD9ǐ- c@1vt)OlDBZ!{xIEps. 2&G_zW 3ݙT/bDM,/#ey}fglw%$#% `"CrdkRTX)~pU_!c8;R2Nz{ ͒ *)Eڏ㺊ێbY;4:{8t֙}JސTZGrw%d}qyB?oNFh5[B%nzju}"hlwj:Ϋ4dV@&ŠU\mqkQ.pgɹڪ=I=߆" zo%vl}au'82 E9Ԭ4!JtQ!1,.LcUz!TziQމEqw}_Oť֋6Y ] q dm=J4HLȻtDzm,#Ci (AP m.qTk4E]#'i|Ngi$ZU Jki3.^HYG L7^ /0R?BmQya`YXk>L*9⦧mnjW䠴bK~*d(]{4N s};@48 㑐[}Π«y*I#p=*K/gn?"3l fF$>?8I٬=B{o6zyNl:*R.֎}i}!9$SʊV1U B7]:k[Ƞ3QyK>g7q.Y=]!h:=,:ZxVyC!L\\ )#OAB,TK͎#?>{CB0Ou .[`|$C7i'n^CV} -9;zGZgg[#{,guJro(zTc¯frj~23gLoPdQM _Akfya @EH>}#ak/3tZoʡ"$2iOXׄyXڦ-_X} ᤼;i݇peeUZ-GvW׆E[8itV5yS=ڝ>7넃2;D# >{R>j!GjN+ݔ҅PL@fY~9v2w,݇s)[Mvn<+8 q/¶v]ߝpg/b{O2ck|U1KIOb~)TEg1_p ѧeH-أ͏?[Id0yz.exNr>ɑ9WŴϖ ipE ۭL7= —iޱ 3?8oҫX=ٰyQ& p؃IQtҊm8a"j:1|cG{'zn;uJS \Kܚgs0)"7χ*T[27p!y+kK^Lw46~+1{DE٩V <6oÌ\1SvDɝ=fe : *,/]t!T',VݾORG>'NZ)%I?+!Q{5DɩSY݀Vxoف ủ2#Ukl>ZFG:35"BޡYMٳMTJ^ImX|aNrވ`S)ئɣE 7KYϴp#Kݾ4TP4,H7|x;="PpcjLVp )4\g;p٥:3I_rl_G*+uw,f ?Q@ ?wu aKy|:e7Bd/.,rrՎҶŸÝ]p 䪗*L~C-p <4gk%[^Oå)qn K!:b'ƋWV?[v֣:HWRc(.Eg _S!z<2f|GsQ >7܌H {3hl.Uw꿺ahSSYq: Fmj΢O^O[x5㇈X- ,ZϏ!wkkQI)L+x\9>V p)[&) ܳ"2p_D?G#@?w&&I RqL;K_k$&9nW%ƁwV<ϗp,|x&}_a;CBLlcpQSE*66avO K>7p gw0&SW\y2ha,^Zlڼ:Pn?v5hZpW3VJD*o?yd=KDy3I˝/)zUIηyK4sv;k[\'Vp٨ Oo'$}p\Fu5]m 4J xĴ1<@HV'ZPc%&+)aSS7wZdd>&\~re a6[vf5p*khTט41\@ PDRlr1Z.'u>5Pk!hzFmqk>c^ >vqi9>q;RdړTN@/4&d 2FJYwsjlILe/ZϽt/%aմtk@cFf /OW^:e"yf ZzIzWc+@_B7%fɹեM(OX%hn+$v8fos7~acXF^i>{TLTUРRiٲ{Rwb@Qu]L&8ńnmd7Sri=u4_>^DfkFHR^"$m*o MLĕc}%`M}-MK1<:5M'U$_ws" iWC\LO<#Ŵ]vڽ=MHrcSOBxR9֊۟XJPݑc8,N-h0nĽ\e)mƧ`ek{;e}5b-%%zo7cjt""N`f  p$%Xvxݴtn)К#0 Sl\sʼn^׉'2pg{<*X6k#&Tk=z$?A`+Lkr5-TkFu$ADW}6.&3 tc$rz o_˽@ezk3'5KLRħlY}MByLygZᄀV3]H{b*~_R?^![j+jepQ/|vʗգ rqmx*g endstream endobj 90 0 obj << /Type /FontDescriptor /FontName /IEOMZW+CMMI8 /Flags 4 /FontBBox [-24 -250 1110 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 78 /XHeight 431 /CharSet (/K/comma/i/j/n/partialdiff/theta) /FontFile 89 0 R >> endobj 91 0 obj << /Length1 1366 /Length2 6000 /Length3 0 /Length 6924 /Filter /FlateDecode >> stream xڍwuTTm> " ͡A$ f`h)PQ@@BPRE}}o[֙u}q a{!ʺJ` @"&H9)ĠeC

AZ(, %d2  I`e Z4ܝ[E:8z At@EB!h@wuBP1{]uÀ_= /nB܀#1 O4 pcM@@vrf*DN@WvHW h/ C H}vh@p$"]=܅ܑ_$ݳ*qq=OCq+|o&!~y E#<*p.|p@$%)*-QW _W " pDHGXOxm H4?qn8X`m f[2{†*FwTI  AqK kAyF`?X/&^.ߟAi8A (? woU%GRD~D? 'Ԟ8bp2A7 0(4= 8(p.G!}0eqi~pj]P ~KD\`_rhq8KpG,#W]'k{ٿ5 _1aNeau?*2y .]mۍ'3WeZ2 Q=}pDqh4HE9v? hy1~NZ皻ȢvC=Q4́nڨ{ uY꒣b-Ru+I饤D+fԗ(S{w)qjklX>r&iu~ƪf F{ |*I<_~]X0{ARrI/H -#* V2_R%1jR{~実dYPŏE7R2$s|^Lk%6D~#ݡs5Z=fI v4[aB> l=TY\nA𻐣Վ9zDW4y'`* w|F $'_=꜈z'Ϩ4/Q-sY}%K !Urg3+?QCŻfVYWa^ֽ$KULX9_E4Ye)nWSN<*Io؜_茙Ϊ`u$]=0yθ?#S^l \ҭD&k$Ez%A(3*5٘9l~,.vi +x`z2ҟL>XF~GN} V(kS[k27ok,ئYdq N;Z:fXO(Aqc%< IdgYٱb6O>((_`*3K W&:G2?6,g-=Hr#ґ%m+ufw-`3@8b g~!Ćg]@Z6%u':xiƊj}z_WbZUt?yn÷vئ6ڡE Ow$$a'.DuKut aL^٠#tqAq±%0M`PZ {zZ ^aKM9S}Q{Jvǵ_,$.(0/S.VtnfUfffhe-M.2,$cg4›I3%7IVe/iqj_h~YNfkPR1й$B%^ZcvtfN0`@br|y_+鷴%?bt3A/ץjJ(vܨHa˜3F1@ԷΥ?6ƽ5<n88 9ڔa 8grA= -~>@+h;3\~wx<;Yב -D ܮsԝ1ZOa-]3h$j TUfWnV3mpGkǘ.KjQzE7~ -b>NkixH?ّE.>`|Cxv"DH<Mgߏ*-hYwCoOsN8S,g>Q#tz_A!Ƀ2<]ti OYv:륾Dvqsd.7Zļm̫|T䑣ę,UA6}*3ÌUP(Sb1VqZ:[}O֥1u98$UmubE}۷; ot3Y|A}Wj܈q5PYONBck|ǜd OY8GZ/>q}_YX`+s3sNF5hW׀qvGzܕR2HݬvNȆY'tk瞋۶OMn^˱҄&;=G2hs⹹%vfsZꕧ{6)}-e*3]3GD Bx W3I#,6ܩu/.ӥx2P9[-]w3QsqR9/#O$FaL95XijQ-dloIP~fca;C Pok )li$j%_-9f~c]A r? /~vD a$˩@DvW8xn>\+64nmdw㤨lZyYGnG%J[%\HCx\t LJKT9w?{Yǖ]dQ1_s:&Vnu! U.N9.g:?c ']ّ\FI]wooKo,vjwv2_*8ʔYY\FR <_"~I7Ң7)~E]GPKC U >r@u1fl󎇿q-qfptkۮ+} ~+1J,L: K2"tB2~|Gװ^)kJ{JQ3[arak /2H&3z4Lk*܎pW;aV}w-cBgI4b{f-*bd\1㔔heKh9z Q\m/[4^lnv;i1)[:Ek؜Ϭt8bm(o+B=ɂFZ^i}KLR'Єr5a#RO bXw"ρ= 蒤ރ2/sW/RƂ%aQʴDS#ΌcH.dpP\p=Y9aϦiJ#rv-¯xf&I|Fn"Y~M2cNM FL=)*+ 5>|!=kZ=mv5م!~yYcE Dz]5Q/O`, ˄ُ֭V(o9jSIQȴ)eBJH EEi4w[B|֞;*4Jm*ɶk:?Y'٢l'^L"+"ruHFW1-I6ϸhȓSGGt_fHV'd/`F X\"~إ_ƿq+_'$ݷ<]ʨhhe]1vK;FZ7?tPr~Z ^RfC7 /AF륁 f*dF q30/z?([C- _^j0=;s] rh4τ!H(u(tMuHHb'4Y2 gj$ei ӒaKQl "^g;#iUMGd-PN^}!qTg(>F%ڨ쮕aW]֞jjm-~,xt@MƷ2p~ۘ_k}(T9 M cet~#0n}V*.넹k@VzK2$gtb,8:K'܄bGc.F+4T?S43߹AޣhǩKNbyZi Rb<4)F¨,8?ht1_:Z‹M T]=3}Z>mmjq2A`ģb+$̢ڵN_32r 5J7xO'ɰ]L!2FX(}H.I@L:5٨"S>tƗBpk EA:ge#`)XVS;9%Qzkȩ4avDmnu¬J O>XJmU EX^pɢ ZiNvWҭNk":.UP-(xs3[/Ó~>K'(ܷ6ю=mUn1  Ǡaɍ|'ƅ_]]RK"wI0y\=K}g^", 0,$N6~C&L؆;E@⟔^}kTȠZMt34ܐV޾=cS'=>Ckq[p|y7[抹UQ;?z$ /^H>2v$^6s˩Ҵ!$) x6$7#DcOSg>@k*}=i,Sn}N _Z,6jmv^&~ %V5 zKaZn P\r#D Y-ÁFVwW9al7S{/}FLȏ,e=M{Als43wDvGJ;w]$2 F1H"bX_X-w7K+:, җ$Zs?b+&?o 8OA<)?Q9Tcј{e*wh3\՜DN P{y=aWxM1m}sG #'} k=هWG.{IQᛴa#tlOlkWܶzQ}=zt8<3yTtGMYzj\euïO\Yd/OD5ՋUcxZj?'v6dCYg:H dS^2ыZ%+;l/A)ɧO҇R5ʧǰGז; ͪSuRtt"ezҿwpT"Q"`PbKjwnHNCŮUOKO |9+%UU#k86dsө h5-5{5"do߂~*/|O1GL'%HJ-Un l}qj+,龾7iPG0JI76%o} ʂ%V/bמnğOt'yg(0RRk/ڥsLma_EOU]Ԁ?GY[+d%c%n5]>`sˈy1}jcb#*q endstream endobj 92 0 obj << /Type /FontDescriptor /FontName /QSYQDR+CMMIB10 /Flags 4 /FontBBox [-15 -250 1216 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle -14 /StemV 113 /XHeight 444 /CharSet (/y) /FontFile 91 0 R >> endobj 93 0 obj << /Length1 2616 /Length2 22403 /Length3 0 /Length 23883 /Filter /FlateDecode >> stream xڌP\ и @NHp wwww̜3߫>Y  PSPecr0#QQ[9#F::Yف0s;e`;;@`cceΑ njeP`ځNHTbvV0}КxyyvLAcgK-8 @ ?|,,nnnƶNvt7+gK* 4U0@OeHTuK+jvnƎ@X`ce 9=\@f@G88@MFdc,#?1K￈@;<@s+ @IRݙ` 2ojlecl6;sc \s2uwvbvDh]ANH'n4݃~ٹ̭@fabϢrpʈ,B-:XYYyx9@Ԓ/zu{J |">V@$/'cW `!f`zczفl<~=_51ym*W'*jbd0sZ2ۀT?(2Sy?kAoE;.W_ob[jڿ?jc[+W| v_S-?4rZgcy,lm;L6V _/x`G>8ӏxV{ߐ S;`h=qjt{, ;g \鯉rsXD,E7z`x,"Vo`,ҿE7F\~#p.8oE_oF8okF"^p<li-M~#p_LM?sr\˿ pa".0 xS+Kbk;_+bfl` 2p>ES <S;k A?87 _z;?&@0t8 ? n zpv;\o59#߉s~ϐ{?!8k ܞ\`''_6@?&qM '6pʿÂ,Ζ?F 0< ? 83?{OyK8[w MLkE޸1펽JHWx#8ce[Zx븹>%^0Vuria`OR jqY`NӼމ)i1t$W­j5\H|a.vmnvw+`UؿauG?mhrPn">nlz+|iɰΣP]Z@ %wO!^?EضYYu@=SQر19o!5[դ3"ВC(=6'MSZ4 -~&bYăT>nkeT|P~=ofFk W gуAѠ^2QC; pѡMuOY]NJ)R" og{M(NE]lѵ?lv>1ʈS,* y/~X/!t^ۮtG E Ma>ԨH].D66M~goK M,5{//Mkn"uKokf'#08c'Ҁ5׹L- Nk8!et )Ņ5'ܥrT@eoR#w2'!k2S1mё}1D0=-0K3XS[C",seBMvVLv BֹNj."@sgxvNzMghn\ n?)^Tǒ'|2HXKR^Zm׆,/ֲ+뫫ӄx Ga;޹+ p_wXBGNinqsa;xLJūv {5%_w8oiTt%K3iɭ>VۿguRA^!K|$Ջ{ aN0JA:!C}JGyEh_ꇜqTf; 2-ZMhfr%2%CyS<^ pt<5;EIgحa B9{/K\Jv 7}j+}!jwԲWαu<펡ȋ!tvTWn[cLRa% ɟ $)ۦ R}ϫzж-_$lJȿ Va4EDk .[2b5JF@+g0Likc\RɮBUW~v ʾG`Y" rhwňƋr;c(lA$l:I1kX5ӯ[FB_3U0`bZ:Pwɿ6>UĬa]IIOhE{rw9&_c;4lhm,*3L*"WɚJgf79UG|e[ME#8'NfQi 4n|򙞄0/J# rK\;>+HR[PNj,Xp{@"FK*_ !++Ep [ɥޯٝYZ e ⦲X!Z-N d}Cz7)"]0|޼&RQb/2άǙn` p.?SX]E#O!#)gws'ْB2X咨]9zeҜ$UyqOK"bӈ=yf΅ʅl{Jsn ɮj=zS !A:66]~ s2/Are7jqhlB_1('J\PXCs0m;a3!fm$h(^EBolm5 oQ >.)?BԐ=zr1-5.^RWEx ]fqÙ*o5)K)r RCxC3lA'z -+@$T=6QDiX+Y#,+LU|X6q;|[0 E2x$;]IDa?CR*mDI2\X#$QVJ$֍9Cq൞Hp0t9Dq-^=mJOݱ%r) ȶ>_;@E4X*qUaDsԫz7/GJ:֣Ϊ0uVg^UQbUQcco:|\ EU0{g8QoYC6s|֌Ύũ̩h7SI8W! 2/)-sL0uZ ڡ,$ J,kg`lWiDR=qZ,'v m^!mBL8T %* mȸ/dW#A1hq>q/$A*wY*d :ME&@ŽK[v/k(!va @h'CsǭO!ݥ "g5K[bl;:$!1\\dOTE!Z} 3ܑL3jhݖ1VNxm; adH֬)2!h9̀iJ~h22i܇c=)xp`\$ b\i~T[K馾I>fztL+h}gڱK-&ڀ+H4bB\)jĭ?+2SpRDL#Bm h/!('@:^F6PĕF-426~5duO9x%IT}=?fo|``y(,m❋ eU CW/ٌ7w]'ht{V|җJ!˴@CbI͎ 8\a0f\6厛P|R7Ay02Im\E2]>ޖ$][cZu"ڟu{:/m]o \aOHqVR ߜdzL>_`FUE`MuHd}w#=1&ygu)oczH1/bק}\>eDVe#[y9gwLԃyrFbFIgCNB-íOpU~l+0,ugڑ#F.i yN^YYDŸIfO`k?x6O@=зA Zܼr iY,:6j= Mqzr[7#xBן" Ʉj)!?U`aw~Vu[WFWy^I$#bIQ &YD9ZגIseTbEYV%I9ܮjD:( *_9NJ inNn{$4p˥^7 XJz`n -뒔{8 pRӲ,v_s^}7ⲳ-->Eb"P_}a#ȧn)bճ$oo f⡉ST.3ܯ*}_i2T8M)H9HFJM0OecY(;j|'tP &Hu]&ˮCo?gBQ۪$BFQ[Rzfi:ߩ9+2v*k@9]\@;yxe27u(:5I&3#rb䯪[dHUX` )}ӗM.h|I_4 hL4qaRs2)+7O|CPC2>x^ K?\v$͡GC׋IĄC|(Hpu0(hZ w@.HosCejC&V+}^z:y֩aGڶ}8PCf}O;ͬq!I6]IK<ӓ%{toak4}ǗʮYrސu!㉚k11H_TV4.- 2Pm *qu,$Mfq~ضc`RՇL[KO W~w@%~;G̱Gdz@ 1_LFKx5S}9"]~4@p~U@mWhHMP/^s ien*S!Z!, ( >dPi݃4$>9X2+w &z:"Cuyp}zl}^ЦnRWqd]lֿYA$L?| b@T/\"O22ФՍׄ@=F8&-Ja2͊D+u,UJ2<%نk޲O|RQC48f'FЗar\jXƆ%/V\<.#I?)Ua J,zp̖U߬X#̾=/Ț [n}ԡr1s8#<\2]I[n~P=V#an67:&dBX<#d[`[Ut> YIBwlK`MU lUhRySs;=M22 tdɼ=:#3!ZeW%;_)5_Ǥ3Guv!b Tuy)8oBuêsȆasOn=2h>O΋U-u+cth>N4Ʃ' CI"U`23q ࣋mSuJ.zGexyn*l2Μ YL¶{]4iAJe߉vD#9 xP2]A~MtK9Qz!{L֛AHFlKed@!~ckYVSYzm.գm_߻ǣd? ˟c2vqң׹!ld؋w-PBw:;ZlJljO.yP4zp!i)M!,quQfR:,eȻuXhnQO.}'HX!o/lZ.Р\]f}o' {ѹXVAO?!Kӳ/Q$c##­'Ji_I|v0]7aMe䎀zw⭽Q gD Yˈ XO ujhu!8\=gN0/uz2KȺ@1E Ja-n^#hQRwXaf曾\h#H\AĥfZ1ӧj>]ӹ[w)~PJ3d\!0k5 /^jRˀǭ[,&i +rmZOt]i3 n k|kϟ o;I|J[f'$Gpڄ'ڿtԆs 1;8noX|i4'qP炙]NG9Z&m#ƳWb\Q>I κi$g~ mrfQ[C V%lә=,x)wh#EKbANޞ]ʁv`ن(CWQ8ĴMޘM3u6HhRL#H[ Xp)Y~9M_9Z)1}r{|Kwk"4؟A'h jKU +?؆YI8,*q=;w#SI \6\<NUyBzTcG%?}wv( v=7F,p E`%_Ν8gf`x#V'[]ܘ^vϭia8^^9&Mov}h\m:.NnaAI\G7Ty'K7-/v%a_t0{5etF5NL-\,P!K({So2_PA H`@VgIkӔapEthk.J-J&zgr/ڧcAp3KveeR搔:CuR[Fվڢ\,jޤ19"鹟°R޾O>mgo&n L쟱h_^+S}8U/4 %G/t {ےJ[,J|d9i ]%tB78n73c|Qa3VȈBvm"(oSRE8 Y4˸(|_(28$m0Y%Z7¾ⴱ 2bgd^3s)R ^k7cK"Q(ƨń/[p [3ڡ8[s!=i€\Q/\wDOkCl+|˖rUqģ[۲;*ʶ_!_nFq՗)F;ǁօ|&C*4PɍZN@cjq؛XRM?>s&k4隟 Z7MC~d_M[ս)ݔfFl?Ȯ,`lBR7oz `E{kRd3o` q~@6{.Za *iQSGdƑ,eCÒgʧ&u7{VXQU1|^։3B;[DȆ`wR' QF[qD<$=y Y͢HU6ͲtO_;wӛؾӲ<7ʰF)pT\kf5@kN޺LitXH~io u齣=e,zTAee!`v-Ac:<С"`P3/$X&YIrJǠw ߾<8ousQ7UpB\n6G˛c"bմ3,1CU ߺ0܆ \`/.t+S)ݬmC#j> 1]AdGGA{i*HP%X}x{{{si=O) {.,3Ǽf#nh%O#=Ї;UeU﵌&eghI괾|g+J:=|2(%WK"nBQ](%G U 2R̾y&+XX3f}U,lE7R朊/%QÛlڲ M%1mތUXX'|9-}[Hz+OvR ޻sWJk{aA8(RNlVSMex/{+}V+[-V@1"2)j $e*dYB6]EiZAA=r쁏ро[zRPzw|K 9ЍE I#= 2>){%9A*C xrsk.DC:KI19rz|]FdnMlmqM`.ӷ){l:~\@Jw8*a'6pV0%*2'H29@Yn0t>.#AL4&|%OX}7 vq1I>=2hTq!jKXRGs1*_NTmV+| iɥ\m?U#J]4ݏQî Lesr[. !QBl*yQ<=W='`bBǻ/6`ok-P0)*.V E'&s恄 3ٵF.Ȩ>}MY*. $vk(1ȯg|w9P-GE_x2P"$uv}MYtpU}V׏Ur<,r@Sf[1DBiȂWUud>h0MB.[-9wJBSkB6=`ai g(.&3[\DHPqoFC6!)VFpθ1cK1|m&_{\tFqJh,UfƖ>("Rw.麣9y2ɟ wi r鲕uIm(&\:ATlv7w5xYb&L8S4q?;Byj6Y5+j yQ9#-#rQ34ĸ2s1DEħ1$8˴o[ DB W D>_EǨ8[AȌ0NdRC9σb0[N&^!{8Jg sчZÑd)ֲ&@\Z_d@EKbTðZ^l#tOv t@eW5D.7"ùA.DE$\I9Ub yUƃ+̾H}^)|p'h&p2}PсTՓ'isYSf:'妠K_\9F O H`o3@x+nZ+6'MlTc` R[ (ZlHi$?5| DI7Q{O Ѿ\6r uwFd,|4.20!<y2BoT-BfOWFBt议pP +kZXeԻG'@_N W[&H5mGhk̤e'ڒ+(;K}8mMѾ{4C>.\'i9'Gvf5;޿(~ [MM51+@׬<2gfw뵧U)9WkV>dҭ:2F(޹i}vT'1Bn4ۊՐX!c* @B W.XdpC{-0 \Xd$jS}k#ƘZaǰmdtL52/1[XC<BӅ)$dh%5ĥ]x<:vTK@ KpTՕky6tuTVt 퀗R^x Ocش9%/kͮ#6 3uYyb 0\5CӬ"o/VLW,S=/s!(v#&2p~r䨍]s$ԍE("47Wf"=&I:q շ0U'Zl֫tb`^--_+/Q*4Kf/V:UG{9:Fs(a0$v,ҍ9$*yR%|vh(yҵHh]vʯ #b6Og -gvd&Tav1mgTIAڥ,X=uQ N`cJzQ#p&!t{4w@Q'>(~s#"'K3e@|̏WՃ|]~v=$Ǥ-U~:S XƯaGɮ~+^-Rzm%tE&D ⓸nQ輲PLMЁVHJ1=UCjDFP>ĝ͢^7#h^1V\-߬.?܄VkinjDuICCq?Q z÷n )D6Qp Ff?ZI$zc8)(=J_8O@3Gqp$nPe7镏49rMKNǤ6J G"Z.cfy, % __B8@ql217F}wz6w49Yr!eף.* 's|("֔z9<>YS|:OYn`r"V2,d!њiXC=c]ۿΡ!) r=eMm=aܶɵ'5tU[]C#_yiռxsZF :ֳ~8B=v%RIUŲ s8Hdc;&CLݰkO,0YNo>Qԣ)M(%^-qϢK=RHoh=wn&xǶ9@7ǴSLLWKRCV!y5rL'4MS<r_Hz"dٰw`?0=F V˜PVkH~`:9Qb[QۢeΑ*˸ߑ;|3D|#˄1I+88i3QsQG]ҎGőBn/g`5A =ʆHZ|ή4ÚBX/$r/_8׭=5Ӑ@wO[6dS y< 趥)a&aJVHF ¸R0Pvqzgl=RrR̸2rBUwKB*Ettw-*IBw1iT@׶ֳ> d7;vnC ?fBCՠV6~0Uqvnp'/98|)BDgCi0gBnBNĠ管zcD~w|7b-ysl/[hǤuW (AG˹K|Cs{a= Ɇ+DÝtQ9%;.$pp桾 xu|&SVaċڎM@~)q)EDPLB I~UA"Pl"tP.T Bm_ R 5U{ Ө$%->S"Z"p\vyM)C[nW3pux_&iTNq\"ot.o rl4Q. V2r!ܹ>b:)li~B hO] Il:ZSG ?-`sKLQYU"T˔,έp%řr䙰aJ{y< gDea8$L4F'ǯg%N'1xއL8M^b@^`Ol# œ/m%{Q1¥@~LY{~cD2?EC pJr@[覞4ZS=t)a8pI(tA ˖ZAÏOÊݵ`䵸y-X5;,5.J҈pc; 3@SDہҎfO{xqnWR MsI#I780G M߯ކ!a{pXw0kX?n@yIQ?\7g?#j;QȊwk3EbW'Oe GO?"džrjlogOtw7hn($TՐ +^R'rFDSÞS-2|w\k ^/4Ă/hlInJw+W(Ea (_|t `X~~,QhF`kFK ݆'ѧY%l*>{{:\li`9n=EXyj'DyMI&1wR4i'Â@O/)ޢdBfo@k()Btl߄#t>%eGNu7}f,W9q(y "ҪuzQgϫB_CnRFHfgi )TG +ƥS83jr>I43<$T2 wO.j{n)=4@<8NC\ _ADjI*p (Rv,f`&}_ܪd#LVW mq,&a%)(aG 03Ϗ"4sZ*9)o@SH %I 8? eއ*J܍iUbn /Bm:W9ɎsgFJ@V[L "'3_% 0` *?+Bt?7$2"89Jw&#[!\d<[m 떞muфVŽ+Ȉw-Uq쥨a Z -߬N_܎8%ܑWs$ZgZFibҮ~u扷LD{} LމS[̡CieS ` ىѵ./q"-_%oOFI8tnLiuNKyCaw v6c`"֬6oL`Ⱥӵև9+Sp7 v9T4 F| * !}d: {BwC˔E9rwD55)[$B/XF vVUz k0t9Au\SVԇz83gߌ4Y쐊}Aa֠iU({Ǧ:) ^zRP82SN\?  v/n[E ގC HkTU!nFnVkF+l՛qYJghen P|KpqaMsu &.GZ 6f_Cb0r\VS\tn u?utd@'Lj?AFJÃՄ6ӷ6*BC59gAg-d@ؙpƩD?[# 4$Ʋ'_.t~ZNYw1C/L4bL~NDs)!cK/#7lK^7ю4Cy8uc?V {aq&X ;TlOсN 9Ӵ V߁ple6PjP7Ja5+.rkX[vq; ! b3̗^&y]B{frImآW :yʨ%ŤIƥI Ml#|MoG03/?j#W̍yt43*<umR|TS"f{(TdLـhXa6pCRboq̣I ",B4ݟthڪ%s3$ײlAQh{P!`cf9z>a \uvgUܚpF 2!&Q0f֒FrmmZT(}$[CÄy>qP:t$Ts@rc$8܋б@rI-b]R@ᔄNYտ)ʶW] ^ԡo~-{)Z@l()Z ~4ihU b^rdL f{Q֗VV3s xa!=MvEdz-EeeCxsf#+?v)%ll/_h⛚jٌBp UA\L[«cJ8M|:#:k)]KƗ Dy42G 4CdDN`1ys5o-Zf%>v9ARi99x?|IOXtIf*DP*N!o9$Gڕ1!76}hVd(U.SSKE7lzewژD&rwv,46vW_r_ڳكU- lNT}vJ@Dq3l5OY" f , B儡m:"iлs+rӲRBUsXYfТ4 KſPDH.(azwr:& Dd}:*gһ7lJLax\af 4FG Yv,0GKP+YMTLQއ]~R;rxÊ m-iYX$i?(b J,0#XR.*3rr%D>&Nti[bu讛@VeJpݐIuT+΢ ʈ^tA tc,X.fK-?/OY+iJAFzZ_olt^ԳI{n<[mu`%#PLfDSA֛Ismze Gl!3$%t4XaQMVAJi ]s9R1$X{2_ 䍩j.7WOwR.=@6v2 ^H2jrKx:(2*j`0-<2¨֗of|Q/8ƁסoF72otP:0IB 0Ru`z'r>`͡]:B(haI>S>,˝斶esYTf֟ZA?/+Qpi'i3K h3=M~q3HHCdGR2j+oAQo‚x;"$9D`^V$T3ZWQW "*ë~jn4o:'*[ǷX%NN)Y LYikt(!kW[}>nFuC{ u{q>21wI5 /s,9h2E}J5x4۩,t;yLb`++x] y,<+Wa{t/xxӆyr A\@mra"{\`z7iNgm.Na(b2"}մ ى*hQ=J ҭjmF H#4Jrd!: m>/\1CGn%x)tH u1K'l=W#'NĆGR wJȱ\,DFW=J6MAO #H+uX|K9jowSp;e[yA/*h&ʦ>(JHb( BRp5[]O"M6E] 6G<[w+m_[JXM0̨?b֩?;_hZ_knaWi\|&63oԃn~YX YIǭ(́qI,euDNHцFȂY{VcGṢf7g{?ށ4<棋:ȩ451.@eed( q 8F]}Fse؏RP oHL&NhWc%.lWh뻇ҟtq<9M{t2?MvT64${I9-u[q|]0.e;¸TX3sO G!.إ`\/10]XV sT\Nݧ+9߱/ t%jݝ>Ggd;V蓍?O.K*"B)" zXt&FƸ 7zTɪ}FԻ;5_sW}ZSGoJ=%Ki kve ׵i$X2S;94!W/~`ƭf!\t ø}Gج_Vf]Uҡ/-S@mLiE%b$QmVcnTQ|*vEdE/EP[ipe+An+V%xCj䤪S|[{J`r!{H#pDžuf\M+Bs(}lQgO r'&>f.`E\WlZ̬ k>G8%I&uOzn7Y;DlzGO=l ŸAv\`q@(л ٫6OCF)i$>Xm-Z{ 'a0^? @ q JrXq-_D!:J r "5]U=BgCWxHۿl]*"|o4쇁 4u^aoo$Ӓ|s9X#Qvv݈+vQF@~/ ΛF*@V ,!@MKNJ8#EOFV-j Q*@~fs a^ 6Pu|p [N:\-8cͨTײɮTq]QLfkR& _e8V-UnϪkhMJzr4O.U?eUzHپ&jb[u'R_>X&H< Ro)ehτԫIhqھiT̼K^SxxLǢGpO5c/(%I{誦Ѩ,Dc-j(UTĨ)?ij #f *jw _\5MؼI:@8Ӣ Z[ܳ endstream endobj 94 0 obj << /Type /FontDescriptor /FontName /SIACLX+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Z/a/b/bracketleft/bracketright/c/colon/comma/d/e/eight/emdash/endash/equal/f/ff/ffi/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 93 0 R >> endobj 95 0 obj << /Length1 1413 /Length2 6283 /Length3 0 /Length 7236 /Filter /FlateDecode >> stream xڍvT6%1:I(FݝRc  J" DJBBI)I%yw=ws_swLD D!1"`Q>s8 g CQHa ^ PH,K˃eA 8$# -T]@] SCyn|@~,''#;PhP 0AJ  |EQh7Ea`40/@C(hCmr@0 ^? a?py5@(tFJG@(7G]^0(&# ]~9B|Qx?q;nT1BD Eý1p_~_E @_hAbD ]H_\,p?x @2r  Jn mRzxP+ Ba@ Oÿ% tC1@g ';^ sCO ~}>Bz{b*ZBmRUE"2@q) 7C'''\+<H , M?/V_ AYo v0⿭:~3Tn^_"Ws1c{0c/3@e'ïҿKj (_;'.% ѐ ~xI @1Q$ ]QhyJ/o?1;^-4ƯojK0X GAoxua {ҀߒUvwLC."'r}AyQ_y 5YLcIIȩcR`bʻ*58N s3O7|>~4ƅ]Z5K&/(O+>Q;|t\.56i\;S\S\Z{UעŨL5i ^\W szRTS Ta]{$;ff?jb=G<V?lQx^N]vT 7z;tP20f*1vmggr|ib{If ԔJ鵤w!d_Ӗpn1U0ÖjZFI͂#FÍ,ʮL$y=S0'*9kD 56\I.@ʊa Ejq7#utO8:bԸ}` ıG:{q}0Fs½+OWx2^GU&Q$8R&6C-]s+g[8 Yu`B1@eRϪŲZt˸]]-4+o;Ͳh.Bp7<ҦT`B9^V瓊OCY4y9>v )Tm_D`>اJS>B('PަbX#%q](ܻGv8肣wc c]8vRJYm^*~咼NSBۅHg<t|RB&CWs%3箽~&v\%HX9xŦ 2]M2W"c8":#ȴqUץ&S+L67Lwg bk}_(""#"[ {&HO92}I/Nr$q>6 qE NzI:U% 6'p#p,6[ vCt4a(9DKdpDWAܚ7|^@p1vj;׵%?]fiDiRT+ÌքvR~a[K幄^i qFf!X3U0f!yi! .FmR|9!'DވG  O-=-sEK0/4߷؄fqmu̵O`$lT!Ѹo[}Ћ>w;o*XGYԵŲYc@en~j0#4{֍~ʧ6g۶,e)q{rd$_vwn+G;A+CʹF%l''!!:.Vr@eK]^媐W(d\9ˣpT.qHO)YiQzp_J5ȁ.4JqtD<(gOuTQ;w.9Z73o2~%PrQcOq*]=V9qHCХW!_6TT޶sW{N~j7J$b~rΉYF.aS]lCģvE%KD8kOl*lޕh!|N%H~xa7GxCELlyJƎۘ!TA^|z~ hE~=' g٘&3REv' T5tVv/_'*af6%xٝpT}Z gHr۾bgQ&٣xa&w3S E(r1%/Zn~aoF1~Ē\ݹQyf~F $_ 4s笰:NP}9,m|9;\/MHXJrM=m]N)Yv7~ NU7Z8_ʋ\.o\Dݷ/+ [aǜ6K y3?z߲pkkLhÜgHMObr] *g$r7՜mJy=q`+W齙 c6۸[g\FQSPNr,<3F ]޽Ș/S%:LE28cmC3_\o Hq%ϴk&LfniqI&܌flq?Zάh{g}VWF9c x::&ֈwreq0&YMk-iU:.\=8LIfv-;?t]5N?"ӫSތ4Wc! c <WEO&)?` S^}+~eP S|OUʗCB8ctbys5LJe#)EZhq'C,4ϔWϒd#Kn5 Wr7ݾ^W(+HoK"^!uc?6r8|U^ؿI^ $Qsi&lT[#OJd/r:_EDVe '4gm5\ Qk#~G SsPdޗhእ*C\}ekMaZ+ 5mNϐS/=bvIxcEv\hcyp3TǁxBسEIUvcy536+a!39̥m iS@Nqy9Svit5bFb9S %:k)z3/jPK8o)Vm7~o-ؑO6Çd~2oƿvf3`$RH)\/vz}U2u0=דW<_mì(YK$ )5D nsSq7բ`9Y}؉s }.6'5oMILd_rlM_oU]2ܣx{k<{y7X=^jM]/\} ;:/e\*E&r"FT-0kO0 y놚f{_![tY%zmA }u 7;ގԶ"Qe2qs]:pӗ%n0M$FBHχS6(fg^vjQ~0tKrљNB0y=l^FxaM( 76ra~()Ś`&iKh&Rk2v LE/ ^t SuzDqbwk6/!-U93ejzz|,xM#;mf%**ϏӦiw˽EoݲxC$f/Ol?>6+{9o+}ei+8bl6{ڧTr(Tb+2Ib,]]NU]HQ2".'.#zs;EOg\W+}v*bAI}Sŷ]/oKX_MTɧ <+~khf%62!-ؿ&j? IaQ0^5:v8o^y '!Oxl;F}촬E1J"uG1E G U[cph\4mNw.n8?7Du 0lu 1}x]pW%2ſs|#'hE{ _0~ű pYlzi1#IS2@ u>*P!Cn*L>7@zAaּ,-]cҬ;[$Avɡ\y")􃁷 l*_k5;Uwm"~\0Uq=0*vcb׵s jHY>5 mPLę錗v >> endobj 97 0 obj << /Length1 1446 /Length2 6616 /Length3 0 /Length 7590 /Filter /FlateDecode >> stream xڍtT]6]%)Cw ) ) 30 "%" t H3RSZ߷f{γٙ a (j  Zv J]AtJ66 "PBJH ,$$# .P0(ȃ] ;:!Pupq| 8 жA8\Q7@0;0\7)AAoooW!7p<@p/=\+70v!mP @xBApn@ Y>O NgD``;;  u8! rxP6^6`-w6y} ߟ<`7 4GV+\]APp} qvC~At4=AJzTA$r|%7u6VwP@` @=AiDv- %';J rCFu }Dq z ƼmRPEbB@uwVgmBdT:@@_0ן :0Aho!$&d, O䷕ڸ!Q,D&B >1 {[6ɐ:B~D dF9AzJCAz05 5kv.Uo5JRj5sb8Ɨx$A( `p_:<ῴA[z "Biaf 7wP%^ Ȏ`~f'̹Yy<7?rTf7<'1n:wu|{\'r L_q#[R[/ &ƩNJ13m\`6wj{'+8U+_EoUk޹*7-fe;CÂg!?!>9"9vˤK/lU8boHأ֌|x_a9+54 dcpa>&EK#IҢZœ#{YcGDn V"QKl{8QC\z+^FHnF}SU ܧKK#F1Z K22䪭!jR\>zziZ?>sz.ӷgubSR5)99yPcҿm\.82#InCn¶w K&LmP>_LRo=*!2ZWo6y„t`>X-W.ژ[5Vлm}$9]/U4~ʎ#!z: RvkEVMNbp_AgR$Q L #„齙7l{ohm4."⭱l ᘦgѬ!>h=- 'O_ ԳyJ5S·ǀμ%}`maF1 IezIEDC=-H~S;֩,]}ϥڞ獓 'si Ot椖l|\u\ <Б] Hۊx7K>J:̝]Y+lfhz}32UFg{m 1wٔ*]XGiJjfil0x.mbU Ζ-VjA2ʏz zٛ C\!{^?BbE}۶ᘘIU3;Ӭ[xjK d?R!ӂ)SM>;naz>&( BxCHEx_fD .SP` rHxlj#5 Q6Kx.EHpD%dHvBz8饏VKGld=˰V뉉/D蔒rSc? >?S!ѧP8kkUKٛb};]SéqMOULbNu}4"~8?s5l|03{!cs OpBtHv bRyp6J&W;OVUa]]ɕ:|F4;&m-/6A'3i3>Id>" EH=EA|T\+2YqYaK.嘷yk<%u^k?;*>~ǷWwh2ewO|My@q/qagaaVvo9-վR$G Nf&VՁ)loYS)k3knx NwxE+=VlcItM}-[f~MGx8DO36iNuڀo_y+[e$Q2e-x9II}%]-N 4HM]]%(1 W,^Dۍ/Lbq+TiSvcN}.^T꼾m.WTLJyvyMx:if ՜rVΡ&k^۾,YQĢDYN }BH\qoYkyq 2n QFi)z&WWXb']Z2&bw:rkԯݟnfbp#D[І̓^g$|_O`1{l;?T:#PNSg'Av}Oqzg)jF:A'|u=-u ZCVRO8{ *ݸy\<|kYykʀj{Z6_m?j%ҐљYNw2XrǓ9;@qܜBILQqvjke15HÄQjW(}Jϩw6d3&'ت|s}c|TH`ǍHS[#D5')hY^9_ː2S6[U PvCO_/J~%9EVFўq̖ tM5؉pLk2Op d̡\&ho7p23;E TE<&m57tM_YR֬ꘪ<W袆(g{ۈ i0*z̄.iyN*}Κ YFX^nkb ՙֳDd:Cw'@]m*zxezZ}+"1JZ &qɇSWjt34*7&SC:|nzFːїwoWe X2f|k (/v&Gc#e~~l<:hBX=:27xb=PvC7.!t^@\? P!R砲hIE-4[R\C I's1ˆ*CZؤ)"sYAسEI5&9)?BoF.}. a |zTqg:=*SdDNu ' O/pωT: G5S]u"iO.CpM& &ODNdJ[ĭ&/njqR6Gg3uA >uh=|c[>}a:@<æO{wĎҸI_쌓"5\@oIأ$ X]č o)~A:2 dgǸg.n"W*5b9!lN\Y1 y3*څMON;z-H򉌢մLv.'l`յ!._UJt;˜Z1i)Ð8oo!x+5w0bJ2a܁32-M̠5f^`|g`d \l:; [As=^GY_BaڗmpJ{бϛ$^)сŸy ղO M⮇O~!&@?),:knnhu!QQ^"u݁j%O. g!y :7R gwSq9tC cY O5#/՗'eaTKzl&q& #7sp^!Dk lhܖ9X۝UuU2b7->~1Pp",:MhY3JVGaǵ%;'XZ}oxh^tų&dz4%;^mݑ/5jrC;j֐tnD_`KH_GR=G [^J W^^-_=b' zyL!so+9g1)1tD}: F>`I' vyEL/A5geUgWN^\ɯr]t^fhn +߾HǞ-- e$0;6jE(Α=]}ksa2e.x`+EXbOp -S}#hm7󈢡™̚k$vzw){|x'Pn% Vw>kTqg emO=\y3;4? [#B,"8Ss3xmL8-l=dMʯ[A㏑qs]mh}%F)#輟j( r)쩸ykbd v$nH1k7:bdtˮ N[UbRe-߂mK*H-T |r{*Upwjznd>Qfa <tN^6{XӉd| !o "S+B)a.M7=Š<|U5-s P.:k_KXHm Q3MZ)uHe,9<*>{ 'uaU+YuaJ"A+]%.rl=Ƒji?4h`qW,#Ds8?0;i޵Ѻ֤N#SU㚄Onՠ1%~{dw8|[ꚎʓH7D%W ":CVtB:xw]&-,M[Yl%R'fg:DDXry;Ma~r';3t4&R}9.Ježjg1Z(ؤ_zm0ʿ @.VQLJoY2*ᒊD@2Fp#.p(Lbú^:'w{t-ǽ*Nlx endstream endobj 98 0 obj << /Type /FontDescriptor /FontName /BSPBRU+CMR8 /Flags 4 /FontBBox [-36 -250 1070 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/four/one/six/three/two) /FontFile 97 0 R >> endobj 99 0 obj << /Length1 2244 /Length2 16353 /Length3 0 /Length 17691 /Filter /FlateDecode >> stream xڌPk # P%@šhq.E[q/VaWgΙ$ϵZ; %9(wadeb+XXؙXX))A.I)5N =?N@7˛ j `errXXxcvH|`{3"8 di?3Z+//7Q;`b{hfb P.CA#`dbve\@g'9t&vcB[%V[8o[x P(9e,/K`eb/ݿ"lbfs0[,@@< /C[g'7HLwvfN g&g_2EVdI{sqIfoU`6`7{=[-JՁY śdaae@w3+=+YxK} z9|\\>^T/Bde\@K=71_N wXzmn.8 W%&vx18Y,\eoo gc(co+'O  -#(3,,fooo3HK5z[6Ů.o~ k+AvW+b-"Y 4WYkӃ7z[=P 0ۮټ]%o[|[ )io6k8&NN&oC/ַ4=f&{˛ -= ~rq_!. `xE,f?OzSx8Л2L ^uc1lf?// ]a`| g'[ɬ<.?o2?[&6ob盫[K'3ow~#sxm.k+~kQ7f?e#wtMmIy_{Kטg}Z99@f`[?* ?Fvy;ß owO޶ 5?91=oFV2?%~c:+l[C\Y?N h86 j%pcJ.:#`V4i}e[Fd븥G'8թVąIǢD"{ώޚ6-9K[ﱩ(|K5"usXGYpJUb3lAfJ N#{o{l'q+׮(E0ab,kC׾BAMORỏM>o203DD*̓3٨(FAvK&fxܝ*I;WŐŻb]P`IE+<lm;36 HWS病Zֶ_,gYkex?Rjb`du,EBta˽|\d{x2w?=I2Y`Rl}J2nbّ(CJ^G|zY ۹^i-VY[eGpG0+Yh c?E@FGvɽ`Z5h\qY*=A6Ȇq1Z,'`>2e؞Z)>L: ̷vc#]bm=..^їE0*%AWG'Q8K 6<ªQ )hr b )s+ gNm~18}]Bav ,גtSİw4)lBtQ)sqQ ~9ardk@R_䣯}.KNiӈ=5"P겴 Uh͊UO^͕7?"O A$?t iNɴz(u% ox`-O?P.ls.)i8yֽL%Q|\pJ,ϬvǂfWE'fk˶HFњJa4{~Cr i5ze~44>x_{L+#FsRddzU𗞇 8=~*b$mZTwϠ$,3W̔g#ڦ[_ }x"*/T-!E*gbq<ⴣ4F͘բ*;b@n.U ÏTaApyB !^)AEl!=I:3`﵏PaAZ*U=F\r9?D?zǸ_ YY4FGrQf YN1T[yKEa ʳVWziT(XRk +ɏdx}7"'Zfz4}[떧>@$4*mKuJqVEBDеUTx,A~ȗv]ZER+ Y`a6ZksyN|աƋSs#! }*vr'jg- z;|mAy/1fi95/l7 + d9WǖU~=q#Y{.4BhdeÈ^cD1M%QҕhdW\ओLLAWǐn ji4M0cc!XV  7+OD%DT#%p; DrSN 8\9Ikʼf>X\ƚd{es&zP%S+ ATo[Ǚ1~xD'GM#=;0Svsp%gN4֣5,W$Q&ݟ+ [{;B~K߯w CAmUZOZg{?8ظ)w9"Ek{ǸZG8ǿ5y%\7 buOB%PiHU#/=pHiS2V9^EPM-c(09)'H>kz9X H$}rFHB/ȐHyjdjsAI8TV]ғe]RlM}Sg˜*SW$B53c g({3a)i8ib8uuQ])٘Lҫx!U3yt̥kVЇ {;ic>6C%/ c~؍9 i;T#rڙvro7 /;{\y&$H>#2(RkD;t?#'xpi(C))a)G y)g9\e&h630CD*gyHa]5 4XڡcxC EgGbӝGza l<| 6sC]Mk!@chx#/IL huI‘PQ ̐vsm:C'Kt,|B_$}ru L;f1.f|FEjnnY8lzH,8XdJ'luRϵ;{o)2DD7qt=A`djgvȸxi;W c!fuu^MHTW;B\+RZws6Of#t~t ԁ7rY [-^_ȇ45P]C:,]C]I<+c] :i~%)z6ruZW9DbVѨG%̺Z=>"^2)G ::_f dL/zg-"DE #H2>T˰aMڥ" 4[=W;L]Mvb*l.P]h80C֛ivnI4NYjJPaGHoY}(b1').ɛxs&]E }+<|o }!&N3Bp!"%k0ѓbgz:$m7DOIaqcqŌޥ7 N\QwnU+Ni(nt% ]f6سZ=vޯ)@,))ܣ@gjS6T0~7׼lu^ Z, Z{x~ߔAWz.iZ"IKELm̪} Dr܁ew;qF3@xىk,47lgU뮗abXHkցV N,wvK!3r~jJ1yMA3[ͣq"ϲbF_  K< B$ι!)rz Cg1A71F,Dc?Kk2.~#_V)zp.3A;8zK:饙cG~n3%FJE)H$<\vO(c3*(0mCyM e8lv:ixAnb1m5w4Rrn&EmU ; _%ix.XN<=1`p!B{,)Pi\9saO|ݵ،FP%8աyYʓd~an;AHLJpl)ǴMꒌ'>Dҿ/thx۲rlWi1yO16r $_Ox1U>*kgyKtps_[&u,FGvH@곶XG#o^CQΥ7rP?N0oEݘQjGy/-҃Յ:!m0WO/oJ>w+ ,.61yE&YSNw unsfs޽`:|7ގڻL2nbW*i|]JS^t V>Dic錹VCr^qcǵRE9$gkdw2]TĀt~sg)t!G+Pn}UVn-ğo a< R *D5| op6tZӱtehwܒs8a"v[T>IraAB|{T ^38M3 tr ֑A |[Lh4㶁GS+pAk21=3?Vg: .* cqU-ġ11Cs_T-^)2Y:˱ OD5D1#ꤖ,tb+jfW;{xBfM;txdR_9J7r9ih OΘ[>-ٗ%)_L2I $(&!rk'GBЩ-,7)n,(Yp(]~@6&/wT!4JP|jް )]W.,sv%EcyehΧBN{JD˂|NGP_+Hlݒ `3TU2ksQMU:Xb(>&Ro'Mڿ!48fQMqTPe:NR|C%Q,)i9Ǥ]RP+9I=9 KZ#fMtsل;EC+>nsT<e%#=5^{pfh62j߲MR]ҁsA wS3@Z(ï\Ιlv'ULlE^W<^m~@ Uf7X[<7s m*ap=٦K%Xd^9hպD&E~f`Y-*\dg`Y}ja|0[ zNV=jI{,.|",+9eN #Ykhې`V}nKFFpLTR\+^b0A34k sZҕ'6sl;L,E4B17%Ŏ@+}dV0itzBw\^h!_a4} Qz=#lx2QvVz5) u$9L}R> 6ˤ򁭶b;y@'H+Sip%s~؁erYٸ-7]g/֊+g yT>QMdXc Fc_~@rȸ$m8i}Ȇoc= Z"|Bq[ki@0 -8sn`?f* ƪz6*#!=/GUUE s5s L9 xG/@sr~7CJR9vyjzdmoY~M`Ԇf=@[.m-[N44GEwWvFC î03(]A%&Hs<ǥ찇.˻g~g" xFp'AXetw^DSB罹=fG9maG4x"aR^JˏQNl,J DRb߂ۑ*%\Tx'IDgP3sB1ʋAU0>C::\YB䣀a6lE݇UA[4رwHaJkWF. Sb@cuT'ԙSU)vcly@^W]RH pƘˑg `zWH`1H;0%ykGN^Q{L_˰WvhlUNn?ծ/+wy4K:D=#xOxz/ 76|9䴟5P"g?w Fq[GPFReuO0<\^ѝuvwOe=pn4L1 ,g<7܅^ihMfDz٣s8`||4^-q7JS~$Z+?'gd0#3b5nj˂ Tey\./y; Y &^^2FxP[qT?ʑG~H&!Qd*_ي1!(uőULdABY]:%Y\p5VG#Ň0ׅjIh$ *CV |us7(KhBć2c7m< 48ՍRtL85vlJVzOw #0WO҇q^׾hC\ BS }x*p0m`;JG>j @84j;"s6/C 6]{||Wa;[_BdP Pq#Xa֍):DwMDq~wL^uszB=jiV0 YB&sypF1q=R3\n4t\ީ5,gy>"mlwBdOhuq#5`(<ڀVv6.g:or*>1v) ;K1va?ՠt7ueӱI8OD!Mgv% hZ@Bj_3IA([4cvÈ]r4SHAs,4Vga"5֫;a4W%.C^񹌮c?v6uLE4AH_)!rprr`x3c.G6\?mw냰,=VΚ(mPz ~לl#2>O-O ЗTIM涮B=}4->oN(12+<:TK{}Dcaär·g2% @ˌ(r_NSB61/m򿡭4sjY)G0h#nT/hqi') z=2Kֽ/,nL-pu^g~i+)d@ Ul˳t'.o-D'. XCݯjɐω_#, 4S)J1oRܫ62Mg/yͭ^Ef|7ג8(J/aNVLųk)"cBl>D8j,bUblz|8^H9Ć̖ۿm>ށ;!<1JaH(H˝tBpn8sd^SF~ bjt&<*v0t_+c%ZŊM,>n@M0GU(H͞3zF鏗u}BROv2(g~/f } K3# .Χj!F;QތWƯL'˛Q~|-E+dwjD4b 520>UilâZgۚ}?q"*mS9>GʹUWses(`=B!gv,DGd?6Xnl] f#%Θ`[#Z %%$7IFr^gð > kZJ}l>#_ iI^c*ٷIfkZ~1Z+Ѣr'%-HpzDǷQ*nFwB[+&c6{pаc Rxv-eiݸKOpS0Lr*ǢϚ+d) [6iYwYl( \.D[NW:!g%v`ق3é5l2ߑȧ=,bOvȰ&H`@,XE=цH8ڒARstJj\=?Bڜ*Sˑ3d4&@-^iڍ;xʼnl^g+"m6smY6H݊Xb< }o#$ݡ,!Z9J(U PvJGxi|.N=n:;L5BX_]th :ބ)F5my{]G?pEāW&UC ߪ=>)=ShSQCtYhp#9I9W LEKԍ9`[#+\"2Uf +2ѯH:*n? ]!g@g"I[fdpPe/D"䛋MϷDbQ-s^ja ]7idNr鎐:G8g{[tVl=㟵w/5q17Fo<ژWru#|_CaHO z)8l#}9ؠxb+=|.-v1M6O 5/$J[WI>חܳ\bcOr׳ Ù{D#nOg&k2z9:m^ Is^FBBkfqrvsdyǸ^gx} 5dszYL4S++Ը9Sړ7('>P8.J9n)rnP_[UJ'b (ˌ}Ark0mY)!='C kPuڱ1^<.,iLyf>oSE[o=S)X&KHwk9,"uC7&ȅ:sWeц{+150[yhS1FSJa{+X%x6B՝j^u s6yO)Sɚ(2L"e9ۉ ^ @E!>#[R3 e_=M:pWG/?D+(5k'!z< SD[g4d{@~v#Td% s`e7 ')ŖtRG^PWJC*_~L5$GqԯR!PVVSz<2ֳUȟBqgGC+pKB h=6p oւ,bćJ *APim=bd_**;Jp5S]yѤɖZé̠%GmH*ٿKV*YG9M3h.-QO,r~ɠu.ٴI?RbF;P;r\Nt@34 yz&˯}TȈϼPNa_߷Ç})Ǽ 2*U pf6a\rtk._L:[ T/ȷj[YQ9wb B3>Ykgn zKY__%B#<(aYQ!2TJ2kc8-4FӸ5,b>`bu\hDnA%MR- ]U0rHdJ2o<ԐjjÓ_Mۿ}Yˆea c!x7SzTl-6M@(:X7ne7[r7d3qPۖz(5y uhI!ˑ\(f =pGH|'[%` Ry!UKNuw9~y-Ё%D.2F~^hB-?^b| 3^\n"&Rh~WXuȿa5:hѨ*hii3ȍ[_z`%fn_0*f:Ptji# f ~iEϥV>؆XvWۙˣ+%+mŻ݀i4E-qBބ<N"ofL9%=˅f,Ohĩ2_Yxt6c %{8#?4WѶ̑"jTޔ[q覦Kw0J nA9"%pXڹF(RAxۻ ȘuDYU@ҧs?8z#z!_Bk(',ԗnr KŹLo3/²9ߦiE>J7/6%d F9E <$=>o׻sSvIP&p"6kcw N#g6?pJKbvn;Rt;VdTfa='B0W#+DCD0)fn?x*,s# SY;#f 9lV2c U1 ҹC pݿ UA*gDŽ=䦄=(EN1@}^ #b[T/#X-H;tKp,XK]SS`1pX,1ef髪9a 1S}O< 4xэ j>,k|Hr3݋P뉁NhL:Rˉ;k䉍5;9`9p~6ul4`{/2P['\%8 <ZVӢg^uIל=C+, ˈn/~m>sԆԃ1yñMncAYZuy@a4W`sb&}1$6~ȗ%:9y. Iӵ&p3RqDlf27/ \f*!5߿zåFyKZZ@:jl:F07,V%1xјx06U5@it~2Xo]:J1};n"-oڅ{B ͆ 싩Z&Z^#E>ZahK1wֻo٦r=c!WOqd`O^,~Ey׬mu.2\zvegO.$Pb#[J.lq" Vh%sbVĿpu5}7EİQa_V~$^Tܫ+c_/7e*j3A#iD:YEap#o#3okMmd{0 hǒ@XA$tʏ= 㶼p5JE=fhqˠ=,k$R/qV򂫦q:QY:hץ{iUze;t}1g}Gɹ:17JqP>'a z<glQRϐmxlJt) sq╬bco.QXY9"ڱıZM*ձ(;;Y:ve$\[M{,BEkH' ZC K43b?d< !$ FƀUWa{Qh(T BH8|=-Eފ<֦Łvyn"i endstream endobj 100 0 obj << /Type /FontDescriptor /FontName /ACTTTC+CMR9 /Flags 4 /FontBBox [-39 -250 1036 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/A/B/C/D/F/L/M/N/T/W/a/b/c/comma/d/e/f/fi/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/t/three/two/u/v/w/x/y/z/zero) /FontFile 99 0 R >> endobj 101 0 obj << /Length1 1566 /Length2 7162 /Length3 0 /Length 8199 /Filter /FlateDecode >> stream xڍT[64= ! 10݂tH#)JJw* t =}k֚yu׾^D%k*A!p.>n^1)/WƱn0"_n@k8S#5;'u(X{5(bz8?Xm|œ.@75i w "ZP[/p'  z@hEeC `%Ї=݀!0;@Dj]5RIw9A~]\! 4^pN55E[{X6[( ٺ\0n#/74+B..@k 7-"< zB|^ك vhعB@݁ t0  +*$$>ly~0v}]{ ?Y{p7w ؁lhQ7~|_,f>>! ~:֠?/{(@/MOg6#hA  "_mݑ;[Gn{@;1PĄ@W@k@.+U[#fDs.'ܼOA0%Nu."@a_ŠdѳuF-0D~w\E- ܬX |jn0 8nX +, ^ x>rXܬm`=`?"H 4?rAa.`8/nn}Z^ڊ95u]Ryr}G_xd:%g^|먁<\]-hRewyk*p$Ł-SvPJI-“d]g, ½;ܽ혉\eTxق7ȱӧ ̳ T 'cA Wr]q߽GVW d  FQ Q$穽!1 ^W'1PD0<^1[<ؙ<$%0\,];5΃KޖY(Tgt9uR'.C%7p9 -2@^i2E~,>'"],2饜uxV"@DDE>P ]*b}Ho)d&8ɤ;?A}cŖX8WXFYLFti!HȀp@c)K롩Xl,q%ͫ!m"AN(&4la~GLq;ǴT/|c\E $ zt+g:|*V(0Њ"i}o;-'&MQf贞-c4f YoYwTZn.QOlFņJխ$ц]mncq̯ğlZhz.xϲ.*U,ꋊeMTKѾk,BZ|`CtzzGJ@ͣ6c{R$CG'm޲О〃 T !QO#MNJMtO5۱k+*X|d^3,=]~Pc-:ŴYi[Y`:{ҧz|h lNsDq-ezY1è=硡yGtMW`ij[(Z@/U.s0*zU;Zgų{ƾf ˰>bMZR%͹j F 1QmUQuzK4/jDۦ]$sHbM%A@yAfGrM鋦TW0aE2:|0-eTAShM"Joݲvmf^/3LxÔqJnR|^FNY*8~.ޔK_y;\g?^۬z5J–V$B)%'ڒdG?e ):P5/sx˜QWn^O,>vX.2f|~fA(NO~ kg {ǓiɖCo?yxyi4[HARVO䗚A# ?M6aq%Es`r̉X֑o:aP);=(,h+%KzSϺn4u=F,nOeLVhu$Ch&/!‡cSόFY_{'\7x\[c(oe6"k0oP,n놃4L#{&4iuٛ_eeo ?B||#灨Zg(@~x@G@VZ9(S4nmr^5Tgx~IT}Æ~+Nj.XAD E U :f2^Gr\ DZ+ >δZM𵐯bǁ~*%i)fKGxx-L$q@Sa55ϒ/{!&*G(: .1zׂYRg+ @m׷ #dAonDWl_P!];WW8VcRAx}Ȫ_l=~x`]i6KؾdRBY+WuqyPNJs!)uJֲNQNoI$}gOO}g?ZOUfy96׶[OY%` {t 0)=ÌuȜ3|2u;u~iEw 2\? H,jFyت_4cB8\n@3rk+I~zOb}b$ 4Q*4[ڠVoCD^+rݮo,eZ'hYRxo,ALԊ|$t@pi}٘J1,ƾwn\#}Gl&*xn_[tS%ؽUL!) ^&f$1q]83:;3Z<9#A=o+#G5ΐ9=!J֭{%;fA joEP~@t0]|}%{ Ѓ]ζAcy/=7 2x9KP9`JWPN_ol_{?fݪ{ƴ[EEPNߥK [jߑ標w=Q\?1O8hSdal$'o'#`F`!PE?O=ĮBGWZ .or# m͵P'6FO?RfڔʆZv3ϊ.a&[S) skȕg-V 3Xo2)cZ +06ACDDGu׌04o5k%&Ȏ*GYC#VSU8Wߎş͓|Tk~bTƆ/eSeȷ3tHt:R\tf;dgHР\$ecSVy~T<ڌÝiq=AX6V=DX |ZDl_l}uW$o>T`웧9& _yf]̘BЃ.) dS-L.at Q"Άt!AI5bUhIO1AnAp)oɺ`y7*Y"0K@YWKE:p8>򥻲ÓxZl {M73z=GOo4Iv(1rJ#_p|Tם `< [; Yl,Vяy irF O6G+8jK_Ծi2Z<ҟaP'/xiO 8ƘW\$R[TyՉ ^:Y zk1a1EVR[I3Y5dm^ֲ1fkLHdW~Y3}ku<ȩ*ϏqVа9ɬFc!r#&%3L*)O8k&.`u0R %u­%#rv3)p$εiG}.cGx(j,F$+?zj}oWE3^k lyYME+Ы DO2X~(o +{E\geѼAVC_=,wMm[P"PGw!ƨ8?JEyrWOoh•rјq¶S#Zşx`[30?]@8 "0(gR:ůWyǜ=tIͼ R^pӎXy}b<2i'QPƠxi ia_f=kpǧ}_VЦvLu+,mk7˫6/sxO3j>8 f>cMD69ږI2pnq/>![ߌS o9J0=Wb)LeI:&]nH_X܏GH>m'zi9*m>vb{ ?^Eo3L( O9ͮ;΂\*p饏x{CSEwѮnΚ8eezo_gFW_hvy\זV1ce)S9afg, ߲>D6R^: \((}0<(ւ6}jńn]*cpng%5ɠDl\jCFJf( ۤߧ2wվ6]Gm۹mZ)ǥI}Gi͗O9e!#J1QZ(ڧN+XZ7ev;ݭzlkfBqMEw(JBx{Ni-/ 0doJ~:P3MnE9y%0ˎ{f]"cPB\ݷouV(NTV蠬òZvlܴUߊ9?eBԹw۹ `n{ᅰoyrYE=VQTP&i] *4@f<>dZ:@lG/8T@ř<@2}lwPn?RU=Ys@ (IC',A,gdkOEOIi1ŎnV{$mϩ 3~9$C9^tc+=.|8_aQl@if2"JZq9ӌWrcQ(e1aAf:eGdX> "= Ҟ Wr4|+1 d<;72N00s㟢!wEtY:DNJM/BMdGP(qKTwЕ—m endstream endobj 102 0 obj << /Type /FontDescriptor /FontName /CYZAVM+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet (/O/arrowright/asteriskmath/bar/braceleft/braceright/element/minus/multiply) /FontFile 101 0 R >> endobj 103 0 obj << /Length1 1393 /Length2 5904 /Length3 0 /Length 6854 /Filter /FlateDecode >> stream xڍtTk.]  H"!ݍt C0t7RJI!! tw"(9kz}|EKGaU@Q< ^>1OMre&bӇ"]a EB(MBǩ#7GH@0k:/@"0[;߯'i'(` v" 0(_%8P(g1 Ãʋ@Jr>xPv+ ;A %b\u6(0 @a("]e53'XOC_xA)WB0d0prý`p[  TPEyp_`GW:9o(Hkhs a(W^W/_eS["p+ѯPz^?u#<>l`pk_ ݜO07_!h?6[( HXXPu@=!v__f4?g3 |\P ߎ@ 5 XAmapP?g0O { ߯F _ <>< !#!ď~]?o A8_e( A~x}!7Gn v9z - uZ5:^e-i-< A^>?vjCAU{8P-+_> 诊+za]PWAXR0D$2z7 G)4F? Ik| J7$@[P'B43< m^!>,ި;R>N ⸋u)`cS \G?},񫬚&ɊnQ٠Tc+BPLvܻWrbiXڨWB7 ?ZAQBk.N5T3# gGjgOYs xM8" B6dعF~ OMHy' B^s(gEdp'2&j JUKiO~AG/¯zi|ڝJlúCYݤO>~&cl>+%L\:[l&xGTJ 6% d_gh.l1T-KHZ0d`a8N0WqPDJ HNiġ})I+VEġ>&@K@JB{wx/rSf)>S3)05@?/SiwǒW:T!Gi$O?87|-B zNGe80+nUX NL%vw QC&{[6̘X1^nCA>} |y!%WV}WaR6cl/YJAkQM\]+^n1Ǎ+vTg|vI1x302'r\l]0?_"mR[snT菍) \ȠYγoswsa]C{,So3't8sĩzP ,`,^ʪ OoQI^wyԸ3t$]S*aLZhJXD.؊>׳s} zIϓS3c{"JGb 1 zBXܟGdMNP+X3+`d_.ђwN yp Yҩ6 ;/+C"}e#b-"E1[8JT>^֪^~](11}ԭ#@yjRlGv+?0^$l6"K}.)yb ݴ{%' ܑM_[!ief?`=90~o7*<;rc5[yP z*D^ #~ iIU*!|d2D0k}w+De!=_Q).Vn|[aq0NI,$kfNqJ@wJ;C>?9ݐAK7uֿ+MUkǤzo5_\҄WXuE\LfS]k5^nM;OO*Gn8bFjxfM1G3TwNyJnjZ{yB"V,Z7LbN-7=)S8~*Z72YT廇CmsLt$K)X̢R+?a ;.OSnGs[\#ˣ[Hqťv5 Vߘ"u1I]oP7CXO#wk}45^~>3d݈=S:!)58EbÖ"x-Ŏ_$ &-󍶒ZXƯ+&xE&wDWHycgB LL.Rk&i>~l߹FwfԆsś2_v[,>5bê_ޛk)I.@9*r 껖v嵝nQk!/B|uK"KxT>*DbglzcƢ. Ҭc$%*7۷l45wL2WlV} dhzel1iݳ0,U8U4JVʂJۥ陛gOqV|fSeiX}IeMqmϸPs"d$ f ] m!g?50K⊪oE,h(V´z@Y Ibi?bu,V%ܣ]x࣌ƹ׫gkWS⊴Jy*_UP[$\ff;, Tgܯ^gTF i9[c}f+d"tIYqiPzYz8mޢO&!npMԉ搘"?WdK #zAPIj *<:\ZOXZsuNA_便ba_g>$:Z;ՠ<1a_KRemٻ=k޳[S"'1|:& 51?g9c|/3%\FAnDY9ό`3HN{Eysw"Ay~3&;{Jr0bWIN=HaSOpSWm_2!&f.(5͐ǔ F2 1^RsvC8j54?Up*ոu ?ƪGX@oē|F;8do =rw%ffEKȏg9? 13Q8|L…-N5L+F^VqOso\A $A4AzGǚ#P`7oGeeu#:+?5vɼ`\ ș p\g4=}M%:{(V1p]J9»$ʃ|GBHCe|/#>I<e&sN$618G}kl` 犌,Ou*m"Zb@I\#^=mVs.S˲X W{0[^`g s2椁F ߤñ7m"^#3Rܤ #m ghg" Y l+V fRz%g3j,.[WRruI?n.>kd#}cYk J1$uHt#Yn:`B)JYl}UFdWK63Pvrk=r?Kر,o1r|UBoɣ!Tr_زٜԺw]:+7´abd1ϰZꋼ~nbF:zC=$eϰ Uq|l|ʨ`!X;ӭ3~'ݏlԼ4!~D<2ܡC i7/f:?4 s|ٱ?9*+ຆ*6%0{NTd_[O㷌lr v:MRmkFlfGKԷ/_D 1R#eֺĽjj#%'\7Z|,CnɞzXPќ+J@ w?2ö,eGq 94K'bpSI< Vi&Z<[Ƚ'q4B"9u,*S1xbt.XqHkk(h~L'zy|kخ UC&^fR8c%Rܞ+f,&A^ȯ"LQTz$6F:}qW;iϾk|21օr--RZNȏYs<%fU='970(GTvy Ǻx7 " YOVd'555_[#Й܎ ~Br|fѹLfï}rֲD5 ;Jo)sW#l"+ٴTJB_F'~7䒗‡ķzTS ?w߼(`4)l {knbu-,gZ2P:>4PZ=3Klj:مxR{%Tl+FiNn<-ZobdZd],9o>.xk36#RO" Bo$tR"i|*6EHJ%;% /pnO>WWFiD4Z]S9!T@3> 7fTcVkY\5Ã-{e-=?+:lS&Y(P endstream endobj 104 0 obj << /Type /FontDescriptor /FontName /PXBGHL+CMSY7 /Flags 4 /FontBBox [-15 -951 1251 782] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 49 /XHeight 431 /CharSet (/minus) /FontFile 103 0 R >> endobj 105 0 obj << /Length1 1436 /Length2 6156 /Length3 0 /Length 7133 /Filter /FlateDecode >> stream xڍuT6N atHN:#6Ft " t<4H" !ݍ?=}پs_w\lFJ0#=+("YHA 1!He:.S8@!e 0U秋Bܜ"b@IY)Y( BU!PWB1.agŕ H *9( ԅ`θPE^J+oź {xxA1B(1p;Ix L4G`~F([ '"ܐ08+4u~; PDHt&B CP @mNp=!'VA~:B0(\<p<9d.X4[VCTPp$ٟ* Kd(ϟ- I"lD5U 0;8(]pO^._F0 h#Cq? Ģ~>@DC@Gp;8n> p~~y B:y|յ 5ofMY e$$""@))߿sC'&wyp# ?+w(@H $DWM? ssree?gݰE߮f߫ !ܜ۪C iH7Cxa, Ga?8(l:*~ลw]5$}@ p"ũG0/}(,.E?*) v` S: H7? p [_ZuCS(\CeHq~/_",:"$|uHG\Jn&O e<jMxSXP9kPvRɑ [ n?yJ-.^4a-eրC $&Ș5( 6ίV1Thp~"H!kaf;#Yl7[L$[-7YV-[YPMb;k0YHGX*At{lL-AߣT" Yә-Uo&qܘ9q[Sg ]*dYr<[ `E=%c#ڎ=+˩âÍʲ)?B&*oxX )L2 בwquf>zD #N{֦Yb$FV"t1oTzE[;W_}̷]>:v8ѻ{-NQvjDd:O ~m6sw{M^ y.[r@X:-OV7q|{u4ywȥE'QUwDm^vJTMO+v!\ܛ;OD;7KDF>jOK֪UoBLzn GC9ұ1S' jkTonY]!{-| 20Txxuu'KRSD g6; k';>}t (\`9 y\LHo40aBR ИBz@;brUƧ'i_)$H%i "Χ\2P<9_$(a-tCϕ.Qnmp@2eFR^Ubv0tfz>dfЏ**_,c@B('倗IݴD>@àciRݮ/|tHWVszΐfHҟ ^7U_BBc9p)!߸y!2p;yWqU eBb ~7t~Aun7W5Dc[.gCx4J4'RmYY8X}UƦqeSkO<PS &Pg~ >oh+aH_ͼ?ZLf=t]|$'bRsUYHE3yQEh4=p~2}fLYv,y+–/ c]G訡w]ܱCOnqOP4/ruqܲn*Hx1"6ONmˮ7ܕlSo"'7\+L5gdJ Ku$)'zꪊJ3-2zRfGS.娝9vZySTV^[C}~J{ QuO’ YJ9osVVvZ!͂nvAs_Kp7ܐd1lPu w49\a󒊳sg4sWNc<+2W&7}L,q4+5~Iwv 39%51LdC9FZy/Yly(η5كM:r5^{M5 ݪg\8lZrqOlk'GݛtJ̀71%z5P85o owǵ^\ek@ufz.hl-N%34x (n:XzN|9CrpʼI݊VbY`g)>sAkץɲn#EKycgg{3l*&at,(:t)SeĔϻ@ -dׅNTE2ϴzp'cZtf>MlpO#ʦ>#Zxi~s'Ve}5V:c̈́3|5R= Fuhws9WKg+͟ VP֥H7<3;/:`c\R<ޤbCME엗[B7ʼZf6Dc%rhΊ?]=tҨ?ƦwϭG7?Yʕ >QRe;K(LRrm갟V4K1Y =mtӘwHA-THrq͞$nVlX橣Yhy4#B ',p^/okKΜە-o{;1^G6iLI5@ D/[=S|" (4&XR mw/ <ZT>ǯ}n@nrrm4j5)peBSD\EA@V U,!g\޷!i`dz.钜Trӆ ]G꾏_} ?tZ3SqAZN[}).AJ ˛4 ˳d.z{%d'5 |#WCj 6hn*6$=gŞv {w[wI P? et59iqݯ|6SEzG⢬HsG;z9/f6J%$ᢶj&CϞP}GMU%3uBScdY=:o\M$- _kVooQ~GÖIMzv7dgOкw%QF׈o^nj\a2QOg2 Da $T)OK6tuή4|hH=\css/$RcXJ,;[V_ ˱WM઩R\mЭkM'! Ǥˋ# /}ݻ /7?/I$+`:?JzJW /#CV?„񼵉gA/ iR4_~Ud=U2(JEy 7Lw-f>O=f~@ρ8pPe.7~!ӽlto.tOd }">e iEd/iv@gB!|͔T\k{KTo7hItP#-AP;; uu&.BCss*/Eed >[YsAIYqb:!(GA(umc3N|K/ʚ{9\:K iTjlUg'[|{e6)zȁYBOAj3TwFV0 8b@{Eu AZ]!sGLlY{QLZ([3eQP E䘧tɀ>_iqӿvuFƹ<5<}Ν[yACyٯO\ZamM>N܈IU> k+OZ\0>|@oJ"̯\7Wnvڜ!ds\]#i3U;Z[q9@!%#znlS6Q0aPu]6R꽂~OUJp=L"McJTT`g y;gKH =֑cgkOYYF30x+S, I6]Q2֕x"i]~DU5hT`9ƨt,弾{I)q"Sn8N!rNeں\6kN_ofIhdl⌻VX k3ܸ%+D6m}S+ꮎP;a=.~6E ۲OG[Qʍ2=k:70k/½>D[33` *u-HE`*4e\/Y^ay_>>\b#DAِmJF ZRw:r '{\\OlE1-eM@Ǵl DcWD"\GG_G1庲KY8hz'Fx0W}F:AHܛ?4=WpSFD5S"Ѵ2`qðm @!t@j37ÔiGcuǯ׏BpΕ,Jmi&ۉ9l~>3>:m[ZfDdWbm}oiS)ߜ$Roe1Z= P}UnfH|Ltd{أ􁐎+#Y#]t !V>Ĉy^RxY\fw5E-=5Wy@| %{},kҀ)]\Y²SҴ^Nl)zBۄFޚj1yRT\hf#vuc:k%IlU]v>&|^}s9;u"RhI 4k;ӺIX_&Hpy|ݯ\ pPF "0|L3uNÏo,'}vn/0Vh^Ma1 B[;-WD$[xK$p_O)E*tB:άe}M|Քa|sHZU]SM}]5K([\6`_zwfK' gVI)5^S 6odGTTW?37<1uhϩ3TC[=:|-4 aON,9 v(wjf5$}G3C9v|BAѥr<0#9奎۞Eo_LO=-zcfWj|f$?Hྟey.CWvD;%a-.YcO${ ' 2KtL^Uͳ@,u̍L (a6%[YNb)UKa~\jYHu<݇湩R8]ukP3Y{:t~g}VJnEqrVۂ|ru*>OOϢMm^QC!L<ƳE޺r /j>Qbf,Ung/^߽#ihFPghVCѕ+͙Dd+ಓn{ȄmFrٖcȒ_:XRl Mr(RЀJ5橃~xrEuޥh {R1XJϓWO:ӱ!*>~,![<ӼkθiKP3mmܓVK:W=)ƢV8tAY0t縃[1SR0ې8 +o_goqBhiW7G@iL0NݗtĆ͝L9uGC.M֥&H(ٕ{A@8EDz͓0}&!fAh{}RXQ={"Rd{yɫiFt.F]9D; 6$KܣkD:EAW2F?::'2\Q3CE ؍d ӤJRz<؄J$6lG4ԧɞvXLmIj2WӃx R:bѰns*`py(@< wӀrzjO&qvrZyؘH݉ endstream endobj 106 0 obj << /Type /FontDescriptor /FontName /GKQTPI+CMSY8 /Flags 4 /FontBBox [-30 -955 1185 779] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 46 /XHeight 431 /CharSet (/latticetop/minus/multiply) /FontFile 105 0 R >> endobj 107 0 obj << /Length1 2248 /Length2 18566 /Length3 0 /Length 19901 /Filter /FlateDecode >> stream xڌP\k NK$Bpwwwwv9畜{kfj[t?\EY$`ffca+jȲXY9XXYّ5ȑ@.V|wd7CE{-Cg>@ `rAwpt@gJ`};@lejlP4[MmV @wwwc;g !z&r9 P24$j˿`wcgM`ke wysq79 eGewsl,l oYllj`hlieo0X`&_ƶ.onV&on UU\L.,.V+[%@`rõwp273 3WG+HV6o"?2 9@4<A+0+kezAv1vή _*!̬L=ҟob;[y>&G sx3spٹXll윀oOKU?"ڛ;xU[Sۿ'kC_%y+%uoFRe7?"?]zctxt[f&Лgunnn[5oz?doXz:Z,d-u{Po7ٛۻ|^' s)ۿ:_qWߪu/ 7spoWl S.pxk?[t߼AOo^ E5uu~km~q@ SyS`ֻJQ"w_율W;n{9X셯 6:x6>|xK&L>X. 8,NݯDfͥK 4ߖY@GEp@U̶R\ǓH'sm/3AZm&:_}Nh0C-I.5˨0%NEt_W D -~D|Ѳ)MHX4;sf&䳒9ee>ܴM<\#5mڙvkfըyl8rDS)SHinup9k+ jHdZK‡k!.JJ9]s! Gƍ|]r[!H˶s^wꩢS,7g1,~߂*M:pXt)kB,k!8`,TL5sW!:9w ڑ.Q*0/K刖:/X LsAy+&{#whl'^[' >l3@S,+bqhDUծώ<ۓ{1U=(L",©YOC%~m0F;/ۣot2 S!!P?UZqvkE$R0Rq͡$ݞD-J,X$VuxOD PE#!%J}(&3zlr Unq)}f _@1z=~B.UofY,bve+D?^b(V nJ/@7M冎(E6zlXŔIk]X喔DY`qHRf5g_ES_oϟ*S5iV־}T;Ȩ7fEZE9Bg q)P#F|D?rJy)( %Ω[S<=ޞ_TEݯSV據@sssE `8S7\C@ bF3^ ~\?\zGDٌ\qRp\u4[/n0-69G{Ʊ`#LdX(j >%6^Ⓘq ΒEԸ"G,vAY?Ph4c%x3WΫQ&55m7jRa!kOkAυ3\ϧWh,F ୚s4M]k\gU\@8J>rvi^Uem/XbVJ]q qJw_ԾrrKNU>mW~n7`@$&T@2=xB]6˯ꮳ ] q> 뮌G(~QOj͙lC"u3BVkɞ^;^`[24za+{~c]VbjjK3Zj PjX(.ֻ>\z x>UfW\2//Ǹ4v\V@=eJTQ?|NgWC4ª.y^SS*p3Tp,aP 1 K{琟2e%/QF4%??Rd]%q,g\xccj&u{v ;}w8m<|$VLCylYNl+}l}01cQj%w?iU7ogflzş6r7#Si}g\=Cp A# d Gɰj$lĻ^lD{2r3*c=#;ԨD=ӏ/ruӞ,lHZֽ=,60q'Rv xE 8`<Y&ę5X:= }Vټt7< 8"x2zqY22spk~ 'h706a*;"e =Qzkװc){űJ]xԋ _nt EUMMr?qѰf6|ОzPTSh;wϿi^X7 n*$|λ-vQn Z5Gh?q=n6V,4?f3⦤;,17T 2@ LPj`\]%̡1|-1ĸXrn5ڢ5ּGةƽ% *a|{M;$@ L}WdG,n~5yb.@f}egm G׉'@ݕ3[S%x(AZ*~Ù5sĘ<{BbnT|c]'"Hu z<cx_4fpM 6Fn櫡&if}WY<)V/ʇW Wlp܈hR򴴍wnOZ=Գ$o~}7qQTt\YB<<<l#whŃaaYʃ(nI -sPMZ6.n&?'r x|{ Ϧ khheqS+Ѵ4ENr f%|PZ~|iF7 nqX;D'O1[k]Z$2]` _8~ ;>hit^gֲV4D4BK_nf 3N*[g 6&@sk6q^g;2FsFTn8{1Б&"6d R`W᧽qWb.>hx'!Z 4UB>uy:#xIGD6C"SQm6*<%MB%/BF4 u{zB$QTIKC U J\R?)x A>CcUpJP׫| `SW4E:aD kϐ63sy_NY}YX?tݣ0Rui0i#'#[.p!62|<=ʜQL bPlBs}e䕜bm=Vnf|b^0TLd]ߠ} g#Mgǡٯ',:gguf)܂ONBkHk![y{$<GS쥖 1 Ddzl|Lѣ(Q#'8KXG2p(ǖa&s?Pw)}Tœ,={mzuLqy6hL-QtkN1aNv, Mk.XSA URWlS WeF[ǡҿوqC7/UrlDIJ^c°_,V1EB VB<`5?fJ AO* -٪U|¬;])vg&s)PJK1f|@Bv?-߇aWn^Bj_}$S\ـ_ SF3FIAO: n;e) ($HrHO $?@ZC7l'(ChhIN|m*v}GΘkM%g$aLAG+Ul%-κݟcю/\Pa&h%4i!µnyq!uƆG)b%䦒 Pw*aX>X+E'}K߱i "/phT,pvM;05mw1򜫸G{~FY.w]}76~MdWAJ]XMg)'z?ir80*P >WiZj܆0]}K\*; T**ڥSa;V6JD|:4 4Wz+Ys(Wӟ>#6't?iUm Pؼn~0;|{)WOOܩ A%3jI+LZ 3IzBZ'jn3_gl{iMa$K1eb!j8NW[rg75/{QI3a|xHm^؅C 4aNTuek$ai[? W*9IR嗘&6') 䚰ӲYZ\@aVY*fpۛ_d+kcdJ] ΞOʖK'bQ~ .gO&AO/ A{|}$͎@AEVN寸]E3y@m|q7.\)3" Wo@7A|8&7'T5-OG qG$;rE2K>WG{} L&V9H!  CI ?jV§|GnIWX^>}>lX^Cx28wIqS.ϯQ1/1b|N|qR¤x4Nݒ5qq_sEJo{Y@]H{& ?Ž@*T%9ЗU0fԴ^뒿TN&C4.mvV»wN?́Tiﲒy(+}D/PxD?(Z}vIͼ4oyJt Vm&e Ŀ >rٓXMkp#;Ÿr05xFqUkrmdH otΡ۩(t"fb6GmRa ٷ&>$}" ${"\s0 1-dG1tE <foLeӟ2C!d-J+3jmh[h.g1($*%KTњ<](d;'siݾ8L,MQO-^v3㔷mwd)L'3Jxq'һ8Δ'9'qEa~cA:,]'vNGs4%XQϻ X.oWrL 5Y >&PN@VFu WlW ADF٘}~+R///M_EiiӬTrLi:fE .~oM3lc3ҹ%"Sl]Q<C9PϦ#%>=y6ZGVn1$`F>$k9|.̴+7hIO5G{DK>2ն;aW; ONQ)[1]}3m\(P;LUW,Mnl ^Vݟ6o}g >Z~mHFSW@v>B,J6 .KtgaV\ DIR[XMЮ_cI.s_aCAtieX qں'*hnU";tvKN}C>X9[1C"n.A\k]fyA=֬ >ƆEnN7 6$/~eGJyP,|n<6߿9 J3]1ji`p_` G?>\C0޿ d @hoƵ"I!dF4͵%Fu {r'ǩsǚ9Y¶DؠtG59 %"š=Ü=C1JH.Ti]گ/1fm԰w zz`2uVZX^k)!⚂^=RL-w0 r`tv*"s](k;6$k7,\d&U6ݼ]62y0CKo ߾G_Jve2^c5te[]2>̕.oI@ %|pf%%">( xSr>·v{>=kZ- 2ci*˰â3E;:u3"=q0|b\-S1&$$DHa=;RdtNBߐ,0{F7亰Y9,۞9rJݨƨlާG$DҖ*1nԪ 5֯/cV MaJY!}\^fzЕ޸?#=w9RqCy1"et*_lJݎ˥c?G M+^\j;qCo1/\;1 vRN]L:x:hZP7>7Jny}{Qk3e( 5vNH9x7,kGn;.^6x!m~'qbY2檿OWP-\p/\тߪ] vmaG/tnee^D_.4"If˜~:׎1!nYgU7AZsFk@E]\bb ;!jZͼ2Ys6H7b!b_la$ "b9 'jz3Wݲi Nhb5W:7_((Qs2XQV`E108^?Mr^K=]g;9ɢ[ ~I-+݃6Q) |#~V8!>*ko 8Sa?HUsQ_y?iڱ8ɼ17>]/W@5?4o_<稊6xȮ^DKI*l T[s0׿2gUs6bIЩzc%kU[NfŽ?$P,𗟧/%POTF#f2K m"K&F!eDWxI9! 0"=k,trpfS:;Gpthrzr>XA%_ &^J剼j\KT/ ~YO.m'0g߾+Q/vkqCNJ ;5-rd vQSpX%a>ﶟ7-։~絴iHK(z$^~wPmۧFI̠{HbF]C8b$x%l:^p/RT(];oZ+FD~ymd}hH8KRV_` <-DI`%HB)&` C(̀7E"Wҫ~rq jJ#0u(|q\1&%| !"ĠⱕrW~)gm6${ArF |D:a|g iXhRZͣ=HnFC;̐-p:tfSf };OJd]\0K |e=+5P2 |њR}y~%n%&k3ns#ټJ:fp/V~8Ľ[zh}B y-V}Vr,DW "dlts1X88 [01BrS'Sm?.ѾPui(c}íP'zg_n5@NDYiťY5iov!0/ЀsKT0bVNʱP<$'GAe@\a3 [_Y޻>^p$(,<.aZ:4;<%jw-`_q(#l`Ó1eeeA%X*BO&_q _9tM$*r{bgDsr_`gT v}:MBk[) 6+ɼ(<)_2-aAe1G:㽐зggqRAS|UŽs[:~O?wq F< b+Lm Qo#5AQ]*iL$`7]ns'}wSezIdױm6@n*սodW*hCD]Yxaո[W m) kFfR0iƺϗMɗt M)o"W\fNj'IL]B5{8 1qPcvZTiψ'vVEQ =#(p$6Tֿ|1ӷKMH:ܩFҺV:(P>wNf9@ݗFڅ8hhbNLfx~ܧ<@ NC/`>e 0,BmLNjZ3 6 6:Ԫ*gspn:{%ݔفAE؍t9 JGCҝR tkOK8I]3ћ/ !Q_ͤ1`AG艌U:zW\ _A^^|nFЌqf";uKz@}3ϼpYnozHLiܑ= ?)bj9$ً0 uws4؎#' +YV*A<rF@3)<ܧVF|A1\^ ռl4RޚrF'r>t);-K>V =4DFҍ^<2]5Z9Rb#Cc*S} ó%uq j OTk =R,yȼ@^Mr:ˢ3`x*] &w-5/>v ;"jvUc| vn7M-KiMr@&mtw]Fׅ b0G&'ڝ\v ELuUc}" /+`]Pϧc)#Ǒk Vۢ[MJ]kov=oUN Dm{$s} Ӛ9w tl3A=r,od4J`&!` +shkvj1i._F[I^bN_T _6klr}FkdGㅬxZ+_],J*0dʖ0QՒ 8a 1SZZϻ8zJ*.@C0`avJt\&azJHum Dm&ߩ歌 bθi]u# ㊀%fo/{X4hU4H?U$nj*;T*Ns_reHRy{ =rdqs6VؘU_;0S8pHBipC ЦՀHCMiKuClG8% m_&ktcܰpf]8 $t(Ϧ+RZEO&}Pn}]^S`;my>[;AAkAXv=$L5̰pٜĬe(-3av\/ٱ[-ITyڴ q:M*}K<@n".;E1 LZORgLxj5-{.E_b96zrG]:jݧ2!}rI1g: W1X#T "1PNSF;OY~uEH : Ԫywu;;s8o1$2zԮ =!Ok8UӠċt؏j9wVB!7s1z)} Ӟ'*d3q!8#˲Wd:SK~zl@*{͙Sp YX΄]Γ6U~ %N{Ԑ'fbbT<±1nζv!LQv2N8U0hUqVbw4źT7p<|KUrҾaF+R,zvC!Z` MQ*oT߾o:1}0 A2zsD=WkzՒ%/ ~{bcCIQߐ\?,us^ڣE~ I̶gIm֢+1Ns ªG4-?T5u. \?I3+}_9JRT&hx B߫EeG&^2fߤ刄bj’QI7Ls_ǵǬwmO/#vIl[֛Nr@ VU]@<4[]!ޒ/DaN{b۟0Jn}(2ӨC 536'H?f_ʇ:mJ_ӌ2z&2B2 ;ӈKkhMB:Pi1j{? Bê i$:W&-)??l1|Ɲ8FƾIJ{yZ8г::&@n(ûLxOelڶgmu!Noۈ~y8+7?YBK.o&S7`2I4(Ly+b3 E{Y4 wbL/ZWwΒq sPTy`q;sSrbo@R'ZoN>&Cl7W#)!hEQ۟Ed&ew #Pg:b5[V'X忤JvGCWTN ,DD"U:~;ϯmq||J̟Q5oKm-mFK7*:$.ǧ^f'6jo Fo@t1b䄧 ׅҪmPؽS@YT7YFz|n}Qbk d4Dh+gmwXi 㼟nH_%d6FxQchX]N+ ~Ӝ{rAc@"-Vp`0[Gc.CΚ~|-7昮nW8Ҽ)Ӏsk7=3o4!RW .4upוAvQ/v4E#͍1(#*uEBʇEӵgAQU0̏P|_ >vn/;q.>%ck/:,&6)3oq^֦jsb?'ϖ)@nwݡ >l搯[  uypפ ]LQ.N Uq瞰ciU7rкaH3&s.?2Lҟ ŷNc-0pzB{'>9f 2oqJyXAE /GA n@&9ϛ<]j)YF IߙSi}837kͶzXzCZxmuvHoa (M#<ۊa|"rw+}b~NH+5sͭE[K&} VaJoa.D"%Y\"&5d*:wmVQK_smeŽ-K&<"< R#T>n*^(UTxl?# S)Lq4r0}i2 qPVi6 ]̷+B~_l_Ϗ3 IȪǃ"i4´c.>8M﮿Rf+4G%%񣉽yyDrUu8'"VsJ +%mcF(@I }Q%:p76z`^.j. z)\!QIه_G= ~)AY lq #P;QQ 䃛:y@wDW9e9[&zX{R֞~R1v5q3 r+2W§1ѽŲ3!WR!Cm肹ڈ Ҝ}i/eq/nY@:[ylwO?!awՓ*H" zA!Laǘg"4(*賮~at.C^驮2Xb_:58|Ct(J?dߦ0>≦ B8*}<7/‡9&{재)kݬ&oGwNE)^%En)qY泠*KP),`W&ͨYk# E[: `P/pP*Vs vѓ~ *vx9ԍ윍3D@ ?O$9fDq 9RhQ!ovM,)=N?( Ք<4&3BYE) I?z [BjfV\zYm]xK^TTey]o)UĶ#qH<뗻C>õwqzL`Ocd{Ld%b7 ($wK˰D.sAG܋7?tӡ/d47$22i*(*1GEoĘ˖śM!"K33Y\5#*6='-_Ÿ/ZweBИn^ij%,##.ʖ~\.^ ?k4J8t^k҂bLP\CaiOgߘ:wo`B!4&QY iRu*Ey,*ӯŽ3vL͐"װl}9?l ^1x4>rЁ:$R 5h4t }Xj/0),#6԰1,X}nzlTWc} j]r~!x<(䪨ܖ=jn{0 W6 z}3m+r&^5G[07ls4qVwҾ*LܟPx #@L|ҡ"zۍ>C{ 6Pn dF?]B^:`(*u6s;Z\lo^ΐH,6 ɝ1~EJꌗr80.@E tq_~'@)* T27Wwlخib3_lŤvn埴TĭA!iǾ[;](4)&vUW_aq\ H3 86V-`<@eYnXk ']~2w%m+W^~,-s0NQ5Iql`o'F"I!z;p,ህXN3¤v!a:4LkR߫ӇJ<^s0qI` v|pcBH֕FɡuƮ_eogytCef 4շ|ѷpPoYY#n0M7x9 jV4 {n42 :iA'ϏxMeл ">B _W vv>a'6džOJ,)dFNQ6w14y+Ѓ-Q׹7ߩk 0$M^M}+W2SA)>Ek4x4ԉ!(oPρj=X_p{Z 7N cPM??=qL(r%ЙG~7;WxBzdwfI f,UkFKw}>+dx3v^@if%+Zj4%~?5- "(8vRKHVsBcR~QCKG|H>6u%f_gK8H]]mˌusj6I$V9MB<[xK-+o[X^k^QsUGI endstream endobj 108 0 obj << /Type /FontDescriptor /FontName /WZCLPS+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/C/D/E/G/I/J/L/M/N/O/P/R/S/T/U/V/W/Y/a/b/c/comma/d/e/f/ffi/g/h/hyphen/i/k/l/m/n/o/one/p/parenleft/parenright/period/q/quoteright/r/s/seven/six/t/three/two/u/v/w/x/y/zero) /FontFile 107 0 R >> endobj 109 0 obj << /Length1 2058 /Length2 12860 /Length3 0 /Length 14116 /Filter /FlateDecode >> stream xڍP tpwww @i\k\K;%Xp NcΝ{Uݽ}>-vsspduu\\\\yĜZJFQ[)#yxya@F)ղUۿ)؁һk.ZffL3rsټ|q^?]MQ_V??z+g_/} u~_SYh pZeˆH;Hh891=N }`?yr֟*FoFy/@|и^拇@?G^?T)O$(T qL?7~q@w '[?VBN Xټv3.+6#`6`NW__%?<^ݿK)/ I+W˿,^d|)^8_V_^. N?^l__*uGrO'o^Ne 5ȿ ^h;Y;%_㟃z9qC] N^/})OCgm< / J/_zmЖ6auam>K{3-A=SkC!7ҩC=8LRԿ#[_>?Z$jO-N LISRJv~ ۩B!U˫Oѻbe4b~n*c4{;Y9$(;% ޙ7 ^3J"+Zqo9ߵ*].R:RcJk)?* ~e%r9`GG:_)s9AGZ9 {1Pwt,]Y\HX 5FFAXm=5|v7UN&L|MPѶWd~G#Q\ u9f:NxzTʟz`!f`e~J3EnA5f6"]V[p;};)5NR}hqJ(QkvI<1&ʈaK+PE+bIjUvL=rۢ֞Hi_(a8'צ4k%~#m1㺁dX"rbq8ew?>`8k0Φ'yQ葴P-7Kә _U,~]e2Jћd60}xxg{]]d`9ę,Ɲ9Qap)yGq#Jԍk.q懿fԛfX}J#8^W%qu HU䈚rt8OLr*ՖF>Yu9|`58vUSog>9 isC DłRDҫZX1) " ksE~:^/xTR}꺒 VY z,t}e1;ware!3w':9=4a㻆lIٛO,KptAhŖ1tph`rzS?ʏ#U5AڦWee]e%Rt(MzN#e&儙t"[T8MhNOL7JaNs~S0זsSFl OWgI~WN-ς+VSMg!F-Q 6o];xm1Y)Eft|y?n|06yӵA tNIW?W7Ub{>"ߪ U+ĵ$#v!-=3&TG`jM)GZmf ?_.rd_]eCDIbk@vaU٭vVl,y oa+MVo2Gt{ߘDJ w#ad+0H!IsDF 079e{ 8o+i<[6-JN[R40V0"9gS2bn`2Jfohi*hcI mH͙1_U psHE5"ϻxp (]:VjY]}.\Â@~Vh{_t L\uȐ+drw;=H=ʕ.J@_ qǒ.[o,˨\ֱ*wo*:85u-)˜HTE8dAc…J[|TQ;K-1}lW[N#knln8ɟ7Q54\n/<ƨΫu\u?rq OY?mt`w \4qTa>&tWߦb6]dO/2=,swz>.J;&G }/~8eTp Z'.#ɉ𔭉n+ ~;TRA|U;P<Gl%k8p0S5fP/+V,l9n OQT,\nA-A5{aPy75_Lx!\ͮOBnrjmVO,mR0U}9;¢`2Nj6F-B\Qs{Lfx748C\('d  !3~țU',a &u ) <m'LP%ex1(mh-e fB%.Q{FY P\Q*'룈4󴾎YCS;H1~) j2^ېCn-'A3N >D‹'_nE 9ԱE!1; d.ꩾ#YA!:L5Cg6IYuR- Zl wpiEnWDo$|ٖ̓l Y[OM߫Jɺ'n[fBwt>_dj ?q/Ut_,סw,XxP[B,YX _/!co{<x1f";V |$hJ=Ut/aʌ6\ON=ֲcGɅ>Oh=@ KUSg)V69M-=֞MȩKy{L .!*ԍOTա#^th:v}Z_em@6M2WJpٽ\rn>%pɖVEH_aP?˺tu7ώf;ən,ye8 UPd̗|[yUnX bc}`t$o^z|i}lH#f࢙kەzbKSN` yjw`]I4yrf-#9֍Ƹś1 H |4DEugXX LwaJjCRザw b#/HkVsE܉=XhF}5MְMc~QYvk0 =VTzEL&?(JM܎~Hzie<pڣ()ҝ@9;m&q-ܳ{aS줳slP抨|uaYNr&`'rgٯʆҝ]N{Xuwۀ۲0,3`iw+^ #]{te"]񨐨 8;¬Y٧3 Vh w[ڤWS_0O+r|5GI\ ѹOqp)p1wWc!FXY٫O)\4LrqOp=>&bK>|WUfx"KQ>ᎴS>ePLۿ_b* ZVM`b0maR홹g#ia^#AQW:mH~#1x4Ŗ_mf N^I>=o*J{o|뀇_vAe4-Y1l^c|ek$~}mdYgb!SAP:v~/Jtby'K_mշ{Y֝)%ꪤiV~`,])0Wr9{ ޤ8D7JIܳJr]Xyih^~06bݸ1ǧ2F !/l(zdVywh14a_g*~L*&0xoYq[;>}&Gf2L[Ż89T\k?~(!lk5=5>V#1o8Vi$5&j {҈%J!#WirS򖤘o%Odt"zS}%`hLcߏJ1,կDWbc0'?B4d[@d LV >OJ|\Ž~KU$dBi,;4{zU4gO2>ՂV?z 2;@ޝBUYS`stLqOD&Et2tr1G%it>Kšy{ːHy_|rܨԚ6Tlـ}7)'x7lBC3錾o>{,Q`GԳ-v~`[[;P)G@ ~4A" ؀@޾IW _ݓ!Or 0Ħܚ9qh'W;TAX 陓?n|rԏxޅ͹|H7SAF66&GZ=IKknUI,xHtŢ\"}îP芺]n?$|bH\%H*ހ%:Fw4\u/Ӎ+}H~J Ő jEWF?Qm=nMpM j)~_),L%ܓ'iL\A81_OItF8ABU2Coߖe9ROՊ"apd(Ќvn sCB"d+^٧#Z?”MZ\Ji8)jdÍT>n'])K j܅ጱjj2B&M;VQ oC3\@PqnC8t 䛿lJ*˻>"i *1ot)q} v)\uG$ 8wm}j-#{?Y6EYOU2chۄ/iQ%.TJ~ZЛ\0߷zf\ǔAhcAKں tx~ED'E㌲nеRzXX_-{vBJhCulCD6}`qNH* Cō gi- +|ty(ñIn-N⧐`08:R2E&/c)8.a ٟ|.zŌ凶έu,BL)kͶ ??yoEvt|sʼ,<(1*|߻[/FGznDh:.$4On-A7bAj;թ˃dF5|E:NPInkea:y+UV *}qNpKM'"-G(r^&)zڏ#YoiKھ,l|(5)rwrQb@Bl<ټ(ΤfFQ_tZ!0 D׽,HnjA g9H>sS!#p_F@ `<=!޸1TTʏ-لvV 7{~^?Aҩrߦ=PM,!wHB̢ikkP5$R;Q #!"R&sm6ԵVWӏ d]&3"^}vs1kFfΦm_5y]68NLtT_x"zCio\xW"66oV!!6CQȣ"Djh3u38Dދ74VbηKgq1s9Qʦ_N}BKτK8t N!dsF0s_}Muhʐw^O^HR3pugQʮ>$5ٟ6=~@m0>\xBT^$'SU31+uZwxǗ0_8 H=,# l&̺%O*4:WEMh?4uoWj_AO9H\vj ?irǣ!J,HL> =3(slZ(O-,EUfVzk]ߙHrO/Rٓ`e)yƶi C7g2Cag-hB1Ǖ.uGG~4?fLer~}7WbA.)__c{QymqFj0 `8!طB |21(xW Wym1S-tFq'g%YW oKH],Co2`X}~)/r(LimrޚuHS\愮uS>֧իez`Q\fڒL[NQ1 gk 4a7*:>?[nPsTZ5 CqNq] k? (ۙoO5d~UEVZޠ6|ɹ|hDƉ2s%HaYs5c牌K D}kMg-_~LIєY3cox:* ntXfX>n'z.>+! ˦}U_]NupRkӈѴR]v_|(ifcZKxT 3bm$߱MS_-Xnj :-N z{R \x.Mtbݟ6_Us= 5)*bmX_?:]n PT072( h'B_[FX_\fo{}aDZE|#.~ %++Ly3R,oz1!9ri*oaBnԲ#Ljۂ{OV J6aNibgQdzg硔7aB|?JM-ӑ]+AA";.X.O"bkXk\(H&d.9Ga~R(hTf_ؿU BDG7+u0 YNlH b[l|գ32ɲGnb[O|ϤnnGI?5rX ,mN:I`oˇG\ MnUX|o8n!7Nof^-2I rә)Ԛ00RDDd/s1m%@-8!+Y\FT,ߓ_>ʻ~Z h_CCm͛>f¿s aVFr" ɸ7D2aܐ!a7vhCV6< lH{:Rrh{\?3WH{ P񏁺ڃ=22l+o?xɁm$^T*[3JkZw~$TEzSu<*V*li'm(R. $>NFvNoD`F4*Qʃka4SͮXJ"A[U$`?h'XW[$"`op T"wz)Z;k`a(wR R&L~"f]z;hnXhlw^5E'nS $Gy:R{W=7$t m:vFa(^݉h"&$*\_"F.brۏҿ^z Ь R9 `, #f}9&mw˕#MT7C3Erd "2F[OQy&W)-珬F!G0 ДqW61 ;qAgI-a1o^I8j#8sfЂ*w)%Oan1Ul>8Ug3 8.u"L4h/c7ݨ*o KDtn[`@rCE-^_)DuLklIW^Tc[0]Q*}&_:}QSD կf>_O5cuXMW0>p+jE,}d&\rebx\_Mn>TVZ~i0;lhB"zujd.pO$=4E oer~k$A oKd6}ЀdIͳAaO@0ܘ+084Oi/%{Rpo1讃up$4TW]iC& /w]Mğ4PZyWR⟶?.>ȐHQ8Tr@@%̲&SYQ28鄪Zox e|[~㉷AkEb|k(1o>kP5ty=K)Mhgݘ(]'wi_O~57P]]r/9'mX69NɅgzELr`}ZS+r- GuAU0֐)5/@ގuFry `T(yw*pR;&Ĥev(kO\@ `:B"vH7)х!]l|7Z A , gq5 8eZ1B[dY^1d7jaPmwk֤44W)H.@I1 A4C+5EyJv%^;Y,A5eKcn>P|sm~)d~:C̆sF*493o;=Ⱥq/n9A %\qրG;ޘ^DpH.Vhs-`֪'pP<Q9D5kzV8ryRNz eҬK2x}Bc- ADZC>ig5OJx*L} 5ݦΒL}K(XtkKJd3JW'rG|+sf Ѳ6fjDS/*F/ vg`P((\Ks0eM]>RЇRGvR +,36)EQ 6m7NIE/E?Yvkg,`Do01vJcr&\(`ףbl`IלkJ}M P$٢͊Lڱc<_xLasT/؍~Bfҫ̜my9G$>jrmT.rGnRkaTu:g]G$7AF+&8\yT-Z4o.x:$.Rވ]0]P"o `ޞ*gi48,R&~ASH1xuFk0 RӇ2x1ڌhħ";yVJ~ /vODk73wF[굫 :A'BBy<Ҥ,s! 蓗!ȑueM) s2*"m̫][DdLCΎ۷j`a^eg ) O͔͒Cq2H(8vY9O!CO |R6#o \BF`VSҏ׉ϒ\)5K!@qc wS:"oo9䐱r3Y7cl#'\OGhLK;+^1seD3;DS-VWow=[~M<c Svya`!~{Ut Me?=(+Ѫ* ,6?; endstream endobj 110 0 obj << /Type /FontDescriptor /FontName /PXHXYN+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/M/P/T/a/asciitilde/b/bracketleft/bracketright/c/colon/comma/d/e/equal/f/g/h/hyphen/i/k/l/m/n/o/one/p/parenleft/parenright/period/r/s/slash/t/u/underscore/v/w/x/z/zero) /FontFile 109 0 R >> endobj 111 0 obj << /Length1 1494 /Length2 2181 /Length3 0 /Length 3125 /Filter /FlateDecode >> stream xڍT 8Tktht9Hhr sq M6ca TJQ9t/‰\:IE ɷIyٳZ{om"oC;P!ňl  Fd2@$2'}`P p$n< b (fed2_<8@! W D{^Psx/@( &-&7HL yLPB׊#YHFP ߈3`>,0NIjF"`p7-0.„Q>"DY0ۅ܃`3`&/P(_MfBЉdAh6…H e!.C!…p!Dp!As$eaT'`&~aPTb#(=N% "A`!0]o>XLd1,brH aAD29DxAӀ#6|(LGh(B#([u ?1D6qQym0}ODs^q$A;; )jlL&DX+/'2y6z.(,>S I]N.jf~/ٔy&R?WDNB.w"P Dj p ] ^g7 |Ch?E"|'D<3/cs 0?c>>oԏQ&5zTS3aF 1Q,6 <pv#57$Ƹk²0$! 4$;sIL3@|3T@:ap|͞P=a$<1G]!j^I5Y>WQ-3jqzl=QG 깱us'Z}[0j^l=ç 6l1FYsJmk?>rՒ+/su2![?V~ Bډ+vWi5n,V^r(մႁ Ҝ=3hDR3U[@ qA(iAD׏ u6c 'C-{ۜ\Dm}h#exZP•-A1Uao{E_GnMqEb0IN˚y`>|Tmʜk;408]\|rCQ4Idv¸uO6g:.׷fh^|^-a%F;`ZI~ڛ5v I6\yAeOPCOG\b~oߵR 1[Ss]<X,hPzݵ[뭘J׆SZ`9[7c/"^z%gN %tgH=S7K6IO+iWQQ[]5̀z Kcu ^nnØUī1IQXBǥ>v%ePS*gɈqiXW{yg$eմ%i;.퓩xsL VS4#3]>p7,~ |ܲ[%Ռ̃^owi(YṮn ZL4 "{#4!-7),RFlJÜ0()NpΧ#܄O|XР(aݠXyѨ{hsx`x%wRmWqֈ9"gnx(t;(;1K}$b(IsCҪYFcFvx&PRUmSX4qq{S`5?w9cIb~ӭVМ뎅/3e%-b?0-?ּk2x{94R:R=nγǗis%lBYIQJٍ924ݚk>le${htabpMOw#+g/eiz`G\(9ݣs( 3|Q)K4uwtP>oiqȗ v:epO_pb3,F^DY\gb/͍%4ܙ}}xz(S{JFߧpTt7W*\HhuV)ݕCc ߦҳv9&]./(> endobj 113 0 obj << /Length1 1591 /Length2 8140 /Length3 0 /Length 9177 /Filter /FlateDecode >> stream xڍT6LP*%0C7 !0  3!)!]J "-凾9=5k<׽{? %c*"(.^n1(¢ C,zPG'!9G(ugԐsg8+$+,W Q (vYոϑEiA-GWTTO:P@50jw"  !0((HؠPb +7Ήh CNPG%`:2n P]ir;Bw8 E8e8#,Ł:ʪ@ {(`տ8op!V08ʍrCq߁`.wv*hwq٣`AiCA(':W+o`CXZalz98C3c<<<"@uq1)GD@aVл D9:C=oZ ( # hs{@ߟ?ܵ%wO)VK}H7'((z7ɿK&xçBERpWp)=0l^AyP41 uo[?'7w;஑QwC 5jPKzQAX]F" j CAl˿C@5N7 |wyuw8n{Ei{`GG;箹wi u@7KީZ!TDmDE ȿ,y ? ?d(E ? 31; A\r=wEsUAnP,"h[rQ)Cʵ9*9Ų2c%1n[EL@׽u' 7kpⵚb'6|ĥ+u 9Kfkۇޒ7Z[B*%\/" Y-2f(qP\xdn$ӧgSd~?xE{EX~ALeHIyJ6<)59ŜgQAĪ\&7<3P ǥ4sT`1&~ Ds8M̂?WoҬ|kʟjuv LDf?8f-O\Vukdu બ =@;ygҬ8_jbiX) Ӟ{q.Ig;R.?s26G ɜA&@V S {`ג})ѱ|d-$o89acut)̥ͳV#!x|ƼWfSoѴ',(f'{܊lU51O~ro&L8.8dg_!/PN!GɈH#bJ!*d%h7^LsS٘'Ir:6fw,$>'*᧡ ՝UZ5:Xf L⊖/E\ܺX_.RmOBBU&w.mOK?Wuӹll:fw- S9n4?}ƭ^QbN55L4-a緎jwe/W`ed{U [BoiйAg\q9__P[FU /#꣐/a!jOYtx.'Y쁽vttIIy;X_o.W(EaKult'b.:IOlPˏSVgkYzJ1Nq8 y1IG&whSSDu1ϔ PSDx$;Ƌ,7VG1>.D8-/̄WntfM(?Evjv}+OJLhx;s~P'v>Nw0ߛm|Zwgyae!ɱ~L;,Q9WzS#sǧلXʞABTîa xCo.op{.y^/&9},VӒv-Qnc @4xdirK2U' ӌӄ%3um% *Rm:(oZS#DQBӲmw !n63@[:~#PE ԼU2WtcPm{u5JpAmOFgSVœ @+n{+Cxid>LyuhJ۪^tyAbzuJ0RÐlJi<9:ur|W#V+$I{CKaXm7'//pG 4"c:faϷeQ&>ȇ?d!y'i?mdVVgcǕxKYqyZN{bϸ^nV6]S@W>cNc~ fSe*/Tv湜AP__g_j^RaS' ]Pwu{d3$'N"X՗ω/='^G[~q iD6`xb/ @6&$x$q:-ٵ]g2/{^qjUt f0ȚVg|<۽zӭ(I4rm1\N$[/m3"o|i<-i/LCK@Wߏ֪߲Y'_ivsbSDcF; KIJ-C#qgK}[hFȔi>N0 ϯ,R?Vd"v_{th'  w[hFB~i} e., r8C/jU#2[b<yp?'UB>UNIV lmΥ੷YVŋ+eJϔ>œ{iW }>=O6P5(=H¶>%%ƳNߞ{Uh*=?k0GN5yJ"b;cF46)5]G}0Oz/׏ nB-Q@u^^86-i7Pd]UΫ:Š^;"V*2Z=?Cܭ9w]Yӛ)Ma>8̄EwM7g~kםy.ɨq7ǴFT]UXuopNuuKg2OGZЪ$B/ ?.+icς]TҢ6 ::CmD)px_,;˄|ﴨwT5f$>;JVhJ{%o9w% .XM62Y!}]S?n qׯbTӀ'7(v8Vg|KM$+kh$n\$5ɽrd_ pjMLi5j?b++Fۭ>ԹݒOjF8{j#c=]N_ȯ"LpC;DWK gS~JxHϪop\&^Js-mX%*n f11_j7le0fuM7pM>YT nX(ȧK|N*z*ДVbj]JcM!DK^ ҟA|کrpiYeڀb٠2lĕfEsS}ٓdy%V&TGuz `\C +RwK"c7"wq"5D;)u49{cpai:Ŵ㥭f.zirĦx5A: 6ǥXJ'zE_d̦;{Ԯ~e Pb5==IyxaRq84Y-:)I ZI,R(mSK{}#e~ۀ[q\H] }RoTh_cði_4m7`yXo !_5rRLI>4s7%†\x{=([#J`~u^$U|_?DBDz?'!ELc^;!ܥK;<y݌WN;d)'DV HǗ,os 1@]:'&8t\$+6~>=*$؄":c^X hM/tB=m磆iApv4-yX鵋D 7D?˦&êvQ( Ή3dk0d)3}Wn_ؘ^6dG ι~ fсĞnD {bLG6x:;QwUfvXj"m hg rqE ^DŽ3$\■rZ[eٹLoűhiH5T&o^>{OVfMXSݼIY!3g)ճzKWCwfi!PBXHs,wT9#rEP98 eLQf |Q%8KEeڄB TܰH:Δ9=(%~a Oҩ!\3G0S=%Ǫ ~^uOh0om=ڶ2LeUmQU4Z]hΩzq%,f1Ŵ1y.K]]| ?2`6gV /TB{vYm Ug7x?3;ӅՄعRK֒GTxjQo-9k7ZFICPߞq(.(©TC1Ծ/;I#h1z:g6Z"߇Z.\AcV/LyI+/]vGrd;@LOvKF_zJ Mo9CvVWn'ٯ|L `4MFXd] Uԗٸodd֑Uθl.E ~Otܐ~Uӓ=W{ѥgo1ƞ?v}/{*o)M{ilQ >i',7NWa?%^+oKi5j8 wv+kKaS7}'0 ^~Ss9Ot; `J90vR A*2 #t[B$? vG)dJi" p5n&י?ɏĝi5o8I %[U'yGD:{6 An P?I[Y5!"+#^Fmڥ!dRfXw8J9\őյxDZmɗV[.gUzڏDΩi$=qkn2~7db9S̅$8$3;E`a%j3L2D\FlLm]"8TGNIW'5mU4s ;9G-!xe7HIE0 bJls.! s4t\ mBRm_F|boS"٩,Enb/|MsLH wۍxmBQc^\',3W.C{U%{Luc!z9 l۔q,J_ZA_t~m`}K̭豢PC_CeG*ew|9kMې#CY#a&rUcjZlXd:R; ɯlKna_WG['5g%BˀPFږgA󙓳WZ~?rۥ $p]~4ޢkFH*.a:>7Ȉ/)`nfQ_`Pwsdi!Ь[)&19ObUylzj.:_嘾=zfr'k}P#! (*6\W xG#/9T'w޻R^|6^bw_l1t >\e9WsO:(-D]X[CzT%dmW?(ҌvR70( O(Y-G6'PrLw%c8N{+ :5NaiGÍaSe0X 9?j8V?Ŕ!]KH5+$jW(l7jR㫍%}|n3U"c;Ui+k$&Wv!tcBzfOb02] um%N٥9f{z|AsT`Jࡂ~JyJI"K,Z _ܗ=k ]9©sv%یJl{kqq[Xo ZoQ=r ~@IG_bE-YpD)Л9kF亣O=9Vi\ҏ_YEkEx[wȂefUӎH֓(ӞgߎQ?Ay endstream endobj 114 0 obj << /Type /FontDescriptor /FontName /CFWVRL+CMTT9 /Flags 4 /FontBBox [-6 -233 542 698] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/T/c/d/e/g/i/l/m/n/o/p/s/t/v/z) /FontFile 113 0 R >> endobj 115 0 obj << /Length1 1342 /Length2 1550 /Length3 0 /Length 2413 /Filter /FlateDecode >> stream xڍS TSgVhF"**(HJP"RvA"+/ y&y/d"` +[E Z*EPDJAD"Eb:/v朙s^{w~re@-qa6*l$ Q)B(Ғ([?r+,# UC )@ J1՞I]ϤPBqx dLE#|G T%C" &xwV(a(T(L29&&I$LdM1Ba9,@Kl$45p|* 1 C`T(Q>, Kat ; *t!H!T@a%)bD|-1<1C 4?9OHrk9e6|WL"Q}"yxUP,{k /+`R^nExAS6Xº U9$I1)4D89 L '5ER)DPLeH,ˏ (߻v\a| u#&{oi3M]q :с~Hλe@R `` {oDO+jzm7lp=) P%Х7kOElX[M#Ij òB5R7FߵX(x)0溣<]@2"Pp1Q-ñ:q2 x * @ڑ#j]:ˁa:KxJ u ñ0umLY\7q4Q ҳ1Ð>%я$:|N?~uV hoEL(/3M},[l }~:ʏ4yZx%f̹Sb裎55e/N =7Lגn`a}^r=+̥~뼗sHrܦ4KwK3ܥFRAO|"ZAe_dUX]ڊ+oʆ'RvhQܮcMzly=]m_.l[|%nΉ<"r;r+LuRNdMl1%3 IlGf3wδ֫87k=kSƽFgWYUj=?_jyZvc w{޽GH[ra"vs;n2\uΛ$i`NiTsɓ5Ua+<s5R.q&Iܶ``h싓7Yðzc F CGǜ όkG zaGIa|*eg%F ױSx*V<_s-47 4Ɣkm)#{l5-S|,4s^\#~e|>,8ek]~#)[?y(rѓ^iOsak R=g9?^"p]F,I@voOo]Ժјe;lwwƏ.E}5_Nt'x壁zZexKVe }d _\+0]rݹYR9ܷB?ioC͛&k4 mnޯ_ݾ|RA:wrOP8IIijsPtCWWdF}#I̫~4v|_-=k"e0X!/[p3-̵Wtlmu'_n&$ުsyMֆ[g%$hr[iyOc\Vh3h5>i(yuʖkߦwSBG7! ٗON ąփ?>20`f^'͌>#.%/Se6ُ8J=88s@_PP> w9.TY=XE:ϢS6#G;>ICSf/}7cKxkj*gv쭨v1MݝE'+^+61 acn eig~} By-9߳(J\ͱCo}ڍ6yCGtޡ)!3| kg<.Ɵ*, 6^>e endstream endobj 116 0 obj << /Type /FontDescriptor /FontName /JVQUOH+MSBM10 /Flags 4 /FontBBox [-55 -420 2343 920] /Ascent 464 /CapHeight 689 /Descent 0 /ItalicAngle 0 /StemV 40 /XHeight 463 /CharSet (/R/Z) /FontFile 115 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PNMQNT+CMBX10 /FontDescriptor 78 0 R /FirstChar 40 /LastChar 121 /Widths 74 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MKNZRP+CMBX12 /FontDescriptor 80 0 R /FirstChar 46 /LastChar 122 /Widths 75 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HQDFTI+CMCSC10 /FontDescriptor 82 0 R /FirstChar 46 /LastChar 122 /Widths 73 0 R >> endobj 20 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZPGVCH+CMEX10 /FontDescriptor 84 0 R /FirstChar 18 /LastChar 19 /Widths 60 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZPXYAI+CMMI10 /FontDescriptor 86 0 R /FirstChar 18 /LastChar 121 /Widths 69 0 R >> endobj 25 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KFKJAD+CMMI6 /FontDescriptor 88 0 R /FirstChar 106 /LastChar 106 /Widths 59 0 R >> endobj 16 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IEOMZW+CMMI8 /FontDescriptor 90 0 R /FirstChar 18 /LastChar 110 /Widths 64 0 R >> endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QSYQDR+CMMIB10 /FontDescriptor 92 0 R /FirstChar 121 /LastChar 121 /Widths 62 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SIACLX+CMR10 /FontDescriptor 94 0 R /FirstChar 11 /LastChar 124 /Widths 71 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AXLZUG+CMR7 /FontDescriptor 96 0 R /FirstChar 49 /LastChar 51 /Widths 68 0 R >> endobj 19 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BSPBRU+CMR8 /FontDescriptor 98 0 R /FirstChar 49 /LastChar 54 /Widths 61 0 R >> endobj 26 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ACTTTC+CMR9 /FontDescriptor 100 0 R /FirstChar 12 /LastChar 122 /Widths 58 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CYZAVM+CMSY10 /FontDescriptor 102 0 R /FirstChar 0 /LastChar 106 /Widths 70 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PXBGHL+CMSY7 /FontDescriptor 104 0 R /FirstChar 0 /LastChar 0 /Widths 66 0 R >> endobj 17 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GKQTPI+CMSY8 /FontDescriptor 106 0 R /FirstChar 0 /LastChar 62 /Widths 63 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WZCLPS+CMTI10 /FontDescriptor 108 0 R /FirstChar 14 /LastChar 121 /Widths 72 0 R >> endobj 13 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PXHXYN+CMTT10 /FontDescriptor 110 0 R /FirstChar 40 /LastChar 126 /Widths 67 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AHYZVE+CMTT12 /FontDescriptor 112 0 R /FirstChar 84 /LastChar 122 /Widths 76 0 R >> endobj 31 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CFWVRL+CMTT9 /FontDescriptor 114 0 R /FirstChar 84 /LastChar 122 /Widths 57 0 R >> endobj 15 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JVQUOH+MSBM10 /FontDescriptor 116 0 R /FirstChar 82 /LastChar 90 /Widths 65 0 R >> endobj 21 0 obj << /Type /Pages /Count 5 /Kids [2 0 R 23 0 R 29 0 R 35 0 R 55 0 R] >> endobj 117 0 obj << /Type /Catalog /Pages 21 0 R >> endobj 118 0 obj << /Producer (MiKTeX pdfTeX-1.40.14) /Creator (TeX) /CreationDate (D:20140812190817-05'00') /ModDate (D:20140812190817-05'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.9.4902 (1.40.14)) >> endobj xref 0 119 0000000000 65535 f 0000003948 00000 n 0000003843 00000 n 0000000015 00000 n 0000258110 00000 n 0000255868 00000 n 0000255728 00000 n 0000256008 00000 n 0000257827 00000 n 0000256854 00000 n 0000257409 00000 n 0000256289 00000 n 0000256993 00000 n 0000257968 00000 n 0000257550 00000 n 0000258392 00000 n 0000256571 00000 n 0000257688 00000 n 0000256711 00000 n 0000257131 00000 n 0000256149 00000 n 0000258533 00000 n 0000008086 00000 n 0000007978 00000 n 0000004201 00000 n 0000256430 00000 n 0000257269 00000 n 0000012841 00000 n 0000011583 00000 n 0000011475 00000 n 0000008295 00000 n 0000258251 00000 n 0000019979 00000 n 0000026689 00000 n 0000032561 00000 n 0000012733 00000 n 0000011745 00000 n 0000015888 00000 n 0000016219 00000 n 0000016265 00000 n 0000016678 00000 n 0000017001 00000 n 0000017095 00000 n 0000022343 00000 n 0000022674 00000 n 0000022720 00000 n 0000023141 00000 n 0000023483 00000 n 0000023577 00000 n 0000028361 00000 n 0000028692 00000 n 0000028738 00000 n 0000029165 00000 n 0000029513 00000 n 0000034946 00000 n 0000034838 00000 n 0000032714 00000 n 0000035059 00000 n 0000035233 00000 n 0000035885 00000 n 0000035909 00000 n 0000035939 00000 n 0000035993 00000 n 0000036017 00000 n 0000036419 00000 n 0000036995 00000 n 0000037066 00000 n 0000037090 00000 n 0000037456 00000 n 0000037492 00000 n 0000038084 00000 n 0000038701 00000 n 0000039332 00000 n 0000039976 00000 n 0000040453 00000 n 0000040925 00000 n 0000041377 00000 n 0000041629 00000 n 0000055367 00000 n 0000055664 00000 n 0000069538 00000 n 0000069856 00000 n 0000081789 00000 n 0000082070 00000 n 0000089272 00000 n 0000089515 00000 n 0000099794 00000 n 0000100074 00000 n 0000107158 00000 n 0000107376 00000 n 0000115830 00000 n 0000116079 00000 n 0000123122 00000 n 0000123344 00000 n 0000147347 00000 n 0000147846 00000 n 0000155201 00000 n 0000155429 00000 n 0000163138 00000 n 0000163375 00000 n 0000181186 00000 n 0000181612 00000 n 0000189931 00000 n 0000190225 00000 n 0000197199 00000 n 0000197424 00000 n 0000204677 00000 n 0000204922 00000 n 0000224944 00000 n 0000225335 00000 n 0000239572 00000 n 0000239957 00000 n 0000243202 00000 n 0000243434 00000 n 0000252731 00000 n 0000252976 00000 n 0000255509 00000 n 0000258619 00000 n 0000258671 00000 n trailer << /Size 119 /Root 117 0 R /Info 118 0 R /ID [<61BA638A80E45FD645E5A8BCE5DF33EB> <61BA638A80E45FD645E5A8BCE5DF33EB>] >> startxref 258894 %%EOF PK?u E $toeblitz-1.0/ ѴFѴF,FPK?u E$+toeblitz-1.0/decomp/ יFיFSFPK? CI**$$ ]toeblitz-1.0/decomp/decompToeplitz.m BwSFSFPK? CpJ ($ +toeblitz-1.0/decomp/decompToeplitzFast.m BwFFPK? CpI -$ |7toeblitz-1.0/decomp/decompToeplitzFastZohar.c BwFFPK? C]+5+5/$ eRtoeblitz-1.0/decomp/decompToeplitzFastZohar.mex BwFFPK? CEe2#2#2$ ݇toeblitz-1.0/decomp/decompToeplitzFastZohar.mexa64 Bw_F_FPK? C^!!5$ _toeblitz-1.0/decomp/decompToeplitzFastZohar.mexmaci64 BwFFPK? CkM,,2$ toeblitz-1.0/decomp/decompToeplitzFastZohar.mexw64 Bw(F(FPK? C7q$ toeblitz-1.0/decomp/logdet.m Bw.:F.:FPK? CFF-$ toeblitz-1.0/decomp/logdetToeplitzFastZohar.c Bw/aF/aFPK? CR##/$ wtoeblitz-1.0/decomp/logdetToeplitzFastZohar.mex Bw\F\FPK? CO!2$ b4toeblitz-1.0/decomp/logdetToeplitzFastZohar.mexa64 Bw$F$FPK? C=F(!!5$ {Ttoeblitz-1.0/decomp/logdetToeplitzFastZohar.mexmaci64 BwKFKFPK? Cz &$$2$ nvtoeblitz-1.0/decomp/logdetToeplitzFastZohar.mexw64 BwיFיFPK? C|7$ toeblitz-1.0/invToeplitz.m BwEFEFPK? Ci}}$ toeblitz-1.0/license.txt BwZFZFPK? C69ۯ$ toeblitz-1.0/logdetToeplitz.m BwFFPK? CTCk00$ $toeblitz-1.0/README ڦ F FPK?Ϲ C$Ttoeblitz-1.0/results/ ׾ŤĕFĕFPK?u E$Ttoeblitz-1.0/solve/ 2F2FĕFPK? C\ \ $ +Utoeblitz-1.0/solveToeplitz.m BwĕFĕFPK? Ci($ btoeblitz-1.0/solve/PCG_Chan.m BwܼFܼFPK? CL-ˆ,$ itoeblitz-1.0/solve/PCG_Circulant_Embedding.m BwFFPK? Co8>>$$ nntoeblitz-1.0/solve/solveToeplitzLD.m BwFFPK? C*$ utoeblitz-1.0/solve/solveToeplitzMldivide.m Bw F FPK? Cs s %$ xtoeblitz-1.0/solve/solveToeplitzPCG.m Bw2F2FPK? CW$ toeblitz-1.0/startup.m Bw'YF'YFPK?u E$toeblitz-1.0/test/ FF'YFPK? CE|*--$ toeblitz-1.0/testToeplitz.m H(y'YF'YFPK? CԂx x '$ toeblitz-1.0/test/test_decompToeplitz.m BwWFWFPK? L C_  $ toeblitz-1.0/test/test_plot.m .,y_F_FPK? C_ug&$ toeblitz-1.0/test/test_solveToeplitz.m BwtFtFPK? Cw )$ 0toeblitz-1.0/test/test_solveToeplitzPCG.m BwtFtFPK? Ctrhuu&$ 9toeblitz-1.0/test/test_traceToeplitz.m BwFFPK?u E$toeblitz-1.0/trace/ 9|F9|FCFPK? Cѿ**$ #toeblitz-1.0/traceToeplitz.m BwCFCFPK? C`y\jj($ toeblitz-1.0/trace/traceToeplitzBackup.m BwjFjFPK? Cdv &$ 7toeblitz-1.0/trace/traceToeplitzFast.c BwjFjFPK? CȒ""($ 8toeblitz-1.0/trace/traceToeplitzFast.mex Bw‘F‘FPK? C@ ==+$ ?toeblitz-1.0/trace/traceToeplitzFast.mexa64 Bw F FPK? C=NJ!!.$ Ztoeblitz-1.0/trace/traceToeplitzFast.mexmaci64 Bw.F.FPK? C+$ h{toeblitz-1.0/trace/traceToeplitzFast.mexw64 Bw9|F9|FPK?u E$toeblitz-1.0/util/ ѴFѴF9|FPK? C^% % #$ toeblitz-1.0/util/convertToeplitz.m BwKFKFPK? C|1u !$ Gtoeblitz-1.0/util/genPDToeplitz.m BwKFKFPK? C==%$ toeblitz-1.0/util/multiplyCirculant.m BwfFfFPK? Cc$($ toeblitz-1.0/util/multiplyinvCirculant.m BwnFnFPK? C ;;$$ toeblitz-1.0/util/multiplyToeplitz.m BwFFPK? . C(oo)$ ctoeblitz-1.0/util/recreateToeblitzPlots.m E-fFfFPK? C:& $$ .toeblitz-1.0/util/startup_checkMEX.m BwѴFѴFPK?u E$8toeblitz-1.0/written/ FFѴFPK? Eӥ<<!$ 9toeblitz-1.0/written/toeblitz.pdf FFPK55>6