package org.eclipse.stem.definitions.edges;

/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;

import org.eclipse.stem.core.graph.GraphPackage;

/**
 * <!-- begin-user-doc -->
 * The <b>Package</b> for the model.
 * It contains accessors for the meta objects to represent
 * <ul>
 *   <li>each class,</li>
 *   <li>each feature of each class,</li>
 *   <li>each enum,</li>
 *   <li>and each data type</li>
 * </ul>
 * <!-- end-user-doc -->
 * @see org.eclipse.stem.definitions.edges.EdgesFactory
 * @model kind="package"
 * @generated
 */
public interface EdgesPackage extends EPackage {
	/**
	 * The package name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNAME = "edges";

	/**
	 * The package namespace URI.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_URI = "http:///org/eclipse/stem/definitions/edges.ecore";

	/**
	 * The package namespace name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_PREFIX = "org.eclipse.stem.definitions.edges";

	/**
	 * The singleton instance of the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	EdgesPackage eINSTANCE = org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl.init();

	/**
	 * The meta object id for the '{@link org.eclipse.stem.definitions.edges.impl.MigrationEdgeImpl <em>Migration Edge</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.definitions.edges.impl.MigrationEdgeImpl
	 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMigrationEdge()
	 * @generated
	 */
	int MIGRATION_EDGE = 0;

	/**
	 * The feature id for the '<em><b>URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__URI = GraphPackage.EDGE__URI;

	/**
	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__TYPE_URI = GraphPackage.EDGE__TYPE_URI;

	/**
	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__DUBLIN_CORE = GraphPackage.EDGE__DUBLIN_CORE;

	/**
	 * The feature id for the '<em><b>A</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__A = GraphPackage.EDGE__A;

	/**
	 * The feature id for the '<em><b>Node AURI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__NODE_AURI = GraphPackage.EDGE__NODE_AURI;

	/**
	 * The feature id for the '<em><b>B</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__B = GraphPackage.EDGE__B;

	/**
	 * The feature id for the '<em><b>Node BURI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__NODE_BURI = GraphPackage.EDGE__NODE_BURI;

	/**
	 * The feature id for the '<em><b>Label</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__LABEL = GraphPackage.EDGE__LABEL;

	/**
	 * The feature id for the '<em><b>Directed</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE__DIRECTED = GraphPackage.EDGE__DIRECTED;

	/**
	 * The number of structural features of the '<em>Migration Edge</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_FEATURE_COUNT = GraphPackage.EDGE_FEATURE_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.definitions.edges.impl.MigrationEdgeLabelImpl <em>Migration Edge Label</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.definitions.edges.impl.MigrationEdgeLabelImpl
	 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMigrationEdgeLabel()
	 * @generated
	 */
	int MIGRATION_EDGE_LABEL = 1;

	/**
	 * The feature id for the '<em><b>URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL__URI = GraphPackage.EDGE_LABEL__URI;

	/**
	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL__TYPE_URI = GraphPackage.EDGE_LABEL__TYPE_URI;

	/**
	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL__DUBLIN_CORE = GraphPackage.EDGE_LABEL__DUBLIN_CORE;

	/**
	 * The feature id for the '<em><b>URI Of Identifiable To Be Labeled</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL__URI_OF_IDENTIFIABLE_TO_BE_LABELED = GraphPackage.EDGE_LABEL__URI_OF_IDENTIFIABLE_TO_BE_LABELED;

	/**
	 * The feature id for the '<em><b>Current Value</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL__CURRENT_VALUE = GraphPackage.EDGE_LABEL__CURRENT_VALUE;

	/**
	 * The feature id for the '<em><b>Identifiable</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL__IDENTIFIABLE = GraphPackage.EDGE_LABEL__IDENTIFIABLE;

	/**
	 * The feature id for the '<em><b>Edge</b></em>' container reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL__EDGE = GraphPackage.EDGE_LABEL__EDGE;

	/**
	 * The number of structural features of the '<em>Migration Edge Label</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL_FEATURE_COUNT = GraphPackage.EDGE_LABEL_FEATURE_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.definitions.edges.impl.MigrationEdgeLabelValueImpl <em>Migration Edge Label Value</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.definitions.edges.impl.MigrationEdgeLabelValueImpl
	 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMigrationEdgeLabelValue()
	 * @generated
	 */
	int MIGRATION_EDGE_LABEL_VALUE = 2;

