//--------------------------------------------------------------------------------// // COPYRIGHT NOTICE // //--------------------------------------------------------------------------------// // Copyright (c) 2012, Instituto de Microelectronica de Sevilla (IMSE-CNM) // // // // All rights reserved. // // // // Redistribution and use in source and binary forms, with or without // // modification, are permitted provided that the following conditions are met: // // // // * Redistributions of source code must retain the above copyright notice, // // this list of conditions and the following disclaimer. // // // // * Redistributions in binary form must reproduce the above copyright // // notice, this list of conditions and the following disclaimer in the // // documentation and/or other materials provided with the distribution. // // // // * Neither the name of the IMSE-CNM nor the names of its contributors may // // be used to endorse or promote products derived from this software // // without specific prior written permission. // // // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE // // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //--------------------------------------------------------------------------------// package xfuzzy.xfcpp; import java.io.*; /** * Generador del fichero "xfuzzy.cpp" * * @author Francisco Jos� Moreno Velo * */ public class XfcppXfuzzyCppCode { //----------------------------------------------------------------------------// // MIEMBROS PRIVADOS // //----------------------------------------------------------------------------// /** * Directorio en el que crear el fichero "xfuzzy.hpp" */ private File dir; //----------------------------------------------------------------------------// // CONSTRUCTOR // //----------------------------------------------------------------------------// /** * Constructor */ public XfcppXfuzzyCppCode(File dir) { this.dir = dir; } //----------------------------------------------------------------------------// // M�TODOS P�BLICOS EST�TICOS // //----------------------------------------------------------------------------// /** * Genera el fichero "xfuzzy.cpp" */ public static final String create(File dir) { XfcppXfuzzyCppCode creator = new XfcppXfuzzyCppCode(dir); creator.createFile(); return creator.getMessage(); } //----------------------------------------------------------------------------// // M�TODOS P�BLICOS // //----------------------------------------------------------------------------// /** * Devuelve la descripcion del resultado de la compilacion */ public String getMessage() { File file = new File(dir,"xfuzzy.cpp"); return file.getAbsolutePath(); } /** * Genera el fichero "xfuzzy.cpp" */ public void createFile() { File file = new File(dir,"xfuzzy.cpp"); try { OutputStream os = new FileOutputStream(file); PrintStream stream = new PrintStream(os); printHeading(stream); printSource(stream); stream.close(); } catch (IOException e) {} } //----------------------------------------------------------------------------// // M�TODOS P�BLICOS // //----------------------------------------------------------------------------// /** * Genera el c�digo de cabecera */ private void printHeading(PrintStream stream) { stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//"); stream.println("// //"); stream.println("// File: xfuzzy.cpp //"); stream.println("// //"); stream.println("// Author: Automatically generated by Xfuzzy //"); stream.println("// //"); stream.println("//++++++++++++++++++++++++++++++++++++++++++++++++++++++//"); stream.println(); } /** * Genera el contenido del fichero */ private void printSource(PrintStream stream) { stream.println("#include <string.h>"); stream.println("#include \"xfuzzy.hpp\""); stream.println(); createParamMembershipFunction(stream); createOutputMembershipFunction(stream); } /** * Genera el c�digo de la clase ParamMembershipFunction */ private void createParamMembershipFunction(PrintStream stream) { stream.println("//======================================================//"); stream.println("// Membership function of an input variable //"); stream.println("//======================================================//"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Constructor //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("ParamMembershipFunction::ParamMembershipFunction"); stream.println("(double min, double max, double step) {"); stream.println(" this->min = min;"); stream.println(" this->max = max;"); stream.println(" this->step = step;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Default Center function //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.println("double ParamMembershipFunction::center() { return 0; }"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Default Basis function //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.println("double ParamMembershipFunction::basis() { return 0; }"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Default Smaller_or_equal function //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.println("double ParamMembershipFunction::compute_smeq(double x) {"); stream.println(" double degree=0, mu;"); stream.print(" for(double y=max; y>=x ; y-=step) "); stream.println("if((mu = compute_eq(y))>degree) degree=mu;"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Default Greater_or_equal function //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.println("double ParamMembershipFunction::compute_greq(double x) {"); stream.println(" double degree=0, mu;"); stream.print(" for(double y=min; y<=x ; y+=step) "); stream.println("if((mu = compute_eq(y))>degree) degree=mu;"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to detect singletons //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.println("int ParamMembershipFunction::isXflSingleton() {"); stream.println(" int size = strlen(name);"); stream.println(" if(size < 14) return 0;"); stream.println(" if( !strcmp(&name[size-14],\"_xfl_singleton\") ) return 1;"); stream.println(" return 0;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var == label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isEqual"); stream.println("(MembershipFunction &mf) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.println(" { return compute_eq( ((FuzzySingleton &) mf).getValue()); }"); stream.println(" double mu1,mu2,minmu,degree=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = compute_eq(omf.conc[i]->param(0));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=min; x<=max; x+=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = compute_eq(x);"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var >= label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isGreaterOrEqual"); stream.println("(MembershipFunction &mf) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.println(" { return compute_greq( ((FuzzySingleton &) mf).getValue()); }"); stream.println(" double mu1,mu2,minmu,degree=0,greq=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = compute_greq(omf.conc[i]->param(0));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=min; x<=max; x+=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = compute_eq(x);"); stream.println(" if( mu2>greq ) greq = mu2;"); stream.println(" if( mu1<greq ) minmu = mu1; else minmu = greq;"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var <= label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isSmallerOrEqual"); stream.println("(MembershipFunction &mf) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.println(" { return compute_smeq( ((FuzzySingleton &) mf).getValue()); }"); stream.println(" double mu1,mu2,minmu,degree=0,smeq=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = compute_smeq(omf.conc[i]->param(0));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=max; x>=min; x-=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = compute_eq(x);"); stream.println(" if( mu2>smeq ) smeq = mu2;"); stream.println(" if( mu1<smeq ) minmu = mu1; else minmu = smeq;"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var > label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isGreater"); stream.println("(MembershipFunction &mf, Operatorset &op) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.print(" { return op._not(compute_smeq( "); stream.println("((FuzzySingleton &) mf).getValue())); }"); stream.println(" double mu1,mu2,minmu,gr,degree=0,smeq=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = op._not(compute_smeq(omf.conc[i]->param(0)));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=max; x>=min; x-=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = compute_eq(x);"); stream.println(" if( mu2>smeq ) smeq = mu2;"); stream.println(" gr = op._not(smeq);"); stream.println(" minmu = ( mu1<gr ? mu1 : gr);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var < label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isSmaller"); stream.println("(MembershipFunction &mf, Operatorset &op) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.print(" { return op._not(compute_greq( "); stream.println("((FuzzySingleton &) mf).getValue())); }"); stream.println(" double mu1,mu2,minmu,sm,degree=0,greq=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = op._not(compute_greq(omf.conc[i]->param(0)));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=min; x<=max; x+=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = compute_eq(x);"); stream.println(" if( mu2>greq ) greq = mu2;"); stream.println(" sm = op._not(greq);"); stream.println(" minmu = ( mu1<sm ? mu1 : sm);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var != label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isNotEqual"); stream.println("(MembershipFunction &mf, Operatorset &op) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.print(" { return op._not(compute_eq( "); stream.println("((FuzzySingleton &) mf).getValue())); }"); stream.println(" double mu1,mu2,minmu,degree=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = op._not(compute_eq(omf.conc[i]->param(0)));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=min; x<=max; x+=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = op._not(compute_eq(x));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var ~= label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isApproxEqual"); stream.println("(MembershipFunction &mf, Operatorset &op) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.print(" { return op._moreorless(compute_eq( "); stream.println("((FuzzySingleton &) mf).getValue())); }"); stream.println(" double mu1,mu2,minmu,degree=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = op._moreorless(compute_eq(omf.conc[i]->param(0)));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=min; x<=max; x+=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = op._moreorless(compute_eq(x));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var += label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isVeryEqual"); stream.println("(MembershipFunction &mf, Operatorset &op) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.print(" { return op._very(compute_eq( "); stream.println("((FuzzySingleton &) mf).getValue())); }"); stream.println(" double mu1,mu2,minmu,degree=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = op._very(compute_eq(omf.conc[i]->param(0)));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=min; x<=max; x+=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = op._very(compute_eq(x));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute proposition (var %= label) //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("double ParamMembershipFunction::isSlightlyEqual"); stream.println("(MembershipFunction &mf, Operatorset &op) {"); stream.println(" if( mf.getType() == MembershipFunction::CRISP )"); stream.print(" { return op._slightly(compute_eq( "); stream.println("((FuzzySingleton &) mf).getValue())); }"); stream.println(" double mu1,mu2,minmu,degree=0;"); stream.println(" if( mf.getType() == MembershipFunction::INNER &&"); stream.println(" ((OutputMembershipFunction &) mf).isDiscrete() ){"); stream.print(" OutputMembershipFunction &omf = "); stream.println("(OutputMembershipFunction &) mf;"); stream.println(" for(int i=0; i<omf.length; i++){"); stream.println(" mu1 = omf.conc[i]->degree();"); stream.println(" mu2 = op._slightly(compute_eq(omf.conc[i]->param(0)));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" else {"); stream.println(" for(double x=min; x<=max; x+=step){"); stream.println(" mu1 = mf.compute(x);"); stream.println(" mu2 = op._slightly(compute_eq(x));"); stream.println(" minmu = (mu1<mu2 ? mu1 : mu2);"); stream.println(" if( degree<minmu ) degree = minmu;"); stream.println(" }"); stream.println(" }"); stream.println(" return degree;"); stream.println("}"); stream.println(); } /** * Genera el c�digo de la clase OutputMembershipFunction */ private void createOutputMembershipFunction(PrintStream stream) { stream.println("//======================================================//"); stream.println("// Membership function of an inner variable //"); stream.println("//======================================================//"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Constructor //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.print("OutputMembershipFunction::OutputMembershipFunction"); stream.println("(Operatorset *op,int length,int inputlength,double *input){"); stream.println(" this->op = op;"); stream.println(" this->length = length;"); stream.println(" this->inputlength = inputlength;"); stream.println(" this->input = input;"); stream.println(" this->conc = new (RuleConclusion*)[length];"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to compute an aggregation of MFs //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.println("double OutputMembershipFunction::compute(double x) {"); stream.println(" double dom = op->_imp(conc[0]->degree(),conc[0]->compute(x));"); stream.println(" for(int i=1; i<length; i++)"); stream.print(" dom = op->_also(dom,op->_imp"); stream.println("(conc[i]->degree(),conc[i]->compute(x)));"); stream.println(" return dom;"); stream.println("}"); stream.println(); stream.println("//------------------------------------------------------//"); stream.println("// Function to detect an aggregation of singletons //"); stream.println("//------------------------------------------------------//"); stream.println(); stream.println("int OutputMembershipFunction::isDiscrete() {"); stream.print(" for(int i=0; i<length; i++) "); stream.println("if(!conc[i]->isDiscrete()) return 0;"); stream.println(" return 1;"); stream.println("}"); stream.println(); } }