All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.evosuite.strategy.PropertiesTestGAFactory Maven / Gradle / Ivy

/**
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite 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
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see .
 */
package org.evosuite.strategy;

import org.evosuite.Properties;
import org.evosuite.Properties.Criterion;
import org.evosuite.Properties.Strategy;
import org.evosuite.Properties.TheReplacementFunction;
import org.evosuite.TestGenerationContext;
import org.evosuite.coverage.branch.BranchPool;
import org.evosuite.coverage.mutation.MutationTimeoutStoppingCondition;
import org.evosuite.ga.ChromosomeFactory;
import org.evosuite.ga.FitnessReplacementFunction;
import org.evosuite.ga.metaheuristics.*;
import org.evosuite.ga.metaheuristics.mulambda.MuLambdaEA;
import org.evosuite.ga.metaheuristics.mulambda.MuPlusLambdaEA;
import org.evosuite.ga.metaheuristics.mulambda.OnePlusLambdaLambdaGA;
import org.evosuite.ga.metaheuristics.mulambda.OnePlusOneEA;
import org.evosuite.ga.operators.crossover.CrossOverFunction;
import org.evosuite.ga.operators.crossover.SinglePointCrossOver;
import org.evosuite.ga.operators.crossover.SinglePointFixedCrossOver;
import org.evosuite.ga.operators.crossover.SinglePointRelativeCrossOver;
import org.evosuite.ga.operators.crossover.UniformCrossOver;
import org.evosuite.ga.operators.ranking.FastNonDominatedSorting;
import org.evosuite.ga.operators.ranking.RankBasedPreferenceSorting;
import org.evosuite.ga.operators.ranking.RankingFunction;
import org.evosuite.ga.operators.selection.BinaryTournamentSelectionCrowdedComparison;
import org.evosuite.ga.operators.selection.FitnessProportionateSelection;
import org.evosuite.ga.operators.selection.RankSelection;
import org.evosuite.ga.operators.selection.SelectionFunction;
import org.evosuite.ga.operators.selection.TournamentSelection;
import org.evosuite.ga.operators.selection.TournamentSelectionRankAndCrowdingDistanceComparator;
import org.evosuite.ga.stoppingconditions.GlobalTimeStoppingCondition;
import org.evosuite.ga.stoppingconditions.MaxTimeStoppingCondition;
import org.evosuite.ga.stoppingconditions.StoppingCondition;
import org.evosuite.ga.stoppingconditions.ZeroFitnessStoppingCondition;
import org.evosuite.seeding.TestCaseRecycler;
import org.evosuite.testcase.TestCaseReplacementFunction;
import org.evosuite.testcase.TestChromosome;
import org.evosuite.testcase.factories.AllMethodsTestChromosomeFactory;
import org.evosuite.testcase.factories.JUnitTestCarvedChromosomeFactory;
import org.evosuite.testcase.factories.RandomLengthTestFactory;
import org.evosuite.testcase.secondaryobjectives.TestCaseSecondaryObjective;
import org.evosuite.utils.ArrayUtil;

/**
 * Factory for GA for tests
 * 
 * @author gordon
 *
 */
public class PropertiesTestGAFactory extends PropertiesSearchAlgorithmFactory {

	protected ChromosomeFactory getChromosomeFactory() {
		switch (Properties.STRATEGY) {
		case ONEBRANCH:
			switch (Properties.TEST_FACTORY) {
			case ALLMETHODS:
				logger.info("Using all methods chromosome factory");
				return new AllMethodsTestChromosomeFactory();
			case RANDOM:
				logger.info("Using random chromosome factory");
				return new RandomLengthTestFactory();
			case JUNIT:
				logger.info("Using seeding chromosome factory");
				return new JUnitTestCarvedChromosomeFactory(new RandomLengthTestFactory());
			default:
			}
		case ENTBUG:
			return new RandomLengthTestFactory();
		default:
			break;
		}
		throw new RuntimeException("Unsupported test factory: "
		        + Properties.TEST_FACTORY);
	}
	
