stdCBDTest.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. #!/usr/bin/env python
  2. """
  3. Unit tests for all the basic CBD blocks in the std library.
  4. """
  5. import unittest
  6. from CBD.Core import *
  7. from CBD.lib.std import *
  8. from CBD.simulator import Simulator
  9. NUM_DISCR_TIME_STEPS = 5
  10. class StdCBDTestCase(unittest.TestCase):
  11. def setUp(self):
  12. self.CBD = CBD("CBD_for_block_under_test")
  13. self.sim = Simulator(self.CBD)
  14. def _run(self, num_steps=1, delta_t = 1.0):
  15. self.sim.setDeltaT(delta_t)
  16. self.sim.setTerminationTime(num_steps * delta_t)
  17. self.CBD.addBlock(DummyClock("clock", delta=delta_t))
  18. self.sim.run()
  19. def _getSignal(self, blockname, output_port = None):
  20. block = self.CBD.getBlockByName(blockname)
  21. signal = block.getSignal(name_output = output_port)
  22. return [x.value for x in signal]
  23. def testConstantBlock(self):
  24. self.CBD.addBlock(ConstantBlock(block_name="c1", value=3.3))
  25. self._run(NUM_DISCR_TIME_STEPS)
  26. self.assertEqual(self._getSignal("c1"), [3.3] * NUM_DISCR_TIME_STEPS)
  27. self.CBD.getBlockByName("c1").setValue(5)
  28. self.assertEqual(self.CBD.getBlockByName("c1").getValue(), 5)
  29. def testNegatorBlockPos(self):
  30. self.CBD.addBlock(ConstantBlock(block_name="c1", value=6.0))
  31. self.CBD.addBlock(NegatorBlock(block_name="n"))
  32. self.CBD.addConnection("c1", "n")
  33. self._run(NUM_DISCR_TIME_STEPS)
  34. self.assertEqual(self._getSignal("n"), [-6.0] * NUM_DISCR_TIME_STEPS)
  35. def testNegatorBlockNeg(self):
  36. self.CBD.addBlock(ConstantBlock(block_name="c1", value=-6.0))
  37. self.CBD.addBlock(NegatorBlock(block_name="n"))
  38. self.CBD.addConnection("c1", "n")
  39. self._run(NUM_DISCR_TIME_STEPS)
  40. self.assertEqual(self._getSignal("n"), [6.0] * NUM_DISCR_TIME_STEPS)
  41. def testNegatorBlockZero(self):
  42. self.CBD.addBlock(ConstantBlock(block_name="c1", value=0.0))
  43. self.CBD.addBlock(NegatorBlock(block_name="n"))
  44. self.CBD.addConnection("c1", "n")
  45. self._run(NUM_DISCR_TIME_STEPS)
  46. self.assertEqual(self._getSignal("n"), [0.0] * NUM_DISCR_TIME_STEPS)
  47. def testInverterBlock(self):
  48. self.CBD.addBlock(ConstantBlock(block_name="c1", value=5.0))
  49. self.CBD.addBlock(InverterBlock(block_name="i1"))
  50. self.CBD.addBlock(InverterBlock(block_name="i2"))
  51. self.CBD.addConnection("c1", "i1")
  52. self.CBD.addConnection("i1", "i2")
  53. self._run(NUM_DISCR_TIME_STEPS)
  54. self.assertEqual(self._getSignal("i1"), [0.2] * NUM_DISCR_TIME_STEPS)
  55. self.assertEqual(self._getSignal("i2"), [5.0] * NUM_DISCR_TIME_STEPS)
  56. def testInverterBlockDivByZero(self):
  57. self.CBD.addBlock(ConstantBlock(block_name="c1", value=0))
  58. self.CBD.addBlock(InverterBlock(block_name="inv"))
  59. self.CBD.addConnection("c1", "inv")
  60. self.assertRaises(ZeroDivisionError, self._run, NUM_DISCR_TIME_STEPS)
  61. def testAdderBlock(self):
  62. self.CBD.addBlock(ConstantBlock(block_name="c1", value=2.0))
  63. self.CBD.addBlock(ConstantBlock(block_name="c2", value=6.0))
  64. self.CBD.addBlock(AdderBlock(block_name="a"))
  65. self.CBD.addConnection("c1", "a")
  66. self.CBD.addConnection("c2", "a")
  67. self._run(NUM_DISCR_TIME_STEPS)
  68. self.assertEqual(self._getSignal("a"), [8.0] * NUM_DISCR_TIME_STEPS)
  69. def testAdderBlock2(self):
  70. self.CBD.addBlock(ConstantBlock(block_name="c1", value=2.0))
  71. self.CBD.addBlock(ConstantBlock(block_name="c2", value=-6.0))
  72. self.CBD.addBlock(AdderBlock(block_name="a", numberOfInputs=5))
  73. self.assertEqual(self.CBD.getBlockByName("a").getNumberOfInputs(), 5)
  74. self.CBD.addConnection("c1", "a")
  75. self.CBD.addConnection("c2", "a")
  76. self.CBD.addConnection("c1", "a")
  77. self.CBD.addConnection("c2", "a")
  78. self.CBD.addConnection("c1", "a")
  79. self._run(NUM_DISCR_TIME_STEPS)
  80. self.assertEqual(self._getSignal("a"), [-6.0] * NUM_DISCR_TIME_STEPS)
  81. def testProductBlock(self):
  82. self.CBD.addBlock(ConstantBlock(block_name="c1", value=2.0))
  83. self.CBD.addBlock(ConstantBlock(block_name="c2", value=5.0))
  84. self.CBD.addBlock(ProductBlock(block_name="p"))
  85. self.CBD.addConnection("c1", "p")
  86. self.CBD.addConnection("c2", "p")
  87. self._run(NUM_DISCR_TIME_STEPS)
  88. self.assertEqual(self._getSignal("p"), [10.0] * 5)
  89. def testProductBlock2(self):
  90. self.CBD.addBlock(ConstantBlock(block_name="c1", value=0.5))
  91. self.CBD.addBlock(ConstantBlock(block_name="c2", value=4.0))
  92. self.CBD.addBlock(ProductBlock(block_name="p", numberOfInputs=4))
  93. self.assertEqual(self.CBD.getBlockByName("p").getNumberOfInputs(), 4)
  94. self.CBD.addConnection("c1", "p")
  95. self.CBD.addConnection("c2", "p")
  96. self.CBD.addConnection("c1", "p")
  97. self.CBD.addConnection("c2", "p")
  98. self._run(NUM_DISCR_TIME_STEPS)
  99. self.assertEqual(self._getSignal("p"), [4.0] * 5)
  100. def testGenericBlock(self):
  101. self.CBD.addBlock(ConstantBlock(block_name="c1", value=2.2))
  102. self.CBD.addBlock(GenericBlock(block_name="g", block_operator="ceil"))
  103. self.CBD.addConnection("c1", "g")
  104. self._run(NUM_DISCR_TIME_STEPS)
  105. self.assertEqual(self._getSignal("g"), [3.0] * 5)
  106. def testRootBlock(self):
  107. self.CBD.addBlock(ConstantBlock(block_name="c1", value=8.0))
  108. self.CBD.addBlock(ConstantBlock(block_name="c2", value=3.0))
  109. self.CBD.addBlock(RootBlock(block_name="g"))
  110. self.CBD.addConnection("c1", "g")
  111. self.CBD.addConnection("c2", "g")
  112. self._run(1)
  113. self.assertEqual(self._getSignal("g"), [2.0])
  114. def testRootBlock2(self):
  115. self.CBD.addBlock(ConstantBlock(block_name="c1", value=9.0))
  116. self.CBD.addBlock(ConstantBlock(block_name="c2", value=2.0))
  117. self.CBD.addBlock(RootBlock(block_name="g"))
  118. self.CBD.addConnection("c1", "g")
  119. self.CBD.addConnection("c2", "g")
  120. self._run(1)
  121. self.assertEqual(self._getSignal("g"), [3.0])
  122. def testRootBlockDivByZero(self):
  123. self.CBD.addBlock(ConstantBlock(block_name="c1", value=0))
  124. self.CBD.addBlock(ConstantBlock(block_name="c2", value=2.0))
  125. self.CBD.addBlock(RootBlock(block_name="root"))
  126. self.CBD.addConnection("c2", "root")
  127. self.CBD.addConnection("c1", "root")
  128. self.assertRaises(ZeroDivisionError, self._run, NUM_DISCR_TIME_STEPS)
  129. def testPowerBlock(self):
  130. self.CBD.addBlock(ConstantBlock(block_name="c1", value=8.0))
  131. self.CBD.addBlock(ConstantBlock(block_name="c2", value=3.0))
  132. self.CBD.addBlock(PowerBlock(block_name="g"))
  133. self.CBD.addConnection("c1", "g")
  134. self.CBD.addConnection("c2", "g")
  135. self._run(1)
  136. self.assertEqual(self._getSignal("g"), [512.0])
  137. def testAbsBlock(self):
  138. seq = [1, -1, 2, -6, -9, 7]
  139. self.CBD.addBlock(SequenceBlock(block_name="seq", sequence=seq))
  140. self.CBD.addBlock(AbsBlock(block_name="abs"))
  141. self.CBD.addConnection("seq", "abs")
  142. self._run(len(seq))
  143. self.assertEqual(self._getSignal("abs"), [abs(x) for x in seq])
  144. def testMaxBlock(self):
  145. self.CBD.addBlock(TimeBlock("time"))
  146. self.CBD.addBlock(ConstantBlock("c1", -2))
  147. self.CBD.addBlock(ConstantBlock("c2", 3.0))
  148. self.CBD.addBlock(AdderBlock("sum"))
  149. self.CBD.addBlock(MaxBlock(block_name="max", numberOfInputs=3))
  150. self.assertEqual(self.CBD.getBlockByName("max").getNumberOfInputs(), 3)
  151. self.CBD.addConnection("time", "sum")
  152. self.CBD.addConnection("c1", "sum")
  153. self.CBD.addConnection("sum", "max")
  154. self.CBD.addConnection("c2", "max")
  155. self.CBD.addConnection("time", "max")
  156. self._run(5)
  157. self.assertEqual(self._getSignal("max"), [max(float(x), 3.0, x + 2.0) for x in range(-2, 3)])
  158. def testMinBlock(self):
  159. self.CBD.addBlock(TimeBlock("time"))
  160. self.CBD.addBlock(ConstantBlock("c1", -2))
  161. self.CBD.addBlock(ConstantBlock("c2", 3.0))
  162. self.CBD.addBlock(AdderBlock("sum"))
  163. self.CBD.addBlock(MinBlock(block_name="min", numberOfInputs=3))
  164. self.assertEqual(self.CBD.getBlockByName("min").getNumberOfInputs(), 3)
  165. self.CBD.addConnection("time", "sum")
  166. self.CBD.addConnection("c1", "sum")
  167. self.CBD.addConnection("sum", "min")
  168. self.CBD.addConnection("c2", "min")
  169. self.CBD.addConnection("time", "min")
  170. self._run(5)
  171. self.assertEqual(self._getSignal("min"), [min(float(x), 3.0, x + 2.0) for x in range(-2, 3)])
  172. def testClampBlock(self):
  173. self.CBD.addBlock(TimeBlock("time"))
  174. self.CBD.addBlock(ConstantBlock("c1", -2))
  175. self.CBD.addBlock(AdderBlock("sum"))
  176. self.CBD.addBlock(ClampBlock(block_name="clamp", min=-1.0, max=2.0))
  177. self.CBD.addConnection("time", "sum")
  178. self.CBD.addConnection("c1", "sum")
  179. self.CBD.addConnection("sum", "clamp")
  180. self._run(5)
  181. self.assertEqual(self._getSignal("clamp"), [max(min(float(x), 2.0), -1.0) for x in range(-2, 3)])
  182. def testClampBlock2(self):
  183. self.CBD.addBlock(TimeBlock("time"))
  184. self.CBD.addBlock(ConstantBlock("c1", -2))
  185. self.CBD.addBlock(ConstantBlock("c2", -1.0))
  186. self.CBD.addBlock(ConstantBlock("c3", 2.0))
  187. self.CBD.addBlock(AdderBlock("sum"))
  188. self.CBD.addBlock(ClampBlock(block_name="clamp", use_const=False))
  189. self.CBD.addConnection("time", "sum")
  190. self.CBD.addConnection("c1", "sum")
  191. self.CBD.addConnection("sum", "clamp")
  192. self.CBD.addConnection("c2", "clamp")
  193. self.CBD.addConnection("c3", "clamp")
  194. self._run(5)
  195. self.assertEqual(self._getSignal("clamp"), [max(min(float(x), 2.0), -1.0) for x in range(-2, 3)])
  196. def testMultiplexerBlock(self):
  197. a = list(range(10))
  198. b = list(range(100, 90, -1))
  199. s = [0, 1, 1, 0, 0, 0, 1, 1, 1, 0]
  200. self.CBD.addBlock(SequenceBlock(block_name="c1", sequence=a))
  201. self.CBD.addBlock(SequenceBlock(block_name="c2", sequence=b))
  202. self.CBD.addBlock(SequenceBlock(block_name="c3", sequence=s))
  203. self.CBD.addBlock(MultiplexerBlock(block_name="mux"))
  204. self.CBD.addConnection("c1", "mux")
  205. self.CBD.addConnection("c2", "mux")
  206. self.CBD.addConnection("c3", "mux", input_port_name="select")
  207. self._run(10)
  208. self.assertEqual(self._getSignal("mux"), [0, 99, 98, 3, 4, 5, 94, 93, 92, 9])
  209. def testIntBlock(self):
  210. seq = [1.2, 2.2, 3.8, 4.7, 2.3, 6.6666]
  211. self.CBD.addBlock(SequenceBlock(block_name="seq", sequence=seq))
  212. self.CBD.addBlock(IntBlock(block_name="int"))
  213. self.CBD.addConnection("seq", "int")
  214. self._run(len(seq))
  215. self.assertEqual(self._getSignal("int"), [int(x) for x in seq])
  216. def testLessThanBlock1(self):
  217. self.CBD.addBlock(ConstantBlock(block_name="c1", value=2))
  218. self.CBD.addBlock(ConstantBlock(block_name="c2", value=6))
  219. self.CBD.addBlock(LessThanBlock(block_name="lt"))
  220. self.CBD.addConnection("c1", "lt")
  221. self.CBD.addConnection("c2", "lt")
  222. self._run(1)
  223. self.assertEqual(self._getSignal("lt"), [1])
  224. def testLessThanBlock2(self):
  225. self.CBD.addBlock(ConstantBlock(block_name="c1", value=9))
  226. self.CBD.addBlock(ConstantBlock(block_name="c2", value=7))
  227. self.CBD.addBlock(LessThanBlock(block_name="lt"))
  228. self.CBD.addConnection("c1", "lt")
  229. self.CBD.addConnection("c2", "lt")
  230. self._run(1)
  231. self.assertEqual(self._getSignal("lt"), [0])
  232. def testLessThanBlock3(self):
  233. self.CBD.addBlock(ConstantBlock(block_name="c1", value=5))
  234. self.CBD.addBlock(ConstantBlock(block_name="c2", value=5))
  235. self.CBD.addBlock(LessThanBlock(block_name="lt"))
  236. self.CBD.addConnection("c1", "lt")
  237. self.CBD.addConnection("c2", "lt")
  238. self._run(1)
  239. self.assertEqual(self._getSignal("lt"), [0])
  240. def testLessThanOrEqualsBlock1(self):
  241. self.CBD.addBlock(ConstantBlock(block_name="c1", value=2))
  242. self.CBD.addBlock(ConstantBlock(block_name="c2", value=6))
  243. self.CBD.addBlock(LessThanOrEqualsBlock(block_name="leq"))
  244. self.CBD.addConnection("c1", "leq")
  245. self.CBD.addConnection("c2", "leq")
  246. self._run(1)
  247. self.assertEqual(self._getSignal("leq"), [1])
  248. def testLessThanOrEqualsBlock2(self):
  249. self.CBD.addBlock(ConstantBlock(block_name="c1", value=9))
  250. self.CBD.addBlock(ConstantBlock(block_name="c2", value=7))
  251. self.CBD.addBlock(LessThanOrEqualsBlock(block_name="leq"))
  252. self.CBD.addConnection("c1", "leq")
  253. self.CBD.addConnection("c2", "leq")
  254. self._run(1)
  255. self.assertEqual(self._getSignal("leq"), [0])
  256. def testLessThanOrEqualsBlock3(self):
  257. self.CBD.addBlock(ConstantBlock(block_name="c1", value=5))
  258. self.CBD.addBlock(ConstantBlock(block_name="c2", value=5))
  259. self.CBD.addBlock(LessThanOrEqualsBlock(block_name="leq"))
  260. self.CBD.addConnection("c1", "leq")
  261. self.CBD.addConnection("c2", "leq")
  262. self._run(1)
  263. self.assertEqual(self._getSignal("leq"), [1])
  264. def testEqualsBlock1(self):
  265. self.CBD.addBlock(ConstantBlock(block_name="c1", value=5))
  266. self.CBD.addBlock(ConstantBlock(block_name="c2", value=5))
  267. self.CBD.addBlock(EqualsBlock(block_name="eq"))
  268. self.CBD.addConnection("c1", "eq")
  269. self.CBD.addConnection("c2", "eq")
  270. self._run(1)
  271. self.assertEqual(self._getSignal("eq"), [1])
  272. def testEqualsBlock2(self):
  273. self.CBD.addBlock(ConstantBlock(block_name="c1", value=4))
  274. self.CBD.addBlock(ConstantBlock(block_name="c2", value=7))
  275. self.CBD.addBlock(EqualsBlock(block_name="eq"))
  276. self.CBD.addConnection("c1", "eq")
  277. self.CBD.addConnection("c2", "eq")
  278. self._run(1)
  279. self.assertEqual(self._getSignal("eq"), [0])
  280. def testNotBlock1(self):
  281. self.CBD.addBlock(ConstantBlock(block_name="c", value=0))
  282. self.CBD.addBlock(NotBlock(block_name="not"))
  283. self.CBD.addConnection("c", "not")
  284. self._run(1)
  285. self.assertEqual(self._getSignal("not"), [1])
  286. def testNotBlock2(self):
  287. self.CBD.addBlock(ConstantBlock(block_name="c", value=1))
  288. self.CBD.addBlock(NotBlock(block_name="not"))
  289. self.CBD.addConnection("c", "not")
  290. self._run(1)
  291. self.assertEqual(self._getSignal("not"), [0])
  292. def testNotBlock3(self):
  293. self.CBD.addBlock(ConstantBlock(block_name="c", value=17))
  294. self.CBD.addBlock(NotBlock(block_name="not"))
  295. self.CBD.addConnection("c", "not")
  296. self._run(1)
  297. self.assertEqual(self._getSignal("not"), [0])
  298. def testAndBlock(self):
  299. self.CBD.addBlock(SequenceBlock(block_name="c1", sequence=[0, 0, 1, 1]))
  300. self.CBD.addBlock(SequenceBlock(block_name="c2", sequence=[0, 1, 0, 1]))
  301. self.CBD.addBlock(AndBlock(block_name="and"))
  302. self.CBD.addConnection("c1", "and")
  303. self.CBD.addConnection("c2", "and")
  304. self._run(4)
  305. self.assertEqual(self._getSignal("and"), [0, 0, 0, 1])
  306. def testOrBlock(self):
  307. self.CBD.addBlock(SequenceBlock(block_name="c1", sequence=[0, 0, 1, 1]))
  308. self.CBD.addBlock(SequenceBlock(block_name="c2", sequence=[0, 1, 0, 1]))
  309. self.CBD.addBlock(OrBlock(block_name="or"))
  310. self.CBD.addConnection("c1", "or")
  311. self.CBD.addConnection("c2", "or")
  312. self._run(4)
  313. self.assertEqual(self._getSignal("or"), [0, 1, 1, 1])
  314. def testModuloBlock(self):
  315. self.CBD.addBlock(ConstantBlock(block_name="c1", value=8.0))
  316. self.CBD.addBlock(ConstantBlock(block_name="c2", value=3.0))
  317. self.CBD.addBlock(ModuloBlock(block_name="g"))
  318. self.CBD.addConnection("c1", "g")
  319. self.CBD.addConnection("c2", "g")
  320. self._run(1)
  321. self.assertEqual(self._getSignal("g"), [2.0])
  322. def testModuloBlock2(self):
  323. self.CBD.addBlock(ConstantBlock(block_name="c1", value=8.0))
  324. self.CBD.addBlock(ConstantBlock(block_name="c2", value=8.0))
  325. self.CBD.addBlock(ModuloBlock(block_name="g"))
  326. self.CBD.addConnection("c1", "g")
  327. self.CBD.addConnection("c2", "g")
  328. self._run(1)
  329. self.assertEqual(self._getSignal("g"), [0.0])
  330. def testPreviousValueDelayBlock(self):
  331. self.CBD.addBlock(ConstantBlock(block_name="ZeroConstant", value=0.0))
  332. self.CBD.addBlock(SequenceBlock(block_name="seq", sequence=[0, 2, 4, 6, 8, 10, 12]))
  333. self.CBD.addBlock(DelayBlock(block_name="d"))
  334. self.CBD.addConnection("ZeroConstant", "d", input_port_name="IC")
  335. self.CBD.addConnection("seq", "d")
  336. self._run(7, 0.5)
  337. self.assertEqual(self._getSignal("d"), [0, 0, 2, 4, 6, 8, 10])
  338. def testPreviousValueDelayBlock2(self):
  339. self.CBD.addBlock(SequenceBlock(block_name="FirstSeq", sequence=[2, 12, 22, 23, 32, 11, 91]))
  340. self.CBD.addBlock(SequenceBlock(block_name="SecSeq", sequence=[5, 5, 5, 5, 3, 3, 3]))
  341. self.CBD.addBlock(DelayBlock(block_name="prev"))
  342. self.CBD.addConnection(self.CBD.getBlockByName("FirstSeq"), "prev")
  343. self.CBD.addConnection(self.CBD.getBlockByName("SecSeq"), "prev", input_port_name="IC")
  344. self._run(7)
  345. self.assertEqual(self._getSignal("prev"), [5, 2, 12, 22, 23, 32, 11])
  346. def testSequenceBlock(self):
  347. self.CBD.addBlock(SequenceBlock(block_name="FirstSeq", sequence=[2, 2, 2, 3, 2, 1, 1]))
  348. self._run(7)
  349. self.assertEqual(self._getSignal("FirstSeq"), [2, 2, 2, 3, 2, 1, 1])
  350. def testLoggingBlockError(self):
  351. self.CBD.addBlock(ConstantBlock(block_name="One", value=1))
  352. self.CBD.addBlock(LoggingBlock("L1", "Logging block test were level is error", level.ERROR))
  353. self.CBD.addConnection("One", "L1")
  354. self._run(1)
  355. def testLoggingBlockWarning(self):
  356. self.CBD.addBlock(ConstantBlock(block_name="One", value=1))
  357. self.CBD.addBlock(LoggingBlock("L1", "Logging block test were level is warning", level.WARNING))
  358. self.CBD.addConnection("One", "L1")
  359. self._run(1)
  360. def testLoggingBlockFatal(self):
  361. self.CBD.addBlock(ConstantBlock(block_name="One", value=1))
  362. self.CBD.addBlock(LoggingBlock("L1", "Logging block test were level is fatal", level.FATAL))
  363. self.CBD.addConnection("One", "L1")
  364. self.assertRaises(SystemExit, self._run, 1)
  365. def initializeFuncDerBas(self):
  366. #f(t) = 5*t
  367. CBDFunc = CBD("function", output_ports = ["OUT1"])
  368. CBDFunc.addBlock(TimeBlock(block_name="t"))
  369. CBDFunc.addBlock(ProductBlock(block_name="p"))
  370. CBDFunc.addBlock(ConstantBlock(block_name="c", value=5.0))
  371. CBDFunc.addConnection("t", "p")
  372. CBDFunc.addConnection("c", "p")
  373. CBDFunc.addConnection("p", "OUT1")
  374. return CBDFunc
  375. def testDerivatorBlock(self):
  376. self.CBD.addBlock(ConstantBlock(block_name="c3", value=1.0))
  377. self.CBD.addBlock(ConstantBlock(block_name="zero", value=0.0))
  378. CBDFunc = self.initializeFuncDerBas()
  379. self.CBD.addBlock(CBDFunc)
  380. self.CBD.addBlock(DerivatorBlock(block_name="der"))
  381. self.CBD.addConnection("c3", "der", input_port_name="delta_t")
  382. self.CBD.addConnection("zero", "der", input_port_name="IC")
  383. self.CBD.addConnection("function", "der")
  384. self._run(5)
  385. self.assertEqual(self._getSignal("der"), [0.0]+[5.0]*4)
  386. def testIntegratorBlock(self):
  387. # Function: f(t) = 6 + f(t - dt), where f(0) = 6
  388. dt = 0.0001
  389. epsilon = 0.002
  390. self.CBD.addBlock(ConstantBlock(block_name="c1", value=6.0))
  391. self.CBD.addBlock(ConstantBlock(block_name="c2", value=0.0))
  392. self.CBD.addBlock(ConstantBlock(block_name="c3", value=dt))
  393. self.CBD.addBlock(AdderBlock(block_name="a"))
  394. self.CBD.addBlock(DelayBlock(block_name="d"))
  395. self.CBD.addBlock(IntegratorBlock(block_name="int"))
  396. self.CBD.addConnection("c3", "int", input_port_name="delta_t")
  397. self.CBD.addConnection("a", "int")
  398. self.CBD.addConnection("c2", "int", input_port_name="IC")
  399. self.CBD.addConnection("c1", "a")
  400. self.CBD.addConnection("d", "a")
  401. self.CBD.addConnection("a", "d")
  402. self.CBD.addConnection("c2", "d", input_port_name="IC")
  403. self._run(NUM_DISCR_TIME_STEPS, dt)
  404. actual = [x*dt for x in [0.0, 9.0, 24.0, 45.0, 72.0]]
  405. measured = self._getSignal("int")
  406. error = [abs(measured[i] - actual[i]) for i in range(NUM_DISCR_TIME_STEPS)]
  407. self.assertFalse(any([x > epsilon for x in error]), "Error too large.\n\tExpected: {}\n\tActual: {}"
  408. "\n\tErrors: {}".format(actual, measured, error))
  409. def testDelayBlock(self):
  410. self.CBD.addBlock(ConstantBlock(block_name="c1", value=5.0))
  411. self.CBD.addBlock(ConstantBlock(block_name="c2", value=3.0))
  412. self.CBD.addBlock(DelayBlock(block_name="d"))
  413. self.CBD.addConnection("c2", "d")
  414. self.CBD.addConnection("c1", "d", input_port_name="IC")
  415. self._run(4)
  416. self.assertEqual(self._getSignal("d"), [5.0, 3.0, 3.0, 3.0])
  417. def testDelayBlock2(self):
  418. self.CBD.addBlock(ConstantBlock(block_name="c1", value=1.0))
  419. self.CBD.addBlock(ConstantBlock(block_name="c2", value=5.0))
  420. self.CBD.addBlock(DelayBlock(block_name="d"))
  421. self.CBD.addBlock(AdderBlock(block_name="a"))
  422. self.CBD.addConnection("c2", "a")
  423. self.CBD.addConnection("d", "a")
  424. self.CBD.addConnection("c1", "d", input_port_name="IC")
  425. self.CBD.addConnection("a", "d")
  426. self._run(5)
  427. self.assertEqual(self._getSignal("d"), [1.0, 6.0, 11.0, 16.0, 21.0])
  428. def testAddOneBlock(self):
  429. self.CBD.addBlock(SequenceBlock(block_name="c", sequence=[1, 2, 5, 7, 3]))
  430. self.CBD.addBlock(AddOneBlock(block_name="add1"))
  431. self.CBD.addConnection("c", "add1")
  432. self._run(5)
  433. self.assertEqual(self._getSignal("add1"), [2, 3, 6, 8, 4])
  434. if __name__ == '__main__': # pragma: no cover
  435. # When this module is executed from the command-line, run all its tests
  436. unittest.main(verbosity=2)