GetNetworkDescription
        (
            String sUserNameToAnalyze,
            WhatToInclude eWhatToInclude,
            NetworkLevel eNetworkLevel,
            Int32 iMaximumPeoplePerRequest
        )
        {
            Debug.Assert(!String.IsNullOrEmpty(sUserNameToAnalyze));
            Debug.Assert(iMaximumPeoplePerRequest > 0);
            AssertValid();

            NetworkDescriber oNetworkDescriber = new NetworkDescriber();

            oNetworkDescriber.AddSentence(

                "The graph represents the {0} YouTube network of the user with the"
                + " username \"{1}\"."
                ,
                NetworkLevelToString(eNetworkLevel),
                sUserNameToAnalyze
                );

            oNetworkDescriber.AddNetworkTime(NetworkSource);

            oNetworkDescriber.StartNewParagraph();

            if (WhatToIncludeFlagIsSet(eWhatToInclude,
                                       WhatToInclude.FriendVertices))
            {
                oNetworkDescriber.AddSentence(
                    "There is a vertex for each friend of the user."
                    );
            }

            if (WhatToIncludeFlagIsSet(eWhatToInclude,
                                       WhatToInclude.SubscriptionVertices))
            {
                oNetworkDescriber.AddSentence(
                    "There is a vertex for each person or channel subscribed to by"
                    + " the user."
                    );
            }

            oNetworkDescriber.AddNetworkLimit(iMaximumPeoplePerRequest, "people");

            return(oNetworkDescriber.ConcatenateSentences());
        }
        GetNetworkDescription
        (
            String sSearchTerm,
            WhatToInclude eWhatToInclude,
            Int32 iMaximumVideos
        )
        {
            Debug.Assert(!String.IsNullOrEmpty(sSearchTerm));
            Debug.Assert(iMaximumVideos > 0);
            AssertValid();

            NetworkDescriber oNetworkDescriber = new NetworkDescriber();

            oNetworkDescriber.AddSentence(

                "The graph represents the network of YouTube videos whose title,"
                + " keywords, description, categories, or author\'s username"
                + " contain \"{0}\"."
                ,
                sSearchTerm
                );

            oNetworkDescriber.AddNetworkTime(NetworkSource);

            oNetworkDescriber.StartNewParagraph();
            oNetworkDescriber.AddNetworkLimit(iMaximumVideos, "videos");

            if (WhatToIncludeFlagIsSet(eWhatToInclude,

                                       WhatToInclude.SharedCategoryEdges
                                       |
                                       WhatToInclude.SharedCommenterEdges
                                       |
                                       WhatToInclude.SharedVideoResponderEdges
                                       ))
            {
                oNetworkDescriber.StartNewParagraph();
            }

            if (WhatToIncludeFlagIsSet(eWhatToInclude,
                                       WhatToInclude.SharedCategoryEdges))
            {
                oNetworkDescriber.AddSentence(
                    "There is an edge for each pair of videos that have the same"
                    + " category."
                    );
            }

            if (WhatToIncludeFlagIsSet(eWhatToInclude,
                                       WhatToInclude.SharedCommenterEdges))
            {
                oNetworkDescriber.AddSentence(
                    "There is an edge for each pair of videos commented on by the"
                    + " same user."
                    );
            }

            if (WhatToIncludeFlagIsSet(eWhatToInclude,
                                       WhatToInclude.SharedVideoResponderEdges))
            {
                oNetworkDescriber.AddSentence(
                    "There is an edge for each pair of videos responded to with"
                    + " another video by the same user."
                    );
            }

            return(oNetworkDescriber.ConcatenateSentences());
        }
    GetNetworkDescription
    (
        String sSearchTerm,
        WhatToInclude eWhatToInclude,
        Int32 iMaximumVideos
    )
    {
        Debug.Assert( !String.IsNullOrEmpty(sSearchTerm) );
        Debug.Assert(iMaximumVideos > 0);
        AssertValid();

        NetworkDescriber oNetworkDescriber = new NetworkDescriber();

        oNetworkDescriber.AddSentence(

            "The graph represents the network of YouTube videos whose title,"
            + " keywords, description, categories, or author\'s username"
            + " contain \"{0}\"."
            ,
            sSearchTerm
            );

        oNetworkDescriber.AddNetworkTime(NetworkSource);

        oNetworkDescriber.StartNewParagraph();
        oNetworkDescriber.AddNetworkLimit(iMaximumVideos, "videos");

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,

            WhatToInclude.SharedCategoryEdges
            |
            WhatToInclude.SharedCommenterEdges
            |
            WhatToInclude.SharedVideoResponderEdges
            ) )
        {
            oNetworkDescriber.StartNewParagraph();
        }

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.SharedCategoryEdges) )
        {
            oNetworkDescriber.AddSentence(
                "There is an edge for each pair of videos that have the same"
                + " category."
                );
        }

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.SharedCommenterEdges) )
        {
            oNetworkDescriber.AddSentence(
                "There is an edge for each pair of videos commented on by the"
                + " same user."
                );
        }

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.SharedVideoResponderEdges) )
        {
            oNetworkDescriber.AddSentence(
                "There is an edge for each pair of videos responded to with"
                + " another video by the same user."
                );
        }

        return ( oNetworkDescriber.ConcatenateSentences() );
    }
    GetNetworkDescription
    (
        String sScreenName,
        WhatToInclude eWhatToInclude,
        NetworkLevel eNetworkLevel,
        Int32 iMaximumPerRequest
    )
    {
        Debug.Assert( !String.IsNullOrEmpty(sScreenName) );
        Debug.Assert(iMaximumPerRequest > 0);
        AssertValid();

        NetworkDescriber oNetworkDescriber = new NetworkDescriber();

        oNetworkDescriber.AddSentence(

            "The graph represents the {0} Flickr network of the user with the"
            + " screen name \"{1}\"."
            ,
            NetworkLevelToString(eNetworkLevel),
            sScreenName
            );

        oNetworkDescriber.AddNetworkTime(NetworkSource);

        oNetworkDescriber.StartNewParagraph();

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.ContactVertices) )
        {
            oNetworkDescriber.AddSentence(
                "There is a vertex for each contact of the user."
                );
        }

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.CommenterVertices) )
        {
            oNetworkDescriber.AddSentence(
                "There is a vertex for each person who commented on the user's"
                + " photos."
                );
        }

        oNetworkDescriber.AddNetworkLimit(iMaximumPerRequest, "people");

        return ( oNetworkDescriber.ConcatenateSentences() );
    }
        GetNetworkDescription
        (
            List<NetworkType> oEdgeType,
            bool bDownloadFromPostToPost,
            bool bDownloadBetweenDates,
            int iFromPost,
            int iToPost,
            DateTime oStartDate,
            DateTime oEndDate,
            bool bLimitCommentsLikes,
            int iNrLimit,
            GraphMLXmlDocument oGraphMLXmlDocument
        )
        {            
            Debug.Assert(oGraphMLXmlDocument != null);
            AssertValid();

            NetworkDescriber oNetworkDescriber = new NetworkDescriber();

            

            oNetworkDescriber.AddSentence(
                "The graph represents the network of "+ GetLoggedInUsername()+"\'s friends."
                );

            oNetworkDescriber.AddNetworkTime();
            
            oNetworkDescriber.AddSentence(
                    "The network has "+oVertices.Count+" vertices and "+
                    oEdges.Count+" edges."
                    );

            if (oEdgeType.Contains(NetworkType.TimelinePostAuthors))
            {
                oNetworkDescriber.AddSentence(
                "There exists an edge for each post author."
                );
            }
            if (oEdgeType.Contains(NetworkType.TimelineUserComments))
            {
                oNetworkDescriber.AddSentence(
                "There exists an edge for each user that has commented on a post."
                );
            }
            if (oEdgeType.Contains(NetworkType.TimelineUserLikes))
            {
                oNetworkDescriber.AddSentence(
                "There exists an edge for each user that has liked a post."
                );
            }
            if (oEdgeType.Contains(NetworkType.TimelineUserTagged))
            {
                oNetworkDescriber.AddSentence(
                "There exists an edge for each user tagged in a post."
                );
            }

            oNetworkDescriber.AddSentence(
                "The network is built "
                );

            if (bDownloadFromPostToPost)
            {
                oNetworkDescriber.AddSentence(
                "from post number "+iFromPost+" to post number "+iToPost+" of each friend timeline."
                );
            }
            else if (bDownloadBetweenDates)
            {
                oNetworkDescriber.AddSentence(
                "upon posts between " + oStartDate.ToString() + " and " + oEndDate.ToString() + " of each friend timeline."
                );
            }

            if(bLimitCommentsLikes)
            {
                oNetworkDescriber.AddNetworkLimit(iNrLimit, "comments/likes");
            }

            return (oNetworkDescriber.ConcatenateSentences());
        }
    GetNetworkDescription
    (
        String sUserNameToAnalyze,
        WhatToInclude eWhatToInclude,
        NetworkLevel eNetworkLevel,
        Int32 iMaximumPeoplePerRequest
    )
    {
        Debug.Assert( !String.IsNullOrEmpty(sUserNameToAnalyze) );
        Debug.Assert(iMaximumPeoplePerRequest > 0);
        AssertValid();

        NetworkDescriber oNetworkDescriber = new NetworkDescriber();

        oNetworkDescriber.AddSentence(

            "The graph represents the {0} YouTube network of the user with the"
            + " username \"{1}\"."
            ,
            NetworkLevelToString(eNetworkLevel),
            sUserNameToAnalyze
            );

        oNetworkDescriber.AddNetworkTime(NetworkSource);

        oNetworkDescriber.StartNewParagraph();

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.FriendVertices) )
        {
            oNetworkDescriber.AddSentence(
                "There is a vertex for each friend of the user."
                );
        }

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.SubscriptionVertices) )
        {
            oNetworkDescriber.AddSentence(
                "There is a vertex for each person or channel subscribed to by"
                + " the user."
                );
        }

        oNetworkDescriber.AddNetworkLimit(iMaximumPeoplePerRequest, "people");

        return ( oNetworkDescriber.ConcatenateSentences() );
    }
    GetNetworkDescription
    (
        String sScreenNameToAnalyze,
        WhatToInclude eWhatToInclude,
        NetworkLevel eNetworkLevel,
        Int32 iMaximumPeoplePerRequest
    )
    {
        Debug.Assert( !String.IsNullOrEmpty(sScreenNameToAnalyze) );
        Debug.Assert(iMaximumPeoplePerRequest > 0);
        AssertValid();

        NetworkDescriber oNetworkDescriber = new NetworkDescriber();

        oNetworkDescriber.AddSentence(

            "The graph represents the {0} Twitter network of the user with the"
            + " username \"{1}\"."
            ,
            NetworkLevelToString(eNetworkLevel),
            sScreenNameToAnalyze
            );

        oNetworkDescriber.AddNetworkTime(NetworkSource);

        oNetworkDescriber.StartNewParagraph();

        Boolean bFollowedVertices = WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.FollowedVertices);

        Boolean bFollowerVertices = WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.FollowerVertices);

        if (bFollowedVertices)
        {
            oNetworkDescriber.AddSentence(
                "There is a vertex for each person followed by the user."
                );
        }

        if (bFollowerVertices)
        {
            oNetworkDescriber.AddSentence(
                "There is a vertex for each person following the user."
                );
        }

        oNetworkDescriber.AddNetworkLimit(iMaximumPeoplePerRequest, "people");

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,

            WhatToInclude.FollowedFollowerEdges
            |
            WhatToInclude.RepliesToEdges
            |
            WhatToInclude.MentionsEdges
            ) )
        {
            oNetworkDescriber.StartNewParagraph();
        }

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.FollowedFollowerEdges) )
        {
            if (bFollowedVertices)
            {
                oNetworkDescriber.AddSentence(
                    "There is an edge for each followed relationship."
                    );
            }

            if (bFollowerVertices)
            {
                oNetworkDescriber.AddSentence(
                    "There is an edge for each following relationship."
                    );
            }
        }

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.RepliesToEdges) )
        {
            oNetworkDescriber.AddSentence(
                "There is an edge for each \"replies-to\" relationship in the"
                + " user's latest tweet."
                );
        }

        if ( WhatToIncludeFlagIsSet(eWhatToInclude,
            WhatToInclude.MentionsEdges) )
        {
            oNetworkDescriber.AddSentence(
                "There is an edge for each \"mentions\" relationship in the"
                + " user's latest tweet."
                );
        }

        return ( oNetworkDescriber.ConcatenateSentences() );
    }