Parcourir la source

Add observable declaration

Eric Ramat il y a 6 ans
Parent
commit
466da3533b

+ 3 - 0
src/artis-star/common/Model.hpp

@@ -144,6 +144,9 @@ public:
     virtual bool is_remote() const
     { return false; }
 
+    virtual std::string observable_name(unsigned int observable_index) const
+    { (void)observable_index; assert(false); }
+
     std::string path() const
     { return (_parent != nullptr ? _parent->path() : "") + ":" + get_name(); }
 

+ 1 - 1
src/artis-star/common/observer/View.hpp

@@ -165,7 +165,7 @@ public:
                  const std::string& selector_name, unsigned int variable_index)
     {
         std::string path = (boost::format("%1%:%2%") % model->path() %
-                            variable_index).str() ;
+                            model->observable_name(variable_index)).str() ;
         VariableValues& values = _values[selector_name];
 
         if (values.find(path) == values.end()) {

+ 29 - 0
src/artis-star/kernel/pdevs/Dynamics.hpp

@@ -43,6 +43,14 @@ class Dynamics
     typedef pdevs::Simulator < Time, Dyn, Parameters > Simulator;
 
 public:
+    struct Observable
+    {
+        unsigned int index;
+        std::string name;
+    };
+
+    typedef std::map < unsigned int, std::string > Observables;
+
     Dynamics(const std::string& name,
              const Context < Time, Dyn, Parameters >& context) :
         _name(name), _simulator(context.simulator())
@@ -94,6 +102,26 @@ public:
         }
     }
 
+    void observable(Observable observable)
+    {
+        _observables[observable.index] = observable.name;
+    }
+
+    void observables(std::initializer_list < Observable > list)
+    {
+        for (typename std::initializer_list < Observable >::iterator it =
+                 list.begin(); it != list.end(); ++it) {
+            _observables[it->index] = it->name;
+        }
+    }
+
+    virtual std::string observable_name(unsigned int observable_index) const
+    {
+        assert(_observables.find(observable_index) != _observables.end());
+
+        return _observables.find(observable_index)->second;
+    }
+
     void output_port(common::Port p)
     {
         _simulator->add_out_port(p);
@@ -110,6 +138,7 @@ public:
 private:
     std::string _name;
     Simulator*  _simulator;
+    Observables _observables;
 };
 
 } } // namespace artis pdevs

+ 3 - 0
src/artis-star/kernel/pdevs/Simulator.hpp

@@ -128,6 +128,9 @@ public :
                           unsigned int index) const
     { return _dynamics.observe(t, index); }
 
+    virtual std::string observable_name(unsigned int observable_index) const
+    { return _dynamics.observable_name(observable_index); }
+
 /*************************************************
  * when *-message(t)
  *   if (t = tn) then