/**
 * Copyright (c) 2020 CEA LIST
 * 
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License v2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 */
package org.eclipse.papyrus.aiml.profile.AIML.Distance_functions.impl;

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

import org.eclipse.emf.ecore.impl.EPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.AIMLPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Convolution_layers.Convolution_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Convolution_layers.impl.Convolution_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.DataParallel_layers.DataParallel_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.DataParallel_layers.impl.DataParallel_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Distance_functions.CosineSimilarity;
import org.eclipse.papyrus.aiml.profile.AIML.Distance_functions.Distance_functions;
import org.eclipse.papyrus.aiml.profile.AIML.Distance_functions.Distance_functionsFactory;
import org.eclipse.papyrus.aiml.profile.AIML.Distance_functions.Distance_functionsPackage;
import org.eclipse.papyrus.aiml.profile.AIML.Distance_functions.PairwiseDistance;

import org.eclipse.papyrus.aiml.profile.AIML.Dropout_layers.Dropout_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Dropout_layers.impl.Dropout_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_constraints.Layer_weight_constraintsPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_constraints.impl.Layer_weight_constraintsPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.Layer_weight_initializersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.impl.Layer_weight_initializersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_regularizers.Layer_weight_regularizersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_regularizers.impl.Layer_weight_regularizersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Linear_layers.Linear_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Linear_layers.impl.Linear_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Loss_functions.Loss_functionsPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Loss_functions.impl.Loss_functionsPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Module.ModulePackage;

import org.eclipse.papyrus.aiml.profile.AIML.Module.impl.ModulePackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.NonLinearActivations.NonLinearActivationsPackage;

import org.eclipse.papyrus.aiml.profile.AIML.NonLinearActivations.impl.NonLinearActivationsPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Normalization_layers.Normalization_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Normalization_layers.impl.Normalization_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Padding_layers.Padding_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Padding_layers.impl.Padding_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Pooling_layers.Pooling_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Pooling_layers.impl.Pooling_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Recurrent_layers.Recurrent_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Recurrent_layers.impl.Recurrent_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.SoftMinMaxActivations.SoftMinMaxActivationsPackage;

import org.eclipse.papyrus.aiml.profile.AIML.SoftMinMaxActivations.impl.SoftMinMaxActivationsPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Sparse_layers.Sparse_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Sparse_layers.impl.Sparse_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Tensor.TensorPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Tensor.impl.TensorPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Transformer_layers.Transformer_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Transformer_layers.impl.Transformer_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.Vision_layers.Vision_layersPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Vision_layers.impl.Vision_layersPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.datatypes.DatatypesPackage;

import org.eclipse.papyrus.aiml.profile.AIML.datatypes.impl.DatatypesPackageImpl;

import org.eclipse.papyrus.aiml.profile.AIML.impl.AIMLPackageImpl;

import org.eclipse.uml2.types.TypesPackage;

