//--------------------------------------------------------------------------------// // 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.xfsp.model.types; import xfuzzy.lang.ParamMemFunc; import xfuzzy.lang.Universe; import xfuzzy.xfsp.XfspEvent; import xfuzzy.xfsp.controller.XfspStore; /** * <p> <b>Descripci�n:</b> clase de objetos que permiten la uni�n de dos * funciones de pertenencia en una nueva cuyos par�metros han sido * especificados por el usuarios. * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS> * @author Jorge Agudo Praena * @version 3.3 * @see IXfspMFMerger * */ public class XfspCustomMFMerger implements IXfspMFMerger { //nueva funci�n de pertenencia que ser� igual a la uni�n de las dos originales private volatile ParamMemFunc mergedmf; //grado de similaridad que existe entre las funciones de pertenencia a //fusionar private double similarityDegree; //almac�n donde se guardan los posibles eventos producidos durante el proceso //de fusi�n de funciones de pertenencia private XfspStore store; /** * <p> <b>Descripci�n:</b> construye un objeto que fusiona funciones de * pertenencia. * */ public XfspCustomMFMerger() { //establece a nulo la funci�n de pertenencia producto de la fusi�n mergedmf = null; } /** * <p> <b>Descripci�n:</b> une dos funciones de pertenencia en una nueva * cuyos par�metros son totalmente especificados por el usuario. * @param mf1 Primera funci�n de pertenencia que se debe fusionar. * @param mf2 Segunda funci�n de pertenencia. * @param universe Universo de las dos funciones de pertenencia originales. * @return Nueva funci�n de pertenencia definida por el usuario. * */ public ParamMemFunc merge(ParamMemFunc mf1, ParamMemFunc mf2, Universe universe) { //this.mf1 = mf1; //this.mf2 = mf2; //this.universe = universe; //argumentos que se le pasar�n al controlador para que cree una vista //adecuada para la elecci�n de la nueva funci�n de pertenencia Object[] args = new Object[4]; //el primer argumento es la primera de las funciones de pertenencia a unir args[0] = mf1; //el segundo argumento es la segunda de las funciones de pertenencia a unir args[1] = mf2; //el tercer argumento es el grado de similaridad que existe entre ambas //funciones de pertenencia args[2] = new Double(similarityDegree); //el cuarto argumento es el propio objeto que permite la fusi�n de //funciones de pertenencia args[3] = this; //env�a un evento al almac�n pidiendo a alg�n controlador que muestre una //ventana de selecci�n de funciones de pertenencia por el usuario con los //argumentos indicados store.store(new XfspEvent("Merge", args)); try { synchronized (this) { //mientras el usuario no haya elegido la nueva funci�n de pertenencia //sigue a la espera while (mergedmf == null) { wait(); } } } catch (InterruptedException e) { } //si el usuario no ha seleccionado ninguna funci�n para la fusi�n de las dos //originales... if(mergedmf.getLabel() == null && mergedmf.getFunctionName() == null){ //...devuelve null mergedmf = null; } //si el usuario ha introducido la funci�n que resulta de la fusi�n de las //dos similares else{ //...establece el universo de la nueva funci�n de pertenencia... //...y el nombre mergedmf.set(mf1.getLabel(),universe); } //devuelve la nueva funci�n de pertenencia return mergedmf; } /** * <p> <b>Descripci�n:</b> establece la funci�n de pertenencia resultado de * la uni�n de las dos originales tal y como la ha definido el usuario. * @param mergedmf Funci�n de pertenencia definida por el usuario. * */ public synchronized void setMergedMemFunction(ParamMemFunc mergedmf) { this.mergedmf = mergedmf; notify(); } /** * <p> <b>Descripci�n:</b> devuelve el almac�n donde se almacenan los eventos * para comunicarse con los controladores. * @return Almac�n donde el objeto actual almacena los eventos para asi * comunicarse con un posible controlador. * */ public XfspStore getStore() { return this.store; } /** * <p> <b>Descripci�n:</b> establece el almac�n donde se almacenan los * eventos para comunicarse con los controladores. * @param store Nuevo almac�n de eventos que debe emplear el objeto actual * para almacenar los eventos. * */ public void setStore(XfspStore store) { this.store = store; } /** * <p> <b>Descripci�n:</b> devuelve la grado de similaridad de las funciones * que se quieren unir. * @return Grado de similaridad de las funcinoes de pertenencia que se * quieren unir. * */ public double getSimilarityDegree() { return this.similarityDegree; } /** * <p> <b>Descripci�n:</b> establece el grado de similaridad de las funciones * de pertenencia que se van a unir. * @param similarityDegree Grado de similaridad de las funciones de * pertenencia a unir. * */ public void setSimilarityDegree(double similarityDegree) { this.similarityDegree = similarityDegree; } }