In [ ]:
# # MNinov GMU 2017 # #
import networkx as nx
import matplotlib.pyplot as pltQ
In [ ]:
Pi=3.14
In [ ]:
Pi*2
In [ ]:
Pi*2**2
In [ ]:
Pi*3**2
In [ ]:
Pi
In [ ]:
a=2
type(a)
In [ ]:
b=2.0
type(b)
In [ ]:
c='2'
type(c)
In [ ]:
a==b
In [ ]:
type(a)==type(b)
In [ ]:
a==c
In [ ]:
L=[a,b,c]
In [ ]:
L[0]
In [ ]:
L[-1]
In [ ]:
L.append('two')
In [ ]:
L[-1]
In [ ]:
L.insert(2,2.)
In [ ]:
L
In [ ]:
L.pop(3)
In [ ]:
L
In [ ]:
L.remove(2.0)
In [ ]:
L
In [ ]:
len(L)
In [ ]:
L[1]=10
In [ ]:
L
In [ ]:
# Dictionary and Key
M={}
In [ ]:
M[2]=L[1]
In [ ]:
M[2]
In [ ]:
M[1]=L[2]
In [ ]:
M
In [ ]:
#Keys of Dictionary don't need to be ordered in any way
#When accecces, one must keep this in mind
M.keys()
In [ ]:
#To determined what is stored for each of those keys
M.values()
In [ ]:
#Obtain a complete listing of what is contained in M
M.items()
#tuples are very similar to lists, but are not mutable,which is to say,
#I could not reassign a value to an element of a tuple, in contrast to list.
In [ ]:
#IF Statement ends with:
if a==b:
	e=1
#we have used a Boolean operator to determine whether a and b are equal to one another
#an if statement determining this, will allow the execution to continue to the block of instructions indented below it
#In this case, it simply assign the integer value 1 to e
In [ ]:
e
In [ ]:
#Indentation:
	# python requires some sort of cue to tell it that a block of instructions depends on something.
In [ ]:
#If you want to paste code into IPython, try the %paste and %cpastemagic functions
##
In [ ]:
#IF Else statements end with: %autoindent = Magic Word
if a==c:
    f=1
else:
	g=1
In [ ]:
g
In [ ]:
f
#We know from above that a and c are different, and hence when a==c evaluates to 'False'
#Therefore, the if statement will not evaluate f=1, but rather it will evaluate g=1.
In [ ]:
#For Statement (Define Dictionary s and range
s={}
#range(x) gives a list of numbers of length x, running from 0 to x-1
range(10)
In [ ]:
#For statements end with : and indent
for i in range(100):
	s[i] = i+1
In [ ]:
#Choose what you want to call: spaces are used for code||Readability
s[0], s[1], s[5], s[99]
In [ ]:
#For Loop #for (Vvariable) in (a list)
#variable is i, and the list is given by range(100) since Gauss added up to 100
# #count sum of elements s+1 increments of the Keys
sum=0
for i in s.keys():
	sum=sum+s[i]
#sum appears both on the left and the right of the equality sign. The way that programming languages work is
# that for an equality sign as in this line, they will make STUFF on the left become equal to STUFF on the right
#Therefore, is sum at some point has a value, say 1, and we evaluate sum=sum+s[i], then sum will take on the new value 1+s[i]
In [ ]:
sum
In [ ]:
#Calculating an average An=Ao*r^n OR well approximated by about 1+n*(r-1)
#calculate an average of 20 terms of a geometric series
#where r = 2, and a o = 10
#First let us create a list Comprehensions containing the elements of the geometric series
#gs=[] must be in the same line in Python 3.6
#gs.append is used and ** denotes exponents in Python, where ^ is used in MATLAB
gs=[]
for i in range(20):
	gs.append(10*2**(i+1))
In [ ]:
avg=0
for elem in gs:
		avg=avg+elem
In [ ]:
avg=avg/len(gs)
avg
In [ ]:
#Link indicator **using an integer counter such as i or j, links (edges) that connect a node (vertex) as (i,j)
#
#Node Degree aka (incident on the node) may contain large # of links => Ki= number of links connecting to node i
#Important: Many networks have a very wide spread of values of Ki
#Mathematically keep track of whether a link is present or absent (from source to target) Ai,j{1/0 if i,j connected 1, else 0
In [ ]:
#Let's store these link indicators and calculate degrees without the help of python libraries
##So we want to create some data structure (lists or dictionaries)
####So if we were to use a list to store indicators, we would need an ordering of the list elements that is a convention
#so that every time we go looking for a particular node pair, we know exactly where to find it.
##### Other possibility is using a dictionary. This allows us to specify an entry value so that we
##can ask a correctly constructed dictionary whether the link we are supplying it as entry is present or not.
In [ ]:
#Decide What KIND of entry you supply the dictionary ex, tuples
#It turns out that tuples can be a good solution to use as keys to a dictionary
a={}
#first statement defines the dictionary a
a[(1,2)]=1
#defined one element of the dictionary with key (1,2) ~ nodes 1and2 are connected aka (ASW)

