@@ -16,6 +16,24 @@ void ModelHandler::Fuzzy<Type>::addInputMF(std::string InputName, std::string MF
16
16
17
17
}
18
18
19
+ template <typename Type>
20
+ void ModelHandler::Fuzzy<Type>::addOutputMF(std::string OutputName,
21
+ std::string MFName,
22
+ advancedModelHandler::MembershipFunction<Type> *MF){
23
+ if (this ->OutputMF .count (OutputName.c_str ()) != 0 ){
24
+ if (this ->OutputMF [OutputName].count (MFName.c_str ()) != 0 ){
25
+ std::cout << " Variavel existente: " << MFName;
26
+ }else {
27
+ this ->OutputMF [OutputName][MFName] = MF;
28
+ }
29
+ }else {
30
+ std::map<std::string, advancedModelHandler::MembershipFunction<Type>* > MFMap;
31
+ MFMap[MFName] = MF;
32
+ this ->OutputMF [OutputName] = MFMap;
33
+ }
34
+
35
+ }
36
+
19
37
template <typename Type>
20
38
std::map<std::string, advancedModelHandler::MembershipFunction<Type>* > ModelHandler::Fuzzy<Type>::getInputMF(std::string InputName){
21
39
return this ->InputMF [InputName];
@@ -61,8 +79,7 @@ LinAlg::Matrix<Type> ModelHandler::Fuzzy<Type>::fuzzyfication( LinAlg::Matrix<Ty
61
79
template <typename Type>
62
80
void ModelHandler::Fuzzy<Type>::addRules(std::string rule)
63
81
{
64
- int n = std::count (rules.begin (),rules.end (),' ,' ) + 1 ;
65
- std::map<std::string, std::string> ret;
82
+ LinAlg::Matrix<modelString> ret;
66
83
67
84
while (!(rule.empty ()))
68
85
{
@@ -77,53 +94,100 @@ void ModelHandler::Fuzzy<Type>::addRules(std::string rule)
77
94
}
78
95
79
96
int colonPosition = partRule.find (" :" );
80
- if (colonPosition ! = -1 )
97
+ if (colonPosition = = -1 )
81
98
{
82
- ret[partRule] = " " ;
99
+ LinAlg::Matrix<modelString> temp = LinAlg::Matrix<modelString>(modelString (partRule))||modelString (" " );
100
+ ret = ret|temp;
83
101
}
84
102
else
85
103
{
86
104
std::string InOut = partRule.substr (0 , colonPosition);
87
- std::string MF = InOut.erase (0 , colonPosition + 1 );
88
- ret[InOut] = MF;
105
+ std::string MF = partRule.substr (colonPosition + 1 );
106
+ LinAlg::Matrix<modelString> temp = LinAlg::Matrix<modelString>(modelString (InOut))||modelString (MF);
107
+ ret = ret|temp;
89
108
}
90
109
rule.erase (0 , partRulePosition + 1 );
91
110
}
92
- this ->rules .push_back (rule);
93
- this ->countMaxOutputMFRepetitionInRules ();
111
+ rules = rules||ret;
94
112
}
95
113
96
114
template <typename Type>
97
- LinAlg::Matrix<Type> ModelHandler::Fuzzy<Type>::rulesExecute(LinAlg::Matrix<Type> Output )
115
+ std::string ModelHandler::Fuzzy<Type>::viewRules( )
98
116
{
99
- // Onde Paramos: como definir quem é saida e regra no indice de ret;
100
- // verificar OR é min e AND é max?
101
- // Permitir o uso de maxV e minV
102
- unsigned sizeOfRules = this ->rules .size ();
103
- unsigned numberOfOutputs = this ->outputMF .size ();
104
- LinAlg::Matrix<Type> ret (numberOfOutputs, sizeOfRules);
105
-
106
- std::map<std::string, std::string>::reverse_iterator iter = this ->rules [i].rbegin ();
107
- if (iter->first == " and" )
117
+ std::string str;
118
+ for (unsigned i = 1 ; i <= rules.getNumberOfRows (); i+=2 )
108
119
{
109
- iter++;
110
- for (unsigned i = 1 ; i < sizeOfRules; i += 2 )
120
+ for (unsigned j = 1 ; j <= rules.getNumberOfColumns (); ++j)
111
121
{
112
- std::map<std::string, std::string>::reverse_iterator iter = this -> rules [i]. rbegin ();
113
- // for esse for é para iterar as entradas na regra
114
- ret (saida,regra) = maxV ( ret (saida,regra), this -> InputMF [iter-> first ][iter-> second ]. sim (Output) );
115
- iter++ ;
122
+ str += rules (i,j). getString ();
123
+ str += " : " ;
124
+ str += rules (i+ 1 ,j). getString ( );
125
+ str += " \n " ;
116
126
}
117
127
}
118
- else if (iter->first == " or" )
128
+ return str;
129
+ }
130
+
131
+ template <typename Type>
132
+ LinAlg::Matrix<Type> ModelHandler::Fuzzy<Type>::rulesExecute(LinAlg::Matrix<Type> Output)
133
+ {
134
+ // Onde Paramos: como definir quem é saida e regra no indice de ret;
135
+ // verificar OR é min e AND é max?
136
+ // Permitir o uso de maxV e minV
137
+ // unsigned sizeOfRules = this->rules.size();
138
+ // unsigned numberOfOutputs = this->outputMF.size();
139
+ LinAlg::Matrix<Type> ret (this ->OutputMF .size (),this ->rules .getNumberOfRows ()/2 );
140
+ for (unsigned i = 1 ; i <= this ->rules .getNumberOfRows ()/2 ; ++i)
119
141
{
120
- iter++;
121
- for (unsigned i = 1 ; i < sizeOfRules; i += 2 )
122
- {
123
- std::map<std::string, std::string>::reverse_iterator iter = this ->rules [i].rbegin ();
124
- // for esse for é para iterar as entradas na regra
125
- ret (saida,regra) = minV (ret (saida,regra),this ->InputMF [iter->first ][iter->second ].sim (Output));
126
- iter++;
127
- }
142
+ if (this ->rules (1 ,1 ).getString () == " and" )
143
+ continue ;
144
+ else if (this ->rules (1 ,1 ).getString () == " or" )
145
+ continue ;
146
+ // Algoritmo aqui deve ser:
147
+ // ret deve receber o valor correspondente a qual entrada estiver na string e/ou a outra entrada
148
+ // saber qual entrada e saida está na regra
149
+ // realizar as operações e ou ou
150
+ // atribuir a ret na sequência: às saídas que as regras afetam;
128
151
}
152
+ // std::map<std::string, std::string>::reverse_iterator iter = this->rules[i].rbegin();
153
+ // if(iter->first == "and")
154
+ // {
155
+ // iter++;
156
+ // for(unsigned i = 1; i < sizeOfRules; i += 2)
157
+ // {
158
+ // std::map<std::string, std::string>::reverse_iterator iter = this->rules[i].rbegin();
159
+ // for esse for é para iterar as entradas na regra
160
+ // ret(saida,regra) = maxV(ret(saida,regra),this->InputMF[iter->first][iter->second].sim(Output));
161
+ // iter++;
162
+ // }
163
+ // }
164
+ // else if(iter->first == "or")
165
+ // {
166
+ // iter++;
167
+ // for(unsigned i = 1; i < sizeOfRules; i += 2)
168
+ // {
169
+ // std::map<std::string, std::string>::reverse_iterator iter = this->rules[i].rbegin();
170
+ // // for esse for é para iterar as entradas na regra
171
+ // ret(saida,regra) = minV(ret(saida,regra),this->InputMF[iter->first][iter->second].sim(Output));
172
+ // iter++;
173
+ // }
174
+ // }
175
+ }
176
+
177
+ template <typename Type>
178
+ Type ModelHandler::Fuzzy<Type>::maxV(Type a, Type b)
179
+ {
180
+ if (a < b)
181
+ return b;
182
+ else
183
+ return a;
184
+ }
185
+
186
+ template <typename Type>
187
+ Type ModelHandler::Fuzzy<Type>::minV(Type a, Type b)
188
+ {
189
+ if (a > b)
190
+ return b;
191
+ else
192
+ return a;
129
193
}
0 commit comments