home Forums Feature Requests Reading/Writing FIS files using FuzzyLite


Viewing 10 posts - 1 through 10 (of 11 total)
  • Author
  • #830

    Hello again Juan,

    I”m working on a fuzzy logic problem that requires me to integrate the original code into the Network Simulator 3, or commonly known as NS-3. Previously I’ve modified the original C code from MATLAB’s Fuzzy Logic toolbox written by Roger Jang (i.e. “fismain.c”). The file “fis.c” is left unmodified, and it works perfectly. However the problem is the NS-3 is a C++ platform which requires different coding style, which I am not entirely familiar with. I just need 3 input to produce a single output using Mamdani or Sugeno type fuzzy engine.

    Do FuzzyLite has a simpler version just like “fis.c” and “fismain.c“?

    Many, many thanks in advance.

    CF Kwong

    The modified code from “fismain.c” is as follows.

    #include <fis.c>
    #include <stdio.h>

    double SS = 0.5;
    double NC = 0.5;
    double BER= 0.5;

    FuzzyDataFile = fopen(“Fuzzy_Logic.dat”,”w+”);
    fprintf (FuzzyDataFile, “%f %f %f\n”, SS, NC, BER);

    /* Writing a Data Matrix file */
    dataMatrix = returnDataMatrix(“Fuzzy_Logic.dat”, &data_row_n, &data_col_n);

    /* Fuzzy Inference System (FIS) File */
    fisMatrix = returnFismatrix(“Handover_Decision.fis”, &fis_row_n, &fis_col_n);

    /* Build FIS data structure */
    fis = (FIS *)fisCalloc(1, sizeof(FIS));
    fisBuildFisNode(fis, fisMatrix, fis_col_n, MF_POINT_N);

    /* Error Checking */
    if (data_col_n < fis->in_n)
    PRINTF(“Given FIS is a %d-input %d-output system.\n”,fis->in_n, fis->out_n);
    PRINTF(“Given data file does not have enough input entries.\n”);
    fisFreeMatrix((void **)dataMatrix, data_row_n);
    fisFreeMatrix((void **)fisMatrix, fis_row_n);

    /* Create output matrix */
    outputMatrix = (DOUBLE **)fisCreateMatrix(data_row_n, fis->out_n, sizeof(DOUBLE));

    /* Evaluate FIS on each input vector */
    for (i = 0; i < data_row_n; i++)
    getFisOutput(dataMatrix[i], fis, outputMatrix[i]);

    /* Output vector */
    for (i = 0; i < data_row_n; i++)
    for (j = 0; j < fis->out_n; j++)
    results = outputMatrix[i][j]; // Here is the output after defuzzification

    /* clean up FIS memory */
    fisFreeMatrix((void **)dataMatrix, data_row_n);
    fisFreeMatrix((void **)fisMatrix, fis_row_n);
    fisFreeMatrix((void **)outputMatrix, data_row_n);



    I do not know what the goal is for fis.c or fismain.c. It seems to me that you want to have the data in FLD format stored in a two-dimensional matrix. You can do that if you parse the results obtained with the FldExporter.

    However, if you want custom input vectors, you can have two matrices, one for inputs and the other for outputs. Then, you can easily create both matrices yourself using fuzzylite. You do not need the fis.c or fismain.c to do it for you, roughly, you can do it as follows.

    for every input vector v:
       for every input variable i:
     for every output variable o:
       w[o] = o.defuzzify();

    where v is a row of the input matrix, w is a row of the output matrix.


    Thank you, much appreciated.

    Here’s another question:

    Let say if I have a string of data store inside, say InputData.txt with three column format “SS BER QOS” where SS, BER and QOS is the crisp data input before the fuzzier, and I want to feed those data into fuzzylite.

    The output will be stored inside a file, say OutputData.txt, Can fuzzylite do such or I need to do some minor modification of the codes? I am using MATLAB generated FIS data, i.e. HD.fis.

    Hope to hear from you soon.


    CF Kwong



    fuzzylite does not deal with Files, and I think I will keep it that way for the foreseeable future. However, I will consider using custom vectors for the next version.

    You need to investigate how to read and write files from your computer using C++. I have done reading files using std::ifstream and std::getline. For every line read, you can use std::istringstream as a tokenizer that reads the line and gets each of the values in the line and stores them in a matrix. Afterwards:
    1) traverse the matrix using the values to prepare the input variables (using InputVariable::setInputValue)
    2) call method Engine::process
    3) defuzzify the values of each output variable and store them in the matrix
    4) Write to file the matrix or part of the matrix

    Also, I have changed the title of the post to reflect better its contents.



    Hi CF,

    Another person has asked for the same fis.c and fismain.c file, but now I understand what you want to do!
    I will definitely add that feature to fuzzylite soonish and let you know.



    What you require is not too hard and you do not need to build fuzzylite from source to achieve so.

    Roughly, in SomeFile.cpp:

    #include <fl/Headers.h>
    int main(int argc, char** argv){
       std::string fisEngine = readFromSomeFile("xxx.fis");
       std::vector<std::vector<fl::scalar> > inputs = readFromSomeFileAndParse("xxx.dat");
       fl::Engine* engine = FisImporter().fromString(fisEngine);
       for (std::size_t i = 0 ; i < inputs.size(); ++i){
           for (std::size_t x = 0 ; x < inputs.at(i).size(); ++x){
           for (int i = 0 ; i < engine->numberOfOutputVariables(); ++i){
              fl::scalar output = engine->getOutputVariable(i)->defuzzify(); 
              writeToSomeFile(output + " ");
           writeToSomeFile(output + "\n");

    You have to implement yourself the read and write functions and fix some details.

    g++ SomeFile.cpp -I/path/to/fuzzylite/fuzzylite -L/path/to/fuzzylite/fuzzylite/bin -lfuzzylite


    Hi Juan,
    I have noticed that you’ve included “import from Fuzzy Inference System (FIS)” feature to fuzzylite 4.0 GUI but it seems that no explicit instruction on how to use the feature is available. Could you provide an example to clarify the matter?


    Hi hacmachdien,

    If you have a fuzzy engine in “fis” format (check examples), then you can copy and paste the contents of the “fis” file into the import window.

    For example, if you copy and paste the following block into the import window, you will have a fuzzy engine ready to use.

    Range=[0.000 1.000]
    MF1='DARK':'trimf',[0.000 0.250 0.500]
    MF2='MEDIUM':'trimf',[0.250 0.500 0.750]
    MF3='BRIGHT':'trimf',[0.500 0.750 1.000]
    Range=[0.000 1.000]
    MF1='LOW':'trimf',[0.000 0.250 0.500]
    MF2='MEDIUM':'trimf',[0.250 0.500 0.750]
    MF3='HIGH':'trimf',[0.500 0.750 1.000]
    1.000 , 3.000 (1.000) : 1
    2.000 , 2.000 (1.000) : 1
    3.000 , 1.000 (1.000) : 1

    Thanks a lot, Juan
    The reply was a great help to me. Just another curious notion about fuzzylite 4.0 C++ codes: Is it easily applicable in hardware implementation? I using your fuzzy GUI and C++ code generator to create a real-time application on FPGA environment. I guess it would take me tons of time to convert the C++ codes to synthesizable Fixed-Point (if the conversion is even possible).


    I am not sure about hardware implementation, but later this year I expect to export to pure C, for which it should be compatible for hardware implementation.

Viewing 10 posts - 1 through 10 (of 11 total)
  • You must be logged in to reply to this topic.