import org.eclipse.uml2.uml.UMLPackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class Distance_functionsPackageImpl extends EPackageImpl implements Distance_functionsPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass distance_functionsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass cosineSimilarityEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass pairwiseDistanceEClass = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see org.eclipse.papyrus.aiml.profile.AIML.Distance_functions.Distance_functionsPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private Distance_functionsPackageImpl() {
		super(eNS_URI, Distance_functionsFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 *
	 * <p>This method is used to initialize {@link Distance_functionsPackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static Distance_functionsPackage init() {
		if (isInited) return (Distance_functionsPackage)EPackage.Registry.INSTANCE.getEPackage(Distance_functionsPackage.eNS_URI);

		// Obtain or create and register package
		Object registeredDistance_functionsPackage = EPackage.Registry.INSTANCE.get(eNS_URI);
		Distance_functionsPackageImpl theDistance_functionsPackage = registeredDistance_functionsPackage instanceof Distance_functionsPackageImpl ? (Distance_functionsPackageImpl)registeredDistance_functionsPackage : new Distance_functionsPackageImpl();

		isInited = true;

		// Initialize simple dependencies
		EcorePackage.eINSTANCE.eClass();
		TypesPackage.eINSTANCE.eClass();
		UMLPackage.eINSTANCE.eClass();

		// Obtain or create and register interdependencies
		Object registeredPackage = EPackage.Registry.INSTANCE.getEPackage(AIMLPackage.eNS_URI);
		AIMLPackageImpl theAIMLPackage = (AIMLPackageImpl)(registeredPackage instanceof AIMLPackageImpl ? registeredPackage : AIMLPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(ModulePackage.eNS_URI);
		ModulePackageImpl theModulePackage = (ModulePackageImpl)(registeredPackage instanceof ModulePackageImpl ? registeredPackage : ModulePackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(TensorPackage.eNS_URI);
		TensorPackageImpl theTensorPackage = (TensorPackageImpl)(registeredPackage instanceof TensorPackageImpl ? registeredPackage : TensorPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(DatatypesPackage.eNS_URI);
		DatatypesPackageImpl theDatatypesPackage = (DatatypesPackageImpl)(registeredPackage instanceof DatatypesPackageImpl ? registeredPackage : DatatypesPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Pooling_layersPackage.eNS_URI);
		Pooling_layersPackageImpl thePooling_layersPackage = (Pooling_layersPackageImpl)(registeredPackage instanceof Pooling_layersPackageImpl ? registeredPackage : Pooling_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Convolution_layersPackage.eNS_URI);
		Convolution_layersPackageImpl theConvolution_layersPackage = (Convolution_layersPackageImpl)(registeredPackage instanceof Convolution_layersPackageImpl ? registeredPackage : Convolution_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Layer_weight_constraintsPackage.eNS_URI);
		Layer_weight_constraintsPackageImpl theLayer_weight_constraintsPackage = (Layer_weight_constraintsPackageImpl)(registeredPackage instanceof Layer_weight_constraintsPackageImpl ? registeredPackage : Layer_weight_constraintsPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Padding_layersPackage.eNS_URI);
		Padding_layersPackageImpl thePadding_layersPackage = (Padding_layersPackageImpl)(registeredPackage instanceof Padding_layersPackageImpl ? registeredPackage : Padding_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(NonLinearActivationsPackage.eNS_URI);
		NonLinearActivationsPackageImpl theNonLinearActivationsPackage = (NonLinearActivationsPackageImpl)(registeredPackage instanceof NonLinearActivationsPackageImpl ? registeredPackage : NonLinearActivationsPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(SoftMinMaxActivationsPackage.eNS_URI);
		SoftMinMaxActivationsPackageImpl theSoftMinMaxActivationsPackage = (SoftMinMaxActivationsPackageImpl)(registeredPackage instanceof SoftMinMaxActivationsPackageImpl ? registeredPackage : SoftMinMaxActivationsPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Normalization_layersPackage.eNS_URI);
		Normalization_layersPackageImpl theNormalization_layersPackage = (Normalization_layersPackageImpl)(registeredPackage instanceof Normalization_layersPackageImpl ? registeredPackage : Normalization_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Recurrent_layersPackage.eNS_URI);
		Recurrent_layersPackageImpl theRecurrent_layersPackage = (Recurrent_layersPackageImpl)(registeredPackage instanceof Recurrent_layersPackageImpl ? registeredPackage : Recurrent_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Transformer_layersPackage.eNS_URI);
		Transformer_layersPackageImpl theTransformer_layersPackage = (Transformer_layersPackageImpl)(registeredPackage instanceof Transformer_layersPackageImpl ? registeredPackage : Transformer_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Linear_layersPackage.eNS_URI);
		Linear_layersPackageImpl theLinear_layersPackage = (Linear_layersPackageImpl)(registeredPackage instanceof Linear_layersPackageImpl ? registeredPackage : Linear_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Dropout_layersPackage.eNS_URI);
		Dropout_layersPackageImpl theDropout_layersPackage = (Dropout_layersPackageImpl)(registeredPackage instanceof Dropout_layersPackageImpl ? registeredPackage : Dropout_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Sparse_layersPackage.eNS_URI);
		Sparse_layersPackageImpl theSparse_layersPackage = (Sparse_layersPackageImpl)(registeredPackage instanceof Sparse_layersPackageImpl ? registeredPackage : Sparse_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Loss_functionsPackage.eNS_URI);
		Loss_functionsPackageImpl theLoss_functionsPackage = (Loss_functionsPackageImpl)(registeredPackage instanceof Loss_functionsPackageImpl ? registeredPackage : Loss_functionsPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Vision_layersPackage.eNS_URI);
		Vision_layersPackageImpl theVision_layersPackage = (Vision_layersPackageImpl)(registeredPackage instanceof Vision_layersPackageImpl ? registeredPackage : Vision_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(DataParallel_layersPackage.eNS_URI);
		DataParallel_layersPackageImpl theDataParallel_layersPackage = (DataParallel_layersPackageImpl)(registeredPackage instanceof DataParallel_layersPackageImpl ? registeredPackage : DataParallel_layersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Layer_weight_regularizersPackage.eNS_URI);
		Layer_weight_regularizersPackageImpl theLayer_weight_regularizersPackage = (Layer_weight_regularizersPackageImpl)(registeredPackage instanceof Layer_weight_regularizersPackageImpl ? registeredPackage : Layer_weight_regularizersPackage.eINSTANCE);
		registeredPackage = EPackage.Registry.INSTANCE.getEPackage(Layer_weight_initializersPackage.eNS_URI);
		Layer_weight_initializersPackageImpl theLayer_weight_initializersPackage = (Layer_weight_initializersPackageImpl)(registeredPackage instanceof Layer_weight_initializersPackageImpl ? registeredPackage : Layer_weight_initializersPackage.eINSTANCE);

		// Create package meta-data objects
		theDistance_functionsPackage.createPackageContents();
		theAIMLPackage.createPackageContents();
		theModulePackage.createPackageContents();
		theTensorPackage.createPackageContents();
		theDatatypesPackage.createPackageContents();
		thePooling_layersPackage.createPackageContents();
		theConvolution_layersPackage.createPackageContents();
		theLayer_weight_constraintsPackage.createPackageContents();
		thePadding_layersPackage.createPackageContents();
		theNonLinearActivationsPackage.createPackageContents();
		theSoftMinMaxActivationsPackage.createPackageContents();
		theNormalization_layersPackage.createPackageContents();
		theRecurrent_layersPackage.createPackageContents();
		theTransformer_layersPackage.createPackageContents();
		theLinear_layersPackage.createPackageContents();
		theDropout_layersPackage.createPackageContents();
		theSparse_layersPackage.createPackageContents();
		theLoss_functionsPackage.createPackageContents();
		theVision_layersPackage.createPackageContents();
		theDataParallel_layersPackage.createPackageContents();
		theLayer_weight_regularizersPackage.createPackageContents();
		theLayer_weight_initializersPackage.createPackageContents();

		// Initialize created meta-data
		theDistance_functionsPackage.initializePackageContents();
		theAIMLPackage.initializePackageContents();
		theModulePackage.initializePackageContents();
		theTensorPackage.initializePackageContents();
		theDatatypesPackage.initializePackageContents();
		thePooling_layersPackage.initializePackageContents();
		theConvolution_layersPackage.initializePackageContents();
		theLayer_weight_constraintsPackage.initializePackageContents();
		thePadding_layersPackage.initializePackageContents();
		theNonLinearActivationsPackage.initializePackageContents();
		theSoftMinMaxActivationsPackage.initializePackageContents();
		theNormalization_layersPackage.initializePackageContents();
		theRecurrent_layersPackage.initializePackageContents();
		theTransformer_layersPackage.initializePackageContents();
		theLinear_layersPackage.initializePackageContents();
		theDropout_layersPackage.initializePackageContents();
		theSparse_layersPackage.initializePackageContents();
		theLoss_functionsPackage.initializePackageContents();
		theVision_layersPackage.initializePackageContents();
		theDataParallel_layersPackage.initializePackageContents();
		theLayer_weight_regularizersPackage.initializePackageContents();
		theLayer_weight_initializersPackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theDistance_functionsPackage.freeze();

		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(Distance_functionsPackage.eNS_URI, theDistance_functionsPackage);
		return theDistance_functionsPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDistance_functions() {
		return distance_functionsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getDistance_functions_Eps() {
		return (EAttribute)distance_functionsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getCosineSimilarity() {
		return cosineSimilarityEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getCosineSimilarity_Dim() {
		return (EAttribute)cosineSimilarityEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getPairwiseDistance() {
		return pairwiseDistanceEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getPairwiseDistance_P() {
		return (EAttribute)pairwiseDistanceEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getPairwiseDistance_Keepdim() {
		return (EAttribute)pairwiseDistanceEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Distance_functionsFactory getDistance_functionsFactory() {
		return (Distance_functionsFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		distance_functionsEClass = createEClass(DISTANCE_FUNCTIONS);
		createEAttribute(distance_functionsEClass, DISTANCE_FUNCTIONS__EPS);

		cosineSimilarityEClass = createEClass(COSINE_SIMILARITY);
		createEAttribute(cosineSimilarityEClass, COSINE_SIMILARITY__DIM);

		pairwiseDistanceEClass = createEClass(PAIRWISE_DISTANCE);
		createEAttribute(pairwiseDistanceEClass, PAIRWISE_DISTANCE__P);
		createEAttribute(pairwiseDistanceEClass, PAIRWISE_DISTANCE__KEEPDIM);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		ModulePackage theModulePackage = (ModulePackage)EPackage.Registry.INSTANCE.getEPackage(ModulePackage.eNS_URI);
		TypesPackage theTypesPackage = (TypesPackage)EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		distance_functionsEClass.getESuperTypes().add(theModulePackage.getModel());
		cosineSimilarityEClass.getESuperTypes().add(this.getDistance_functions());
		pairwiseDistanceEClass.getESuperTypes().add(this.getDistance_functions());

		// Initialize classes, features, and operations; add parameters
		initEClass(distance_functionsEClass, Distance_functions.class, "Distance_functions", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getDistance_functions_Eps(), theTypesPackage.getReal(), "eps", null, 0, 1, Distance_functions.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$

		initEClass(cosineSimilarityEClass, CosineSimilarity.class, "CosineSimilarity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getCosineSimilarity_Dim(), theTypesPackage.getInteger(), "dim", null, 0, 1, CosineSimilarity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$

		initEClass(pairwiseDistanceEClass, PairwiseDistance.class, "PairwiseDistance", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getPairwiseDistance_P(), theTypesPackage.getReal(), "p", null, 0, 1, PairwiseDistance.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
		initEAttribute(getPairwiseDistance_Keepdim(), theTypesPackage.getBoolean(), "keepdim", null, 0, 1, PairwiseDistance.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
	}

} //Distance_functionsPackageImpl
