コード例 #1
0
    def test_get_latex_result(self):
        edge_1 = Edge('b', 'a', phase=0.5, attenuation=0.5, delay=2)
        edge_2 = Edge('c', 'a', phase=-0.5, attenuation=1.5, delay=-1)

        split_net = self.net
        split_net.add_node('c')

        split_net.add_edge(edge_1)
        split_net.add_edge(edge_2)
        split_net.add_input('b', amplitude=1)
        split_net.add_input('c', amplitude=1)
        split_net.evaluate()
        self.assertEqual(split_net.get_latex_result('b'),'1\cdot\exp(j (0.0))\cdot b_{in}(t-0.0)')

        edge_1 = Edge('a', 'b', phase=1, attenuation=0.4, delay=2)
        edge_2 = Edge('b', 'c', phase=2, attenuation=0.3, delay=1.2)
        edge_3 = Edge('c', 'a', phase=3, attenuation=0.2, delay=0)

        loop_net = Network()
        loop_net.add_node('a')
        loop_net.add_node('b')
        loop_net.add_node('c')
        loop_net.add_edge(edge_1)
        loop_net.add_edge(edge_2)
        loop_net.add_edge(edge_3)
        loop_net.add_input('a', amplitude=1)

        loop_net.evaluate(amplitude_cutoff=1e-4)
        self.assertEqual(loop_net.get_latex_result('b',precision=2),'0.4\cdot\exp(j (1))\cdot a_{in}(t-2)+0.0096\cdot\exp(j (7))\cdot a_{in}(t-5.2)+0.00023\cdot\exp(j (13))\cdot a_{in}(t-8.4)')
コード例 #2
0
    def test_get_reduced_output(self):
        """ creates and evaluates a feed forward combiner """
        edge_1 = Edge('b', 'a', phase=0, attenuation=0.5, delay=2)
        edge_2 = Edge('c', 'a', phase=0, attenuation=1.5, delay=2)

        split_net = Network()
        split_net.add_node('a')
        split_net.add_node('b')
        split_net.add_node('c')

        split_net.add_edge(edge_1)
        split_net.add_edge(edge_2)
        split_net.add_input('b', amplitude=1)
        split_net.add_input('c', amplitude=1)
        split_net.evaluate()

        amp, phase, delay = split_net.get_reduced_output('a')

        self.assertEqual(amp[0], 2)
        self.assertEqual(phase[0], 0)
        self.assertEqual(delay[0], 2)

        split_net.edges[1].phase=-np.pi/2
        split_net.edges[1].attenuation=0.5

        split_net.evaluate()
        amp, phase, delay = split_net.get_reduced_output('a')
        self.assertAlmostEqual(amp[0], 1/np.sqrt(2),places=5)
        self.assertAlmostEqual(phase[0], -np.pi/4, places=5)
        self.assertEquals(delay[0], 2)
コード例 #3
0
    def test_evaluate_loop(self):
        edge_1 = Edge('a', 'b', phase=1, attenuation=0.4, delay=2)
        edge_2 = Edge('b', 'c', phase=2, attenuation=0.3, delay=1)
        edge_3 = Edge('c', 'a', phase=3, attenuation=0.2, delay=0)

        expected_result = {'a': [(1, 0.0, 0.0, '-a'), (edge_1.attenuation * edge_2.attenuation * edge_3.attenuation,
                                                       edge_1.phase + edge_2.phase + edge_3.phase,
                                                       edge_1.delay + edge_2.delay + edge_3.delay, '-a-b-c-a')],
                           'b': [(edge_1.attenuation, edge_1.phase, edge_1.delay, '-a-b'),
                                 (edge_1.attenuation * edge_2.attenuation * edge_3.attenuation * edge_1.attenuation,
                                  edge_1.phase + edge_2.phase + edge_3.phase + edge_1.phase,
                                  edge_1.delay + edge_2.delay + edge_3.delay + edge_1.delay, '-a-b-c-a-b')],
                           'c': [(edge_1.attenuation * edge_2.attenuation, edge_1.phase + edge_2.phase,
                                  edge_1.delay + edge_2.delay, '-a-b-c'),
                                 (
                                     edge_1.attenuation * edge_2.attenuation * edge_3.attenuation * edge_1.attenuation * edge_2.attenuation,
                                     edge_1.phase + edge_2.phase + edge_3.phase + edge_1.phase + edge_2.phase,
                                     edge_1.delay + edge_2.delay + edge_3.delay + edge_1.delay + edge_2.delay,
                                     '-a-b-c-a-b-c')]}

        loop_net = Network()
        loop_net.add_node('a')
        loop_net.add_node('b')
        loop_net.add_node('c')
        loop_net.add_edge(edge_1)
        loop_net.add_edge(edge_2)
        loop_net.add_edge(edge_3)
        loop_net.add_input('a', amplitude=1)

        loop_net.evaluate(amplitude_cutoff=1e-3)
        self.assertEqual(loop_net.nodes_to_output, expected_result)
コード例 #4
0
    def test_evaluate_feed_forward(self):
        """ creates and evaluates a feed forward network """
        ff_net = Network()
        ff_net.add_node('a')
        ff_net.add_node('b')
        ff_net.add_node('c')

        ff_net.add_edge(Edge('a', 'b', phase=0.5, attenuation=0.8, delay=2))
        ff_net.add_edge(Edge('b', 'c', phase=-5, attenuation=1.5, delay=-1))

        ff_net.add_input('a', amplitude=1)

        ff_net.evaluate()

        self.assertEqual(ff_net.nodes_to_output, {'a': [(1, 0, 0, '-a')],
                                                  'b': [(1 * 0.8, 0 + 0.5, 2, '-a-b')],
                                                  'c': [(1 * 0.8 * 1.5, 0 + 0.5 - 5, 2 - 1, '-a-b-c')]})
コード例 #5
0
    def test_get_eval_result(self):
        """ creates and evaluates a feed forward combiner """
        edge_1 = Edge('b', 'a', phase=SymNum('phi1',default=0.5,product=False), attenuation=0.5, delay=2)
        edge_2 = Edge('c', 'a', phase=SymNum('phi2',default=0.0,product=False), attenuation=SymNum('amp2',default=1.5,product=True), delay=-1)

        split_net = Network()
        split_net.add_node('a')
        split_net.add_node('b')
        split_net.add_node('c')

        split_net.add_edge(edge_1)
        split_net.add_edge(edge_2)
        split_net.add_input('b', amplitude=1)
        split_net.add_input('c', amplitude=1)
        split_net.evaluate()

        self.assertEqual(split_net.get_eval_result('a'), [(0.5, 0.5, 2.0), (1.5, 0.0, -1.0)])
        self.assertEqual(split_net.get_eval_result('a',feed_dict=None, use_shared_default=True), [(0.5, 0.5, 2.0), (1.5, 0.0, -1.0)])
        self.assertEqual(split_net.get_eval_result('a',feed_dict={'phi1':0.6,'phi2':3,'amp2':6}, use_shared_default=True), [(0.5, 0.6, 2.0), (6.0, 3.0, -1.0)])
コード例 #6
0
    def test_evaluate_splitting(self):
        """ creates and evaluates a feed forward split """
        edge_1 = Edge('a', 'b', phase=0.5, attenuation=0.5, delay=2)
        edge_2 = Edge('a', 'c', phase=-0.5, attenuation=1.5, delay=-1)

        expected_nodes_to_output = {'a': [(1, 0, 0, '-a')],
                                    'b': [(edge_1.attenuation, edge_1.phase, edge_1.delay, '-a-b')],
                                    'c': [(edge_2.attenuation, edge_2.phase, edge_2.delay, '-a-c')]}

        split_net = Network()
        split_net.add_node('a')
        split_net.add_node('b')
        split_net.add_node('c')

        split_net.add_edge(edge_1)
        split_net.add_edge(edge_2)
        split_net.add_input('a', amplitude=1)
        split_net.evaluate()

        self.assertEqual(split_net.nodes_to_output, expected_nodes_to_output)
コード例 #7
0
    def test_visualize(self):
        """ This test only checks that a graph is generated.

        It does not check if the graph does match the network description. This test will fail if graphviz is not setup.
        """
        edge_1 = Edge('b', 'a', phase=0.5, attenuation=0.5, delay=2)
        edge_2 = Edge('c', 'a', phase=-0.5, attenuation=1.5, delay=-1)

        split_net = Network()
        split_net.add_node('a')
        split_net.add_node('b')
        split_net.add_node('c')

        split_net.add_edge(edge_1)
        split_net.add_edge(edge_2)
        split_net.add_input('b', amplitude=1)
        split_net.add_input('c', amplitude=1)
        split_net.evaluate()
        self.assertEqual(split_net.visualize(show_edge_labels=True,path='./visualizations/test1'), './visualizations\\test1.pdf')
        self.assertEqual(split_net.visualize(show_edge_labels=False, path='./visualizations/test2'), './visualizations\\test2.pdf')
        self.assertEqual(split_net.visualize(show_edge_labels=True,format='svg',path='./visualizations/test1'), './visualizations\\test1.svg')
        rmtree('./visualizations') # remove the directory
コード例 #8
0
net = Network()
for node in nodes:
    net.add_node(node)
for edge in edges:
    net.add_edge(edge)
net.add_input('a', amplitude=1.0)
for edge in net.edges:
    edge.attenuation = 0.75
    edge.phase = np.random.uniform(0, 2 * np.pi)

net.visualize(path='./visualizations/mediumexample')
####
# Evaluate Network
####
net.evaluate(amplitude_cutoff=1e-3, max_endpoints=1e6)

####
# Print and plot
####
for node in net.nodes:
    print('number of paths to ' + node + ':', len(net.get_paths(node)))
print('final path to a added:', net.get_paths('a')[-1])
net.print_stats()

phases = np.asarray([val[1] for val in net.get_result('a')])
phases = phases % 2 * np.pi
amplitudes = np.asarray([val[0] for val in net.get_result('a')])
plt.hist(phases, weights=amplitudes, bins=30)
plt.title("amplitude weighted, binned phase contributions to a")
plt.ylabel('amplitude')
コード例 #9
0
# Add nodes
net.add_node(name='a')
net.add_node(name='b')
net.add_node(name='c')
net.add_node(name='d')

