/* ************************************************************************* */ void accomodateStudent() { // super-hack! just count... bool debug = false; // SETDEBUG("DiscreteConditional::COUNT",true); SETDEBUG("DiscreteConditional::DiscreteConditional", debug); // progress Scheduler scheduler = largeExample(0); // scheduler.addStudent("Victor E", "Autonomy", "HRI", "AI", // "Henrik Christensen"); scheduler.addStudent("Carlos N", "Perception", "AI", "Autonomy", "Henrik Christensen"); scheduler.print("scheduler"); // rule out all occupied slots vector<size_t> slots; slots += 16, 17, 11, 2, 0, 5, 9, 14; vector<double> slotsAvailable(scheduler.nrTimeSlots(), 1.0); BOOST_FOREACH(size_t s, slots) slotsAvailable[s] = 0; scheduler.setSlotsAvailable(slotsAvailable); // BUILD THE GRAPH ! scheduler.buildGraph(1); // Do EXACT INFERENCE DiscreteBayesNet::shared_ptr chordal = scheduler.eliminate(); // find root node DiscreteConditional::shared_ptr root = chordal->back(); if (debug) root->print(""/*scheduler.studentName(s)*/); // GTSAM_PRINT(*chordal); // solve root node only Scheduler::Values values; size_t bestSlot = root->solve(values); // get corresponding count DiscreteKey dkey = scheduler.studentKey(0); values[dkey.first] = bestSlot; size_t count = (*root)(values); cout << boost::format("%s = %d (%d), count = %d") % scheduler.studentName(0) % scheduler.slotName(bestSlot) % bestSlot % count << endl; // sample schedules for (size_t n = 0; n < 10; n++) { Scheduler::sharedValues sample0 = chordal->sample(); scheduler.printAssignment(sample0); } }
/* ************************************************************************* */ void runLargeExample() { Scheduler scheduler = largeExample(); scheduler.print(); // BUILD THE GRAPH ! size_t addMutex = 3; // SETDEBUG("Scheduler::buildGraph", true); scheduler.buildGraph(addMutex); // Do brute force product and output that to file if (scheduler.nrStudents() == 1) { // otherwise too slow DecisionTreeFactor product = scheduler.product(); product.dot("scheduling-large", false); } // Do exact inference // SETDEBUG("timing-verbose", true); SETDEBUG("DiscreteConditional::DiscreteConditional", true); #define SAMPLE #ifdef SAMPLE gttic(large); DiscreteBayesNet::shared_ptr chordal = scheduler.eliminate(); gttoc(large); tictoc_finishedIteration(); tictoc_print(); for (size_t i=0;i<100;i++) { DiscreteFactor::sharedValues assignment = chordal->sample(); vector<size_t> stats(scheduler.nrFaculty()); scheduler.accumulateStats(assignment, stats); size_t max = *max_element(stats.begin(), stats.end()); size_t min = *min_element(stats.begin(), stats.end()); size_t nz = count_if(stats.begin(), stats.end(), NonZero); // cout << min << ", " << max << ", " << nz << endl; if (nz >= 13 && min >=1 && max <= 4) { cout << "======================================================\n"; scheduler.printAssignment(assignment); } } #else gttic(large); DiscreteFactor::sharedValues MPE = scheduler.optimalAssignment(); gttoc(large); tictoc_finishedIteration(); tictoc_print(); scheduler.printAssignment(MPE); #endif }