HGPGrammar.java

/**
 * 
 */
package progen.kernel.hypergp;

import java.util.ArrayList;
import java.util.List;

import progen.kernel.functions.Function;
import progen.kernel.grammar.Grammar;
import progen.kernel.grammar.GrammarTerminalSymbol;
import progen.kernel.grammar.Production;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

/**
 * Gramática específica para la evaluación de HiperGP.
 * 
 * @author jirsis
 * @since v2.0
 */
public class HGPGrammar extends Grammar {

  private static final long serialVersionUID = 8359953232850164115L;

  /**
   * Constructor por defecto en el que se especifica el identificador del árbol,
   * para cargar la gramática correspondiente.
   * 
   * @param idTree
   */
  public HGPGrammar(String idTree) {
    super(idTree);
    transformGrammar();
  }

  /**
   * Convierte una gramática normal, en una en la que todos los operadores están
   * agrupados para generar formas de árbol, en función de su signatura.
   */
  @SuppressFBWarnings(value = "BC_UNCONFIRMED_CAST_OF_RETURN_VALUE", justification = "Inherit code")
  private void transformGrammar() {
    Production productionHGP;
    Function wildCard;
    final int totalProductions = super.getProductions().size();
    final List<Production> productions = new ArrayList<Production>((ArrayList<Production>) super.getProductions());

    for (int i = 0; i < totalProductions; i++) {
      final Production p = super.getProductions().get(0);
      wildCard = getWildCard(p, productions);
      productionHGP = new Production(p.getLeft(), new GrammarTerminalSymbol(wildCard), p.getArgs());
      if (!super.getProductions().contains(productionHGP)) {
        super.getProductions().add(productionHGP);
      }
      super.getProductions().remove(0);
    }
  }

  private Function getWildCard(Production production, List<Production> productions) {
    final WildCard wildCard = new WildCard(production.getFunction().getFunction());

    for (Production pAux : productions) {
      // si no son la misma produccion, se comparan todos los elementos
      if (!pAux.equals(production)) {
        if (wildCard.getSignature().equals(pAux.getFunction().getFunction().getSignature())) {
          wildCard.addFunction(pAux.getFunction().getFunction());
        }
      }
    }
    return wildCard;
  }

}