	/**
	 * The feature id for the '<em><b>Migration Rate</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL_VALUE__MIGRATION_RATE = GraphPackage.LABEL_VALUE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Migration Edge Label Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIGRATION_EDGE_LABEL_VALUE_FEATURE_COUNT = GraphPackage.LABEL_VALUE_FEATURE_COUNT + 1;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.definitions.edges.impl.MixingEdgeImpl <em>Mixing Edge</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.definitions.edges.impl.MixingEdgeImpl
	 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMixingEdge()
	 * @generated
	 */
	int MIXING_EDGE = 3;

	/**
	 * The feature id for the '<em><b>URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__URI = GraphPackage.EDGE__URI;

	/**
	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__TYPE_URI = GraphPackage.EDGE__TYPE_URI;

	/**
	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__DUBLIN_CORE = GraphPackage.EDGE__DUBLIN_CORE;

	/**
	 * The feature id for the '<em><b>A</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__A = GraphPackage.EDGE__A;

	/**
	 * The feature id for the '<em><b>Node AURI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__NODE_AURI = GraphPackage.EDGE__NODE_AURI;

	/**
	 * The feature id for the '<em><b>B</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__B = GraphPackage.EDGE__B;

	/**
	 * The feature id for the '<em><b>Node BURI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__NODE_BURI = GraphPackage.EDGE__NODE_BURI;

	/**
	 * The feature id for the '<em><b>Label</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__LABEL = GraphPackage.EDGE__LABEL;

	/**
	 * The feature id for the '<em><b>Directed</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE__DIRECTED = GraphPackage.EDGE__DIRECTED;

	/**
	 * The number of structural features of the '<em>Mixing Edge</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_FEATURE_COUNT = GraphPackage.EDGE_FEATURE_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.definitions.edges.impl.MixingEdgeLabelImpl <em>Mixing Edge Label</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.definitions.edges.impl.MixingEdgeLabelImpl
	 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMixingEdgeLabel()
	 * @generated
	 */
	int MIXING_EDGE_LABEL = 4;

	/**
	 * The feature id for the '<em><b>URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL__URI = GraphPackage.EDGE_LABEL__URI;

	/**
	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL__TYPE_URI = GraphPackage.EDGE_LABEL__TYPE_URI;

	/**
	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL__DUBLIN_CORE = GraphPackage.EDGE_LABEL__DUBLIN_CORE;

	/**
	 * The feature id for the '<em><b>URI Of Identifiable To Be Labeled</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL__URI_OF_IDENTIFIABLE_TO_BE_LABELED = GraphPackage.EDGE_LABEL__URI_OF_IDENTIFIABLE_TO_BE_LABELED;

	/**
	 * The feature id for the '<em><b>Current Value</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL__CURRENT_VALUE = GraphPackage.EDGE_LABEL__CURRENT_VALUE;

	/**
	 * The feature id for the '<em><b>Identifiable</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL__IDENTIFIABLE = GraphPackage.EDGE_LABEL__IDENTIFIABLE;

	/**
	 * The feature id for the '<em><b>Edge</b></em>' container reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL__EDGE = GraphPackage.EDGE_LABEL__EDGE;

	/**
	 * The number of structural features of the '<em>Mixing Edge Label</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL_FEATURE_COUNT = GraphPackage.EDGE_LABEL_FEATURE_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.definitions.edges.impl.MixingEdgeLabelValueImpl <em>Mixing Edge Label Value</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.definitions.edges.impl.MixingEdgeLabelValueImpl
	 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMixingEdgeLabelValue()
	 * @generated
	 */
	int MIXING_EDGE_LABEL_VALUE = 5;

