/**
 * 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.Layer_weight_initializers.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.Distance_functionsPackage;

import org.eclipse.papyrus.aiml.profile.AIML.Distance_functions.impl.Distance_functionsPackageImpl;

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_initializersFactory;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.Layer_weight_initializersPackage;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.constant;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.glorot_normal;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.glorot_uniform;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.identity;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.initializer_with_gain;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.initializer_with_mean_stddev;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.initializer_with_seed;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.ones;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.orthogonal;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.random_normal;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.random_uniform;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.truncated_normal;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.variance_scaling;
import org.eclipse.papyrus.aiml.profile.AIML.Layer_weight_initializers.zeros;

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 Layer_weight_initializersPackageImpl extends EPackageImpl implements Layer_weight_initializersPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass random_normalEClass = null;

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass variance_scalingEClass = 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.Layer_weight_initializers.Layer_weight_initializersPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private Layer_weight_initializersPackageImpl() {
		super(eNS_URI, Layer_weight_initializersFactory.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 Layer_weight_initializersPackage#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 Layer_weight_initializersPackage init() {
		if (isInited) return (Layer_weight_initializersPackage)EPackage.Registry.INSTANCE.getEPackage(Layer_weight_initializersPackage.eNS_URI);

		// Obtain or create and register package
		Object registeredLayer_weight_initializersPackage = EPackage.Registry.INSTANCE.get(eNS_URI);
		Layer_weight_initializersPackageImpl theLayer_weight_initializersPackage = registeredLayer_weight_initializersPackage instanceof Layer_weight_initializersPackageImpl ? (Layer_weight_initializersPackageImpl)registeredLayer_weight_initializersPackage : new Layer_weight_initializersPackageImpl();

		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(Distance_functionsPackage.eNS_URI);
		Distance_functionsPackageImpl theDistance_functionsPackage = (Distance_functionsPackageImpl)(registeredPackage instanceof Distance_functionsPackageImpl ? registeredPackage : Distance_functionsPackage.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);

		// Create package meta-data objects
		theLayer_weight_initializersPackage.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();
		theDistance_functionsPackage.createPackageContents();
		theLoss_functionsPackage.createPackageContents();
		theVision_layersPackage.createPackageContents();
		theDataParallel_layersPackage.createPackageContents();
		theLayer_weight_regularizersPackage.createPackageContents();

		// Initialize created meta-data
		theLayer_weight_initializersPackage.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();
		theDistance_functionsPackage.initializePackageContents();
		theLoss_functionsPackage.initializePackageContents();
		theVision_layersPackage.initializePackageContents();
		theDataParallel_layersPackage.initializePackageContents();
		theLayer_weight_regularizersPackage.initializePackageContents();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Layer_weight_initializersFactory getLayer_weight_initializersFactory() {
		return (Layer_weight_initializersFactory)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
		random_normalEClass = createEClass(RANDOM_NORMAL);

		initializer_with_mean_stddevEClass = createEClass(INITIALIZER_WITH_MEAN_STDDEV);
		createEAttribute(initializer_with_mean_stddevEClass, INITIALIZER_WITH_MEAN_STDDEV__MEAN);
		createEAttribute(initializer_with_mean_stddevEClass, INITIALIZER_WITH_MEAN_STDDEV__STDDEV);

		initializer_with_seedEClass = createEClass(INITIALIZER_WITH_SEED);
		createEAttribute(initializer_with_seedEClass, INITIALIZER_WITH_SEED__SEED);

		random_uniformEClass = createEClass(RANDOM_UNIFORM);
		createEAttribute(random_uniformEClass, RANDOM_UNIFORM__MINVAL);
		createEAttribute(random_uniformEClass, RANDOM_UNIFORM__MAXVAL);

		truncated_normalEClass = createEClass(TRUNCATED_NORMAL);

		zerosEClass = createEClass(ZEROS);

		onesEClass = createEClass(ONES);

		glorot_normalEClass = createEClass(GLOROT_NORMAL);

		glorot_uniformEClass = createEClass(GLOROT_UNIFORM);

		identityEClass = createEClass(IDENTITY);

		initializer_with_gainEClass = createEClass(INITIALIZER_WITH_GAIN);
		createEAttribute(initializer_with_gainEClass, INITIALIZER_WITH_GAIN__GAIN);

		orthogonalEClass = createEClass(ORTHOGONAL);

		constantEClass = createEClass(CONSTANT);
		createEAttribute(constantEClass, CONSTANT__VALUE);

		variance_scalingEClass = createEClass(VARIANCE_SCALING);
		createEAttribute(variance_scalingEClass, VARIANCE_SCALING__SCALE);
		createEAttribute(variance_scalingEClass, VARIANCE_SCALING__MODE);
		createEAttribute(variance_scalingEClass, VARIANCE_SCALING__DISTRIBUTION);
	}

	/**
	 * <!-- 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
		TypesPackage theTypesPackage = (TypesPackage)EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		random_normalEClass.getESuperTypes().add(this.getinitializer_with_mean_stddev());
		initializer_with_mean_stddevEClass.getESuperTypes().add(this.getinitializer_with_seed());
		random_uniformEClass.getESuperTypes().add(this.getinitializer_with_seed());
		truncated_normalEClass.getESuperTypes().add(this.getinitializer_with_mean_stddev());
		glorot_normalEClass.getESuperTypes().add(this.getinitializer_with_seed());
		glorot_uniformEClass.getESuperTypes().add(this.getinitializer_with_seed());
		identityEClass.getESuperTypes().add(this.getinitializer_with_gain());
		orthogonalEClass.getESuperTypes().add(this.getinitializer_with_gain());
		orthogonalEClass.getESuperTypes().add(this.getinitializer_with_seed());
		variance_scalingEClass.getESuperTypes().add(this.getinitializer_with_seed());

		// Initialize classes, features, and operations; add parameters
		initEClass(random_normalEClass, random_normal.class, "random_normal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		initEClass(initializer_with_mean_stddevEClass, initializer_with_mean_stddev.class, "initializer_with_mean_stddev", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getinitializer_with_mean_stddev_Mean(), theTypesPackage.getReal(), "mean", null, 1, 1, initializer_with_mean_stddev.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
		initEAttribute(getinitializer_with_mean_stddev_Stddev(), theTypesPackage.getReal(), "stddev", null, 1, 1, initializer_with_mean_stddev.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$

		initEClass(initializer_with_seedEClass, initializer_with_seed.class, "initializer_with_seed", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getinitializer_with_seed_Seed(), theTypesPackage.getInteger(), "seed", null, 1, 1, initializer_with_seed.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$

		initEClass(random_uniformEClass, random_uniform.class, "random_uniform", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getrandom_uniform_Minval(), theTypesPackage.getReal(), "minval", null, 1, 1, random_uniform.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
		initEAttribute(getrandom_uniform_Maxval(), theTypesPackage.getReal(), "maxval", null, 1, 1, random_uniform.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$

		initEClass(truncated_normalEClass, truncated_normal.class, "truncated_normal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		initEClass(zerosEClass, zeros.class, "zeros", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		initEClass(onesEClass, ones.class, "ones", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		initEClass(glorot_normalEClass, glorot_normal.class, "glorot_normal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		initEClass(glorot_uniformEClass, glorot_uniform.class, "glorot_uniform", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		initEClass(identityEClass, identity.class, "identity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		initEClass(initializer_with_gainEClass, initializer_with_gain.class, "initializer_with_gain", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getinitializer_with_gain_Gain(), theTypesPackage.getReal(), "gain", null, 1, 1, initializer_with_gain.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$

		initEClass(orthogonalEClass, orthogonal.class, "orthogonal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		initEClass(constantEClass, constant.class, "constant", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getconstant_Value(), theTypesPackage.getReal(), "value", null, 1, 1, constant.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$

		initEClass(variance_scalingEClass, variance_scaling.class, "variance_scaling", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(getvariance_scaling_Scale(), theTypesPackage.getReal(), "scale", null, 1, 1, variance_scaling.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
		initEAttribute(getvariance_scaling_Mode(), theTypesPackage.getString(), "mode", null, 1, 1, variance_scaling.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
		initEAttribute(getvariance_scaling_Distribution(), theTypesPackage.getString(), "distribution", null, 1, 1, variance_scaling.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
	}

} //Layer_weight_initializersPackageImpl