	private GeneticAlgorithm getGeneticAlgorithm(ChromosomeFactory factory) {
		switch (Properties.ALGORITHM) {
		case ONE_PLUS_ONE_EA:
			logger.info("Chosen search algorithm: (1+1)EA");
			return new OnePlusOneEA<>(factory);
		case MU_PLUS_LAMBDA_EA:
		  logger.info("Chosen search algorithm: (Mu+Lambda)EA");
          return new MuPlusLambdaEA<>(factory, Properties.MU, Properties.LAMBDA);
		case MU_LAMBDA_EA:
			logger.info("Chosen search algorithm: (Mu,Lambda)EA");
			return new MuLambdaEA(factory, Properties.MU, Properties.LAMBDA);
        case BREEDER_GA:
				logger.info("Chosen search algorithm: BreederGA");
				return new BreederGA<>(factory);
		case MONOTONIC_GA:
			logger.info("Chosen search algorithm: MonotonicGA");
			{
				MonotonicGA ga = new MonotonicGA<>(factory);
				if (Properties.REPLACEMENT_FUNCTION == TheReplacementFunction.FITNESSREPLACEMENT) {
					// user has explicitly asked for this replacement function
					ga.setReplacementFunction(new FitnessReplacementFunction());
				} else {
					ga.setReplacementFunction(new TestCaseReplacementFunction());
				}
				return ga;
			}
		case CELLULAR_GA:
			logger.info("Chosen search algorithm: CellularGA");
			{
				CellularGA ga = new CellularGA(Properties.MODEL, factory);
				if (Properties.REPLACEMENT_FUNCTION == TheReplacementFunction.FITNESSREPLACEMENT) {
					// user has explicitly asked for this replacement function
					ga.setReplacementFunction(new FitnessReplacementFunction());
				} else {
					ga.setReplacementFunction(new TestCaseReplacementFunction());
				}
				return ga;
			}
		case STEADY_STATE_GA:
			logger.info("Chosen search algorithm: Steady-StateGA");
			{
				SteadyStateGA ga = new SteadyStateGA<>(factory);
				if (Properties.REPLACEMENT_FUNCTION == TheReplacementFunction.FITNESSREPLACEMENT) {
					// user has explicitly asked for this replacement function
					ga.setReplacementFunction(new FitnessReplacementFunction());
				} else {
					// use default
					ga.setReplacementFunction(new TestCaseReplacementFunction());
				}
				return ga;
			}
		case RANDOM_SEARCH:
			logger.info("Chosen search algorithm: Random");
			return new RandomSearch<>(factory);
        case NSGAII:
            logger.info("Chosen search algorithm: NSGAII");
            return new NSGAII<>(factory);
        case SPEA2:
            logger.info("Chosen search algorithm: SPEA2");
            return new SPEA2<>(factory);
        case ONE_PLUS_LAMBDA_LAMBDA_GA:
            logger.info("Chosen search algorithm: 1 + (lambda, lambda)GA");
            return new OnePlusLambdaLambdaGA<>(factory, Properties.LAMBDA);
        case STANDARD_CHEMICAL_REACTION:
            logger.info("Chosen search algorithm: Standard Chemical Reaction Optimization");
            return new StandardChemicalReaction<>(factory);
        case LIPS:
        	logger.info("Chosen search algorithm: LIPS");
            return new LIPS(factory);
		default:
			logger.info("Chosen search algorithm: StandardGA");
			return new StandardGA<>(factory);
		}
	}
	
	private SelectionFunction getSelectionFunction() {
		switch (Properties.SELECTION_FUNCTION) {
		case ROULETTEWHEEL:
			return new FitnessProportionateSelection<>();
		case TOURNAMENT:
			return new TournamentSelection<>();
		case BINARY_TOURNAMENT:
		    return new BinaryTournamentSelectionCrowdedComparison<>();
		case RANK_CROWD_DISTANCE_TOURNAMENT:
		    return new TournamentSelectionRankAndCrowdingDistanceComparator<>();
		default:
			return new RankSelection<>();
		}
	}
	
