-
Notifications
You must be signed in to change notification settings - Fork 240
/
benchmark_multipoint.py
117 lines (80 loc) · 2.76 KB
/
benchmark_multipoint.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import time
import unittest
import numpy as np
import openmdao.api as om
class Plus(om.ExplicitComponent):
def __init__(self, adder):
super(Plus, self).__init__()
self.adder = float(adder)
def setup(self):
self.add_input('x', np.random.random())
self.add_output('f1', shape=1)
def compute(self, inputs, outputs):
outputs['f1'] = inputs['x'] + self.adder
class Times(om.ExplicitComponent):
def __init__(self, scalar):
super(Times, self).__init__()
self.scalar = float(scalar)
def setup(self):
self.add_input('f1', np.random.random())
self.add_output('f2', shape=1)
def compute(self, inputs, outputs):
outputs['f2'] = inputs['f1'] + self.scalar
class Point(om.Group):
def __init__(self, adder, scalar):
super(Point, self).__init__()
self.adder = adder
self.scalar = scalar
def setup(self):
self.add_subsystem('plus', Plus(self.adder), promotes=['*'])
self.add_subsystem('times', Times(self.scalar), promotes=['*'])
class Summer(om.ExplicitComponent):
def __init__(self, size):
super(Summer, self).__init__()
self.size = size
def setup(self):
for i in range(self.size):
self.add_input('y%d'%i, 0.)
self.add_output('total', shape=1)
def compute(self, inputs, outputs):
tot = 0
for i in range(self.size):
tot += inputs['y%d'%i]
outputs['total'] = tot
class MultiPoint(om.Group):
def __init__(self, adders, scalars):
super(MultiPoint, self).__init__()
self.adders = adders
self.scalars = scalars
def setup(self):
size = len(self.adders)
for i,(a,s) in enumerate(zip(self.adders, self.scalars)):
c_name = 'p%d'%i
self.add_subsystem(c_name, Point(a,s))
self.connect(c_name+'.f2','aggregate.y%d'%i)
self.add_subsystem('aggregate', Summer(size))
class BM(unittest.TestCase):
"""A few 'brute force' multipoint cases (1K, 2K, 5K)"""
def _setup_bm(self, npts):
size = npts
adders = np.random.random(size)
scalars = np.random.random(size)
prob = om.Problem(MultiPoint(adders, scalars))
prob.setup()
return prob
def benchmark_setup_2K(self):
for i in range(3):
p = self._setup_bm(2000)
p.final_setup()
def benchmark_setup_1K(self):
for i in range(3):
p = self._setup_bm(1000)
p.final_setup()
def benchmark_run_2K(self):
for i in range(3):
p = self._setup_bm(2000)
p.run_model()
def benchmark_run_1K(self):
for i in range(3):
p = self._setup_bm(1000)
p.run_model()