-
Notifications
You must be signed in to change notification settings - Fork 240
/
benchmark_multipoint.py
113 lines (82 loc) · 2.86 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
from __future__ import print_function
import unittest
from six.moves import range
import numpy as np
import time
from openmdao.api import Problem, Group, ExplicitComponent, IndepVarComp, ExecComp
class Plus(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(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(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(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(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 = Problem(MultiPoint(adders, scalars))
prob.setup(check=False)
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()