##But why use tuples and not a list as the keys of the dictionary?
### ### turns out ### ###
#that one of the few requirements that dictionaries have is that the keys cannot be mutable. 
#one of the few requirements that dictionaries have is that the keys cannot be mutable.
In [ ]:
##or undirected networks, the link (i,j) is the same as the link (j,i)
#   However, python does not know we are working with links from a network
#       and in python the order of the elements in a tuple matters ##
(1,2)==(2,1)
In [ ]:
b={}
b[[1,2]=1
In [ ]:
(1,2)==(2,1)
In [ ]:
import networkx as nx
In [ ]:
G=nx.graph()
In [ ]:
 
In [ ]:
G.nodes()
In [ ]:
G.edges()
In [ ]:
G.add_edge(a,b)
G.add_edge(b,a)
G.add_edge(a,c)
G.add_edge(a,f)
G.add_edge(b,d)
G.add_edge(d,c)
G.add_edge(c,e)
G.add_edge(e,f)
In [ ]:
G.nodes()
In [ ]:
G.edges()
In [ ]:
nx.draw(G)
plt.show()
Nx.draw(G)
Plt.show()
In [ ]:
#put all of this together to create and store the full set of link indicators##
##range(1:n+1) creates a list of elements that starts exactly at 1 and ends at n
####(the last element is range is always the last argument inside of range minus 1)#
#’if (i,j) in G:’
##when i and j are linked, then both (i,j) and (j,i) evaluate (output) to ’True’, if not (else)="False"

#n=int(args[1])
input=open(
input.readline
    a={}
for i in range(1,n+1):
	for j in range(1,n+1):
		if (i,j) in G:
            a[(i,j)]=1
        else:
                a[(i,j)]=0
In [ ]:
#calculate DEGREES for every node
#aij represented by a[(i,j)] are the elements of adjacency matrix A 
##dictionary k has a key ’i’ initialized, with value 0
k={}
for i in range(1,n+1):
    k[i]=0
    for j in range(1,n+1):
        k[i]=k[i]+a[(i,j)]
# #Here, it is very important that the code above whichdefined dictionary ’a’
    #and this code use consistent definitions
In [2]:
cd
Input=open(
Input.readline
sum_m=0
for i in range(1:n+1):
for j in range(1:n+1):
sum_m=sum_0+a[(i,j)]

sum_m=2*"NumberoflinksinG"
    
import networkx as nx
import matplotlib.pyplot as plt
import scipy as sp
import numpy as 
import sys
import math
n=int(input())    
    npG=(nx)
    
#Handshake Lemma
#Degree Distribution
#Histogram
G=degree(List)

#R is now 2, does
#Method of a Dictionary
R={}
h.has_key(elem)
	h{elem}={elem}+1
		Else:
		h{elem}=1
#Complete Graph: All nodes are connected to all other nodes
#All nodes have n-1 connections
#How many times? N times for n nodes

###Graph density P = m/n(n-1)/2
#Spanning Trees P = n-1 
    
    #breadth first algo
def BFS(G,s):
    front=[s]
    d=0
    visited=[s]
    distance={}
    distance[s]=0

    
def BFS(G,s):
    front=[s]
    d=0
    visited=[s]
    distance={}
    distance[s]=d
    while len(front)>0:
        d=d+1
        new_front=[]
        for i in front:
            for j in G.neighbors(i):
                if j in visited:
                    continue
                else:
                    new_front.append(j)
                    distance[j]=d
                    visited.append(j)
        front=new_front
        return(distance)
    
nx.draw(G)
plt.show()
plot plt(show)

G=nx.Graph()
G.nodes()
G.add_edge(1,2)
G.add_edge(1,3)
G.nodes()
[1,2,3]
G.edges()
[(1,2),(1,3)]
G.degree(1),G.degree(2),G.degree(3)
(2,1,1)
    
    
while len(pending)>0:
    d=BFS(H,pending[0])
    NewComponent=[]
    for node in d.keys():
        pending.remove(node)
        NewComponent.append(node)
components.append(NewComponent)
  File "<ipython-input-2-a39bbf3b2dfa>", line 4
    sum_m=0
        ^
SyntaxError: invalid syntax
In [ ]:
#CDS 292 Homework 3
def BFS(G,i):
    front=[i]
    d=0
    visited=[i]
    distance={}
    distance[i]=d
while len(front)>0:
    d=d+1
    new_front=[]
    for i in front:
            for H in G.neighbors(i):
                if H in visited:
                    continue
                else:
                    new_front.append(H)
                    distance[H]=d
                    visited.append(h)
    front=new_front
return(distance)

New.front=[]
for i in front:
    for H in neighbor(i)
    if H in visited:
        else:
new_front.append(H)

import matplotlib.pyplot as plt

from bfs import BFS
import networkx as nx
import BFS as bfs

components=[]
ToVisit=H.nodes()
while len (ToVisit) >0:
    d=BFS(H,ToVisit[0])
    NewComponent=[]
    for node in d.keys():
        ToVisit.remove(node)
        NewComponent.append(node)
components.append(NewComponent)
components=[]
pending=H.nodes()

len(Components)
components[1]
len(components[1])
components
nx.is_connected(H)
len(components[H])
nx.number_connected_components(H)
nx.number_connected_components(H,1)
nx.number_connected_components(H,2)
gl=list(nx.connectected_components(H))
gl[0]
gl=list(nx.connectected_component_subgraph(H))
gl[0]

H=nx.Graph()
H.nodes()
H.add_edge(1,2)
H.add_edge(1,3)
H.nodes()
[1,2,3]
H.edges()
nx.draw(H)
plt.show()

#TRIANGLE COUNTING
def triangle(G,i):
    iNeighList=G.neighbors(i)
    ki=G.degree(i)
    CountTri=0
    for n in range(ki):
        for m in range(n+1,ki):
            a=iNeighList[n]
            b=iNeighList[m]
            if G.has_edge(a,b):
                CountTri=CountTri+1
    return(CountTri)

G=nx.graph()
G.nodes()
G.add_edge(0,1)
G.add_edge(1,3)
G.add_edge(3,0)
G.add_edge(2,4)
G.edges()
nx.clustering(G)

def StarMotifs(G,i)
    rStarMotifs=[]
    for node in G.nodes():
        if G.degree(node)==i-1:
            rStarMotifs.append(node)
return(rStarMotifs)
In [ ]: