srm-adaptive.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:9k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #  Copyright (c) 1997 by the University of Southern California
  2. #  All rights reserved.
  3. #  This program is free software; you can redistribute it and/or
  4. #  modify it under the terms of the GNU General Public License,
  5. #  version 2, as published by the Free Software Foundation.
  6. #
  7. #  This program is distributed in the hope that it will be useful,
  8. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. #  GNU General Public License for more details.
  11. #
  12. #  You should have received a copy of the GNU General Public License along
  13. #  with this program; if not, write to the Free Software Foundation, Inc.,
  14. #  59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  15. #
  16. #  The copyright of this module includes the following
  17. #  linking-with-specific-other-licenses addition:
  18. #
  19. #  In addition, as a special exception, the copyright holders of
  20. #  this module give you permission to combine (via static or
  21. #  dynamic linking) this module with free software programs or
  22. #  libraries that are released under the GNU LGPL and with code
  23. #  included in the standard release of ns-2 under the Apache 2.0
  24. #  license or under otherwise-compatible licenses with advertising
  25. #  requirements (or modified versions of such code, with unchanged
  26. #  license).  You may copy and distribute such a system following the
  27. #  terms of the GNU GPL for this module and the licenses of the
  28. #  other code concerned, provided that you include the source code of
  29. #  that other code when and as the GNU GPL requires distribution of
  30. #  source code.
  31. #
  32. #  Note that people who make modified versions of this module
  33. #  are not obligated to grant this special exception for their
  34. #  modified versions; it is their choice whether to do so.  The GNU
  35. #  General Public License gives permission to release a modified
  36. #  version without this exception; this exception also makes it
  37. #  possible to release a modified version which carries forward this
  38. #  exception.
  39. # Author: Kannan Varadhan <kannan@isi.edu>
  40. # Version Date: Mon Jun 30 15:51:33 PDT 1997
  41. #
  42. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/mcast/srm-adaptive.tcl,v 1.9 2005/09/16 03:05:44 tomh Exp $ (USC/ISI)
  43. #
  44. Agent/SRM/Adaptive set pdistance_ 0.0 ;# bound instance variables
  45. Agent/SRM/Adaptive set requestor_ 0
  46. Agent/SRM/Adaptive set C1_ 2.0
  47. Agent/SRM/Adaptive set MinC1_ 0.5
  48. Agent/SRM/Adaptive set MaxC1_ 2.0
  49. Agent/SRM/Adaptive set C2_ 2.0
  50. Agent/SRM/Adaptive set MinC2_ 1.0
  51. Agent/SRM/Adaptive set MaxC2_ 1.0 ;# G
  52. Agent/SRM/Adaptive set D1_ -1 ;# log10 G
  53. Agent/SRM/Adaptive set MinD1_ 0.5
  54. Agent/SRM/Adaptive set MaxD1_ 0.0 ;# log10 G
  55. Agent/SRM/Adaptive set D2_ -1 ;# log10 G XXX
  56. Agent/SRM/Adaptive set MinD2_ 1.0
  57. Agent/SRM/Adaptive set MaxD2_ 1.0 ;# G
  58. Agent/SRM/Adaptive set requestFunction_ "SRM/request/Adaptive"
  59. Agent/SRM/Adaptive set repairFunction_ "SRM/repair/Adaptive"
  60. Agent/SRM/Adaptive set AveDups_ 1.0
  61. Agent/SRM/Adaptive set AveDelay_ 1.0
  62. Agent/SRM/Adaptive set eps_ 0.10
  63. #Agent/SRM/Adaptive set done_ 0
  64. Agent/SRM/Adaptive instproc init args {
  65.     # XXX These are now done in tcl/lib/ns-packet.tcl
  66. #      if ![$class set done_] {
  67. #   set pm [[Simulator instance] set packetManager_]
  68. #   TclObject set off_asrm_ [$pm allochdr aSRM]
  69. #   $class set done_ 1
  70. #      }
  71.     eval $self next $args
  72.     $self array set closest_ "requestor 0 repairor 0"
  73.     $self set AveDups_ [$class set AveDups_]
  74.     $self set AveDelay_ [$class set AveDelay_]
  75.     foreach i [list MinC1_ MaxC1_ MinC2_ MaxC2_
  76.     MinD1_ MaxD1_ MinD2_ MaxD2_] {
  77. $self instvar $i
  78. set $i [$class set $i]
  79.     }
  80.     $self set eps_ [$class set eps_]
  81. }
  82. Agent/SRM/Adaptive instproc check-bounds args {
  83.     set G [$self set groupSize_]
  84.     $self set MaxC2_ $G
  85.     $self set MaxD1_ [expr log10($G)]
  86.     $self set MaxD2_ $G
  87.     if {[llength $args] <= 0} {
  88. set args "C1_ C2_ D1_ D2_"
  89.     }
  90.     foreach i $args {
  91. $self instvar $i
  92. set val [$self set $i]       ;# We do this for notational convenience
  93. set min [$self set Min$i]
  94. set max [$self set Max$i]
  95. if { $val < $min } {
  96.     set $i $min
  97. } elseif { $val > $max } {
  98.     set $i $max
  99. }
  100.     }
  101. }
  102. Agent/SRM/Adaptive instproc recompute-request-params {} {
  103.     $self instvar closest_ C1_ C2_ stats_ AveDups_ AveDelay_ eps_
  104.     if {$stats_(ave-req-delay) < 0} {
  105. # This is the very first loss this agent is seeing.
  106. $self check-bounds C1_ C2_ ;# adjust bounds to estimated size of G
  107. return
  108.     }
  109.     $self compute-ave dup-req
  110.     if $closest_(requestor) {
  111. set C2_ [expr $C2_ - 0.1]
  112. set closest_(requestor) 0
  113.     } elseif {$stats_(ave-dup-req) >= $AveDups_} {
  114. set C1_ [expr $C1_ + 0.1]
  115. set C2_ [expr $C2_ + 0.5]
  116.     } elseif {$stats_(ave-dup-req) < [expr $AveDups_ - $eps_]} {
  117. if {$stats_(ave-req-delay) > $AveDelay_} {
  118.     set C2_ [expr $C2_ - 0.1]
  119. }
  120. if {$stats_(ave-dup-req) < 0.25} {
  121.             set C1_ [expr $C1_ - 0.05]
  122. }
  123.     } else {
  124. set C1_ [expr $C1_ + 0.05]
  125.     }
  126.     $self check-bounds C1_ C2_
  127. }
  128. Agent/SRM/Adaptive instproc sending-request {} {
  129.     $self set C1_ [expr [$self set C1_] - 0.1]  ;# XXX SF's code uses other
  130.                                                  # value, 0.05.  Why?
  131.     $self set closest_(requestor) 1
  132.     $self check-bounds C1_
  133. }
  134. Agent/SRM/Adaptive instproc recv-request {r d s m} {
  135.     $self instvar pending_ closest_
  136.     if { [info exists pending_($s:$m)]  && $d == 1 } {
  137. # Should we not set closeness, even if we get a late round message?
  138. set closeness [$pending_($s:$m) closest-requestor?]
  139. if {$closeness >= 0} {
  140.     set closest_(requestor) $closeness
  141. }
  142.     }
  143.     $self next $r $d $s $m
  144. }
  145. Agent/SRM/Adaptive instproc recompute-repair-params {} {
  146.     $self instvar closest_ D1_ D2_ stats_ AveDups_ AveDelay_ eps_
  147.     if {$stats_(ave-rep-delay) < 0} {
  148. # This is the very first repair this agent is doing.
  149. # if {$D1_ != -1 || $D2_ != -1} {
  150. #     error "invalid repair parameters <$D1_, $D2_>"
  151. # }
  152.         set logG [expr log10([$self set groupSize_])]
  153. set D1_  $logG
  154. set D2_  $logG
  155. $self check-bounds D1_ D2_ ;# adjust bounds to estimated size of G
  156. return
  157.     }
  158.     $self compute-ave dup-rep
  159.     if $closest_(repairor) {
  160.         set D2_ [expr $D2_ - 0.1]
  161. set closest_(repairor) 0
  162.     } elseif {$stats_(ave-dup-rep) >= $AveDups_} {
  163.         set D1_ [expr $D1_ + 0.1]
  164.         set D2_ [expr $D2_ + 0.5]
  165.     } elseif {$stats_(ave-dup-rep) < [expr $AveDups_ - $eps_]} {
  166.         if {$stats_(ave-rep-delay) > $AveDelay_} {
  167.             set D2_ [expr $D2_ - 0.1]
  168. }
  169. if {$stats_(ave-dup-rep) < 0.25} {
  170.             set D1_ [expr $D1_ - 0.05]
  171. }
  172.     } else {
  173.         set D1_ [expr $D1_ + 0.05]
  174.     }
  175.     $self check-bounds D1_ D2_
  176. }
  177. Agent/SRM/Adaptive instproc sending-repair {} {
  178.     $self set D1_ [expr [$self set D1_] - 0.1]  ;# XXX SF's code uses other
  179.                                                  # value, D1 -= 0.05.  Why?
  180.     $self set closest_(repairor) 1
  181.     $self check-bounds D1_
  182. }
  183. Agent/SRM/Adaptive instproc recv-repair {d s m} {
  184.     $self instvar pending_ closest_
  185.     if { [info exists pending_($s:$m)] && $d == 1 } {
  186. # Should we not set closeness, even if we get a late round message?
  187. set closeness [$pending_($s:$m) closest-repairor?]
  188. if {$closeness >= 0} {
  189.     set closest_(repairor) $closeness
  190. }
  191.     }
  192.     $self next $d $s $m
  193. }
  194. Class SRM/request/Adaptive -superclass SRM/request
  195. SRM/request/Adaptive instproc set-params args {
  196.     $self instvar agent_
  197.     $agent_ recompute-request-params
  198.     eval $self next $args
  199. }
  200. SRM/request/Adaptive instproc backoff? {} {
  201.     $self instvar backoff_ backoffCtr_ backoffLimit_
  202.     set retval $backoff_
  203.     if {[incr backoffCtr_] <= $backoffLimit_} {
  204. set backoff_ [expr $backoff_ * 3]
  205.     }
  206.     set retval
  207. }
  208. SRM/request/Adaptive instproc schedule {} {
  209.     $self next
  210. }
  211. SRM/request/Adaptive instproc send-request {} {
  212.     $self instvar agent_ round_
  213.     if { $round_ == 1 } {
  214. $agent_ sending-request
  215.     }
  216.     $self next
  217. }
  218. SRM/request/Adaptive instproc closest-requestor? {} {
  219.     $self instvar agent_ sender_ sent_ round_
  220.     if {$sent_ == 1 && $round_ == 1} { ;# since repairs aren't rescheduled.
  221.         if {[$agent_ set pdistance_] >
  222. [expr 1.5 * [$self distance? $sender_]]} {
  223.             return 1
  224.         } else {
  225.             return 0
  226.         }
  227.     } else {
  228.         return -1
  229.     }
  230. }
  231. SRM/request/Adaptive instproc closest-repairor? {} {
  232.     return -1
  233. }
  234. Class SRM/repair/Adaptive -superclass SRM/repair
  235. SRM/repair/Adaptive instproc set-params args {
  236.     $self instvar agent_
  237.     $agent_ recompute-repair-params
  238.     eval $self next $args
  239. }
  240. SRM/repair/Adaptive instproc schedule {} {
  241.     $self next
  242. }
  243. SRM/repair/Adaptive instproc send-repair {} {
  244.     $self instvar round_ agent_
  245.     if { $round_ == 1 } {
  246.         $agent_ sending-repair
  247.     }
  248.     $self next
  249. }
  250. SRM/repair/Adaptive instproc closest-requestor? {} {
  251.     return -1
  252. }
  253. SRM/repair/Adaptive instproc closest-repairor? {} {
  254.     $self instvar agent_ requestor_ sent_ round_
  255.     if {$sent_ == 1 && $round_ == 1} {
  256.         if {[$agent_ set pdistance_] >
  257. [expr 1.5 * [$self distance? $requestor_]]} {
  258.             return 1
  259.         } else {
  260.             return 0
  261.         }
  262.     } else {
  263.         return -1
  264.     }
  265. }