|
| 1 | +""" |
| 2 | +Runs the automatic placement code (simulated annealing of glass) |
| 3 | +for a given meeting number, using a schedule given by the schedule database ID. |
| 4 | +
|
| 5 | +for help on this file: |
| 6 | +https://docs.djangoproject.com/en/dev/howto/custom-management-commands/ |
| 7 | +
|
| 8 | +""" |
| 9 | + |
| 10 | +from django.core.management.base import BaseCommand, CommandError |
| 11 | +from optparse import make_option |
| 12 | +#import cProfile, pstats, io |
| 13 | +import os |
| 14 | +import sys |
| 15 | +import gzip |
| 16 | +import time |
| 17 | +import csv |
| 18 | +import codecs |
| 19 | +from ietf.meeting.models import Schedule, Meeting |
| 20 | + |
| 21 | +class Command(BaseCommand): |
| 22 | + args = '<meeting> <schedulename>' |
| 23 | + help = 'perform automatic placement' |
| 24 | + stderr = sys.stderr |
| 25 | + stdout = sys.stdout |
| 26 | + |
| 27 | + verbose = False |
| 28 | + profile = False |
| 29 | + permit_movement = False |
| 30 | + maxstep = 20000 |
| 31 | + seed = None |
| 32 | + recordsteps = False |
| 33 | + |
| 34 | + option_list = BaseCommand.option_list + ( |
| 35 | + make_option('--profile', |
| 36 | + action='store_true', |
| 37 | + dest='profile', |
| 38 | + default=False, |
| 39 | + help='Enable verbose mode'), |
| 40 | + make_option('--recordsteps', |
| 41 | + action='store_true', |
| 42 | + dest='recordsteps', |
| 43 | + default=False, |
| 44 | + help='Enable recording progress to table'), |
| 45 | + make_option('--verbose', |
| 46 | + action='count', |
| 47 | + dest='verbose', |
| 48 | + default=False, |
| 49 | + help='Enable verbose mode'), |
| 50 | + make_option('--maxstep', |
| 51 | + action="store", type="int", |
| 52 | + dest='maxstep', |
| 53 | + default=20000, |
| 54 | + help='Maximum number of steps'), |
| 55 | + make_option('--seed', |
| 56 | + action="store", type="int", |
| 57 | + dest='seed', |
| 58 | + default=None, |
| 59 | + help='Seed to use for calculation'), |
| 60 | + ) |
| 61 | + |
| 62 | + def handle(self, *labels, **options): |
| 63 | + self.verbose = options.get('verbose', 1) |
| 64 | + |
| 65 | + meetingname = labels[0] |
| 66 | + schedname = labels[1] |
| 67 | + targetname = None |
| 68 | + if labels[2] is not None: |
| 69 | + targetname = labels[2] |
| 70 | + |
| 71 | + seed = options.get('seed', None) |
| 72 | + maxstep = options.get('maxstep', 20000) |
| 73 | + verbose = options.get('verbose', False) |
| 74 | + profile = options.get('profile', False) |
| 75 | + recordsteps = options.get('recordsteps', False) |
| 76 | + |
| 77 | + from ietf.meeting.helpers import get_meeting,get_schedule |
| 78 | + try: |
| 79 | + meeting = get_meeting(meetingname) |
| 80 | + except Meeting.DoesNotExist: |
| 81 | + print "No such meeting: %s" % (meetingname) |
| 82 | + return |
| 83 | + |
| 84 | + try: |
| 85 | + schedule = meeting.schedule_set.get(name = schedname) |
| 86 | + except Schedule.DoesNotExist: |
| 87 | + print "No such schedule: %s in meeting: %s" % (schedname, meeting) |
| 88 | + return |
| 89 | + |
| 90 | + if targetname is not None: |
| 91 | + try: |
| 92 | + targetsched = meeting.schedule_set.get(name=targetname) |
| 93 | + except Schedule.DoesNotExist: |
| 94 | + print "Creating new schedule %s" % (targetname) |
| 95 | + targetsched = Schedule(meeting = meeting, |
| 96 | + owner = schedule.owner, |
| 97 | + name = targetname) |
| 98 | + targetsched.save() |
| 99 | + else: |
| 100 | + targetsched = schedule |
| 101 | + |
| 102 | + print "Saving results to %s" % (targetsched.name) |
| 103 | + |
| 104 | + from ietf.meeting.placement import CurrentScheduleState |
| 105 | + css = CurrentScheduleState(schedule, seed) |
| 106 | + css.recordsteps = recordsteps |
| 107 | + css.verbose = verbose |
| 108 | + |
| 109 | + if profile: |
| 110 | + import cProfile |
| 111 | + import re |
| 112 | + cProfile.runctx('css.do_placement(maxstep, targetsched)', |
| 113 | + vars(), |
| 114 | + vars(), |
| 115 | + 'placestats.pyprof') |
| 116 | + |
| 117 | + import pstats |
| 118 | + p = pstats.Stats('placestats.pyprof') |
| 119 | + p.strip_dirs().sort_stats(-1).print_stats() |
| 120 | + else: |
| 121 | + css.do_placement(maxstep, targetsched) |
| 122 | + |
| 123 | + |
| 124 | + |
0 commit comments