/**
 * *******************************************************************************
 * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *      Regent L'Archeveque - initial API and implementation
 *         
 * SPDX-License-Identifier: EPL-1.0    
 * *******************************************************************************
 */
package org.eclipse.apogy.core.environment.earth.orbit.planner;

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc -->
 * The <b>Factory</b> for the model.
 * It provides a create method for each non-abstract class of the model.
 * <!-- end-user-doc -->
 * @see org.eclipse.apogy.core.environment.earth.orbit.planner.ApogyCoreEnvironmentEarthOrbitPlannerPackage
 * @generated
 */
public interface ApogyCoreEnvironmentEarthOrbitPlannerFactory extends EFactory {
	/**
	 * The singleton instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	ApogyCoreEnvironmentEarthOrbitPlannerFactory eINSTANCE = org.eclipse.apogy.core.environment.earth.orbit.planner.impl.ApogyCoreEnvironmentEarthOrbitPlannerFactoryImpl.init();

	/**
	 * Returns a new object of class '<em>Facade</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Facade</em>'.
	 * @generated
	 */
	ApogyCoreEnvironmentEarthOrbitPlannerFacade createApogyCoreEnvironmentEarthOrbitPlannerFacade();

	/**
	 * Returns a new object of class '<em>Observation Analysis Planner Tool</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Observation Analysis Planner Tool</em>'.
	 * @generated
	 */
	ObservationAnalysisPlannerTool createObservationAnalysisPlannerTool();

	/**
	 * Returns a new object of class '<em>Observation Analysis Planner</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Observation Analysis Planner</em>'.
	 * @generated
	 */
	ObservationAnalysisPlanner createObservationAnalysisPlanner();

	/**
	 * Returns a new object of class '<em>Observation Analysis Planner Node</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Observation Analysis Planner Node</em>'.
	 * @generated
	 */
	ObservationAnalysisPlannerNode createObservationAnalysisPlannerNode();

	/**
	 * Returns a new object of class '<em>Observation Analysis Plan Generator</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Observation Analysis Plan Generator</em>'.
	 * @generated
	 */
	ObservationAnalysisPlanGenerator createObservationAnalysisPlanGenerator();

	/**
	 * Returns a new object of class '<em>Observation Analysis Plan Costs Processor</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Observation Analysis Plan Costs Processor</em>'.
	 * @generated
	 */
	ObservationAnalysisPlanCostsProcessor createObservationAnalysisPlanCostsProcessor();

	/**
	 * Returns a new object of class '<em>Default Observation Plan Exporter</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Default Observation Plan Exporter</em>'.
	 * @generated
	 */
	DefaultObservationPlanExporter createDefaultObservationPlanExporter();

	/**
	 * Returns a new object of class '<em>Cost Function State</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Cost Function State</em>'.
	 * @generated
	 */
	CostFunctionState createCostFunctionState();

	/**
	 * Returns a new object of class '<em>Observation Analysis Planner Result</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Observation Analysis Planner Result</em>'.
	 * @generated
	 */
	ObservationAnalysisPlannerResult createObservationAnalysisPlannerResult();

	/**
	 * Returns a new object of class '<em>Stateless Cost Function Map</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Stateless Cost Function Map</em>'.
	 * @generated
	 */
	StatelessCostFunctionMap createStatelessCostFunctionMap();

	/**
	 * Returns a new object of class '<em>Stateful Cost Function Map Entry Value</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Stateful Cost Function Map Entry Value</em>'.
	 * @generated
	 */
	StatefulCostFunctionMapEntryValue createStatefulCostFunctionMapEntryValue();

	/**
	 * Returns a new object of class '<em>Eclipse Cost Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Eclipse Cost Function</em>'.
	 * @generated
	 */
	EclipseCostFunction createEclipseCostFunction();

	/**
	 * Returns a new object of class '<em>Time Interval Cost Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Time Interval Cost Function</em>'.
	 * @generated
	 */
	TimeIntervalCostFunction createTimeIntervalCostFunction();

	/**
	 * Returns a new object of class '<em>Simple Resource Cost Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Simple Resource Cost Function</em>'.
	 * @generated
	 */
	SimpleResourceCostFunction createSimpleResourceCostFunction();

	/**
	 * Returns a new object of class '<em>Simple Resource Cost Function State</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Simple Resource Cost Function State</em>'.
	 * @generated
	 */
	SimpleResourceCostFunctionState createSimpleResourceCostFunctionState();

	/**
	 * Returns a new object of class '<em>Minimum Time Spam Cost Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Minimum Time Spam Cost Function</em>'.
	 * @generated
	 */
	MinimumTimeSpamCostFunction createMinimumTimeSpamCostFunction();

	/**
	 * Returns a new object of class '<em>Crosstrack Angle Cost Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Crosstrack Angle Cost Function</em>'.
	 * @generated
	 */
	CrosstrackAngleCostFunction createCrosstrackAngleCostFunction();

	/**
	 * Returns the package supported by this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the package supported by this factory.
	 * @generated
	 */
	ApogyCoreEnvironmentEarthOrbitPlannerPackage getApogyCoreEnvironmentEarthOrbitPlannerPackage();

} //ApogyCoreEnvironmentEarthOrbitPlannerFactory
