//+++++++++++++++++++++++++++++++++++++++++++++++++++++
// File automatically generated by Xfuzzy - DO NOT EDIT
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
package pkg.xfl.defuz;
import xfuzzy.lang.*;
public class TakagiSugeno extends DefuzMethod {
public TakagiSugeno() {
super("xfl","TakagiSugeno");
Parameter single[] = new Parameter[0];
setSingleParameters(single);
}
public double compute(AggregateMemFunc mf) {
double min = mf.min();
double max = mf.max();
double denom=0;
for(int i=0; i<mf.conc.length; i++) denom += mf.conc[i].degree();
if(denom==0) return (min+max)/2;
double num=0;
for(int i=0; i<mf.conc.length; i++) {
double f = mf.conc[i].param(0);
for(int j=0; j<mf.input.length; j++) f += mf.conc[i].param(j+1)*mf.input[j];
num += mf.conc[i].degree()*f;
}
return num/denom;
}
public boolean test () {
return true;
}
public boolean test(AggregateMemFunc mf) {
for(int i=0; i<mf.conc.length; i++) {
LinguisticLabel pmf = mf.conc[i].getMF();
if(!(pmf instanceof pkg.xfl.mfunc.parametric)
) return false;
}
return true;
}
public String getJavaCode() {
String eol = System.getProperty("line.separator", "\n");
String code = "";
code += " double denom=0;"+eol;
code += " for(int i=0; i<mf.conc.length; i++) denom += mf.conc[i].degree();"+eol;
code += " if(denom==0) return (min+max)/2;"+eol;
code += " double num=0;"+eol;
code += " for(int i=0; i<mf.conc.length; i++) {"+eol;
code += " double f = mf.conc[i].param(0);"+eol;
code += " for(int j=0; j<mf.input.length; j++) f += mf.conc[i].param(j+1)*mf.input[j];"+eol;
code += " num += mf.conc[i].degree()*f;"+eol;
code += " }"+eol;
code += " return num/denom;"+eol;
return code;
}
public String getCCode() {
String eol = System.getProperty("line.separator", "\n");
String code = "";
code += " double f,num=0,denom=0;"+eol;
code += " int i,j;"+eol;
code += " for(i=0; i<mf.length; i++) denom += mf.degree[i];"+eol;
code += " if(denom==0) return (min+max)/2;"+eol;
code += " for(i=0; i<mf.length; i++) {"+eol;
code += " f = mf.conc[i].param(0);"+eol;
code += " for(j=0; j<mf.inputlength; j++) f += mf.conc[i].param(j+1)*mf.input[j];"+eol;
code += " num += mf.degree[i]*f;"+eol;
code += " }"+eol;
code += " return num/denom;"+eol;
return code;
}
public String getCppCode() {
String eol = System.getProperty("line.separator", "\n");
String code = "";
code += " double num=0,denom=0;"+eol;
code += " for(int i=0; i<mf.length; i++) {"+eol;
code += " double f = mf.conc[i]->param(0);"+eol;
code += " for(int j=0; j<mf.inputlength; j++) f += mf.conc[i]->param(j+1)*mf.input[j];"+eol;
code += " num += mf.conc[i]->degree()*f;"+eol;
code += " denom += mf.conc[i]->degree();"+eol;
code += " }"+eol;
code += " if(denom==0) return (min+max)/2;"+eol;
code += " return num/denom;"+eol;
return code;
}
//+++++++++++++++++++
public void derivative(AggregateMemFunc mf, double derror) {
double denom=0;
for(int i=0; i<mf.conc.length; i++) denom += mf.conc[i].degree();
if(denom==0) return;
double num=0;
double f[] = new double[mf.conc.length];
for(int i=0; i<mf.conc.length; i++) {
f[i] = mf.conc[i].param(0);
for(int j=0; j<mf.input.length; j++) f[i]+=mf.conc[i].param(j+1)*mf.input[j];
num += mf.conc[i].degree()*f[i];
}
double y = num/denom;
for(int i=0; i<mf.conc.length; i++) {
mf.conc[i].setDegreeDeriv(derror*(f[i]-y)/denom);
mf.conc[i].setParamDeriv(0,derror*mf.conc[i].degree()/denom);
for(int j=0; j<mf.input.length; j++)
mf.conc[i].setParamDeriv(j+1,derror*mf.conc[i].degree()*mf.input[j]/denom);
}
}
//+++++++++++++++++++
}