models.hpp 25 KB

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