* and open the template in the editor.
*/
- /*
+ /*
* File: basictuner.cc
* Author: hamed
- *
+ *
* Created on December 17, 2018, 2:02 PM
*/
timetaken.put(problem, time);
}
- void TunerRecord::print(){
+ void TunerRecord::print() {
model_print("*************TUNER NUMBER=%d***********\n", tunernumber);
tuner->print();
model_print("&&&&&&&&&&&&&USED SETTINGS &&&&&&&&&&&&\n");
model_print("\n");
}
- void TunerRecord::printProblemsInfo(){
+ void TunerRecord::printProblemsInfo() {
for (uint j = 0; j < problems.getSize(); j++) {
Problem *problem = problems.get(j);
model_print("Problem %s\n", problem->getProblem());
BasicTuner::BasicTuner(uint _budget, uint _timeout) :
- budget(_budget), timeout(_timeout), execnum(0){
+ budget(_budget), timeout(_timeout), execnum(0) {
}
BasicTuner::~BasicTuner() {
}
}
- bool BasicTuner::tunerExists(TunerRecord *tunerec){
+ bool BasicTuner::tunerExists(TunerRecord *tunerec) {
SearchTuner *tuner = tunerec->getTuner();
- for(uint i=0; i< explored.getSize(); i++){
- if(explored.get(i)->getTuner()->equalUsed(tuner)){
+ for (uint i = 0; i < explored.getSize(); i++) {
+ if (explored.get(i)->getTuner()->equalUsed(tuner)) {
model_print("************Tuner <%d> is replicate of Tuner <%d>\n", tunerec->getTunerNumber(), explored.get(i)->getTunerNumber());
return true;
}
//Do run
snprintf(buffer, sizeof(buffer), "./run.sh deserializerun %s %u tuner%u result%u > log%u", problem->getProblem(), maxtime, execnum, execnum, execnum);
+ model_print("Running: %s\n", buffer);
int status = system(buffer);
long long metric = -1;
return newTuner;
}
- int BasicTuner::subTunerIndex(SearchTuner *newTuner){
- for (uint i=0; i< explored.getSize(); i++){
+ int BasicTuner::subTunerIndex(SearchTuner *newTuner) {
+ for (uint i = 0; i < explored.getSize(); i++) {
SearchTuner *tuner = explored.get(i)->getTuner();
- if(tuner->isSubTunerof(newTuner)){
+ if (tuner->isSubTunerof(newTuner)) {
return i;
}
}
{
}
- SATuner::~SATuner(){
+ SATuner::~SATuner() {
}
- void SATuner::rankTunerForProblem(Vector<TunerRecord *> *places, TunerRecord *tuner, Problem *problem, long long metric){
+ void SATuner::rankTunerForProblem(Vector<TunerRecord *> *places, TunerRecord *tuner, Problem *problem, long long metric) {
uint k = 0;
for (; k < places->getSize(); k++) {
if (metric < places->get(k)->getTime(problem))
break;
}
model_print("Problem<%s>:place[%u]=Tuner<%p,%d>\n", problem->getProblem(), k, tuner, tuner->getTunerNumber());
- places->insertAt(k, tuner);
+ places->insertAt(k, tuner);
}
- void SATuner::removeTunerIndex(Vector<TunerRecord *> *tunerV, int index, Vector<Vector<TunerRecord *> *> &allplaces){
+ void SATuner::removeTunerIndex(Vector<TunerRecord *> *tunerV, int index, Vector<Vector<TunerRecord *> *> &allplaces) {
TunerRecord *tuner = tunerV->get(index);
model_print("Removing Tuner %d\n", tuner->getTunerNumber());
tunerV->set(index, NULL);
- for(uint i=0; i < allplaces.getSize(); i++){
+ for (uint i = 0; i < allplaces.getSize(); i++) {
Vector<TunerRecord *> *places = allplaces.get(i);
- for(uint j=0; j < places->getSize(); j++){
- if(tuner == places->get(j)){
+ for (uint j = 0; j < places->getSize(); j++) {
+ if (tuner == places->get(j)) {
places->removeAt(j);
break;
}
}
- void SATuner::removeNullsFromTunerVector( Vector<TunerRecord *> *tunerV){
- for (int i= tunerV->getSize() -1; i >= 0; i--){
- if(tunerV->get(i) == NULL){
+ void SATuner::removeNullsFromTunerVector( Vector<TunerRecord *> *tunerV) {
+ for (int i = tunerV->getSize() - 1; i >= 0; i--) {
+ if (tunerV->get(i) == NULL) {
tunerV->removeAt(i);
}
}
model_print("TunerV size after removing nulls = %u\n", tunerV->getSize());
}
- void SATuner::initialize(Vector<TunerRecord *> *tunerV, Vector<Vector<TunerRecord *> *> &allplaces){
- for(uint ii=0; ii< problems.getSize(); ii++){
+ void SATuner::initialize(Vector<TunerRecord *> *tunerV, Vector<Vector<TunerRecord *> *> &allplaces) {
+ for (uint ii = 0; ii < problems.getSize(); ii++) {
allplaces.push(new Vector<TunerRecord *>());
}
- for (uint j = 0; j< tunerV->getSize(); j++){
+ for (uint j = 0; j < tunerV->getSize(); j++) {
TunerRecord *tuner = tunerV->get(j);
- for (uint i=0; i < problems.getSize(); i++){
+ for (uint i = 0; i < problems.getSize(); i++) {
Problem *problem = problems.get(i);
long long metric = evaluate(problem, tuner);
ASSERT(tuner->getTime(problem) == -1);
tuner->addProblem(problem);
- if(metric != -1){
- tuner->setTime(problem , metric);
- }else{
- tuner->setTime(problem , -2);
+ if (metric != -1) {
+ tuner->setTime(problem, metric);
+ } else {
+ tuner->setTime(problem, -2);
}
- if(metric >=0){
+ if (metric >= 0) {
Vector<TunerRecord *> *places = allplaces.get(i);
rankTunerForProblem(places, tuner, problem, metric);
}
}
void SATuner::tune() {
- Vector<TunerRecord *> *tunerV = new Vector<TunerRecord *>(&tuners);
+ Vector<TunerRecord *> *tunerV = new Vector<TunerRecord *>(&tuners);
Vector<Vector<TunerRecord *> *> allplaces;
uint tunerNumber = tuners.getSize();
//Initialization
initialize(tunerV, allplaces);
//Starting the body of algorithm
- for (uint t = budget; t >0; t--) {
+ for (uint t = budget; t > 0; t--) {
model_print("Current Temperature = %u\n", t);
Hashtable<TunerRecord *, int, uint64_t> scores;
for (uint i = 0; i < tunerNumber; i++) {
- SearchTuner *tmpTuner = mutateTuner(tunerV->get(i)->getTuner(), budget-t);
+ SearchTuner *tmpTuner = mutateTuner(tunerV->get(i)->getTuner(), budget - t);
int tunerIndex = subTunerIndex(tmpTuner);
TunerRecord *tmp = NULL;
- if(tunerIndex == -1){
+ if (tunerIndex == -1) {
tmp = new TunerRecord(tmpTuner);
tmp->setTunerNumber(allTuners.getSize());
model_print("Mutated tuner %u to generate tuner %u\n", tunerV->get(i)->getTunerNumber(), tmp->getTunerNumber());
- allTuners.push(tmp);
- }else{
+ allTuners.push(tmp);
+ } else {
//Previous tuners might get explored with new combination of tuners.
- tmp = explored.get(tunerIndex);
+ tmp = explored.get(tunerIndex);
model_print("Using exploread tuner <%u>\n", tmp->getTunerNumber());
}
tunerV->push(tmp);
}
}
}
- for(uint ii=0; ii < problems.getSize(); ii++){
+ for (uint ii = 0; ii < problems.getSize(); ii++) {
Problem *problem = problems.get(ii);
ASSERT(ii < allplaces.getSize());
Vector<TunerRecord *> *places = allplaces.get(ii);
- int points = pow(tunerNumber*1.0, 2*tunerNumber - 1);
+ int points = pow(tunerNumber * 1.0, 2 * tunerNumber - 1);
for (uint k = 0; k < places->getSize() && points; k++) {
TunerRecord *tuner = places->get(k);
int currScore = 0;
}
}
- for(uint i= 0; i < tunerNumber; i++){
+ for (uint i = 0; i < tunerNumber; i++) {
ASSERT(i < tunerV->getSize());
TunerRecord *tuner1 = tunerV->get(i);
TunerRecord *tuner2 = tunerV->get(tunerNumber + i);
ASSERT( tunerNumber + i < tunerV->getSize());
model_print("Tuner1 = %d \tTuner2 = %d\n", tuner1->getTunerNumber(), tuner2->getTunerNumber());
- ASSERT(scores.contains(tuner1));
- ASSERT(scores.contains(tuner2));
- int score1 = scores.get(tuner1);
- int score2 = scores.get(tuner2);
- if ( score2 > score1 ) {
+
+ int score1, score2;
+ if(!scores.contains(tuner1)){
+ score1 = 0;
+ }else {
+ score1 = scores.get(tuner1);
+ }
+ if(!scores.contains(tuner2)){
+ score2=0;
+ }else {
+ score2= scores.get(tuner2);
+ }
+
+ if( score2 > score1 ){
removeTunerIndex(tunerV, i, allplaces);
- } else if( score2 < score1){
- model_print("score1=%d\tscore2=%d\tt=%u\texp=%f\n", score1, score2, t, exp((score1-score2)*1.0/t));
- double prob = 1/(exp((score1-score2)*1.0/t) );
+ } else if ( score2 < score1) {
+ model_print("score1=%d\tscore2=%d\tt=%u\texp=%f\n", score1, score2, t, exp((score1 - score2) * 1.0 / t));
+ double prob = 1 / (exp((score1 - score2) * 1.0 / t) );
double random = ((double) rand() / (RAND_MAX));
model_print("prob=%f\trandom=%f\n", prob, random);
- if(prob > random){
+ if (prob > random) {
removeTunerIndex(tunerV, i, allplaces);
- }else{
+ } else {
removeTunerIndex(tunerV, tunerNumber + i, allplaces);
}
- } else{
+ } else {
double random = ((double) rand() / (RAND_MAX));
- int index = random > 0.5? i : tunerNumber + i;
+ int index = random > 0.5 ? i : tunerNumber + i;
removeTunerIndex(tunerV, index, allplaces);
}
}
removeNullsFromTunerVector(tunerV);
-
+
}
- for(uint ii=0; ii< allplaces.getSize(); ii++){
+ for (uint ii = 0; ii < allplaces.getSize(); ii++) {
delete allplaces.get(ii);
}
printData();