# Add edges
net.add_edge(Edge(start='a', end='b', phase=1, attenuation=0.8, delay=1))
net.add_edge(Edge(start='b', end='c', phase=2, attenuation=0.6, delay=2))
net.add_edge(Edge(start='b', end='d', phase=3, attenuation=0.4, delay=3))

# Add input
net.add_input(name='a', amplitude=1.0, phase=0)

# Visualize the network
net.visualize(path='./visualizations/feedforward', format='svg')

# Evaluate the network
net.evaluate(amplitude_cutoff=1e-3)

# Compute output and show results
print('paths leading to c:', net.get_paths('c'))
print('paths leading to d:', net.get_paths('d'))
print('waves arriving at c:', net.get_result('c'))
print('waves arriving at d:', net.get_result('d'))
print('latex string for waves arriving at c:', net.get_latex_result('c'))

# render output in a html file
net.get_html_result(['c', 'd'],
                    precision=2,
                    path='./visualizations/feedforward.html')
コード例 #10
0
net = Network()

net.add_node(name='a')
net.add_node(name='b')
net.add_node(name='c')
net.add_node(name='d')

net.add_edge(Edge(start='a', end='b', phase=phi1, attenuation=amp1, delay=1))
net.add_edge(Edge(start='b', end='c', phase=phi2, attenuation=amp2, delay=2))
net.add_edge(Edge(start='b', end='d', phase=3, attenuation=0.4, delay=3))

net.add_input(name='a', amplitude=1.0, phase=0)

net.visualize(path='./visualizations/symbolicfeedforward', format='svg')

net.evaluate(use_shared_default=False, feed_dict=None)

# print('paths leading to c:', net.get_paths('c'))
# print('paths leading to d:', net.get_paths('d'))

print('waves arriving at c:', net.get_result('c'))
print('waves arriving at d:', net.get_result('d'))
net.get_html_result(['c', 'd'],
                    path='./visualizations/symbolicfeedforward.html')
# Evaluation without feed dictionary, using the default value of each SymNum
waves = [
    tuple([
        w.eval(feed_dict=None, use_shared_default=False)
        if hasattr(w, 'eval') else w for w in inner
    ]) for inner in net.get_result('c')
]
コード例 #11
0
amp2 = SymNum(name='v_2', product=True)
amp3 = SymNum(name='v_3', product=True)
phi3 = SymNum(name='v_4', product=False)

net.add_node(name='a')
net.add_node(name='b')
net.add_node(name='c')

net.add_edge(Edge(start='a', end='b', phase=2, attenuation=amp1, delay=1))
net.add_edge(Edge(start='b', end='c', phase=1, attenuation=amp2, delay=2))
net.add_edge(
    Edge(start='c', end='a', phase=phi3, attenuation=0.5 * amp3, delay=3))
net.add_input('a')
net.add_input('b')

net.evaluate(amplitude_cutoff=0.001)
net.visualize(path='./visualizations/docdemo', format='png')
net.visualize(path='./visualizations/docdemo', format='svg')

print(net.get_result('b'))
print(net.get_latex_result('b', linebreak_limit=1))
net.get_html_result(['c', 'b'], path='./visualizations/docdemo_latex.html')
### Create a testbench with a feed dictionary
tb = Testbench(network=net,
               timestep=0.05,
               feed_dict={
                   'v1': 0.8,
                   'v2': 0.8,
                   'v3': 0.9,
                   'v4': 3
               })
コード例 #12
0
    SymbolicEdge('m', 'c')
]

net = Network()
for node in nodes:
    net.add_node(node)
for edge in edges:
    net.add_edge(edge)
net.add_input('a', amplitude=1.0)
for i, edge in enumerate(net.edges):
    edge.phase = np.random.uniform(0, 2 * np.pi)

####
# Evaluate Network
####
net.evaluate(amplitude_cutoff=5e-3, max_endpoints=1e6, use_shared_default=True)
waves = [
    tuple([w.eval() if hasattr(w, 'eval') else w for w in inner])
    for inner in net.get_result('a')
]

####
# Print and plot
####
for node in net.nodes:
    print('number of paths to ' + node + ':', len(net.get_paths(node)))
print('final path to a added:', net.get_paths('a')[-1])
print('10 first waves arriving at a:', waves[:10])
net.print_stats()

#####
コード例 #13
0
]

net = Network()
for node in nodes:
    net.add_node(node)
for edge in edges:
    net.add_edge(edge)
net.add_input('a', amplitude=1.0)

net.visualize(path='./visualizations/symbolicrecurrent')

####
# Evaluate Network
####
net.evaluate(amplitude_cutoff=1e-2,
             max_endpoints=1e6,
             use_shared_default=False)

print('paths leading to a:', net.get_paths('a'))
waves = [
    tuple([w.eval() if hasattr(w, 'eval') else w for w in inner])
    for inner in net.get_result('a')
]
print('waves arriving at a:', waves, '\n')
net.print_stats()

####
# Inserting variable values
###
waves = [
    tuple([