n_sizes = []
    for i in G.nodes():
        new_size = 100.0 * G.node[i]['state'][0]
        if new_size < 1.0: new_size = 1
        n_sizes.append(new_size)
    e_sizes = []
    for i in G.edges():
        e_sizes.append(G.edge[i[0]][i[1]]['state'])
    nx.draw(G, pos, node_size=n_sizes, node_color='#A0CBE2', 
            edge_color=e_sizes, edge_vmin=0.0, edge_vmax=1.0, width=4,
            edge_cmap=plt.cm.Blues, with_labels=False)
    pylab.draw()
    # Save version during the evolution
    if t > 0.3 and t < 0.31:
        plt.savefig('control_sync_adaptive_edges-middle_state.png')

#=========================================
# SIMULATE THE DYNAMICS
#=========================================

# Save initial topology
visual_reporter(G, 0.0) 
plt.savefig('control_sync_adaptive_edges-start_state.png')

# Simulate the network dynamics
netevo.simulate_rk45(G, 2.0, visual_reporter)

# Save and then close the visualization
plt.savefig('control_sync_adaptive_edges-end_state.png')
plt.close()
# Create the figure to display the visualization
fig = plt.figure(figsize=(6.5,6.5))
# Node positions to use for the visualization
pos = nx.circular_layout(G)
# Function to generate the visualisation of the network
def visual_reporter (G, t):
    plt.clf()
    n_sizes = []
    for i in G.nodes():
        new_size = 100.0 * G.node[i]['state'][0]
        if new_size < 1.0: new_size = 1
        n_sizes.append(new_size)
    e_sizes = []
    for i in G.edges():
        e_sizes.append(G.edge[i[0]][i[1]]['state'])
    nx.draw(G, pos, node_size=n_sizes, node_color='#A0CBE2', 
            edge_color=e_sizes, edge_vmin=0.0, edge_vmax=1.0, width=4,
            edge_cmap=plt.cm.Blues, with_labels=False)
    fig.canvas.draw()

#=========================================
# SIMULATE THE DYNAMICS
#=========================================
    
# Simulate the network dynamics
netevo.simulate_rk45(G, 1.7, visual_reporter)

# Save and then close the visualization
plt.savefig('control_sync_adaptive_edges-final_state.png')
plt.close()
    return np.array([v1, v2, v3])

#=========================================
# CREATE THE DYNAMICAL NETWORK
#=========================================

# Create an empty graph (undirected)
G1 = nx.Graph()

# We only need node dynamics
G1.graph['node_dyn'] = True
G1.graph['edge_dyn'] = False

# Create a pair of identical nodes with different initial states
G1.add_node(0)
G1.node[0]['state'] = np.array([2.6, 0.8, 0.9])
G1.node[0]['dyn'] = lorenz_node_dyn
G1.add_node(1)
G1.node[1]['state'] = np.array([1.2, 2.3, 0.2])
G1.node[1]['dyn'] = lorenz_node_dyn

# Connect the nodes with an edge
G1.add_edge(0,1)

#=========================================
# SIMULATE THE NETWORK DYNAMICS
#=========================================

# Simulate the dynamics and print the state to the screen
netevo.simulate_rk45 (G1, 20.0, netevo.state_reporter)