models.hpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. /**
  2. * @file tests/mixed/models.hpp
  3. * @author The ARTIS Development Team
  4. * See the AUTHORS or Authors.txt file
  5. */
  6. /*
  7. * ARTIS - the multimodeling and simulation environment
  8. * This file is a part of the ARTIS environment
  9. *
  10. * Copyright (C) 2013-2019 ULCO http://www.univ-littoral.fr
  11. *
  12. * This program is free software: you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License as published by
  14. * the Free Software Foundation, either version 3 of the License, or
  15. * (at your option) any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  24. */
  25. #ifndef TESTS_MIXED_MODELS_HPP
  26. #define TESTS_MIXED_MODELS_HPP 1
  27. #include <artis-star/common/time/DoubleTime.hpp>
  28. #include <artis-star/common/utils/Trace.hpp>
  29. #include <artis-star/kernel/dtss/Coordinator.hpp>
  30. #include <artis-star/kernel/dtss/Dynamics.hpp>
  31. #include <artis-star/kernel/pdevs/Dynamics.hpp>
  32. namespace artis {
  33. namespace tests {
  34. namespace mixed {
  35. class A1 :
  36. public artis::pdevs::Dynamics<common::DoubleTime, A1> {
  37. public:
  38. enum inputs {
  39. IN
  40. };
  41. enum outputs {
  42. OUT
  43. };
  44. A1(const std::string& name,
  45. const artis::pdevs::Context<common::DoubleTime, A1, artis::common::NoParameters>& context)
  46. :
  47. artis::pdevs::Dynamics<common::DoubleTime, A1>(name, context), _value(0)
  48. {
  49. input_ports({{IN, "in"}});
  50. output_ports({{OUT, "out"}});
  51. }
  52. ~A1() override = default;
  53. void dint(typename common::DoubleTime::type t) override
  54. {
  55. #ifndef WITH_TRACE
  56. (void)t;
  57. #endif
  58. #ifdef WITH_TRACE
  59. common::Trace<common::DoubleTime>::trace()
  60. << common::TraceElement<common::DoubleTime>(get_name(), t,
  61. common::DELTA_INT);
  62. common::Trace<common::DoubleTime>::trace().flush();
  63. #endif
  64. if (_phase == SEND) {
  65. _phase = WAIT;
  66. }
  67. }
  68. void
  69. dext(typename common::DoubleTime::type t, typename common::DoubleTime::type /* e */,
  70. const common::Bag<common::DoubleTime>& bag) override
  71. {
  72. #ifndef WITH_TRACE
  73. (void)t;
  74. (void)bag;
  75. #endif
  76. #ifdef WITH_TRACE
  77. common::Trace<common::DoubleTime>::trace()
  78. << common::TraceElement<common::DoubleTime>(get_name(), t,
  79. common::DELTA_EXT)
  80. << "messages = " << bag.to_string();
  81. common::Trace<common::DoubleTime>::trace().flush();
  82. #endif
  83. _phase = SEND;
  84. }
  85. void dconf(typename common::DoubleTime::type t,
  86. typename common::DoubleTime::type /* e */,
  87. const common::Bag<common::DoubleTime>& bag) override
  88. {
  89. #ifndef WITH_TRACE
  90. (void)t;
  91. (void)bag;
  92. #endif
  93. #ifdef WITH_TRACE
  94. common::Trace<common::DoubleTime>::trace()
  95. << common::TraceElement<common::DoubleTime>(get_name(), t,
  96. common::DELTA_CONF)
  97. << "messages = " << bag.to_string();
  98. common::Trace<common::DoubleTime>::trace().flush();
  99. #endif
  100. }
  101. typename common::DoubleTime::type
  102. start(typename common::DoubleTime::type t) override
  103. {
  104. #ifndef WITH_TRACE
  105. (void)t;
  106. #endif
  107. #ifdef WITH_TRACE
  108. common::Trace<common::DoubleTime>::trace()
  109. << common::TraceElement<common::DoubleTime>(get_name(), t,
  110. common::START);
  111. common::Trace<common::DoubleTime>::trace().flush();
  112. #endif
  113. _phase = WAIT;
  114. return 0;
  115. }
  116. typename common::DoubleTime::type
  117. ta(typename common::DoubleTime::type t) const override
  118. {
  119. #ifndef WITH_TRACE
  120. (void)t;
  121. #endif
  122. #ifdef WITH_TRACE
  123. common::Trace<common::DoubleTime>::trace()
  124. << common::TraceElement<common::DoubleTime>(get_name(), t, common::TA);
  125. common::Trace<common::DoubleTime>::trace().flush();
  126. #endif
  127. if (_phase == WAIT) {
  128. return 3;
  129. } else {
  130. return 0;
  131. }
  132. }
  133. common::Bag<common::DoubleTime>
  134. lambda(typename common::DoubleTime::type t) const override
  135. {
  136. #ifndef WITH_TRACE
  137. (void)t;
  138. #endif
  139. common::Bag<common::DoubleTime> bag;
  140. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _value));
  141. #ifdef WITH_TRACE
  142. common::Trace<common::DoubleTime>::trace()
  143. << common::TraceElement<common::DoubleTime>(get_name(), t,
  144. common::LAMBDA)
  145. << "messages = " << bag.to_string();
  146. common::Trace<common::DoubleTime>::trace().flush();
  147. #endif
  148. return bag;
  149. }
  150. private:
  151. enum Phase {
  152. WAIT, SEND
  153. };
  154. Phase _phase;
  155. double _value;
  156. };
  157. class B1 :
  158. public artis::pdevs::Dynamics<common::DoubleTime, B1> {
  159. public:
  160. enum inputs {
  161. IN
  162. };
  163. enum outputs {
  164. OUT
  165. };
  166. B1(const std::string& name,
  167. const artis::pdevs::Context<common::DoubleTime, B1, artis::common::NoParameters>& context)
  168. :
  169. artis::pdevs::Dynamics<common::DoubleTime, B1>(name, context)
  170. {
  171. input_ports({{IN, "in"}});
  172. output_ports({{OUT, "out"}});
  173. }
  174. ~B1() override = default;
  175. void dint(typename common::DoubleTime::type t) override
  176. {
  177. #ifndef WITH_TRACE
  178. (void)t;
  179. #endif
  180. #ifdef WITH_TRACE
  181. common::Trace<common::DoubleTime>::trace()
  182. << common::TraceElement<common::DoubleTime>(get_name(), t,
  183. common::DELTA_INT);
  184. common::Trace<common::DoubleTime>::trace().flush();
  185. #endif
  186. if (_phase == SEND) {
  187. _phase = WAIT;
  188. }
  189. }
  190. void
  191. dext(typename common::DoubleTime::type t, typename common::DoubleTime::type e,
  192. const common::Bag<common::DoubleTime>& bag) override
  193. {
  194. #ifdef WITH_TRACE
  195. common::Trace<common::DoubleTime>::trace()
  196. << common::TraceElement<common::DoubleTime>(get_name(), t,
  197. common::DELTA_EXT)
  198. << "messages = " << bag.to_string();
  199. common::Trace<common::DoubleTime>::trace().flush();
  200. #endif
  201. std::for_each(bag.begin(), bag.end(),
  202. [this, t, e](const common::ExternalEvent<common::DoubleTime>& /* event */) {
  203. ++_count;
  204. });
  205. _phase = SEND;
  206. }
  207. void dconf(typename common::DoubleTime::type t,
  208. typename common::DoubleTime::type e,
  209. const common::Bag<common::DoubleTime>& bag) override
  210. {
  211. #ifndef WITH_TRACE
  212. (void)t;
  213. (void)bag;
  214. #endif
  215. #ifdef WITH_TRACE
  216. common::Trace<common::DoubleTime>::trace()
  217. << common::TraceElement<common::DoubleTime>(get_name(), t,
  218. common::DELTA_CONF)
  219. << "messages = " << bag.to_string();
  220. common::Trace<common::DoubleTime>::trace().flush();
  221. #endif
  222. dext(t, e, bag);
  223. dint(t);
  224. }
  225. typename common::DoubleTime::type
  226. start(typename common::DoubleTime::type t) override
  227. {
  228. #ifndef WITH_TRACE
  229. (void)t;
  230. #endif
  231. #ifdef WITH_TRACE
  232. common::Trace<common::DoubleTime>::trace()
  233. << common::TraceElement<common::DoubleTime>(get_name(), t,
  234. common::START);
  235. common::Trace<common::DoubleTime>::trace().flush();
  236. #endif
  237. _count = 0;
  238. _phase = WAIT;
  239. return 0; // std::numeric_limits<double>::max();
  240. }
  241. typename common::DoubleTime::type
  242. ta(typename common::DoubleTime::type t) const override
  243. {
  244. #ifndef WITH_TRACE
  245. (void)t;
  246. #endif
  247. #ifdef WITH_TRACE
  248. common::Trace<common::DoubleTime>::trace()
  249. << common::TraceElement<common::DoubleTime>(get_name(), t, common::TA);
  250. common::Trace<common::DoubleTime>::trace().flush();
  251. #endif
  252. if (_phase == WAIT) {
  253. return std::numeric_limits<double>::max();
  254. } else {
  255. return 0;
  256. }
  257. }
  258. common::Bag<common::DoubleTime>
  259. lambda(typename common::DoubleTime::type t) const override
  260. {
  261. #ifndef WITH_TRACE
  262. (void)t;
  263. #endif
  264. common::Bag<common::DoubleTime> bag;
  265. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _count));
  266. #ifdef WITH_TRACE
  267. common::Trace<common::DoubleTime>::trace()
  268. << common::TraceElement<common::DoubleTime>(get_name(), t,
  269. common::LAMBDA)
  270. << "messages = " << bag.to_string();
  271. common::Trace<common::DoubleTime>::trace().flush();
  272. #endif
  273. return bag;
  274. }
  275. private:
  276. enum Phase {
  277. WAIT, SEND
  278. };
  279. Phase _phase;
  280. unsigned int _count;
  281. };
  282. class A2
  283. : public artis::dtss::Dynamics<artis::common::DoubleTime, A2, artis::dtss::Parameters<common::DoubleTime>> {
  284. public:
  285. enum inputs {
  286. IN
  287. };
  288. enum outputs {
  289. OUT
  290. };
  291. A2(const std::string& name,
  292. const artis::dtss::Context<artis::common::DoubleTime, A2, artis::dtss::Parameters<common::DoubleTime>>& context)
  293. :
  294. artis::dtss::Dynamics<artis::common::DoubleTime, A2, artis::dtss::Parameters<common::DoubleTime>>(
  295. name, context),
  296. _value(0)
  297. {
  298. input_ports({{IN, "in"}});
  299. output_ports({{OUT, "out"}});
  300. }
  301. ~A2() override = default;
  302. void transition(const common::Bag<common::DoubleTime>& x,
  303. typename common::DoubleTime::type t) override
  304. {
  305. #ifndef WITH_TRACE
  306. (void)x;
  307. (void)t;
  308. #endif
  309. #ifdef WITH_TRACE
  310. common::Trace<common::DoubleTime>::trace()
  311. << common::TraceElement<common::DoubleTime>(get_name(), t,
  312. common::DELTA_INT)
  313. << "x = " << x.to_string();
  314. common::Trace<common::DoubleTime>::trace().flush();
  315. #endif
  316. }
  317. typename common::DoubleTime::type
  318. start(typename common::DoubleTime::type t) override
  319. {
  320. #ifndef WITH_TRACE
  321. (void)t;
  322. #endif
  323. #ifdef WITH_TRACE
  324. common::Trace<common::DoubleTime>::trace()
  325. << common::TraceElement<common::DoubleTime>(get_name(), t,
  326. common::START);
  327. common::Trace<common::DoubleTime>::trace().flush();
  328. #endif
  329. return 0;
  330. }
  331. common::Bag<common::DoubleTime>
  332. lambda(typename common::DoubleTime::type t) const override
  333. {
  334. #ifndef WITH_TRACE
  335. (void)t;
  336. #endif
  337. common::Bag<common::DoubleTime> bag;
  338. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _value));
  339. #ifdef WITH_TRACE
  340. common::Trace<common::DoubleTime>::trace()
  341. << common::TraceElement<common::DoubleTime>(get_name(), t,
  342. common::LAMBDA)
  343. << "messages = " << bag.to_string();
  344. common::Trace<common::DoubleTime>::trace().flush();
  345. #endif
  346. return bag;
  347. }
  348. private:
  349. double _value;
  350. };
  351. class B2
  352. : public artis::dtss::Dynamics<artis::common::DoubleTime, B2, artis::dtss::Parameters<common::DoubleTime>> {
  353. public:
  354. enum inputs {
  355. IN
  356. };
  357. enum outputs {
  358. OUT
  359. };
  360. B2(const std::string& name,
  361. const artis::dtss::Context<artis::common::DoubleTime, B2, artis::dtss::Parameters<common::DoubleTime>>& context)
  362. :
  363. artis::dtss::Dynamics<artis::common::DoubleTime, B2, artis::dtss::Parameters<common::DoubleTime>>(
  364. name, context),
  365. _value(0)
  366. {
  367. input_ports({{IN, "in"}});
  368. output_ports({{OUT, "out"}});
  369. }
  370. ~B2() override = default;
  371. void transition(const common::Bag<common::DoubleTime>& x,
  372. typename common::DoubleTime::type t) override
  373. {
  374. #ifndef WITH_TRACE
  375. (void)x;
  376. (void)t;
  377. #endif
  378. #ifdef WITH_TRACE
  379. common::Trace<common::DoubleTime>::trace()
  380. << common::TraceElement<common::DoubleTime>(get_name(), t,
  381. common::DELTA_INT)
  382. << "x = " << x.to_string();
  383. common::Trace<common::DoubleTime>::trace().flush();
  384. #endif
  385. }
  386. typename common::DoubleTime::type
  387. start(typename common::DoubleTime::type t) override
  388. {
  389. #ifndef WITH_TRACE
  390. (void)t;
  391. #endif
  392. #ifdef WITH_TRACE
  393. common::Trace<common::DoubleTime>::trace()
  394. << common::TraceElement<common::DoubleTime>(
  395. get_name(), t, common::START);
  396. common::Trace<common::DoubleTime>::trace().flush();
  397. #endif
  398. return 0;
  399. }
  400. common::Bag<common::DoubleTime>
  401. lambda(typename common::DoubleTime::type t) const override
  402. {
  403. #ifndef WITH_TRACE
  404. (void)t;
  405. #endif
  406. common::Bag<common::DoubleTime> bag;
  407. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _value));
  408. #ifdef WITH_TRACE
  409. common::Trace<common::DoubleTime>::trace()
  410. << common::TraceElement<common::DoubleTime>(get_name(), t,
  411. common::LAMBDA)
  412. << "messages = " << bag.to_string();
  413. common::Trace<common::DoubleTime>::trace().flush();
  414. #endif
  415. return bag;
  416. }
  417. private:
  418. double _value;
  419. };
  420. class Beep :
  421. public artis::pdevs::Dynamics<common::DoubleTime, Beep> {
  422. public:
  423. enum inputs {
  424. IN
  425. };
  426. enum outputs {
  427. OUT
  428. };
  429. Beep(const std::string& name,
  430. const artis::pdevs::Context<common::DoubleTime, Beep, artis::common::NoParameters>& context)
  431. :
  432. artis::pdevs::Dynamics<common::DoubleTime, Beep>(name, context), _value(0)
  433. {
  434. input_ports({{IN, "in"}});
  435. output_ports({{OUT, "out"}});
  436. }
  437. ~Beep() override = default;
  438. void dint(typename common::DoubleTime::type t) override
  439. {
  440. #ifndef WITH_TRACE
  441. (void)t;
  442. #endif
  443. #ifdef WITH_TRACE
  444. common::Trace<common::DoubleTime>::trace()
  445. << common::TraceElement<common::DoubleTime>(get_name(), t,
  446. common::DELTA_INT);
  447. common::Trace<common::DoubleTime>::trace().flush();
  448. #endif
  449. if (_phase == SEND) {
  450. _phase = WAIT;
  451. }
  452. }
  453. void
  454. dext(typename common::DoubleTime::type t, typename common::DoubleTime::type /* e */,
  455. const common::Bag<common::DoubleTime>& bag) override
  456. {
  457. #ifndef WITH_TRACE
  458. (void)t;
  459. (void)bag;
  460. #endif
  461. #ifdef WITH_TRACE
  462. common::Trace<common::DoubleTime>::trace()
  463. << common::TraceElement<common::DoubleTime>(get_name(), t,
  464. common::DELTA_EXT)
  465. << "messages = " << bag.to_string();
  466. common::Trace<common::DoubleTime>::trace().flush();
  467. #endif
  468. _phase = SEND;
  469. }
  470. void dconf(typename common::DoubleTime::type t,
  471. typename common::DoubleTime::type /* e */,
  472. const common::Bag<common::DoubleTime>& bag) override
  473. {
  474. #ifndef WITH_TRACE
  475. (void)t;
  476. (void)bag;
  477. #endif
  478. #ifdef WITH_TRACE
  479. common::Trace<common::DoubleTime>::trace()
  480. << common::TraceElement<common::DoubleTime>(get_name(), t,
  481. common::DELTA_CONF)
  482. << "messages = " << bag.to_string();
  483. common::Trace<common::DoubleTime>::trace().flush();
  484. #endif
  485. }
  486. typename common::DoubleTime::type
  487. start(typename common::DoubleTime::type t) override
  488. {
  489. #ifndef WITH_TRACE
  490. (void)t;
  491. #endif
  492. #ifdef WITH_TRACE
  493. common::Trace<common::DoubleTime>::trace()
  494. << common::TraceElement<common::DoubleTime>(get_name(), t,
  495. common::START);
  496. common::Trace<common::DoubleTime>::trace().flush();
  497. #endif
  498. _phase = WAIT;
  499. return 0;
  500. }
  501. typename common::DoubleTime::type
  502. ta(typename common::DoubleTime::type t) const override
  503. {
  504. #ifndef WITH_TRACE
  505. (void)t;
  506. #endif
  507. #ifdef WITH_TRACE
  508. common::Trace<common::DoubleTime>::trace()
  509. << common::TraceElement<common::DoubleTime>(get_name(), t, common::TA);
  510. common::Trace<common::DoubleTime>::trace().flush();
  511. #endif
  512. if (_phase == WAIT) {
  513. return (rand() % 100) / 10.;
  514. } else {
  515. return 0;
  516. }
  517. }
  518. common::Bag<common::DoubleTime>
  519. lambda(typename common::DoubleTime::type t) const override
  520. {
  521. #ifndef WITH_TRACE
  522. (void)t;
  523. #endif
  524. common::Bag<common::DoubleTime> bag;
  525. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _value));
  526. #ifdef WITH_TRACE
  527. common::Trace<common::DoubleTime>::trace()
  528. << common::TraceElement<common::DoubleTime>(get_name(), t,
  529. common::LAMBDA)
  530. << "messages = " << bag.to_string();
  531. common::Trace<common::DoubleTime>::trace().flush();
  532. #endif
  533. return bag;
  534. }
  535. private:
  536. enum Phase {
  537. WAIT, SEND
  538. };
  539. Phase _phase;
  540. double _value;
  541. };
  542. }
  543. }
  544. } // namespace artis tests mixed
  545. #endif