	private CrossOverFunction getCrossoverFunction() {
		switch (Properties.CROSSOVER_FUNCTION) {
		case SINGLEPOINTFIXED:
			return new SinglePointFixedCrossOver();
		case SINGLEPOINTRELATIVE:
			return new SinglePointRelativeCrossOver();
		case SINGLEPOINT:
			return new SinglePointCrossOver();
		case UNIFORM:
			return new UniformCrossOver();
		default:
			throw new RuntimeException("Unknown crossover function: "
			        + Properties.CROSSOVER_FUNCTION);
		}
	}

	private RankingFunction getRankingFunction() {
	  switch (Properties.RANKING_TYPE) {
	    case FAST_NON_DOMINATED_SORTING:
	      return new FastNonDominatedSorting<>();
	    case PREFERENCE_SORTING:
	    default:
	      return new RankBasedPreferenceSorting<>();
	  }
	}

	@Override
	public GeneticAlgorithm getSearchAlgorithm() {
		ChromosomeFactory factory = getChromosomeFactory();
		
		// FIXXME
		GeneticAlgorithm ga = getGeneticAlgorithm(factory);

		if (Properties.NEW_STATISTICS)
			ga.addListener(new org.evosuite.statistics.StatisticsListener());

		// How to select candidates for reproduction
		SelectionFunction selection_function = getSelectionFunction();
		selection_function.setMaximize(false);
		ga.setSelectionFunction(selection_function);

		RankingFunction ranking_function = getRankingFunction();
		ga.setRankingFunction(ranking_function);

		// When to stop the search
		StoppingCondition stopping_condition = getStoppingCondition();
		ga.setStoppingCondition(stopping_condition);
		// ga.addListener(stopping_condition);
		if (Properties.STOP_ZERO) {
			ga.addStoppingCondition(new ZeroFitnessStoppingCondition());
		}

		if (!(stopping_condition instanceof MaxTimeStoppingCondition)) {
			ga.addStoppingCondition(new GlobalTimeStoppingCondition());
		}

		if (ArrayUtil.contains(Properties.CRITERION, Criterion.MUTATION)
		        || ArrayUtil.contains(Properties.CRITERION, Criterion.STRONGMUTATION)) {
			ga.addStoppingCondition(new MutationTimeoutStoppingCondition());
		}
		ga.resetStoppingConditions();
		ga.setPopulationLimit(getPopulationLimit());

		// How to cross over
		CrossOverFunction crossover_function = getCrossoverFunction();
		ga.setCrossOverFunction(crossover_function);

		// What to do about bloat
		// MaxLengthBloatControl bloat_control = new MaxLengthBloatControl();
		// ga.setBloatControl(bloat_control);

		if (Properties.CHECK_BEST_LENGTH) {
			org.evosuite.testcase.RelativeTestLengthBloatControl bloat_control = new org.evosuite.testcase.RelativeTestLengthBloatControl();
			ga.addBloatControl(bloat_control);
			ga.addListener(bloat_control);
		}

		TestCaseSecondaryObjective.setSecondaryObjectives();

		if (Properties.DYNAMIC_LIMIT) {
			// max_s = GAProperties.generations * getBranches().size();
			// TODO: might want to make this dependent on the selected coverage
			// criterion
			// TODO also, question: is branchMap.size() really intended here?
			// I think BranchPool.getBranchCount() was intended
			Properties.SEARCH_BUDGET = Properties.SEARCH_BUDGET
			        * (BranchPool.getInstance(TestGenerationContext.getInstance().getClassLoaderForSUT()).getNumBranchlessMethods(Properties.TARGET_CLASS) + BranchPool.getInstance(TestGenerationContext.getInstance().getClassLoaderForSUT()).getBranchCountForClass(Properties.TARGET_CLASS) * 2);
			stopping_condition.setLimit(Properties.SEARCH_BUDGET);
			logger.info("Setting dynamic length limit to " + Properties.SEARCH_BUDGET);
		}

		// TODO: This seems to be whole test suite specific
		// if (Properties.LOCAL_SEARCH_RESTORE_COVERAGE) {
		// 	ga.addListener(BranchCoverageMap.getInstance());
		// }

		if (Properties.RECYCLE_CHROMOSOMES) {
			if (Properties.STRATEGY == Strategy.ONEBRANCH)
				ga.addListener(TestCaseRecycler.getInstance());
		}

		// ga.addListener(new ResourceController());
		return ga;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy