models.hpp 25 KB

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