-
Notifications
You must be signed in to change notification settings - Fork 0
/
Processor.hpp
100 lines (90 loc) · 3.04 KB
/
Processor.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#ifndef Processor_hpp
#define Processor_hpp
#include<bits/stdc++.h>
#include "FitnessFunction.hpp"
#include "DataMemory.hpp"
#include "RegisterFile.hpp"
#include "ExecutionControlUnit.hpp"
#include "InstructionMemory.hpp"
using namespace std;
class Processor {
public:
FitnessFunction fitnessFunction;
DataMemory DM;
RegisterFile RF;
ExecutionControlUnit ECU;
InstructionMemory IM;
vector<double> instruction;
int PC = 0;
Processor(int n, int dim, int epochs, double w, double c1, double c2, double lowerBound, double upperBound) {
DM.DataMemory_INIT(n, dim, epochs, w, c1, c2, lowerBound, upperBound);
}
void run(){
while(1){
fetchInstruction();
if(instruction[0] == -1) break;
executeInstruction();
if(instruction[0] == 0) printHistory();
}
}
void fetchInstruction() {
instruction.clear();
double opcode = IM.getInstruction(PC++);
instruction.push_back(opcode);
if(opcode == 0){ // INIT
// do nothing
}else
if(opcode == 1 || opcode == 2 || opcode == 3 || opcode == 4){ // CMP ADD MULT SWAP
double a = IM.getInstruction(PC++);
double b = IM.getInstruction(PC++);
instruction.push_back(a);
instruction.push_back(b);
}else
if(opcode == 5){ // RAND Type 0 or Type 1
double a = IM.getInstruction(PC++);
instruction.push_back(a);
}else
if(opcode == 6){ // CALC_FITNESS of a particle of dimension dim
for(int i=0; i<DM.dim; i++){
double a = IM.getInstruction(PC++);
instruction.push_back(a);
}
}else
if(opcode == 7 || opcode == 8){ // MIN and MAX of 2 values
double a = IM.getInstruction(PC++);
double b = IM.getInstruction(PC++);
instruction.push_back(a);
instruction.push_back(b);
}
}
void executeInstruction(){
ECU.executeInstruction(instruction, DM);
}
// Print history to File "history.txt"
void printHistory() {
std::cout << std::fixed;
std::cout << std::setprecision(6);
cout << "Best fitness: " << DM.getBestFitness() << endl;
cout << "Best particle: " << endl << "( ";
for(int i=0; i<DM.dim; i++){
cout << DM.gbest[i] << " ";
}
cout << ")" << endl;
cout << endl;
cout << "Printing history to file..." << endl;
ofstream myfile;
myfile.open("history.txt");
myfile<<DM.epochs<<" "<<DM.n<<" "<<DM.dim<<" "<<DM.lowerBound<<" "<<DM.upperBound<<endl;
for(int t=0; t<DM.epochs; t++){
for (int i = 0; i < DM.n; i++) {
for (int j = 0; j < DM.dim; j++) {
myfile << DM.history[t][i].position[j] << " ";
}
myfile << endl;
}
}
myfile.close();
cout << "Printing history to file... Done!" << endl << endl;
}
};
#endif // Processor_hpp