models.hpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  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
  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. input_ports({{IN, "in"}});
  49. output_ports({{OUT, "out"}});
  50. }
  51. ~A1() override = default;
  52. void dint(const typename common::DoubleTime::type &t) override {
  53. #ifndef WITH_TRACE
  54. (void)t;
  55. #endif
  56. #ifdef WITH_TRACE
  57. common::Trace<common::DoubleTime>::trace()
  58. << common::TraceElement<common::DoubleTime>(get_name(), t,
  59. common::FormalismType::PDEVS,
  60. common::FunctionType::DELTA_INT,
  61. common::LevelType::USER);
  62. common::Trace<common::DoubleTime>::trace().flush();
  63. #endif
  64. if (_phase == SEND or _phase == INIT) {
  65. _phase = WAIT;
  66. }
  67. }
  68. void
  69. dext(const typename common::DoubleTime::type &t,
  70. const typename common::DoubleTime::type & /* e */,
  71. const common::Bag<common::DoubleTime> &bag) override {
  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::FormalismType::PDEVS,
  80. common::FunctionType::DELTA_EXT,
  81. common::LevelType::USER)
  82. << "messages = " << bag.to_string();
  83. common::Trace<common::DoubleTime>::trace().flush();
  84. #endif
  85. _phase = SEND;
  86. }
  87. void dconf(const typename common::DoubleTime::type &t,
  88. const typename common::DoubleTime::type & /* e */,
  89. const common::Bag<common::DoubleTime> &bag) override {
  90. #ifndef WITH_TRACE
  91. (void)t;
  92. (void)bag;
  93. #endif
  94. #ifdef WITH_TRACE
  95. common::Trace<common::DoubleTime>::trace()
  96. << common::TraceElement<common::DoubleTime>(get_name(), t,
  97. common::FormalismType::PDEVS,
  98. common::FunctionType::DELTA_CONF,
  99. common::LevelType::USER)
  100. << "messages = " << bag.to_string();
  101. common::Trace<common::DoubleTime>::trace().flush();
  102. #endif
  103. }
  104. void start(const typename common::DoubleTime::type &t) override {
  105. #ifndef WITH_TRACE
  106. (void)t;
  107. #endif
  108. #ifdef WITH_TRACE
  109. common::Trace<common::DoubleTime>::trace()
  110. << common::TraceElement<common::DoubleTime>(get_name(), t,
  111. common::FormalismType::PDEVS,
  112. common::FunctionType::START,
  113. common::LevelType::USER);
  114. common::Trace<common::DoubleTime>::trace().flush();
  115. #endif
  116. _phase = INIT;
  117. }
  118. typename common::DoubleTime::type
  119. ta(const typename common::DoubleTime::type &t) const override {
  120. #ifndef WITH_TRACE
  121. (void)t;
  122. #endif
  123. #ifdef WITH_TRACE
  124. common::Trace<common::DoubleTime>::trace()
  125. << common::TraceElement<common::DoubleTime>(get_name(), t,
  126. common::FormalismType::PDEVS,
  127. common::FunctionType::TA,
  128. common::LevelType::USER);
  129. common::Trace<common::DoubleTime>::trace().flush();
  130. #endif
  131. if (_phase == WAIT) {
  132. return 3;
  133. } else {
  134. return 0;
  135. }
  136. }
  137. common::Bag<common::DoubleTime>
  138. lambda(const typename common::DoubleTime::type &t) const override {
  139. #ifndef WITH_TRACE
  140. (void)t;
  141. #endif
  142. common::Bag<common::DoubleTime> bag;
  143. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _value));
  144. #ifdef WITH_TRACE
  145. common::Trace<common::DoubleTime>::trace()
  146. << common::TraceElement<common::DoubleTime>(get_name(), t,
  147. common::FormalismType::PDEVS,
  148. common::FunctionType::LAMBDA,
  149. common::LevelType::USER)
  150. << "messages = " << bag.to_string();
  151. common::Trace<common::DoubleTime>::trace().flush();
  152. #endif
  153. return bag;
  154. }
  155. private:
  156. enum Phase {
  157. INIT, WAIT, SEND
  158. };
  159. Phase _phase;
  160. double _value;
  161. };
  162. class B1 :
  163. public artis::pdevs::Dynamics<common::DoubleTime, B1> {
  164. public:
  165. enum inputs {
  166. IN
  167. };
  168. enum outputs {
  169. OUT
  170. };
  171. B1(const std::string &name,
  172. const artis::pdevs::Context<common::DoubleTime, B1, artis::common::NoParameters> &context)
  173. :
  174. artis::pdevs::Dynamics<common::DoubleTime, B1>(name, context) {
  175. input_ports({{IN, "in"}});
  176. output_ports({{OUT, "out"}});
  177. }
  178. ~B1() override = default;
  179. void dint(const typename common::DoubleTime::type &t) override {
  180. #ifndef WITH_TRACE
  181. (void)t;
  182. #endif
  183. #ifdef WITH_TRACE
  184. common::Trace<common::DoubleTime>::trace()
  185. << common::TraceElement<common::DoubleTime>(get_name(), t,
  186. common::FormalismType::PDEVS,
  187. common::FunctionType::DELTA_INT,
  188. common::LevelType::USER);
  189. common::Trace<common::DoubleTime>::trace().flush();
  190. #endif
  191. if (_phase == SEND or _phase == INIT) {
  192. _phase = WAIT;
  193. }
  194. }
  195. void
  196. dext(const typename common::DoubleTime::type &t,
  197. const typename common::DoubleTime::type &e,
  198. const common::Bag<common::DoubleTime> &bag) override {
  199. #ifdef WITH_TRACE
  200. common::Trace<common::DoubleTime>::trace()
  201. << common::TraceElement<common::DoubleTime>(get_name(), t,
  202. common::FormalismType::PDEVS,
  203. common::FunctionType::DELTA_EXT,
  204. common::LevelType::USER)
  205. << "messages = " << bag.to_string();
  206. common::Trace<common::DoubleTime>::trace().flush();
  207. #endif
  208. std::for_each(bag.begin(), bag.end(),
  209. [this, t, e](
  210. const common::ExternalEvent<common::DoubleTime> & /* event */) {
  211. ++_count;
  212. });
  213. _phase = SEND;
  214. }
  215. void dconf(const typename common::DoubleTime::type &t,
  216. const typename common::DoubleTime::type &e,
  217. const common::Bag<common::DoubleTime> &bag) override {
  218. #ifndef WITH_TRACE
  219. (void)t;
  220. (void)bag;
  221. #endif
  222. #ifdef WITH_TRACE
  223. common::Trace<common::DoubleTime>::trace()
  224. << common::TraceElement<common::DoubleTime>(get_name(), t,
  225. common::FormalismType::PDEVS,
  226. common::FunctionType::DELTA_CONF,
  227. common::LevelType::USER)
  228. << "messages = " << bag.to_string();
  229. common::Trace<common::DoubleTime>::trace().flush();
  230. #endif
  231. dext(t, e, bag);
  232. dint(t);
  233. }
  234. void start(const typename common::DoubleTime::type &t) override {
  235. #ifndef WITH_TRACE
  236. (void)t;
  237. #endif
  238. #ifdef WITH_TRACE
  239. common::Trace<common::DoubleTime>::trace()
  240. << common::TraceElement<common::DoubleTime>(get_name(), t,
  241. common::FormalismType::PDEVS,
  242. common::FunctionType::START,
  243. common::LevelType::USER);
  244. common::Trace<common::DoubleTime>::trace().flush();
  245. #endif
  246. _count = 0;
  247. _phase = INIT;
  248. }
  249. typename common::DoubleTime::type
  250. ta(const typename common::DoubleTime::type &t) const override {
  251. #ifndef WITH_TRACE
  252. (void)t;
  253. #endif
  254. #ifdef WITH_TRACE
  255. common::Trace<common::DoubleTime>::trace()
  256. << common::TraceElement<common::DoubleTime>(get_name(), t,
  257. common::FormalismType::PDEVS,
  258. common::FunctionType::TA,
  259. common::LevelType::USER);
  260. common::Trace<common::DoubleTime>::trace().flush();
  261. #endif
  262. if (_phase == WAIT) {
  263. return std::numeric_limits<double>::max();
  264. } else {
  265. return 0;
  266. }
  267. }
  268. common::Bag<common::DoubleTime>
  269. lambda(const typename common::DoubleTime::type &t) const override {
  270. #ifndef WITH_TRACE
  271. (void)t;
  272. #endif
  273. common::Bag<common::DoubleTime> bag;
  274. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _count));
  275. #ifdef WITH_TRACE
  276. common::Trace<common::DoubleTime>::trace()
  277. << common::TraceElement<common::DoubleTime>(get_name(), t,
  278. common::FormalismType::PDEVS,
  279. common::FunctionType::LAMBDA,
  280. common::LevelType::USER)
  281. << "messages = " << bag.to_string();
  282. common::Trace<common::DoubleTime>::trace().flush();
  283. #endif
  284. return bag;
  285. }
  286. private:
  287. enum Phase {
  288. INIT, WAIT, SEND
  289. };
  290. Phase _phase;
  291. unsigned int _count;
  292. };
  293. class A2
  294. : public artis::dtss::Dynamics<artis::common::DoubleTime,
  295. A2,
  296. artis::dtss::Parameters<common::DoubleTime>> {
  297. public:
  298. enum inputs {
  299. IN
  300. };
  301. enum outputs {
  302. OUT
  303. };
  304. A2(const std::string &name,
  305. const artis::dtss::Context<artis::common::DoubleTime,
  306. A2,
  307. artis::dtss::Parameters<common::DoubleTime>> &context)
  308. :
  309. artis::dtss::Dynamics<artis::common::DoubleTime,
  310. A2,
  311. artis::dtss::Parameters<common::DoubleTime>>(
  312. name, context),
  313. _value(0) {
  314. input_ports({{IN, "in"}});
  315. output_ports({{OUT, "out"}});
  316. }
  317. ~A2() override = default;
  318. void transition(const common::Bag<common::DoubleTime> &x,
  319. const typename common::DoubleTime::type &t) override {
  320. #ifndef WITH_TRACE
  321. (void)x;
  322. (void)t;
  323. #endif
  324. #ifdef WITH_TRACE
  325. common::Trace<common::DoubleTime>::trace()
  326. << common::TraceElement<common::DoubleTime>(get_name(), t,
  327. common::FormalismType::DTSS,
  328. common::FunctionType::TRANSITION,
  329. common::LevelType::USER)
  330. << "x = " << x.to_string();
  331. common::Trace<common::DoubleTime>::trace().flush();
  332. #endif
  333. }
  334. void start(const typename common::DoubleTime::type &t) override {
  335. #ifndef WITH_TRACE
  336. (void)t;
  337. #endif
  338. #ifdef WITH_TRACE
  339. common::Trace<common::DoubleTime>::trace()
  340. << common::TraceElement<common::DoubleTime>(get_name(), t,
  341. common::FormalismType::DTSS,
  342. common::FunctionType::START,
  343. common::LevelType::USER);
  344. common::Trace<common::DoubleTime>::trace().flush();
  345. #endif
  346. }
  347. common::Bag<common::DoubleTime>
  348. lambda(const typename common::DoubleTime::type &t) const override {
  349. #ifndef WITH_TRACE
  350. (void)t;
  351. #endif
  352. common::Bag<common::DoubleTime> bag;
  353. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _value));
  354. #ifdef WITH_TRACE
  355. common::Trace<common::DoubleTime>::trace()
  356. << common::TraceElement<common::DoubleTime>(get_name(), t,
  357. common::FormalismType::DTSS,
  358. common::FunctionType::LAMBDA,
  359. common::LevelType::USER)
  360. << "messages = " << bag.to_string();
  361. common::Trace<common::DoubleTime>::trace().flush();
  362. #endif
  363. return bag;
  364. }
  365. private:
  366. double _value;
  367. };
  368. class B2
  369. : public artis::dtss::Dynamics<artis::common::DoubleTime,
  370. B2,
  371. artis::dtss::Parameters<common::DoubleTime>> {
  372. public:
  373. enum inputs {
  374. IN
  375. };
  376. enum outputs {
  377. OUT
  378. };
  379. B2(const std::string &name,
  380. const artis::dtss::Context<artis::common::DoubleTime,
  381. B2,
  382. artis::dtss::Parameters<common::DoubleTime>> &context)
  383. :
  384. artis::dtss::Dynamics<artis::common::DoubleTime,
  385. B2,
  386. artis::dtss::Parameters<common::DoubleTime>>(
  387. name, context),
  388. _value(0) {
  389. input_ports({{IN, "in"}});
  390. output_ports({{OUT, "out"}});
  391. }
  392. ~B2() override = default;
  393. void transition(const common::Bag<common::DoubleTime> &x,
  394. const typename common::DoubleTime::type &t) override {
  395. #ifndef WITH_TRACE
  396. (void)x;
  397. (void)t;
  398. #endif
  399. #ifdef WITH_TRACE
  400. common::Trace<common::DoubleTime>::trace()
  401. << common::TraceElement<common::DoubleTime>(get_name(), t,
  402. common::FormalismType::DTSS,
  403. common::FunctionType::TRANSITION,
  404. common::LevelType::USER)
  405. << "x = " << x.to_string();
  406. common::Trace<common::DoubleTime>::trace().flush();
  407. #endif
  408. }
  409. void start(const typename common::DoubleTime::type &t) override {
  410. #ifndef WITH_TRACE
  411. (void)t;
  412. #endif
  413. #ifdef WITH_TRACE
  414. common::Trace<common::DoubleTime>::trace()
  415. << common::TraceElement<common::DoubleTime>(
  416. get_name(), t,
  417. common::FormalismType::DTSS,
  418. common::FunctionType::START,
  419. common::LevelType::USER);
  420. common::Trace<common::DoubleTime>::trace().flush();
  421. #endif
  422. }
  423. common::Bag<common::DoubleTime>
  424. lambda(const typename common::DoubleTime::type &t) const override {
  425. #ifndef WITH_TRACE
  426. (void)t;
  427. #endif
  428. common::Bag<common::DoubleTime> bag;
  429. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _value));
  430. #ifdef WITH_TRACE
  431. common::Trace<common::DoubleTime>::trace()
  432. << common::TraceElement<common::DoubleTime>(get_name(), t,
  433. common::FormalismType::DTSS,
  434. common::FunctionType::LAMBDA,
  435. common::LevelType::USER)
  436. << "messages = " << bag.to_string();
  437. common::Trace<common::DoubleTime>::trace().flush();
  438. #endif
  439. return bag;
  440. }
  441. private:
  442. double _value;
  443. };
  444. class Beep :
  445. public artis::pdevs::Dynamics<common::DoubleTime, Beep> {
  446. public:
  447. enum inputs {
  448. IN
  449. };
  450. enum outputs {
  451. OUT
  452. };
  453. Beep(const std::string &name,
  454. const artis::pdevs::Context<common::DoubleTime, Beep, artis::common::NoParameters> &context)
  455. :
  456. artis::pdevs::Dynamics<common::DoubleTime, Beep>(name, context), _value(0) {
  457. input_ports({{IN, "in"}});
  458. output_ports({{OUT, "out"}});
  459. }
  460. ~Beep() override = default;
  461. void dint(const typename common::DoubleTime::type &t) override {
  462. #ifndef WITH_TRACE
  463. (void)t;
  464. #endif
  465. #ifdef WITH_TRACE
  466. common::Trace<common::DoubleTime>::trace()
  467. << common::TraceElement<common::DoubleTime>(get_name(), t,
  468. common::FormalismType::PDEVS,
  469. common::FunctionType::DELTA_INT,
  470. common::LevelType::USER);
  471. common::Trace<common::DoubleTime>::trace().flush();
  472. #endif
  473. if (_phase == SEND or _phase == INIT) {
  474. _phase = WAIT;
  475. }
  476. }
  477. void
  478. dext(const typename common::DoubleTime::type &t,
  479. const typename common::DoubleTime::type & /* e */,
  480. const common::Bag<common::DoubleTime> &bag) override {
  481. #ifndef WITH_TRACE
  482. (void)t;
  483. (void)bag;
  484. #endif
  485. #ifdef WITH_TRACE
  486. common::Trace<common::DoubleTime>::trace()
  487. << common::TraceElement<common::DoubleTime>(get_name(), t,
  488. common::FormalismType::PDEVS,
  489. common::FunctionType::DELTA_EXT,
  490. common::LevelType::USER)
  491. << "messages = " << bag.to_string();
  492. common::Trace<common::DoubleTime>::trace().flush();
  493. #endif
  494. _phase = SEND;
  495. }
  496. void dconf(const typename common::DoubleTime::type &t,
  497. const typename common::DoubleTime::type & /* e */,
  498. const common::Bag<common::DoubleTime> &bag) override {
  499. #ifndef WITH_TRACE
  500. (void)t;
  501. (void)bag;
  502. #endif
  503. #ifdef WITH_TRACE
  504. common::Trace<common::DoubleTime>::trace()
  505. << common::TraceElement<common::DoubleTime>(get_name(), t,
  506. common::FormalismType::PDEVS,
  507. common::FunctionType::DELTA_CONF,
  508. common::LevelType::USER)
  509. << "messages = " << bag.to_string();
  510. common::Trace<common::DoubleTime>::trace().flush();
  511. #endif
  512. }
  513. void start(const typename common::DoubleTime::type &t) override {
  514. #ifndef WITH_TRACE
  515. (void)t;
  516. #endif
  517. #ifdef WITH_TRACE
  518. common::Trace<common::DoubleTime>::trace()
  519. << common::TraceElement<common::DoubleTime>(get_name(), t,
  520. common::FormalismType::PDEVS,
  521. common::FunctionType::START,
  522. common::LevelType::USER);
  523. common::Trace<common::DoubleTime>::trace().flush();
  524. #endif
  525. _phase = INIT;
  526. }
  527. typename common::DoubleTime::type
  528. ta(const typename common::DoubleTime::type &t) const override {
  529. #ifndef WITH_TRACE
  530. (void)t;
  531. #endif
  532. #ifdef WITH_TRACE
  533. common::Trace<common::DoubleTime>::trace()
  534. << common::TraceElement<common::DoubleTime>(get_name(), t,
  535. common::FormalismType::PDEVS,
  536. common::FunctionType::TA,
  537. common::LevelType::USER);
  538. common::Trace<common::DoubleTime>::trace().flush();
  539. #endif
  540. if (_phase == WAIT) {
  541. return (rand() % 100) / 10.;
  542. } else {
  543. return 0;
  544. }
  545. }
  546. common::Bag<common::DoubleTime>
  547. lambda(const typename common::DoubleTime::type &t) const override {
  548. #ifndef WITH_TRACE
  549. (void)t;
  550. #endif
  551. common::Bag<common::DoubleTime> bag;
  552. bag.push_back(artis::common::ExternalEvent<common::DoubleTime>(OUT, _value));
  553. #ifdef WITH_TRACE
  554. common::Trace<common::DoubleTime>::trace()
  555. << common::TraceElement<common::DoubleTime>(get_name(), t,
  556. common::FormalismType::PDEVS,
  557. common::FunctionType::LAMBDA,
  558. common::LevelType::USER)
  559. << "messages = " << bag.to_string();
  560. common::Trace<common::DoubleTime>::trace().flush();
  561. #endif
  562. return bag;
  563. }
  564. private:
  565. enum Phase {
  566. INIT, WAIT, SEND
  567. };
  568. Phase _phase;
  569. double _value;
  570. };
  571. }
  572. }
  573. } // namespace artis tests mixed
  574. #endif