#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@author: comellas 2023

https://sagecell.sagemath.org/?q=ndjmra

"""
#  
import time

import networkx as nx

import sys
print('PYTHON version',sys.version)
print('NX version',nx.__version__)


# Function to read the "implicit adjacency list" text file and create the graph
# "implicit adjacency list" format:  each row corresponds to a vertex 
# (row 1, vertex 0; row 2, vertex 1; and so on) and contains the list of its vertices adjacent

def build_graph_from_implicit(file_name):
    G = nx.Graph()
    with open(file_name+'.txt', 'r') as f:
        for i, line in enumerate(f):
            vertices = [int(x) for x in line.split()]
            for v in vertices:
                G.add_edge(i, v)
    G.remove_edges_from(nx.selfloop_edges(G))
    return G


# Function to process a sparse6 string and create the graph

def build_graph_from_sparse6(sparse6_str: str):
    """
    Constructs a NetworkX graph from a sparse6 string.
    
    :param sparse6_str: A string in sparse6 format (e.g. Petersen is , '>>sparse6<<:I`ES@obGkqegW~')
    :return: A NetworkX Graph object
    """
    # Remove the prefix if present
    if sparse6_str.startswith('>>sparse6<<'):
        sparse6_str = sparse6_str[len('>>sparse6<<'):]
    
    # Read the graph from the sparse6 format
    graph = nx.from_sparse6_bytes(sparse6_str.encode())
    
    return graph

# Function to process a sgraph6 string and create the graph
def build_graph_from_graph6(graph6_str: str):
    """
    Constructs a NetworkX graph from a graph6 string.
    
    :param graph6_str: A string in graph6 format (e.g. Petersen, '>>graph6<<IheA@GUAo')
    :return: A NetworkX Graph object
    """
    # Remove the prefix if present
    if graph6_str.startswith('>>graph6<<'):
        graph6_str = graph6_str[len('>>graph6<<'):]
    
    # Read the graph from the graph6 format
    graph = nx.from_graph6_bytes(graph6_str.encode())
    
    return graph

# Function to calculate the diameter and degree distribution of the graph
def calculate_some_properties(G,filename):
    starttime = time.time()

    nx.write_adjlist(G,file_name+'_adjlist.txt')
    nx.write_edgelist(G,file_name+'_edges.txt')
    # nx.write_sparse6(G,file_name+'_s6.txt')
    # nx.write_graph6(G,file_name+'_g6.txt')
    
    # GZ = nx.convert_node_labels_to_integers(G)
      
    
    print(G)
    print('is_connected(G) ? ',nx.is_connected(G))  # added by FC
    print('Degree Distribution:', nx.degree_histogram(G))
    dmax = len(nx.degree_histogram(G))-1
    print('avg. deg.:', sum(dict(G.degree).values()) / len(G.nodes), 'max. deg.:', dmax)   
    diameter = nx.diameter(G, usebounds=True)
    print("Diameter:", diameter)
    avgdist = "{:.6f}".format(nx.average_shortest_path_length(G))
    print("avg. dist.:", avgdist)
    processtime = time.time()-starttime
    print('process time:', round(processtime, 1))

# generates a file with some properties of the graph

    f=open(filename+'grafINFO.txt','w')

    f.write(file_name+'\n\n')
    f.write(str(G)+'\n')
    f.write('deg. distrib.: ' +str(nx.degree_histogram(G))+'\n')
    f.write('max. deg.: ' +str(dmax)+ ' avg. deg.: '+ str(sum(dict(G.degree).values()) / len(G.nodes))+'\n')                
    f.write('diameter: ' +str(diameter)+'\n')
    f.write('avg. dist.: ' +str(avgdist)+'\n')
    f.write('process time: ' +str(round(processtime, 1))+'\n\n')
    f.close() 


starttime = time.time()
# Main function
if __name__ == '__main__':

#    G = nx.petersen_graph()
# # Example usage sparse6 from a string
#    file_name = 'petersen_s6' 
#    sparse6_input = ">>sparse6<<:I`ES@obGkqegW~"
#    G = build_graph_from_sparse6(sparse6_input)

# Read the adjacency list of a graph w
#    G = nx.read_adjlist(file_name)
#    G = nx.read_adjlist('253_11_23_9_adjlist.txt')


#    file_name = '253_11_23_9' 
#    G = build_graph_from_implicit(file_name)
#    sparse6_input = r">>sparse6<<:~?B|awE@KF@SG@[H@cI@kJ@sK@{LACMAKNASOA[PAcQAkRAs?Ac@AkAAs??[@?cA?kB?sC?{D@CKBwb`g_CcMCGd`waCsOCWfaGcDCQCghaWeDSSCwjaggDcUDGl_?VDS@B?j_OXDcBBOl__VB[DB?[_oXBkFBO]`?ZB{HB__`O\CKJBoacwpFsgEO~dGrGCiE`@dWtGSkEpBdgvGcVDowb?nFKXE?ybOpF[ZEO{b_rFk\E_}botF{^Ep?c?vGK`F@AcOxG[bFPCc_mF[dDw{cooFkHE`HH[IEhIHcJEpJHkKExKHsLF@LH{MFHMICNFPNIKOFXOISPF`PI[QFhQIcRFpRIkSFxSIsTG@TI{UGHUJC?GPVJK@GXWJSAG`XJ[BDpDJSCDxEJ[DE@DG{EEHEHCFEPFHKGEXGHSbHhcLKcHpdLSdHxeL[eI@fLcfIHgLkgIPhLshIXiL{iI`jMCjIhkMKkIplMSlIx[LsVJ@\L{WJH]MCXJP^MKYJX_MSZGh[KK[Gp\KS\Gx]K[]H@^Kc^HH_Kk_HP`Ks`HXaK{aH`bLC}JxtMs~K@uM|?KHvND@KPwNLAKXxNTBK`yN\CKhzNcmKp{NknKx|NsoL@}N{pLH~OCqLQ?OKrLY@OSsLaAO[tLiBOcuLqCOkvLyDOswMAEO{xMIFPCyMQGPKzJ`rPK{JhrMc|JpsMkIHXvPq[`XKNANRkKHhxQA]`hMNQPR{MHxzQQ_`xONaIQ[OIH|PYSaHQNqKQkQIX~PiUaXSOAMQ{SIi@PyWahUOQORKUIyBQIY_@WOaQR[@JIDQY[_PYOqSRkBJYFQi]_`DPAUR{DGqHQy__pFMYIRCFH@sPYX`@HMiKRSHHPuPiZd`cQyaTslKiWSYnaxeRIcUCWKyYSipbHgRYeUSYLI[SyrbXiRigUc[LY]TItbhkRyiUs]Li_TYvbxmPQ`Tc_LyJSQlcHoPabTsaMILSancXqPqdUCcJaNSqpch\QAfUSeJqPTArcx^QQhUcgKARTQtdH`QajUsiKQTTavdXbQq`TkUEXuSYyWK?E`vSazWS@EhwSi{W[AEpxSq|WcBExySy}WkCF@zTA~WsDFH{TJ?W{EFP|TR@XCFFX}TZAXKGF`~TbBXSHFi?TjCX[IFq@TrDXcJFyATzEXkKGABUBFXsLGICUIwXCMGQDUQxXKNGYEUYyXSOGaFUazX[PDqGUi{XcQDyHUq|XkRE@rUy}XsSEHsSIwV{TEPtSQxWCFAodJYMXRZ[K?@?eGiNXZ[[S@@GfGqOXb\[[A@OgGyPXj][cB@WhHAQXr^[kC@_iHIRVBN[CD@gjHQSVJO[KE@okHYTVRP[SF@wlHaUVZQ[[GA?VHiVVbR[cHAGWHqWVjS[kIAOXHyXVrNYkJAWYIAYVzOYsKA_ZIIZWBPY{LAg[IQ[WJQZCMAo\IY\WRRZK?@w]Ia]WZSZS@A?^Ii^WbTZ[AAG_Iq_WjUZcBAO`IyIWrVZkCAWaJAJWzWZsDA_bJIKXBXZ{EAgcJQLXJY[F"
#    G = build_graph_from_sparse6(sparse6_input)
#


# next Foster 144
#    graph6_input = ">>graph6<<~?AOs???[G?_G?C?A?C????????????@???O??O?_??O???_????O??@????O??????????????????O???@?????O????O????G?????O??????????????__????GO????@C???@?A????G?O????_?G???C??_????_?C????O?A?????C_??????C_??????Q?????@????????_???????G????????_????????_???????A?????????_????????C????????A?????????C?????????G?????????G??????????O?????????C?????????C?????????C??????????C??????????O??????????O??????????C??????????C?????????????????????????????????????????H???????????D???????????G_??????????__??????????OG???????????`??????????GO???????????OG???????????AA?????????????c????????????P?????????????g???????????CO????????????GC????????????GC????????????A??O???????????C??_???????????_?C??????????A????O??????????_???O??????????_???G?????????A???A???????????C???C???????????_???_???????????AA???????????????__??????????????__????????????A??A?????????????C??C?????????????_??_?????????_????????????????O????????????????_?????????????????????????????O?_??????????????C?A???????????????C?C??????????????_??O??????????????G??G??????????????G??O?????????????C?_????????????????G@????????????????@?G?????????????????G?@????????????????O?A????????????????O?A???????????????@???@???????????????O???_??????????????A???@???????????????_??C????????????????G??@????????????????G??@?????@????????????????????A????????????????????O??????????????????????????????????????G_???????????????????OG???????????????????OG???????????????????_C???????????????????@?O???????????????????G?_??????????????????c?????????????????????H?????????????????????H?????????????????????_?C???????????????????@??G???????????????????G?@??@????????????????????A?a????????????????????@?GO???????????????????A?GO????????????????????C_?_????????????????????H?C????????????????????@G?"

# next AFY 70 
    file_name = 'AFY_deg3_D5_'
    sparse6_input = r":~?@E_GA?_WEF@gYE_giJaw{Mbg}GchMAdXUUdguXEhi[fXu]fh?VfAIbaAQPHYYHEWS`IHA_Iiij_p}HJAyBCYso`Wsqd@}slYAuLwok`BWxdyCfMxOWbA[|`AQWJR}ICb]FKRMFLRmMCrINErb"
    G = build_graph_from_sparse6(sparse6_input)

#	file_name = 'Foster144__s6.txt' 
#	G = nx.read_sparse6(file_name)
    
# # Example usage sparse6 reading a file
#    file_name = '360_deg3D8_s6' 
#     G = nx.read_sparse6("360_deg3D8.s6")

    calculate_some_properties(G,file_name)
    