/****************************************************************************
 * This file was derived from the CNCL library by the Pablo research group.
 *
 * The complete CNCL library is available at:
 *       http://www.comnets.rwth-aachen.de/doc/cncl.html
 *
 * The CNCL copyright notice is included here:
 *
 * |_|_|_  |_|_    |_    |_|_|_  |_               C O M M U N I C A T I O N
 *|_       |_  |_  |_  |_        |_                         N E T W O R K S
 *|_       |_  |_  |_  |_        |_                               C L A S S
 * |_|_|_  |_    |_|_    |_|_|_  |_|_|_|_                     L I B R A R Y
 *
 *
 *
 * Copyright (C) 1992-1998   Communication Networks
 *                           Aachen University of Technology
 *                           D-52056 Aachen
 *                           Germany
 *                           Email: cncl-adm@comnets.rwth-aachen.de
 *
 *
 * This library is free  software; you can  redistribute it and/or modify
 * it  under   the terms  of the GNU   Library  General Public License as
 * published by the  Free Software Foundation;  either  version 2 of  the
 * License, or  (at  your option)  any  later  version.  This  library is
 * distributed  in the  hope  that  it  will  be useful,  but WITHOUT ANY
 * WARRANTY;  without even the   implied  warranty of MERCHANTABILITY  or
 * FITNESS FOR A PARTICULAR PURPOSE.   See the GNU Library General Public
 * Library General Public License along with  this library; if not, write
 * to the Free Software Foundation,  675  Mass Ave, Cambridge, MA  02139,
 * USA.
 ****************************************************************************/

//   -*- C++ -*-
/*****************************************************************************
 *
 * Class: FlFSetTrapez --- Fuzzy set with trapezium function
 *
 *****************************************************************************/

#include "FlFSetTrapez.h"


/*
 * Contructors
 */

FlFSetTrapez::FlFSetTrapez()
    : FlFSetLR(0, 0, 0, 0, 0, 0, FlFuncLin, FlFuncLin)
{}


FlFSetTrapez::FlFSetTrapez(double min, double max,
			   double xm1, double xm2,
			   double xalpha, double xbeta )
    : FlFSetLR(min, max, xm1, xm2, xalpha, xbeta, FlFuncLin, FlFuncLin)
{}


FlFSetTrapez::FlFSetTrapez(double xm1, double xm2,
			   double xalpha, double xbeta )
    : FlFSetLR(xm1, xm2, xalpha, xbeta, FlFuncLin, FlFuncLin)
{}


FlFSetTrapez::FlFSetTrapez(FlStringR xname, double min, double max,
			   double xm1, double xm2,
			   double xalpha, double xbeta )
    : FlFSetLR(xname, min, max, xm1, xm2, xalpha, xbeta, FlFuncLin, FlFuncLin)
{}


FlFSetTrapez::FlFSetTrapez(FlStringR xname, double xm1, double xm2,
			   double xalpha, double xbeta )
    : FlFSetLR(xname, xm1, xm2, xalpha, xbeta, FlFuncLin, FlFuncLin)
{}



/*
 * Initialize
 */
void FlFSetTrapez::init(FlStringR xname, 
		      double xm1, double xm2, double xalpha, double xbeta,
		      double min, double max                              )
{
    FlFSetLR::init(xname, xm1, xm2, xalpha, xbeta,
		   FlFuncLin, FlFuncLin, min, max);
}

/*
 * Compute membership value for x - optimized version for trapezium
 */
double FlFSetTrapez::get_membership(double x) const
{
   double dy = ymax - ymin;

   if(x >= m1 && x <= m2) 
   {
	   return ymax;
   }
   if(x < (m1 - alpha) || x > (m2 + beta)) 
   {
	   return ymin;
   }
   if(x < m1) 
   {
	   return ymin + dy*(x-(m1-alpha))/alpha;
   }
   return ymin + dy*(m2+beta-x)/beta; 
}

/***** Default I/O member function for FuzzyLib classes **************************/

// FlNormal output
void FlFSetTrapez::print(ostream &strm) const
{
    strm << "set trapez " << name()
	 << "(" << m1 << ", " << m2 << ", " << alpha << ", " << beta << ");";
}

// Debug output
void FlFSetTrapez::dump(ostream &strm) const
{
    strm << "FlFSetTrapez { $Revision: 1.5 $" << std::endl;
    print(strm);
    strm << "}" << std::endl;
}
