Defining and evaluating network communities based on ground-truth

Jaewon YangJure Leskovec

article2012Knowledge and Information Systems2,381 citations

Evaluates thirteen structural definitions of network communities against ground-truth data from 230 real-world networks, identifying the most reliable topological metrics and introducing a parameter-free community detection algorithm that scales to hundreds of millions of nodes.

  • Paper: Community detection in graphs, Santo Fortunato (2009). This comprehensive survey provides the essential taxonomy of graph community detection algorithms and structural definitions evaluated in the source paper.
  • Paper: A tutorial on spectral clustering, Ulrike von Luxburg (2007). Reading this tutorial on spectral clustering prepares you for understanding the source paper's extension of local spectral methods to massive networks.
Cover for Defining and evaluating network communities based on ground-truth

Abstract

Nodes in real-world networks organize into densely linked communities where edges appear with high concentration among the members of the community. Identifying such communities of nodes has proven to be a challenging task mainly due to a plethora of definitions of a community, intractability of algorithms, issues with evaluation and the lack of a reliable gold-standard ground-truth.

In this paper we study a set of 230 large real-world social, collaboration and information networks where nodes explicitly state their group memberships. For example, in social networks nodes explicitly join various interest based social groups. We use such groups to define a reliable and robust notion of ground-truth communities. We then propose a methodology which allows us to compare and quantitatively evaluate how different structural definitions of network communities correspond to ground-truth communities. We choose 13 commonly used structural definitions of network communities and examine their sensitivity, robustness and performance in identifying the ground-truth. We show that the 13 structural definitions are heavily correlated and naturally group into four classes. We find that two of these definitions, Conductance and Triad-participation-ratio, consistently give the best performance in identifying ground-truth communities. We also investigate a task of detecting communities given a single seed node. We extend the local spectral clustering algorithm into a heuristic parameter-free community detection method that easily scales to networks with more than hundred million nodes. The proposed method achieves 30% relative improvement over current local clustering methods.

Table of Contents

  • I. INTRODUCTION
  • II. COMMUNITY SCORING FUNCTIONS AND DATA SETS
  • III. EVALUATION OF COMMUNITY SCORING FUNCTIONS
  • IV. ROBUSTNESS OF COMMUNITY SCORING FUNCTIONS
  • V. DISCOVERING COMMUNITIES FROM A SEED NODE
  • VI. CONCLUSION
  • REFERENCES

