servlib/prophet/Stats.h
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlib/prophet/Stats.h	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,117 @@
+/*
+ *    Copyright 2007 Baylor University
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#ifndef _PROPHET_STATS_H_
+#define _PROPHET_STATS_H_
+
+#include <map>
+#include "Bundle.h"
+
+namespace prophet
+{
+
+/**
+ * Statistics to gather per Bundle as described in 
+ * section 3.7 regarding Queuing Policies
+ */
+struct StatsEntry
+{
+    StatsEntry()
+        : p_max_(0.0), mopr_(0.0), lmopr_(0.0) {}
+
+    double p_max_;
+    double mopr_;
+    double lmopr_;
+}; // StatsEntry
+
+/**
+ * Container for Bundle statistics, indexed by Bundle identifier.
+ * Not thread-safe, requires external locking mechanism.
+ */
+class Stats
+{
+public:
+    /**
+     * Default constructor
+     */
+    Stats()
+        : dropped_(0) {}
+
+    /**
+     * Destructor
+     */
+    ~Stats();
+
+    /**
+     * Given a Bundle and a predictability value, update
+     * the stats kept for that Bundle
+     */
+    void update_stats(const Bundle* b, double p);
+
+    /**
+     * Given a Bundle, return the max predictability for
+     * any route over which this Bundle has been forwarded
+     */
+    double get_p_max(const Bundle* b) const;
+
+    /**
+     * Given a Bundle, return the predictability favor for
+     * the routes over which this Bundle has been forwarded,
+     * according to Eq. 7, Section 3.7
+     */
+    double get_mopr(const Bundle* b) const;
+
+    /**
+     * Given a Bundle, return the linear predictability favor
+     * for the routes over which this Bundle has been forwarded,
+     * according to Eq. 8, Section 3.7
+     */ 
+    double get_lmopr(const Bundle* b) const;
+
+    /**
+     * Bundle is no longer with us, so get rid of its stats
+     */
+    void drop_bundle(const Bundle* b);
+
+    /**
+     * Return count of how many Bundle stats have been dropped
+     * so far
+     */
+    u_int dropped() const { return dropped_; }
+
+    /**
+     * Return count of Bundles currently rep'd in Stats
+     */
+    size_t size() const { return pstats_.size(); }
+
+protected:
+    typedef std::map<u_int32_t,StatsEntry*> pstats;
+    typedef std::map<u_int32_t,StatsEntry*>::iterator iterator;
+    typedef std::map<u_int32_t,StatsEntry*>::const_iterator
+        const_iterator;
+
+    /**
+     * Convenience function for finding the StatEntry per bundle id
+     */
+    StatsEntry* find(const Bundle* b);
+
+    u_int  dropped_;
+    mutable pstats pstats_;
+}; // Stats
+
+}; // namespace prophet
+
+#endif // _PROPHET_STATS_H_