1. 04 Apr, 2014 1 commit
  2. 24 Sep, 2012 1 commit
    • Eric Eide's avatar
      Replace license symbols with {{{ }}}-enclosed license blocks. · 6df609a9
      Eric Eide authored
      This commit is intended to makes the license status of Emulab and
      ProtoGENI source files more clear.  It replaces license symbols like
      "EMULAB-COPYRIGHT" and "GENIPUBLIC-COPYRIGHT" with {{{ }}}-delimited
      blocks that contain actual license statements.
      
      This change was driven by the fact that today, most people acquire and
      track Emulab and ProtoGENI sources via git.
      
      Before the Emulab source code was kept in git, the Flux Research Group
      at the University of Utah would roll distributions by making tar
      files.  As part of that process, the Flux Group would replace the
      license symbols in the source files with actual license statements.
      
      When the Flux Group moved to git, people outside of the group started
      to see the source files with the "unexpanded" symbols.  This meant
      that people acquired source files without actual license statements in
      them.  All the relevant files had Utah *copyright* statements in them,
      but without the expanded *license* statements, the licensing status of
      the source files was unclear.
      
      This commit is intended to clear up that confusion.
      
      Most Utah-copyrighted files in the Emulab source tree are distributed
      under the terms of the Affero GNU General Public License, version 3
      (AGPLv3).
      
      Most Utah-copyrighted files related to ProtoGENI are distributed under
      the terms of the GENI Public License, which is a BSD-like open-source
      license.
      
      Some Utah-copyrighted files in the Emulab source tree are distributed
      under the terms of the GNU Lesser General Public License, version 2.1
      (LGPL).
      6df609a9
  3. 10 Nov, 2010 5 commits
    • Robert Ricci's avatar
      Fix up copyright dates · bd6f3dbc
      Robert Ricci authored
      bd6f3dbc
    • Robert Ricci's avatar
      Minor improvements to debugging output · 4ddc7226
      Robert Ricci authored
      4ddc7226
    • Robert Ricci's avatar
      Remove vestiges of SMART_UNMAP compile-time option. · 2175000c
      Robert Ricci authored
      It was a good idea, but we've never used it in production, it hasn't
      compiled in years, and it was just cluttering up the code.
      2175000c
    • Robert Ricci's avatar
      Fix the names of some very badly-name variables · 12b109f8
      Robert Ricci authored
      The 'best' variable didn't really store the best score seen so far,
      so rename it to prev_score. Likewise for the bestviolated variable.
      12b109f8
    • Robert Ricci's avatar
      Re-think no_connect violations · 26e0a6c6
      Robert Ricci authored
      Re-think a very old idea in assign - that no_connect violations for
      unmapped links should not be assessed against links whose endpoints are
      not mapped. The problem with this is that assign is too hesitant to map
      nodes - if there is more than one link that can't be mapped or whose
      other end isn't mapped yet, then assign thinks it's better to leave the
      node unmapped. This leads to confusing solutions (in which nodes remain
      unmapped when really it's the links that are the problem), and I beleive
      it keeps assign from exploring valuable parts of the solution space.
      
      This patch chanes the behavior, so that no_connect violations get scored
      even when the endpoints of the link are not mapped.
      
      Not well enough tested to run in production.
      26e0a6c6
  4. 09 Nov, 2010 2 commits
    • Robert Ricci's avatar
      Fix a bug that's over 10 years old · d7fb737d
      Robert Ricci authored
      I think this must get the award for oldest (frequently excercised) bug
      in the Emulab source. Thanks to the magic of the git pickaxe, I
      discovered that code with this problem was first committed Monday, May
      22, 2000, when it used to be in assign_hw/assign.cc
      
      assign used to use a priority queue to 'randomly' select unassigned
      nodes to try assigning. Turns out this is not very random! A node can
      get unlucky, get a very low random priority assigned to it, and get
      stuck in the queue for a very, very, very long time. As a result, I've
      seen assign try to re-assign the same node several thousand times in a
      row, when there are others waiting to be re-assigned. Of course, this is
      going to result in very poor exploration of the state space.
      
      I changed the unassigned node selection process to use a regular list,
      and select an item from the list at random at the time of item removal.
      This gets a much more even distribution of nodes, at the small cost of
      linear iteration over the list of unassigned nodes.  This should be a
      pretty minor cost, though, as iteration over this list should be cheap
      and the list itself should generally be pretty small.
      
      Also added some debugging statements.
      d7fb737d
    • Robert Ricci's avatar
      Add a bunch of debugging to anneal.cc · c646bd39
      Robert Ricci authored
      Add debugging statements useful in tracking down which vnodes assign attempts
      to assign to which pnodes.
      c646bd39
  5. 20 May, 2009 1 commit
  6. 15 Dec, 2006 1 commit
  7. 28 Nov, 2006 1 commit
  8. 25 Jan, 2006 3 commits
  9. 13 Sep, 2005 1 commit
  10. 17 May, 2005 1 commit
  11. 11 Aug, 2004 1 commit
  12. 08 Jun, 2004 1 commit
  13. 07 Jun, 2004 1 commit
  14. 03 Jun, 2004 1 commit
    • Robert Ricci's avatar
      'port' assign to compile under gcc 3 (specifically tested with 3.3.1). · f05e1008
      Robert Ricci authored
      This mostly required messing with the STL #includes.
      
      Still builds under gcc 2.95, and won't be built with 3.3 by default
      until I've spent more time testing it.
      
      One reason for doing this is that gcc 3.3 seems to generate faster
      code from templated functions. Tests so far show that the
      gcc3-compiled binary shaves 15-30% off of assign's runtime.
      
      The other reason for doing this is forward-looking. When we end up
      getting boss running on FreeBSD 5 or a recent Linux distro, the
      compiler is likely to be from the gcc 3 branch.
      f05e1008
  15. 28 Apr, 2004 3 commits
  16. 27 Apr, 2004 1 commit
    • Robert Ricci's avatar
      Change the termination conditions in subtle, but important, way. When using · c91cc414
      Robert Ricci authored
      epsilon termination (and ALLOW_NEGATIVE_EPSILON), it used to be the case that
      we wrapped the termination condition in a fabs(), and compared that to epsilon.
      The termination condition is basically a measure of how 'stable' of a score
      we're at. What this meant was that we used to keep going until we reached a
      space where the solution was going neither up nor down too much. All this is
      relative to the difference between initial socre and the best score - so, if
      those are close (ie. it's an easy problem), we could end up thrashing a whole
      lot. With the new behavior, if we ever hit a spot in which solutions start
      getting worse, we'll stop.
      
      Also, fix the GNUPLOT_OUTPUT code, which I used to debut this.
      c91cc414
  17. 15 Apr, 2004 1 commit
  18. 09 Mar, 2004 1 commit
  19. 08 Mar, 2004 1 commit
    • Robert Ricci's avatar
      A faily fundamental change in assign - change the criteria we use · 5a72226d
      Robert Ricci authored
      to accept new solutions, so that we don't give violtions any special
      treatment.
      
      This can greatly reduce 'thrasing' at low scores, allowing assign to
      converge on a solution much faster. For example, in the 1000-node
      topology used for the virtualization paper, assign's runtime dropped
      from nearly two hours to just over half an hour, with no degredation
      in scores found.
      
      You can get the old accept behavior by enabling the
      SPECIAL_VIOLATION_TREATMENT #define, which is on right now (hence, we
      are not using this change yet.)
      
      Here are the pertinent comments from the code:
      
      #ifdef SPECIAL_VIOLATION_TREATMENT
               /*
                * In this ifdef, we always accept new solutions that have fewer
                * violations than the old solution, and when we're trying to
                * determine whether or not to accept a new solution with a higher
                * score, we don't take violations into the account.
                *
                * The problem with this shows up at low temperatures. What can often
                * happen is that we accept a solution with worse violations but a
                * better (or similar) score. Then, if we were to try, say the first
                * solution (or a score-equivalent one) again, we'd accept it again.
                *
                * What this leads to is 'thrashing', where we have a whole lot of
                * variation of scores over time, but are not making any real
                * progress. This prevents the cooling schedule from converging for
                * much, much longer than it should really take.
                */
      #else // no SPECIAL_VIOLATION_TREATMENT
               /*
                * In this branch of the ifdef, we give violations no special
                * treatment when it comes to accepting new solution - we just add
                * them into the score. This makes assign behave in a more 'classic'
                * simulated annealing manner.
                *
                * One consequence, though, is that we have to be more careful with
                * scores. We do not want to be able to get into a situation where
                * adding a violation results in a _lower_ score than a solution with
                * fewer violations.
                */
      5a72226d
  20. 28 Jan, 2004 1 commit
  21. 25 Jan, 2004 1 commit
  22. 14 Jan, 2004 1 commit
  23. 12 Jan, 2004 1 commit
    • Robert Ricci's avatar
      Several changes, mostly targeted at jail and simulation-type · 3a345f8e
      Robert Ricci authored
      topologies.
      
      First, added a new 'summary' of the solution, when the '-u' option is
      given. It's a view of things from the physical side - prints out how
      many vnodes were mapped to each pnode, as well as how much bandwidth
      (trivial and non-trivial) was used on each node. For 'normal' nodes,
      we also print out all links used and how much bandwidth was used on
      each of them. For switches, we print only inter-switch links. This is
      amazingly helpful in getting an intuitive feel for how well assign is
      doing.
      
      Added a SIGINFO handler for the impatient (like me) to see things such
      as the current temperature, and current and best scores, while assign
      is running.
      
      Fixed a bug in which emulated links could get over-subscribed, as well
      as a few other misc. bugfixes.
      
      Changed the way assign goes through the list of a node's pclasses in
      random order - there were problems with the old way in which you could
      end up with a situation in which some pnodes were chosen with a much
      higher probability than others. Now, rather than treating the list as
      a ring and starting at a random place, we make a randomly-ordered list
      of the pclasseses, and go through it from start to finish.
      
      Did some work on dynamic pclasses so that we adjust the estimate of
      the neighborhood size to account for disabled pclasses (ie. pnodes
      that have nothing mapped to them yet.)
      
      Changed the way that find_link_to_switch() decides on the best link to
      use - the old method was doing very poorly at bin-packing emulated
      links into plinks. I now use a simple first-fit algorithm. This made a
      pretty big difference. I may try some other fast bin-packing
      approximation algorithm, but my main fear is that all of the good ones
      (such as the 'sort from largest to smallest, then do first-fit'
      algorithm) may require re-mapping other links. This might be slow,
      and/or it might make it difficult, if not impossible, to keep
      add_node() and remove_node() symmetric.
      
      Combinded direct_link() and find_link_to_switch() into
      find_best_link(), since they really do the same thing.
      
      Standardized on std::random() to get random numbers - previosuly, some
      calls were using std::rand().
      
      The big one: I added a find_pnode_connected() function that finds a
      random pnode that one of the vnode's neighbors in the virtual graph is
      assigned to. Then, with a random probability (given with the -c option
      on the command line), we try that function to find a pnode first (if
      it fails, we still call find_pnode() ). Of course, this is only really
      applicable when you have a reasonable degree of vnode-to-pnode
      multiplexing. In the test case I'm using, this managed to get 3x as
      much bandwidth into trivial links as just using find_pnode().
      3a345f8e
  24. 06 Jan, 2004 1 commit
    • Robert Ricci's avatar
      Fix dynamic pclasses, and make them the default for virtual nodes · c7e2d29e
      Robert Ricci authored
      again.
      
      One of the fixes changes the way in which we iterate through pclasses
      in find_pnode(). We used to treat the vector like a ring buffer, and
      start (randomly) someplace in the middle. This turns out to give some
      bad statistical properties when doing dynamic pclasses, since long
      chains of disabled pclasses will cause some pclasses to be selected
      more often. My old hack of just hopping around randomly in the
      disabled-pclass case was bad, because it's hard to tell when you've
      actually tried all the pclasses - so, we were getting false negatives
      where it was looking like there was no place available where we could
      map a vnode, which turned out to have worse effects than I had
      thought.
      
      So, now, we make a list of all the indices and randomize the order,
      then just iterate through that list.
      
      We also now count the number of pclasses that are enabled at every
      temperature step, and adjust the neighborhood size to remove them.
      This makes dynamic pclasses quite a bit faster - it cuts the time
      by 30% - 50% for my test case.
      
      Cleaned up find_pnode() by removing some #ifdef's that we don't use,
      and probably will never want to again - this makes the function almost
      readable!
      c7e2d29e
  25. 18 Dec, 2003 1 commit
    • Robert Ricci's avatar
      Add two new features to assign: · 40ada0ba
      Robert Ricci authored
      In the top file, you can provide a 'node-hint', which is similar to a
      'fix-node' in that it specifies a starting mapping for the virtual
      node. Unlike a fixed node, however, assign is allowed to move hinted
      nodes around all it wants.
      
      Add a '-t' option to assign that allows you to give a starting
      temperature, instead of going through the usual melting process.
      
      Together, these may be helpful with the pre-pass we're planning on
      incorporating into assign. During that pass, assign will be working
      on a coarsened version of the virtual graph, so there may be some
      places where decisions are made poorly due to the reduced information.
      After one run has been done with the coarsened version, we can run
      assign again with the full version of the graph, but with 'node-hints'
      that start virtual nodes where the first run decided. This will allow
      assign to fine-tune the results of the first mapping.
      
      Of course, we don't want this second run to take too long, so we'll
      want to start it with a low initial temperature (so that it basically
      just does hill-climbing), and probably use a fractional '-H' argument
      to prevent it from spending too long on large topologies.
      40ada0ba
  26. 17 Dec, 2003 1 commit
    • Robert Ricci's avatar
      Add the ability to have vritual nodes that consume more than one · 13c6d59f
      Robert Ricci authored
      'slot'. In the top file, you can how give' the virtual node's type as
      type:count - sim:5, for example. If you give no count, it defaults to
      one.
      
      The idea here is to allow a pre-pass to assign to 'coarsen' the
      virtual graph. This pre-pass could, for example, combine several
      virtual or simulated nodes into one so that assign has a simpler
      virtual graph to work with.
      13c6d59f
  27. 22 Oct, 2003 1 commit
    • Robert Ricci's avatar
      A few improvements: · b058ef64
      Robert Ricci authored
      Fix a bug with limited trivial link bandwidth. It used to be the case
      that we penalized solutions that over-used the trivial bandwidth based
      on the number of links that were over it. Turns out this was a
      problem, if you had links of differing bandwidths, and were near the
      limit. Certain orderings were possible where you would remove two
      trivial links in a different order than you added them, which might
      result in more (or fewer) violations being scored then when you did
      them originally. The fix for this is to penalize these based on
      bandwidth, which is what assign now does.
      
      Added a '-g' flag, which does greedy link selection - assign normally
      does random link selection until the very end, when it does one pass
      with greedy selection. This flag makes it do this all the time. This
      is useful for debugging, because it cuts out a call to random(). Turns
      out, it doesn't seem to make assign much slower. I might consider
      making it the default.
      
      Better output when the selftest (-T) fails.
      b058ef64
  28. 10 Oct, 2003 1 commit
  29. 29 Sep, 2003 1 commit
  30. 19 Sep, 2003 1 commit
  31. 15 Sep, 2003 1 commit