models.hpp 25 KB

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