From d30cfc1c392bbe1e0366e3380bb491e2449f1fba Mon Sep 17 00:00:00 2001 From: kd383 Date: Wed, 24 Aug 2016 01:54:12 -0400 Subject: [PATCH 1/6] estrada code --- src/index_estrada.m | 32 ++++++++++++++++++++++++++++++++ src/moments_exponential.m | 10 ++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/index_estrada.m create mode 100644 src/moments_exponential.m diff --git a/src/index_estrada.m b/src/index_estrada.m new file mode 100644 index 0000000..276e149 --- /dev/null +++ b/src/index_estrada.m @@ -0,0 +1,32 @@ +% EE = index_estrada(c) +% EE = index_estrada(Afun, n, nZ, N) +% EE = index_estrada(A, nZ, N) +% +% Compute the Estrada index tr(exp(A)) by the Chebyshev expansion of +% exponential function and moments of A; the spectrum of A should +% already lie in [-1,1]. +% +% Inputs: +% c: A column vector of N Chebyshev moment estimates of A +% A: Matrix or function to apply matrix (to multiple RHS) +% n: Dimension of the space (if A is a function) +% nZ: Number of probe vectors with which we want to compute moments +% N: Number of moments to compute +% +% Output: +% EE: Estrada index of the form tr(exp(A)) +% +function EE = index_estrada(varargin) + % Use the moments if they are given; otherwise compute them + if min(size(varargin{1}))==1 && length(varargin{1})>1 + c = varargin{1}; + else + [c,~] = moments_cheb_dos(varargin{:}); + end + + % Get the coefficients of Chebyshev expansion of exponential + N = length(c); + w = moments_exponential(N); + EE=w'*c; + +end \ No newline at end of file diff --git a/src/moments_exponential.m b/src/moments_exponential.m new file mode 100644 index 0000000..507e5bf --- /dev/null +++ b/src/moments_exponential.m @@ -0,0 +1,10 @@ +% [c] = moments_exponential(N) +% +% Compute Chebyshev moments 0 through N-1 of exponential function +% f(x)=exp(x) on [-1,1] +% +function c = moments_exponential(N) + c = besseli(0:N-1,1); + c(2:N) = c(2:N)*2; + c=c'; +end \ No newline at end of file From ec9cee2b6c6752ad9060a8809d82a6a3d4ccc1da Mon Sep 17 00:00:00 2001 From: kd383 Date: Fri, 26 Aug 2016 13:17:12 -0400 Subject: [PATCH 2/6] subgraph centrality --- .DS_Store | Bin 0 -> 8196 bytes src/index_sub_exp.m | 42 ++++++++++++++++++++++++++++++++++++++ src/index_sub_res.m | 42 ++++++++++++++++++++++++++++++++++++++ src/moments_exponential.m | 18 +++++++++++++--- src/moments_resolvent.m | 24 ++++++++++++++++++++++ 5 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 .DS_Store create mode 100644 src/index_sub_exp.m create mode 100644 src/index_sub_res.m create mode 100644 src/moments_resolvent.m diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c172ba643bc922e19f96b16dcc0e7899431f9bef GIT binary patch literal 8196 zcmeHMTWnNC7@n^e*zE~$N?ThNnl3c9D4V#|w$K{O_GT}DG;FW5bUnN0NKZUHXWetQ z1)IkD;sx(7CdMcVs08&%>n-uY5R4iVmB0h?WTKD6#KhZ!iT|8ATY8~9HYA+c%=|O+ z|NqS2?|d_pnKH)EmR0K*t6+=;D03-GRNNqOJUSaKb z_z3t2_z3t2_z3t2+zJTLnaxvRm2+Qc{nAIkN8q+ZfbS1s%3Q`gIVYsMbx`460Z8&I zfSaf;^9sqZCu5$R6OuHPAY4fbS9n(p2zTladv-BT&Iu{p8NAB}yqV$MP~gr^!r4q?@WW-DYJ?)gFtB z@rHEOnMlZGeHm?vT>BJL8`Nz*sT;a;JP_o+gj_K*b8ll^BwSbDFdGTa?A{%XgzN8X zoSl_l2n4p?)zEriBt3iL)af(ty!+nS^A`jH@OBYavJ8>0uft*3Q+?t&Bk%2GTEOx1 zA~>WCq0R?8OS-xfvYfTGLzO$vj|=Nm#xjgP%hny;GDn6T?U=)Le4r(&;ls9-aoXL%hIJZWSZ(G29ZYj)dr-^R zB!j_o8_Tza@4Wk-`aKU^+9VfmE-96y!vwAA=#S`HW?-7*JEGVr%~W;s=+G1g*UMpt~YcXuwdCnjxz};TElvLPJv`c6p!I*-$ElhEvw$Bn54IeND}w&^VuV zzhXNF)0#;keZ%K&*&A!6kXHM6k$owp-WKq_}df7Nj zv*YYJ_9{EcK4$am6ZRGRj$LL~*>CI``-A<-{$hWFVFNZnMlnLDK`nNo4vpA@CN!fR z-RQ+W?8g8`aRlQ?U;=4mV8g*Ip2E|32Cv{PoWg0G!H4(=U*ZCOz>oL|7jYH8;+lvo zFGt&+T=YWXcaq*JCfa(haCy((n6_12-Cbop?YAs#uWS@#ExV)KWp7hU+X4laefP!e zb15e{<#H{@C6~@i2z-esy>(lqR5d`9)Q+vj7kNEj1OeB2`;MwAIpETaJJ-}wGmjR6 z(C&&@6l223L5V?@gt zBIOg9!;?6H=kX$5!pnFKuj388iIX^sb9f&gU>=|1GklIOa30?;qi63jdS1RxFE zG%WKd_2kIB)YxyW83OrYrV4)l?_B-;f6e0YC-M>S5m Date: Sun, 28 Aug 2016 15:20:28 -0400 Subject: [PATCH 3/6] index codes --- .DS_Store | Bin 8196 -> 8196 bytes src/index_estrada.m | 26 ++++++++++++++------- src/index_inform.m | 49 ++++++++++++++++++++++++++++++++++++++++ src/index_sub_exp.m | 30 ++++++++++++++++-------- src/index_sub_res.m | 31 +++++++++++++++++++------ src/moments_resolvent.m | 12 +++++++--- 6 files changed, 121 insertions(+), 27 deletions(-) create mode 100644 src/index_inform.m diff --git a/.DS_Store b/.DS_Store index c172ba643bc922e19f96b16dcc0e7899431f9bef..e35ff0ca1e5708339358d94c9d709b0ceba3c817 100644 GIT binary patch delta 690 zcmZp1XmQwJAjsG^*-%iN&B@tC*wt;bpI|2=yMUmOouri1KR+uIz=Ss=jNv7l@y2MCFZ71J}IKYAD5C?lIoLKT;gAl znwOd~`ICrahAcO?00SrI6$wcxX;n3Oc>yMYtsER+u9mhuw*a$1A_qiP-+)_QfK?!c z6C!J33e?FWPz=>;X$6#J6Yz%0+Svn*;t)6iHOg6S@@!FQpx4)l8gO4{c+BvE;T^+g zhToH4ic04PG6pe5GsZH;GbS)5GG;O6Fy=AlGZrvbGFCIzGS)HHGj=d`G4?R_GWIb} zXPn76n{f`~T*hULD;QTXu4Y`rxRntlFd<h_W0QCHa2NHQ{84zBysDPIiKU%WL~?#^Zfaghaa>AbNvcm`afyFHYF=u} ztoZ4D*Asg9eB> zd4;GB_d|xa44)W&F#Kg?oqS(Z+B}Fcm@$MgmNA|&kuixenK6ekkFkKUkg1 c = varargin{1}; @@ -26,7 +36,7 @@ % Get the coefficients of Chebyshev expansion of exponential N = length(c); - w = moments_exponential(N); - EE=w'*c; + w = moments_exponential(N,ab(1)); + EE=exp(ab(2))*w'*c; end \ No newline at end of file diff --git a/src/index_inform.m b/src/index_inform.m new file mode 100644 index 0000000..d5eb0be --- /dev/null +++ b/src/index_inform.m @@ -0,0 +1,49 @@ +% IC = index_inform(A, nZ, N) +% IC = index_inform(Afun, n, nZ, N) +% +% Compute the information centrality by the Chebyshev expansion of +% 1/(ab(1)*x_ab(2)) and moments of (L+ee^T/n). +% +% Inputs: +% A: Matrix or function to apply matrix (to multiple RHS) +% n: Dimension of the space (if A is a function) +% nZ: Number of probe vectors with which we want to compute moments +% N: Number of moments to compute +% +% Output: +% IC: Information centrality +% +function IC = index_inform(varargin) + + defaults = {'Afun', NaN, 'n', NaN, ... + 'nZ', 100, 'N', 10, 'kind', 1}; + [Afun, n, nZ, N] = mfuncify(defaults, varargin{:}); + if N < 2, N = 2; end + + % Compute the eigenrange of Laplacian + Lfun = mfunc_laplacian(Afun,n); + opts = []; + opts.isreal = 1; + opts.issym = 1; + range = sort(eigs(Lfun, n, 4, 'be', opts)); + range(1) = 1; + range = sort(range); + range = range([1,end]); + + % Linear rescaling of (L+ee^T/n) + Bfun = @(x) (bsxfun(@plus,mean(x,1),Lfun(x))); + [Bfuns,ab] = rescale_mfunc(Bfun,n,range); + + % Compute the ldos moments + [c,~] = moments_cheb_ldos(Bfuns,n,nZ,N); + + % Compute the Chebyshev expansion of 1/(ab(1)x+ab(2)) + z = -ab(2)/ab(1); + w = 1./(sqrt(z^2-1)*(z-sqrt(z^2-1)).^(0:N-1))/ab(1); + w(2:N)=2*w(2:N); + + % Compute information centrality + d = c'*w'-(n-1)/n^2; + IC = 1./(d+mean(d)-2/n^2); + +end \ No newline at end of file diff --git a/src/index_sub_exp.m b/src/index_sub_exp.m index 96867b5..2522264 100644 --- a/src/index_sub_exp.m +++ b/src/index_sub_exp.m @@ -1,24 +1,34 @@ -% ESC = index_sub_exp(c) -% ESC = index_sub_exp(beta, c) -% ESC = index_sub_exp(beta, Afun, n, nZ, N) -% ESC = index_sub_exp(beta, A, nZ, N) +% ESC = index_sub_exp(c, ab) +% ESC = index_sub_exp(beta, c, ab) +% ESC = index_sub_exp(beta, Afuns, n, nZ, N, ab) +% ESC = index_sub_exp(beta, As, nZ, N, ab) % % Compute the exponential subgraph centrality diag(exp(beta*A)) by the % Chebyshev expansion of exponential function and moments of A; the -% spectrum of A should already lie in [-1,1]. +% spectrum of As should already lie in [-1,1], and the rescaling +% parameters should be given as the last argument. % % Inputs: % beta: Exponential coefficient % c: An N-by-n matrix of ldos moment estimates of A -% A: Matrix or function to apply matrix (to multiple RHS) +% As: Rescaled matrix or function to apply matrix (to multiple RHS) % n: Dimension of the space (if A is a function) % nZ: Number of probe vectors with which we want to compute moments % N: Number of moments to compute +% ab: Rescaling parameters. Original matrix should be ab(1)*A+ab(2) % % Output: % ESC: Exponential subgraph centraility of the form diag(exp(beta*A)) % function ESC = index_sub_exp(varargin) + % If rescaling parameters are given + if length(varargin{end})==2 + ab = varargin{end}; + varargin = varargin(1:end-1); + else + ab = [1,0]; + end + % Check if an exponential coefficient is given (default:1) if isnumeric(varargin{1}) && isscalar(varargin{1}) beta = varargin{1}; @@ -27,6 +37,8 @@ beta = 1; end + ab = beta*ab; + % Check if ldos moments are given; otherwise calculate an estimate if size(varargin{1},1)~=size(varargin{1},2) c = varargin{1}; @@ -34,9 +46,9 @@ [c,~] = moments_cheb_ldos(varargin{:}); end - % Get the Chebyshev expansion of exp(beta*x) + % Get the Chebyshev expansi0n of exp(beta*x) N = size(c,1); - w = moments_exponential(N,beta); - ESC = c'*w; + w = moments_exponential(N,ab(1)); + ESC = exp(ab(2))*(c'*w); end \ No newline at end of file diff --git a/src/index_sub_res.m b/src/index_sub_res.m index 365ddf8..9d1b9a5 100644 --- a/src/index_sub_res.m +++ b/src/index_sub_res.m @@ -1,24 +1,34 @@ -% ESC = index_sub_res(c) -% ESC = index_sub_res(alpha, c) -% ESC = index_sub_res(alpha, Afun, n, nZ, N) -% ESC = index_sub_res(alpha, A, nZ, N) +% ESC = index_sub_res(c, ab) +% ESC = index_sub_res(alpha, c, ab) +% ESC = index_sub_res(alpha, Afuns, n, nZ, N, ab) +% ESC = index_sub_res(alpha, As, nZ, N, ab) % % Compute the resolvent subgraph centrality diag((I-alpha*A)^-1) by % the Chebyshev expansion of exponential function and moments of A; -% the spectrum of A should already lie in [-1,1]. +% the spectrum of As should already lie in [-1,1], and the rescaling +% parameters should be given as the last argument. % % Inputs: % alpha: Resolvent coefficient % c: An N-by-n matrix of ldos moment estimates of A -% A: Matrix or function to apply matrix (to multiple RHS) +% As: Rescaled matrix or function to apply matrix (to multiple RHS) % n: Dimension of the space (if A is a function) % nZ: Number of probe vectors with which we want to compute moments % N: Number of moments to compute +% ab: Rescaling parameters. Original matrix should be ab(1)*A+ab(2) % % Output: % RSC: Resolvent subgraph centraility of the form diag((I-alpha*A)^-1) % function RSC = index_sub_res(varargin) + % If rescaling parameters are given + if length(varargin{end})==2 + ab = varargin{end}; + varargin = varargin(1:end-1); + else + ab = [1,0]; + end + % Check if an exponential coefficient is given (default:0.9) if isnumeric(varargin{1}) && isscalar(varargin{1}) alpha = varargin{1}; @@ -27,6 +37,13 @@ alpha = 0.9; end + % Throw a warning if choice of alpha does not guarantee convergence + if alpha>=1/sum(ab) + warning(['Chebyshev expansion will not converge because'... + ' function has pole in [-1,1]. alpha must be less'... + ' than 1/sum(ab)']); + end + % Check if ldos moments are given; otherwise calculate an estimate if size(varargin{1},1)~=size(varargin{1},2) c = varargin{1}; @@ -36,7 +53,7 @@ % Get the Chebyshev expansion of 1/(1-alpha*x) N = size(c,1); - w = moments_resolvent(N,alpha); + w = moments_resolvent(N,alpha,ab); RSC = c'*w; end \ No newline at end of file diff --git a/src/moments_resolvent.m b/src/moments_resolvent.m index 8700a72..e855929 100644 --- a/src/moments_resolvent.m +++ b/src/moments_resolvent.m @@ -7,17 +7,23 @@ % Input: % N: Number of moments % alpha: Resolvent coefficient in (0,1) +% ab: Rescaling parameters. Original matrix should be ab(1)*A+ab(2) % % Output: % c: A column vector of N moments % -function c = moments_resolvent(N,alpha) +function c = moments_resolvent(N,alpha,ab) + if nargin<3 + ab = [1,0]; + end if nargin<2 alpha = 0.9; end - z = 1/alpha; - c = z./(sqrt(z^2-1)*(z+sqrt(z^2-1)).^(0:N-1)); + ab = alpha*ab; + + z = (1-ab(2))/ab(1); + c = 1./(sqrt(z^2-1)*(z+sqrt(z^2-1)).^(0:N-1))/ab(1); c(2:N) = c(2:N)*2; c=c'; From 15593351ca52d28dc0c687473daf49aa9ecb5a07 Mon Sep 17 00:00:00 2001 From: kd383 Date: Sun, 28 Aug 2016 15:23:47 -0400 Subject: [PATCH 4/6] no DS_store --- .DS_Store | Bin 8196 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index e35ff0ca1e5708339358d94c9d709b0ceba3c817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMUu+ab7@zN2V6PkKloneKnp>=te;2t*TiPbn>s>3*f}C9c($Zt^cBQM^-OKIX zmD*JMqy~k=#Au8f4ImQKH|xJQLo{l9G7y6%#>ANTq7NE1#uvZYnbwxJ#;1maoy*Q| zX1?#6`SRP}&ED)0LLgqy8VIQ&gh+TXq%u~^6lQ1Fk`fRjrHFv>#K~n$JA=KyGPxz* z{(#Sb&w$T>&w$T>&%o`#06w!>kyd!_bE{wb4EPM(kqof?LBWe*OyCShZ|lIyI|3lG zBY;=1O<4m`5f~FV!x1f5fQKUTP!LB9;Ndu~2)~%X8IC-hfH-`BSQ*3#1-#X9e#LVq z5aa0AJ_9}jOBrBapAzDbJjrGz7M|Zt!*Qe0n-C}|U9)zb6fBe3hgOuGOpVzSDOYt1 zPF&3odp$$bGoqbT-LbiLuWg(2Z8g(x=o4vLm9Q;WH7q^9AarEFurzxjZWk=g8Ax{tpOpep>%>p{) z^`Us8v$E@fG^GVcKdzgqYZUcP)zzIeEq9Qm!&%!B$q!_0voLOBGylt9E+c8|jwuS~>{fx_OY@$V`!4r<1cN5-Zg9gsey*4s}j^$Xe)34_p#9;91 zhU%@#_T76MTMk?=rxhD3t7Q2EQfs-!!-k&kn_&D7sZLh6G{ZVQP-NtqdatF9>lF|Q z2EC}7%^`V2!*q|@8jI8Dti&y~n?s>tW=Z6AtTjpU0=C^9l6xIYo~pvJeupggK8kmk zI%3j25joUnsu|s+T9AiD8|2VHk>^f(#9&jE92(5p=D&*kL7d= zQ~FG--Hs^@FsZi}Ds_51(2RC2`VCMoErLl4r;Zfg{id z!*CKtAq``YgFHCk!ZbVyPr=jh9J~$};38atci?^a06v6|;2L}hH{d&-RbWn|2SvUD z;CpO{uPka*ymAXXzr04n2M--C?@rvd8ojxJD|6Fb)yh4)?%mgNAU=P;Js~a>n5QZ( z8&6Jia=Aqfi`04@^}A(jtsL${{pn{`5zS+-CiFK(*SCo+jj2> z%e2H(HnZ-H%3-?3(=h8cHeqC`r*hV9ZA0r?Pt2^_em_nnd0J)NL_JOgxQqQCjsB-X zKPO+2ugMSOC-MvVjruE14z3*Ls=#aiW(oL6d(kf;Dp$wH~cRNgXe z>ol6?biLTw@2xrmC49vicK+{L`ThT@=jAWxGvG6@dJI5mXR0%f>#ejiv$M8>*D1VM xVSY0ly%4Mxy$Hbm{2zwcR?wBj#01W8#1Sm3{vu%cAHDwb-+%sldc0Gre*o}c4rKrU From 943e2dc39a9715536abfdc1814b3eaf5b8dd1c0d Mon Sep 17 00:00:00 2001 From: kd383 Date: Sun, 28 Aug 2016 16:45:53 -0400 Subject: [PATCH 5/6] changed IC code --- src/index_inform.m | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) mode change 100644 => 100755 src/index_inform.m diff --git a/src/index_inform.m b/src/index_inform.m old mode 100644 new mode 100755 index d5eb0be..9158f7e --- a/src/index_inform.m +++ b/src/index_inform.m @@ -1,37 +1,40 @@ % IC = index_inform(A, nZ, N) -% IC = index_inform(Afun, n, nZ, N) % % Compute the information centrality by the Chebyshev expansion of % 1/(ab(1)*x_ab(2)) and moments of (L+ee^T/n). % -% Inputs: -% A: Matrix or function to apply matrix (to multiple RHS) -% n: Dimension of the space (if A is a function) +% A: Adjacency matrix % nZ: Number of probe vectors with which we want to compute moments % N: Number of moments to compute % % Output: % IC: Information centrality % -function IC = index_inform(varargin) - - defaults = {'Afun', NaN, 'n', NaN, ... - 'nZ', 100, 'N', 10, 'kind', 1}; - [Afun, n, nZ, N] = mfuncify(defaults, varargin{:}); - if N < 2, N = 2; end +function IC = index_inform(A, nZ, N) + if nargin<3 + N = 150; + end + if nargin<2 + nZ=100; + end + + n = size(A,1); + % Compute the eigenrange of Laplacian - Lfun = mfunc_laplacian(Afun,n); + L = matrix_laplacian(A); opts = []; opts.isreal = 1; opts.issym = 1; - range = sort(eigs(Lfun, n, 4, 'be', opts)); + range = sort(eigs(L, 2, 'sm', opts)); + range(3) = eigs(L, 1, 'lm', opts); range(1) = 1; range = sort(range); range = range([1,end]); % Linear rescaling of (L+ee^T/n) - Bfun = @(x) (bsxfun(@plus,mean(x,1),Lfun(x))); + Lfun = @(X) L*X; + Bfun = @(X) (bsxfun(@plus,mean(X,1),Lfun(X))); [Bfuns,ab] = rescale_mfunc(Bfun,n,range); % Compute the ldos moments From dde61adc88922647bfd456568e4b924c67b4a127 Mon Sep 17 00:00:00 2001 From: kd383 Date: Mon, 29 Aug 2016 18:45:43 -0400 Subject: [PATCH 6/6] test case on index --- data/gleich/data/Erdos02-cc.smat.gz | Bin 0 -> 56056 bytes test/test_index.m | 255 ++++++++++++++++++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 data/gleich/data/Erdos02-cc.smat.gz create mode 100644 test/test_index.m diff --git a/data/gleich/data/Erdos02-cc.smat.gz b/data/gleich/data/Erdos02-cc.smat.gz new file mode 100644 index 0000000000000000000000000000000000000000..2fd84d478b69b8de6907cefef3698238a48ab2f7 GIT binary patch literal 56056 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≧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 LKx(ZOLqhalEmg?T literal 0 HcmV?d00001 diff --git a/test/test_index.m b/test/test_index.m new file mode 100644 index 0000000..68985e1 --- /dev/null +++ b/test/test_index.m @@ -0,0 +1,255 @@ +clear +clc + +addpath([fileparts(pwd),'/src']); +addpath([fileparts(pwd),'/data/gleich']); + +pass = 'Test passed.'; +fail = 'Test failed.'; +lb = '------------------------------------------------------------\n'; + +% test moments_exponential, which computes Chebyshev coefficient of +% exp(beta*x) bewteen [-1,1] + +beta = 0.9; +N = 20; +fprintf(['Test momemts_expoential with beta = ',num2str(beta),... + ' and N = ',num2str(N),'.\n']); +w = moments_exponential(N,beta); +xx = linspace(-1+1e-8,1-1e-8,1001); +yy1 = plot_chebp(w,xx); +yy2 = exp(beta*xx); +relerr = norm(yy1-yy2)/norm(yy2); +if relerr < 1e-12 + fprintf(['The relative error is ',num2str(relerr),'. ',pass,'\n']); +else + fprintf(['The relative error is ',num2str(relerr),'. ',fail,'\n']); +end +fprintf(lb); + +% test moments_resolvent, which computes Chebyshev coefficient of +% 1/(1-alpha*x) on [-1,1]. + +alpha = 0.9; +N = 70; +fprintf(['Test momemts_resolvent with alpha = ',num2str(alpha),... + ' and N = ',num2str(N),'.\n']); +w = moments_resolvent(N,alpha); +xx = linspace(-1+1e-8,1-1e-8,1001); +yy1 = plot_chebp(w,xx); +yy2 = 1./(1-alpha*xx); +relerr = norm(yy1-yy2)/norm(yy2); +if relerr < 1e-12 + fprintf(['The relative error is ',num2str(relerr),'. ',pass,'\n']); +else + fprintf(['The relative error is ',num2str(relerr),'. ',fail,'\n']); +end +fprintf(lb); + +% Computing eigenvalue of Erdos02-cc for test purposes +fprintf(['Loading Erdos02-cc and computing its eigen-decomposition \n'... + 'for testing purposes. Takes 50s.\n']); + +A = load_graph('Erdos02-cc'); +L = matrix_normalize(A); +[VA,eA] = eig(full(A),'vector'); +[VL,eL] = eig(full(L),'vector'); +fprintf(lb) + +% Test on index_estrada, which computes the Estrada index of matrix +fprintf('Test index_estrada on normalized adjacency. No rescaling.\n'); +EE2 = sum(exp(eL)); +N = 10; +for nZ =10:10:50 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + EE1 = index_estrada(L,nZ,N); + relerr = abs(EE1-EE2)/EE2; + if relerr < 0.01 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +fprintf(['Test index_estrada on normalized adjacency with '... + 'precomputed dos. No rescaling.\n']); +N = 10; +for nZ =10:10:50 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + c = moments_cheb_dos(L,nZ,N); + EE1 = index_estrada(c); + relerr = abs(EE1-EE2)/EE2; + if relerr < 0.01 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +fprintf('Test index_estrada on adjacency. With rescaling.\n'); +EE2 = sum(exp(eA)); +N = 30; +[As,ab] = rescale_matrix(A); +for nZ =200:200:1000 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + EE1 = index_estrada(As,nZ,N,ab); + relerr = abs(EE1-EE2)/EE2; + if relerr < 0.05 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +% Test on index_sub_exp, which computes the exponential subgraph +% centrality + +fprintf(['Test index_sub_exp on normalized adjacency. No rescaling.'... + 'beta = 0.9\n']); +beta = 0.9; +ESC2 = VL.^2*exp(beta*eL); +N = 10; +for nZ =200:200:1000 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + ESC1 = index_sub_exp(beta,L,nZ,N); + relerr = norm(ESC1-ESC2)/norm(ESC2); + if relerr < 0.05 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +fprintf(['Test index_sub_exp on normalized adjacency with '... + 'precomputed ldos. No rescaling. beta = 0.9\n']); +beta = 0.9; +N = 10; +for nZ =200:200:1000 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + c = moments_cheb_ldos(L,nZ,N); + ESC1 = index_sub_exp(beta,c); + relerr = norm(ESC1-ESC2)/norm(ESC2); + if relerr < 0.05 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +fprintf('Test index_sub_exp on adjacency. With rescaling. beta = 0.9\n'); +beta = 0.9; +ESC2 = VA.^2*exp(beta*eA); +N = 20; +[As,ab] = rescale_matrix(A); +for nZ =400:400:2000 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + ESC1 = index_sub_exp(beta,As,nZ,N,ab); + relerr = norm(ESC1-ESC2)/norm(ESC2); + if relerr < 0.05 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +% Test on index_sub_res, which computes the resolvent subgraph +% centrality + +fprintf(['Test index_sub_res on normalized adjacency. No rescaling.'... + ' alpha = 0.9\n']); +alpha = 0.9; +RSC2 = diag((eye(5534)-alpha*L)^(-1)); +N = 10; +for nZ =300:300:1500 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + RSC1 = index_sub_res(alpha,L,nZ,N); + relerr = norm(RSC1-RSC2)/norm(RSC2); + if relerr < 0.05 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +fprintf(['Test index_sub_res on normalized adjacency with '... + 'precomputed ldos. No rescaling. alpha = 0.9\n']); +alpha = 0.9; +N = 10; +for nZ =300:300:1500 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + c = moments_cheb_ldos(L,nZ,N); + RSC1 = index_sub_res(alpha,c); + relerr = norm(RSC1-RSC2)/norm(RSC2); + if relerr < 0.05 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +[As,ab] = rescale_matrix(A); +alpha = 0.9/sum(ab); +fprintf(['Test index_sub_res on adjacency. With rescaling. alpha = ',... + num2str(alpha),'\n']); +RSC2 = diag((eye(5534)-alpha*A)^(-1)); +N = 20; +for nZ =300:300:1500 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + RSC1 = index_sub_res(alpha,As,nZ,N,ab); + relerr = norm(RSC1-RSC2)/norm(RSC2); + if relerr < 0.05 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) + +% Test on index_inform, which computes the information centrality + +fprintf('Test index_inform on adjacency.\n'); +B = matrix_laplacian(A)+1; +K = B^(-1); +I = repmat(diag(K),[1,5534])+repmat(diag(K)',[5534,1])-2*K; +IC2 = 1./(mean(I,2)); +N = 150; +for nZ =100:100:500 + fprintf(['With nZ = ',num2str(nZ),' and N = ',num2str(N),':\n']); + IC1 = index_inform(A,nZ,N); + relerr = norm(IC1-IC2)/norm(IC2); + if relerr < 0.05 + fprintf(['The relative error is ',num2str(relerr),'. '... + pass,'\n']); + else + fprintf(['The relative error is ',num2str(relerr),'. '... + fail,'\n']); + end +end +fprintf(lb) +fprintf('Test Over\n') \ No newline at end of file