Knowls

  1. Knowl 1 — Parameter-Free Local Spectral Community Detection Algorithm from a Seed Node

    algorithm

    The algorithm detects one or more communities containing a single seed node ss in an undirected graph G(V,E)G(V, E) without requiring pre-specified community size or count parameters. It operates in computational time proportional to the size of the detected community by combining a truncated random walk with sweep-curve local minima extraction.

    Input: Undirected graph G(V,E)G(V, E), seed node sVs \in V, community scoring function ff, local minimum threshold parameter α=1.2\alpha = 1.2
    Output: Detected community S^\hat{S} (single) or set of nested communities {S^j}\{\hat{S}_j\} (multiple)
    Compute PageRank proximity vector rr from seed node ss using PageRank-Nibble with error tolerance ϵ\epsilon, setting ru=0r_u = 0 for ru<ϵr_u < \epsilon
    Sort all nodes uu with ru>0r_u > 0 in descending order of normalized score ru/d(u)r_u / d(u), where d(u)d(u) is the degree of node uu, obtaining ordered sequence (u1,u2,,uN)(u_1, u_2, \dots, u_N)
    for k=1k = 1 to NN do
        Form prefix set Sk={u1,u2,,uk}S_k = \{u_1, u_2, \dots, u_k\}
        Compute community score fk=f(Sk)f_k = f(S_k)
    end for
    Identify candidate indices kk^* where fkf_k reaches a local minimum (stops decreasing)
    Validate candidate kk^* if fkf_k subsequently increases to at least αfk\alpha f_{k^*} before decreasing again; discard kk^* otherwise
    if single community detection then
        Let kk^* be the index of the first validated local minimum
        return S^={u1,u2,,uk}\hat{S} = \{u_1, u_2, \dots, u_{k^*}\}
    else
        for each validated local minimum index kjk^*_j do
            S^j={u1,u2,,ukj}\hat{S}_j = \{u_1, u_2, \dots, u_{k^*_j}\}
        end for
        return {S^j}\{\hat{S}_j\}
    end if

    The PageRank-Nibble subroutine computes an approximate PageRank vector with error bounded by ϵ\epsilon in time O(1/ϵ)O(1/\epsilon), which is independent of the total graph size V|V|.

  2. Knowl 2 — Thirteen Structural Community Scoring Functions Categorized into Four Classes

    definition

    Let G(V,E)G(V, E) be an unweighted, undirected graph with n=Vn = |V| nodes and m=Em = |E| edges. For a subset of nodes SVS \subseteq V, let nS=Sn_S = |S| denote the number of nodes in SS, mS={(u,v)E:uS,vS}m_S = |\{(u,v) \in E : u \in S, v \in S\}| the number of internal edges, cS={(u,v)E:uS,vS}c_S = |\{(u,v) \in E : u \in S, v \notin S\}| the boundary cut size, d(u)d(u) the degree of node uu, and dmd_m the median degree across all nodes in VV. Structural definitions of communities map SS to a score f(S)f(S) falling into four distinct structural classes:

    1. Scoring functions based on internal connectivity:
    • Internal Density: f(S)=mSnS(nS1)/2f(S) = \frac{m_S}{n_S(n_S - 1)/2}
    • Edges Inside: f(S)=mSf(S) = m_S
    • Average Degree: f(S)=2mSnSf(S) = \frac{2m_S}{n_S}
    • Fraction Over Median Degree (FOMD): f(S)={uS:{(u,v)E:vS}>dm}nSf(S) = \frac{|\{u \in S : |\{(u,v) \in E : v \in S\}| > d_m\}|}{n_S}
    • Triangle Participation Ratio (TPR): f(S)={uS:{(v,w):v,wS,(u,v)E,(u,w)E,(v,w)E}}nSf(S) = \frac{|\{u \in S : \{(v,w) : v,w \in S, (u,v)\in E, (u,w)\in E, (v,w)\in E\} \neq \emptyset\}|}{n_S}
    1. Scoring functions based on external connectivity:
    • Expansion: f(S)=cSnSf(S) = \frac{c_S}{n_S}
    • Cut Ratio: f(S)=cSnS(nnS)f(S) = \frac{c_S}{n_S(n - n_S)}
    1. Scoring functions combining internal and external connectivity:
    • Conductance: f(S)=cS2mS+cSf(S) = \frac{c_S}{2m_S + c_S}
    • Normalized Cut: f(S)=cS2mS+cS+cS2(mmS)+cSf(S) = \frac{c_S}{2m_S + c_S} + \frac{c_S}{2(m - m_S) + c_S}
    • Maximum Out-Degree Fraction (Max-ODF): f(S)=maxuS{(u,v)E:vS}d(u)f(S) = \max_{u \in S} \frac{|\{(u,v) \in E : v \notin S\}|}{d(u)}
    • Average Out-Degree Fraction (Avg-ODF): f(S)=1nSuS{(u,v)E:vS}d(u)f(S) = \frac{1}{n_S} \sum_{u \in S} \frac{|\{(u,v) \in E : v \notin S\}|}{d(u)}
    • Flake Out-Degree Fraction (Flake-ODF): f(S)={uS:{(u,v)E:vS}<d(u)/2}nSf(S) = \frac{|\{u \in S : |\{(u,v) \in E : v \in S\}| < d(u)/2\}|}{n_S}
    1. Scoring function based on a null network model:
    • Modularity: f(S)=14(mSE[mS])f(S) = \frac{1}{4}\left(m_S - \mathbb{E}[m_S]\right), where E[mS]\mathbb{E}[m_S] is the expected number of edges in SS under a configuration model random graph with identical node degrees.
  3. Knowl 3 — Axiomatic Goodness Metrics for Community Structure Evaluation

    definition

    To evaluate how well scoring functions capture desirable properties of network communities without relying directly on the functions themselves, four axiomatic goodness metrics g(S)g(S) are defined for a node subset SVS \subseteq V with nS=Sn_S = |S| nodes, mSm_S internal edges, and boundary cut cSc_S:

    • Separability: Quantifies how isolated the community is from the rest of the graph by the ratio of internal to external edges: g(S)=mScSg(S) = \frac{m_S}{c_S}

    • Density: Measures the fraction of possible internal edges realized: g(S)=mSnS(nS1)/2g(S) = \frac{m_S}{n_S(n_S - 1)/2}

    • Cohesiveness: Characterizes the internal connectedness and resistance to internal bisection via the maximum internal conductance of any sub-cut within the induced subgraph G[S]G[S]: g(S)=maxSSϕ(S)g(S) = \max_{S' \subset S} \phi(S') where ϕ(S)\phi(S') is the conductance of SS' within G[S]G[S]. Higher values denote higher resistance to internal splitting.

    • Clustering Coefficient: Computes the average local clustering coefficient across nodes uSu \in S, reflecting local triad closure.

  4. Knowl 4 — Randomized Community Perturbation Strategies and Z-Score Robustness Metric

    model/method

    To evaluate the sensitivity and noise robustness of a scoring function ff, a ground-truth community SS undergoes randomized modifications parameterized by intensity p[0,1]p \in [0, 1]. The perturbation procedure executes an operation pSp|S| times to yield a perturbed community h(S,p)h(S, p):

    • NodeSwap: Selects a random boundary edge (u,v)(u, v) where uS,vSu \in S, v \notin S, and swaps memberships (removes uu, adds vv), preserving community size S|S| while diffusing through the graph.
    • Random: Selects a random member uSu \in S and a random non-member vSv \notin S and swaps them, preserving community size.
    • Expand: Selects a random boundary edge (u,v)(u, v) where uS,vSu \in S, v \notin S, and adds vv to SS, increasing community size while preserving boundary connectivity.
    • Shrink: Selects a random boundary edge (u,v)(u, v) where uS,vSu \in S, v \notin S, and removes uu from SS, decreasing community size.

    For a set of ground-truth communities {Si}\{S_i\}, the quality degradation under perturbation strategy hh is measured by the standardized Z-score: Z(f,h,p)=Ei[f(Si)f(h(Si,p))]Vari[f(h(Si,p))]Z(f, h, p) = \frac{\mathbb{E}_i[f(S_i) - f(h(S_i, p))]}{\sqrt{\mathrm{Var}_i[f(h(S_i, p))]}} where scoring functions are oriented such that lower numerical values represent better communities, and expectations/variances are estimated across 20 randomized trials per community. Robustness to noise corresponds to low Z(f,h,p)Z(f, h, p) at small perturbations (p=0.05p = 0.05), while sensitivity corresponds to high Z(f,h,p)Z(f, h, p) at larger perturbations (p=0.20p = 0.20), evaluated by the increment ΔZ=Z(f,h,0.20)Z(f,h,0.05)\Delta Z = Z(f, h, 0.20) - Z(f, h, 0.05).

  5. Knowl 5 — Ground-Truth Functional Community Benchmark Networks

    data/table

    The benchmark comprises 230 networks where ground-truth communities are derived explicitly from functional memberships (interest groups, product categories, or conference publication venues) rather than structural heuristics. In preprocessing, each network is treated as an unweighted, undirected graph, and each connected component of an explicitly defined group forms a ground-truth community (allowing overlap and nesting).

    Dataset NN EE CC SS AA
    LiveJournal 4.0M 34.9M 311,782 40.06 3.09
    Friendster 117.7M 2,586.1M 1,449,666 26.72 0.32
    Orkut 3.0M 117.2M 8,455,253 34.86 95.90
    Ning (225 nets) 7.0M 35.5M 137,177 46.89 0.92
    Amazon 0.33M 0.92M 49,732 99.86 14.83
    DBLP 0.42M 1.34M 2,547 429.79 2.56

    Notation:

    • NN: Total number of nodes.
    • EE: Total number of undirected edges.
    • CC: Total number of ground-truth communities.
    • SS: Average community size (number of member nodes).
    • AA: Average number of community memberships per node.
    • Ning statistics aggregate values across 225 independent social networks hosted on Ning.
  6. Knowl 6 — Comparative Ranking of Community Scoring Functions on Axiomatic Goodness Metrics

    data/table

    Ground-truth communities are ranked by each scoring function, and the cumulative running average of each axiomatic goodness metric is computed across rank depths kk. The table reports the average relative rank (from 1 = best to 6 = worst) of 6 representative scoring functions across all ranking cutoffs kk for the LiveJournal dataset.

    Scoring function Separability Density Cohesiveness Clustering
    Conductance (C) 1.0 3.5 3.4 3.1
    Flake-ODF (F) 3.9 3.6 3.5 4.3
    FOMD (D) 4.9 3.0 2.9 2.9
    TPR (T) 4.5 2.3 2.1 1.2
    Modularity (M) 4.0 5.5 5.7 3.9
    CutRatio (CR) 2.6 3.1 3.2 5.5

    Key observations:

    • Conductance achieves the top rank (1.0) on Separability but ranks poorly on Density, Cohesiveness, and Clustering.
    • Triangle Participation Ratio (TPR) achieves the best performance on Density (2.3), Cohesiveness (2.1), and Clustering (1.2), while performing poorly on Separability (4.5).
    • Modularity ranks near the bottom across all metrics and orders ground-truth communities in reverse order of goodness (cumulative metric average increases with kk).
  7. Knowl 7 — Robustness and Sensitivity Evaluation of Community Scoring Functions Under Perturbations

    data/table

    The table reports the average absolute increment of the standardized Z-score between small (p=0.05p = 0.05) and large (p=0.20p = 0.20) perturbations, defined as ΔZ=Z(f,h,0.20)Z(f,h,0.05)\Delta Z = Z(f, h, 0.20) - Z(f, h, 0.05), averaged across all 230 networks. Higher values signify scoring functions that are simultaneously noise-tolerant at low perturbation and sensitive to structural decay at higher perturbation.

    Scoring function NodeSwap Random Expand Shrink
    Conductance (C) 1.06 1.59 0.50 0.45
    Flake-ODF (F) 0.51 1.15 0.11 0.41
    FOMD (D) 0.18 0.57 0.19 0.12
    TPR (T) 0.37 1.85 0.74 0.21
    Modularity (M) 0.23 0.14 0.03 0.15
    CutRatio (CR) 0.53 0.83 0.13 0.43

    Conductance achieves the highest sensitivity under NodeSwap (1.06) and Shrink (0.45), while Triangle Participation Ratio (TPR) achieves the highest sensitivity under Random (1.85) and Expand (0.74). Modularity exhibits the poorest sensitivity across all four perturbation modes.

  8. Knowl 8 — Performance Comparison for Single-Community Reconstruction from a Seed Node

    data/table

    Reconstruction performance of the seed-based community detection method using 6 different scoring functions compared against two standard baselines: Local Spectral Clustering (LC) and the 3-clique Clique Percolation Method (CPM). A member node sSs \in S is sampled uniformly at random from ground-truth community SS, and the first local minimum set SkS_{k^*} is extracted.

    Metric / Dataset C F D T M CR LC CPM
    LJ (F1) 0.64 0.64 0.62 0.57 0.15 0.61 0.54 0.43
    FS (F1) 0.23 0.22 0.24 0.25 0.24 0.18 0.13 0.14
    Orkut (F1) 0.21 0.19 0.19 0.18 0.20 0.09 0.20 0.13
    Ning (F1) 0.24 0.19 0.10 0.19 0.08 0.19 0.17 0.11
    Amazon (F1) 0.87 0.75 0.73 0.79 0.06 0.85 0.74 0.85
    DBLP (F1) 0.61 0.61 0.65 0.66 0.04 0.61 0.46 0.53
    Avg. F1 0.46 0.43 0.42 0.44 0.13 0.42 0.37 0.36
    Avg. Prec 0.50 0.53 0.52 0.55 0.13 0.53 0.49 0.38
    Avg. Rec 0.60 0.47 0.51 0.47 0.71 0.49 0.65 0.69

    Conductance (C) achieves the highest overall average F1-score (0.46), representing a 30% relative improvement over Local Spectral Clustering (0.37) and Clique Percolation (0.36). Triangle Participation Ratio (TPR) performs best on networks with dense, overlapping communities such as Friendster (0.25) and DBLP (0.66). Modularity severely overestimates community size (high recall of 0.71, low precision of 0.13).

  9. Knowl 9 — Multi-Community Detection from a Single Seed Node Across Community Overlap Levels

    data/table

    When a seed node ss belongs to gg distinct ground-truth communities, all valid local minima {Skj}\{S_{k^*_j}\} along the Conductance sweep curve are extracted. Predicted communities are matched to true communities using the Hungarian method on pairwise F1-scores, and the average F1-score across matched pairs is reported as a function of gg.

    Dataset g=1g = 1 g=2g = 2 g=3g = 3 g=4g = 4 g5g \ge 5 All nodes
    LiveJournal 0.52 0.59 0.52 0.42 0.38 0.53
    Friendster 0.13 0.10 0.08 0.05 0.02 0.13
    Orkut 0.21 0.17 0.13 0.11 0.10 0.20
    Ning (225 nets) 0.11 0.09 0.07 0.06 0.05 0.11
    Amazon 0.59 0.73 0.69 0.66 0.55 0.61
    DBLP 0.34 0.24 0.20 0.21 0.16 0.33

    Multi-community discovery performance generally degrades as the number of overlapping memberships gg increases. In LiveJournal and Amazon, nodes with g=2g = 2 show higher F1-scores than nodes with g=1g = 1 because single-membership nodes frequently reside on community perimeters where Conductance sweeps cut communities too small.

  10. Knowl 10 — Correlation Clustering of Structural Scoring Functions and Modularity Isolation

    empirical result

    Evaluating the 13 structural scoring functions on over 10 million ground-truth communities reveals that the functions are highly redundant and cluster into four distinct classes when thresholded at pairwise correlation 0.6\ge 0.6:

    1. Internal connectivity metrics: Internal Density, Edges Inside, Average Degree, FOMD, and TPR form a dense cluster.
    2. External connectivity metrics: Expansion and Cut Ratio cluster together.
    3. Combined internal and external metrics: Conductance, Normalized Cut, Max-ODF, Avg-ODF, and Flake-ODF form a dense cluster.
    4. Null-model metric (Modularity): Modularity does not correlate with any of the other 12 scoring functions (its maximum pairwise correlation with any other function is only 0.05, with Average Degree).

    No pair of scoring functions exhibits systematic negative correlation across the benchmark.

Coverage note — None was omitted; all key theoretical definitions, goodness metrics, perturbation methods, algorithms, and empirical benchmark evaluations from the paper are included.

References

  1. 1.Y.-Y. Ahn, J. P. Bagrow, and S. Lehmann. Link communities reveal multi-scale complexity in networks. Nature, Oct. 2010.
  2. 2.R. Andersen, F. Chung, and K. Lang. Local graph partitioning using PageRank vectors. In FOCS ’06, pages 475–486, 2006.
  3. 3.R. Andersen and K. Lang. Communities from seed sets. In WWW ’06, pages 223–232, 2006.
  4. 4.L. Backstrom, D. Huttenlocher, J. Kleinberg, and X. Lan. Group formation in large social networks: membership, growth, and evolution. In KDD ’06, pages 44–54, 2006.
  5. 5.L. Danon, J. Duch, A. Diaz-Guilera, and A. Arenas. Comparing community structure identification. J. of Stat. Mech., 2005.
  6. 6.I. Dhillon, Y. Guan, and B. Kulis. Weighted graph cuts without eigenvectors: A multilevel approach. IEEE PAMI, 29(11):1944–1957, 2007.
  7. 7.S. L. Feld. The focused organization of social ties. Am. J. of Sociology, 86(5):1015–1035, 1981.
  8. 8.G. Flake, S. Lawrence, and C. Giles. Efficient identification of web communities. In KDD ’00, pages 150–160, 2000.
  9. 9.S. Fortunato. Community detection in graphs. Physics Reports, 486(3-5):75 – 174, 2010.
  10. 10.S. Fortunato and M. Barthelemy. Resolution limit in community detection. PNAS, 104(1):36–41, 2007.
  11. 11.M. Girvan and M. Newman. Community structure in social and biological networks. PNAS, 99(12):7821–7826, 2002.
  12. 12.M. S. Granovetter. The strength of weak ties. Am. J. of Sociology, 78:1360–1380, 1973.
  13. 13.S. Kairam, D. Wang, and J. Leskovec. The life and death of online groups: Predicting group growth and longevity. In WSDM ’12, 2012.
  14. 14.G. Karypis and V. Kumar. A fast and high quality multilevel scheme for partitioning irregular graphs. SIAM Journal on Scientific Computing, 20:359–392, 1998.
  15. 15.H. W. Kuhn. The Hungarian method for the assignment problem. Naval Research Logistic Quarterly, 2:83–97, 1955.
  16. 16.J. Leskovec, L. Adamic, and B. Huberman. The dynamics of viral marketing. ACM TWeb, 1(1), 2007.
  17. 17.J. Leskovec, K. Lang, and M. Mahoney. Empirical comparison of algorithms for network community detection. In WWW ’10, 2010.
  18. 18.J. Leskovec, K. J. Lang, A. Dasgupta, and M. W. Mahoney. Community structure in large networks: Natural cluster sizes and the absence of large well-defined clusters. Internet Mathematics, 6(1):29–123, 2009.
  19. 19.M. McPherson. An ecology of affiliation. American Sociological Review, 48(4):519–532, 1983.
  20. 20.A. Mislove, M. Marcon, K. P. Gummadi, P. Druschel, and B. Bhattacharjee. Measurement and analysis of online social networks. In IMC ’07, pages 29–42, 2007.
  21. 21.M. Newman. Modularity and community structure in networks. PNAS, 103(23):8577–8582, 2006.
  22. 22.M. Newman and M. Girvan. Finding and evaluating community structure in networks. Phys. Rev. E, 69:026113, 2004.
  23. 23.G. Palla, I. Derenyi, I. Farkas, and T. Vicsek. Uncovering the overlapping community structure of complex networks in nature and society. Nature, 435(7043):814–818, 2005.
  24. 24.F. Radicchi, C. Castellano, F. Cecconi, V. Loreto, and D. Parisi. Defining and identifying communities in networks. PNAS, 101(9):2658–2663, 2004.
  25. 25.Y. Ren, R. Kraut, and S. Kiesler. Applying common identity and bond theory to design of online communities. Organization Studies, 28(3):377–408, 2007.
  26. 26.S. Schaeffer. Graph clustering. Computer Science Review, 1(1):27–64, 2007.
  27. 27.J. Shi and J. Malik. Normalized cuts and image segmentation. IEEE PAMI, 22(8):888–905, 2000.
  28. 28.D. Spielman and S.-H. Teng. Nearly-linear time algorithms for graph partitioning, graph sparsification, and solving linear systems. In STOC ’04, pages 81–90, 2004.
  29. 29.D. Watts and S. Strogatz. Collective dynamics of small-world networks. Nature, 393:440–442, 1998.
  30. 30.J. Yang and J. Leskovec. Community-Affiliation Graph Model for Overlapping Network Community Detection In ICDM ’12, 2012.
  31. 31.J. Yang and J. Leskovec. Defining and Evaluating Network Communities based on Ground-truth. Extended version, 2012.

Citation

MLA
Yang, J., and J. Leskovec. “Defining and Evaluating Network Communities Based on Ground-truth”. Knowledge and Information Systems, vol. 42, no. 1, 2013, pp. 181–213, https://doi.org/10.1007/s10115-013-0693-z.
APA
Yang, J., & Leskovec, J. (2013). Defining and evaluating network communities based on ground-truth. Knowledge and Information Systems, 42(1), 181–213. https://doi.org/10.1007/s10115-013-0693-z
Chicago
Yang, J., and J. Leskovec. 2013. “Defining and Evaluating Network Communities Based on Ground-truth”. Knowledge and Information Systems 42 (1): 181–213. https://doi.org/10.1007/s10115-013-0693-z.
Harvard
Yang, J. and Leskovec, J. (2013) “Defining and evaluating network communities based on ground-truth”, Knowledge and Information Systems, 42(1), pp. 181–213. Available at: https://doi.org/10.1007/s10115-013-0693-z.
Vancouver
1. Yang J, Leskovec J (2013) Defining and evaluating network communities based on ground-truth. Knowledge and Information Systems 42:181–213

BibTeX

@article{Yang_2013, title={Defining and evaluating network communities based on ground-truth}, volume={42}, ISSN={0219-3116}, url={http://dx.doi.org/10.1007/s10115-013-0693-z}, DOI={10.1007/s10115-013-0693-z}, number={1}, journal={Knowledge and Information Systems}, publisher={Springer Science and Business Media LLC}, author={Yang, Jaewon and Leskovec, Jure}, year={2013}, month=Oct, pages={181–213} }
Metadata:Crossref

Access the Paper

This paper is available from its original source. Click below to access the PDF.

Open PDF