	/**
	 * The feature id for the '<em><b>Mixing Rate</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL_VALUE__MIXING_RATE = GraphPackage.LABEL_VALUE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Mixing Edge Label Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MIXING_EDGE_LABEL_VALUE_FEATURE_COUNT = GraphPackage.LABEL_VALUE_FEATURE_COUNT + 1;


	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.definitions.edges.MigrationEdge <em>Migration Edge</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Migration Edge</em>'.
	 * @see org.eclipse.stem.definitions.edges.MigrationEdge
	 * @generated
	 */
	EClass getMigrationEdge();

	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.definitions.edges.MigrationEdgeLabel <em>Migration Edge Label</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Migration Edge Label</em>'.
	 * @see org.eclipse.stem.definitions.edges.MigrationEdgeLabel
	 * @generated
	 */
	EClass getMigrationEdgeLabel();

	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.definitions.edges.MigrationEdgeLabelValue <em>Migration Edge Label Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Migration Edge Label Value</em>'.
	 * @see org.eclipse.stem.definitions.edges.MigrationEdgeLabelValue
	 * @generated
	 */
	EClass getMigrationEdgeLabelValue();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.definitions.edges.MigrationEdgeLabelValue#getMigrationRate <em>Migration Rate</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Migration Rate</em>'.
	 * @see org.eclipse.stem.definitions.edges.MigrationEdgeLabelValue#getMigrationRate()
	 * @see #getMigrationEdgeLabelValue()
	 * @generated
	 */
	EAttribute getMigrationEdgeLabelValue_MigrationRate();

	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.definitions.edges.MixingEdge <em>Mixing Edge</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Mixing Edge</em>'.
	 * @see org.eclipse.stem.definitions.edges.MixingEdge
	 * @generated
	 */
	EClass getMixingEdge();

	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.definitions.edges.MixingEdgeLabel <em>Mixing Edge Label</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Mixing Edge Label</em>'.
	 * @see org.eclipse.stem.definitions.edges.MixingEdgeLabel
	 * @generated
	 */
	EClass getMixingEdgeLabel();

	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.definitions.edges.MixingEdgeLabelValue <em>Mixing Edge Label Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Mixing Edge Label Value</em>'.
	 * @see org.eclipse.stem.definitions.edges.MixingEdgeLabelValue
	 * @generated
	 */
	EClass getMixingEdgeLabelValue();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.definitions.edges.MixingEdgeLabelValue#getMixingRate <em>Mixing Rate</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Mixing Rate</em>'.
	 * @see org.eclipse.stem.definitions.edges.MixingEdgeLabelValue#getMixingRate()
	 * @see #getMixingEdgeLabelValue()
	 * @generated
	 */
	EAttribute getMixingEdgeLabelValue_MixingRate();

	/**
	 * Returns the factory that creates the instances of the model.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the factory that creates the instances of the model.
	 * @generated
	 */
	EdgesFactory getEdgesFactory();

	/**
	 * <!-- begin-user-doc -->
	 * Defines literals for the meta objects that represent
	 * <ul>
	 *   <li>each class,</li>
	 *   <li>each feature of each class,</li>
	 *   <li>each enum,</li>
	 *   <li>and each data type</li>
	 * </ul>
	 * <!-- end-user-doc -->
	 * @generated
	 */
	interface Literals {
		/**
		 * The meta object literal for the '{@link org.eclipse.stem.definitions.edges.impl.MigrationEdgeImpl <em>Migration Edge</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.definitions.edges.impl.MigrationEdgeImpl
		 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMigrationEdge()
		 * @generated
		 */
		EClass MIGRATION_EDGE = eINSTANCE.getMigrationEdge();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.definitions.edges.impl.MigrationEdgeLabelImpl <em>Migration Edge Label</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.definitions.edges.impl.MigrationEdgeLabelImpl
		 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMigrationEdgeLabel()
		 * @generated
		 */
		EClass MIGRATION_EDGE_LABEL = eINSTANCE.getMigrationEdgeLabel();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.definitions.edges.impl.MigrationEdgeLabelValueImpl <em>Migration Edge Label Value</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.definitions.edges.impl.MigrationEdgeLabelValueImpl
		 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMigrationEdgeLabelValue()
		 * @generated
		 */
		EClass MIGRATION_EDGE_LABEL_VALUE = eINSTANCE.getMigrationEdgeLabelValue();

		/**
		 * The meta object literal for the '<em><b>Migration Rate</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MIGRATION_EDGE_LABEL_VALUE__MIGRATION_RATE = eINSTANCE.getMigrationEdgeLabelValue_MigrationRate();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.definitions.edges.impl.MixingEdgeImpl <em>Mixing Edge</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.definitions.edges.impl.MixingEdgeImpl
		 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMixingEdge()
		 * @generated
		 */
		EClass MIXING_EDGE = eINSTANCE.getMixingEdge();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.definitions.edges.impl.MixingEdgeLabelImpl <em>Mixing Edge Label</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.definitions.edges.impl.MixingEdgeLabelImpl
		 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMixingEdgeLabel()
		 * @generated
		 */
		EClass MIXING_EDGE_LABEL = eINSTANCE.getMixingEdgeLabel();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.definitions.edges.impl.MixingEdgeLabelValueImpl <em>Mixing Edge Label Value</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.definitions.edges.impl.MixingEdgeLabelValueImpl
		 * @see org.eclipse.stem.definitions.edges.impl.EdgesPackageImpl#getMixingEdgeLabelValue()
		 * @generated
		 */
		EClass MIXING_EDGE_LABEL_VALUE = eINSTANCE.getMixingEdgeLabelValue();

		/**
		 * The meta object literal for the '<em><b>Mixing Rate</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MIXING_EDGE_LABEL_VALUE__MIXING_RATE = eINSTANCE.getMixingEdgeLabelValue_MixingRate();

	}

} //EdgesPackage
