package org.eclipse.stem.diseasemodels.vector.impl;

/*******************************************************************************
 * Copyright (c) 2011 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.common.notify.Notification;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.stem.core.graph.IntegrationLabelValue;
import org.eclipse.stem.core.graph.LabelValue;
import org.eclipse.stem.diseasemodels.standard.impl.StandardDiseaseModelLabelValueImpl;

import org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue;
import org.eclipse.stem.diseasemodels.vector.VectorPackage;

/**
 * <!-- begin-user-doc --> An implementation of the model object '
 * <em><b>Dengue Model Vector Label Value</b></em>'. <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * <ul>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getE1 <em>E1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getE2 <em>E2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getE3 <em>E3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getE4 <em>E4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getI1 <em>I1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getI2 <em>I2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getI3 <em>I3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getI4 <em>I4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getIncidence1 <em>Incidence1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getIncidence2 <em>Incidence2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getIncidence3 <em>Incidence3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.impl.DengueModelVectorLabelValueImpl#getIncidence4 <em>Incidence4</em>}</li>
 * </ul>
 * </p>
 *
 * @generated
 */
public class DengueModelVectorLabelValueImpl extends
		StandardDiseaseModelLabelValueImpl implements
		DengueModelVectorLabelValue {
	/**
	 * The default value of the '{@link #getE1() <em>E1</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getE1()
	 * @generated
	 * @ordered
	 */
	protected static final double E1_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getE1() <em>E1</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getE1()
	 * @generated
	 * @ordered
	 */
	protected double e1 = E1_EDEFAULT;

	/**
	 * The default value of the '{@link #getE2() <em>E2</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getE2()
	 * @generated
	 * @ordered
	 */
	protected static final double E2_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getE2() <em>E2</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getE2()
	 * @generated
	 * @ordered
	 */
	protected double e2 = E2_EDEFAULT;

	/**
	 * The default value of the '{@link #getE3() <em>E3</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getE3()
	 * @generated
	 * @ordered
	 */
	protected static final double E3_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getE3() <em>E3</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getE3()
	 * @generated
	 * @ordered
	 */
	protected double e3 = E3_EDEFAULT;

	/**
	 * The default value of the '{@link #getE4() <em>E4</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getE4()
	 * @generated
	 * @ordered
	 */
	protected static final double E4_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getE4() <em>E4</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getE4()
	 * @generated
	 * @ordered
	 */
	protected double e4 = E4_EDEFAULT;

	/**
	 * The default value of the '{@link #getI1() <em>I1</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getI1()
	 * @generated
	 * @ordered
	 */
	protected static final double I1_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getI1() <em>I1</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getI1()
	 * @generated
	 * @ordered
	 */
	protected double i1 = I1_EDEFAULT;

	/**
	 * The default value of the '{@link #getI2() <em>I2</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getI2()
	 * @generated
	 * @ordered
	 */
	protected static final double I2_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getI2() <em>I2</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getI2()
	 * @generated
	 * @ordered
	 */
	protected double i2 = I2_EDEFAULT;

	/**
	 * The default value of the '{@link #getI3() <em>I3</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getI3()
	 * @generated
	 * @ordered
	 */
	protected static final double I3_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getI3() <em>I3</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getI3()
	 * @generated
	 * @ordered
	 */
	protected double i3 = I3_EDEFAULT;

	/**
	 * The default value of the '{@link #getI4() <em>I4</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getI4()
	 * @generated
	 * @ordered
	 */
	protected static final double I4_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getI4() <em>I4</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @see #getI4()
	 * @generated
	 * @ordered
	 */
	protected double i4 = I4_EDEFAULT;

	/**
	 * The default value of the '{@link #getIncidence1() <em>Incidence1</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @see #getIncidence1()
	 * @generated
	 * @ordered
	 */
	protected static final double INCIDENCE1_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getIncidence1() <em>Incidence1</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @see #getIncidence1()
	 * @generated
	 * @ordered
	 */
	protected double incidence1 = INCIDENCE1_EDEFAULT;

	/**
	 * The default value of the '{@link #getIncidence2() <em>Incidence2</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @see #getIncidence2()
	 * @generated
	 * @ordered
	 */
	protected static final double INCIDENCE2_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getIncidence2() <em>Incidence2</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @see #getIncidence2()
	 * @generated
	 * @ordered
	 */
	protected double incidence2 = INCIDENCE2_EDEFAULT;

	/**
	 * The default value of the '{@link #getIncidence3() <em>Incidence3</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @see #getIncidence3()
	 * @generated
	 * @ordered
	 */
	protected static final double INCIDENCE3_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getIncidence3() <em>Incidence3</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @see #getIncidence3()
	 * @generated
	 * @ordered
	 */
	protected double incidence3 = INCIDENCE3_EDEFAULT;

	/**
	 * The default value of the '{@link #getIncidence4() <em>Incidence4</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @see #getIncidence4()
	 * @generated
	 * @ordered
	 */
	protected static final double INCIDENCE4_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getIncidence4() <em>Incidence4</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @see #getIncidence4()
	 * @generated
	 * @ordered
	 */
	protected double incidence4 = INCIDENCE4_EDEFAULT;

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected DengueModelVectorLabelValueImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return VectorPackage.Literals.DENGUE_MODEL_VECTOR_LABEL_VALUE;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getE1() {
		return e1;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setE1(double newE1) {
		double oldE1 = e1;
		e1 = newE1;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E1, oldE1, e1));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getE2() {
		return e2;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setE2(double newE2) {
		double oldE2 = e2;
		e2 = newE2;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E2, oldE2, e2));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getE3() {
		return e3;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setE3(double newE3) {
		double oldE3 = e3;
		e3 = newE3;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E3, oldE3, e3));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getE4() {
		return e4;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setE4(double newE4) {
		double oldE4 = e4;
		e4 = newE4;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E4, oldE4, e4));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getI1() {
		return i1;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setI1(double newI1) {
		double oldI1 = i1;
		i1 = newI1;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I1, oldI1, i1));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getI2() {
		return i2;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setI2(double newI2) {
		double oldI2 = i2;
		i2 = newI2;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I2, oldI2, i2));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getI3() {
		return i3;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setI3(double newI3) {
		double oldI3 = i3;
		i3 = newI3;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I3, oldI3, i3));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getI4() {
		return i4;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setI4(double newI4) {
		double oldI4 = i4;
		i4 = newI4;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I4, oldI4, i4));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getIncidence1() {
		return incidence1;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setIncidence1(double newIncidence1) {
		double oldIncidence1 = incidence1;
		incidence1 = newIncidence1;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE1, oldIncidence1, incidence1));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getIncidence2() {
		return incidence2;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setIncidence2(double newIncidence2) {
		double oldIncidence2 = incidence2;
		incidence2 = newIncidence2;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE2, oldIncidence2, incidence2));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getIncidence3() {
		return incidence3;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setIncidence3(double newIncidence3) {
		double oldIncidence3 = incidence3;
		incidence3 = newIncidence3;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE3, oldIncidence3, incidence3));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public double getIncidence4() {
		return incidence4;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void setIncidence4(double newIncidence4) {
		double oldIncidence4 = incidence4;
		incidence4 = newIncidence4;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE4, oldIncidence4, incidence4));
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E1:
				return getE1();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E2:
				return getE2();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E3:
				return getE3();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E4:
				return getE4();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I1:
				return getI1();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I2:
				return getI2();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I3:
				return getI3();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I4:
				return getI4();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE1:
				return getIncidence1();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE2:
				return getIncidence2();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE3:
				return getIncidence3();
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE4:
				return getIncidence4();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E1:
				setE1((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E2:
				setE2((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E3:
				setE3((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E4:
				setE4((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I1:
				setI1((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I2:
				setI2((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I3:
				setI3((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I4:
				setI4((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE1:
				setIncidence1((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE2:
				setIncidence2((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE3:
				setIncidence3((Double)newValue);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE4:
				setIncidence4((Double)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E1:
				setE1(E1_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E2:
				setE2(E2_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E3:
				setE3(E3_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E4:
				setE4(E4_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I1:
				setI1(I1_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I2:
				setI2(I2_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I3:
				setI3(I3_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I4:
				setI4(I4_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE1:
				setIncidence1(INCIDENCE1_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE2:
				setIncidence2(INCIDENCE2_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE3:
				setIncidence3(INCIDENCE3_EDEFAULT);
				return;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE4:
				setIncidence4(INCIDENCE4_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E1:
				return e1 != E1_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E2:
				return e2 != E2_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E3:
				return e3 != E3_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__E4:
				return e4 != E4_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I1:
				return i1 != I1_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I2:
				return i2 != I2_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I3:
				return i3 != I3_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__I4:
				return i4 != I4_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE1:
				return incidence1 != INCIDENCE1_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE2:
				return incidence2 != INCIDENCE2_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE3:
				return incidence3 != INCIDENCE3_EDEFAULT;
			case VectorPackage.DENGUE_MODEL_VECTOR_LABEL_VALUE__INCIDENCE4:
				return incidence4 != INCIDENCE4_EDEFAULT;
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (E1: ");
		result.append(e1);
		result.append(", E2: ");
		result.append(e2);
		result.append(", E3: ");
		result.append(e3);
		result.append(", E4: ");
		result.append(e4);
		result.append(", I1: ");
		result.append(i1);
		result.append(", I2: ");
		result.append(i2);
		result.append(", I3: ");
		result.append(i3);
		result.append(", I4: ");
		result.append(i4);
		result.append(", incidence1: ");
		result.append(incidence1);
		result.append(", incidence2: ");
		result.append(incidence2);
		result.append(", incidence3: ");
		result.append(incidence3);
		result.append(", incidence4: ");
		result.append(incidence4);
		result.append(')');
		return result.toString();
	}

	@Override
	public IntegrationLabelValue set(IntegrationLabelValue value) {
		DengueModelVectorLabelValue v = (DengueModelVectorLabelValue) value;

		super.set(value);

		setE1(v.getE1());
		setE2(v.getE2());
		setE3(v.getE3());
		setE4(v.getE4());

		setI1(v.getI1());
		setI2(v.getI2());
		setI3(v.getI3());
		setI4(v.getI4());

		setIncidence1(v.getIncidence1());
		setIncidence2(v.getIncidence2());
		setIncidence3(v.getIncidence3());
		setIncidence4(v.getIncidence4());

		return this;
	}

	@Override
	public IntegrationLabelValue add(IntegrationLabelValue value) {
		DengueModelVectorLabelValue v = (DengueModelVectorLabelValue) value;

		super.add(value);

		setE1(getE1() + v.getE1());
		setE2(getE2() + v.getE2());
		setE3(getE3() + v.getE3());
		setE4(getE4() + v.getE4());

		setI1(getI1() + v.getI1());
		setI2(getI2() + v.getI2());
		setI3(getI3() + v.getI3());
		setI4(getI4() + v.getI4());

		setIncidence1(getIncidence1() + v.getIncidence1());
		setIncidence2(getIncidence2() + v.getIncidence2());
		setIncidence3(getIncidence3() + v.getIncidence3());
		setIncidence4(getIncidence4() + v.getIncidence4());

		return this;
	}

	@Override
	public IntegrationLabelValue sub(IntegrationLabelValue value) {
		DengueModelVectorLabelValue v = (DengueModelVectorLabelValue) value;

		super.sub(value);

		setE1(getE1() - v.getE1());
		setE2(getE2() - v.getE2());
		setE3(getE3() - v.getE3());
		setE4(getE4() - v.getE4());

		setI1(getI1() - v.getI1());
		setI2(getI2() - v.getI2());
		setI3(getI3() - v.getI3());
		setI4(getI4() - v.getI4());

		setIncidence1(getIncidence1() - v.getIncidence1());
		setIncidence2(getIncidence2() - v.getIncidence2());
		setIncidence3(getIncidence3() - v.getIncidence3());
		setIncidence4(getIncidence4() - v.getIncidence4());

		return this;
	}

	@Override
	public IntegrationLabelValue scale(double scaleFactor) {
		super.scale(scaleFactor);

		setE1(scaleFactor * getE1());
		setE2(scaleFactor * getE2());
		setE3(scaleFactor * getE3());
		setE4(scaleFactor * getE4());

		setI1(scaleFactor * getI1());
		setI2(scaleFactor * getI2());
		setI3(scaleFactor * getI3());
		setI4(scaleFactor * getI4());

		setIncidence1(scaleFactor * getIncidence1());
		setIncidence2(scaleFactor * getIncidence2());
		setIncidence3(scaleFactor * getIncidence3());
		setIncidence4(scaleFactor * getIncidence4());

		return this;
	}

	@Override
	public boolean avoidNegative(IntegrationLabelValue value) {
		DengueModelVectorLabelValue v = (DengueModelVectorLabelValue) value;
		boolean adjusted = super.avoidNegative(value);

		if (getE1() + v.getE1() < 0.0) {
			setE1(-v.getE1());
			adjusted = true;
		}
		if (getE2() + v.getE2() < 0.0) {
			setE2(-v.getE2());
			adjusted = true;
		}
		if (getE3() + v.getE3() < 0.0) {
			setE3(-v.getE3());
			adjusted = true;
		}
		if (getE4() + v.getE4() < 0.0) {
			setE4(-v.getE4());
			adjusted = true;
		}

		if (getI1() + v.getI1() < 0.0) {
			setI1(-v.getI1());
			adjusted = true;
		}
		if (getI2() + v.getI2() < 0.0) {
			setI2(-v.getI2());
			adjusted = true;
		}
		if (getI3() + v.getI3() < 0.0) {
			setI3(-v.getI3());
			adjusted = true;
		}
		if (getI4() + v.getI4() < 0.0) {
			setI4(-v.getI4());
			adjusted = true;
		}

		if (getIncidence1() + v.getIncidence1() < 0.0) {
			setIncidence1(-v.getIncidence1());
			adjusted = true;
		}
		if (getIncidence2() + v.getIncidence2() < 0.0) {
			setIncidence2(-v.getIncidence2());
			adjusted = true;
		}
		if (getIncidence3() + v.getIncidence3() < 0.0) {
			setIncidence3(-v.getIncidence3());
			adjusted = true;
		}
		if (getIncidence4() + v.getIncidence4() < 0.0) {
			setIncidence4(-v.getIncidence4());
			adjusted = true;
		}

		return adjusted;
	}

	@Override
	public double computeDeltaAdjustment(IntegrationLabelValue value) {
		DengueModelVectorLabelValue v = (DengueModelVectorLabelValue) value;
		double factor = super.computeDeltaAdjustment(value);

		if (getE1() + v.getE1() < 0.0) {
			factor = Math.min(factor, -v.getE1() / getE1());
		}
		if (getE2() + v.getE2() < 0.0) {
			factor = Math.min(factor, -v.getE2() / getE2());
		}
		if (getE3() + v.getE3() < 0.0) {
			factor = Math.min(factor, -v.getE3() / getE3());
		}
		if (getE4() + v.getE4() < 0.0) {
			factor = Math.min(factor, -v.getE4() / getE4());
		}

		if (getI1() + v.getI1() < 0.0) {
			factor = Math.min(factor, -v.getI1() / getI1());
		}
		if (getI2() + v.getI2() < 0.0) {
			factor = Math.min(factor, -v.getI2() / getI2());
		}
		if (getI3() + v.getI3() < 0.0) {
			factor = Math.min(factor, -v.getI3() / getI3());
		}
		if (getI4() + v.getI4() < 0.0) {
			factor = Math.min(factor, -v.getI4() / getI4());
		}

		if (getIncidence1() + v.getIncidence1() < 0.0) {
			factor = Math.min(factor, -v.getIncidence1() / getIncidence1());
		}
		if (getIncidence2() + v.getIncidence2() < 0.0) {
			factor = Math.min(factor, -v.getIncidence2() / getIncidence2());
		}
		if (getIncidence3() + v.getIncidence3() < 0.0) {
			factor = Math.min(factor, -v.getIncidence3() / getIncidence3());
		}
		if (getIncidence4() + v.getIncidence4() < 0.0) {
			factor = Math.min(factor, -v.getIncidence4() / getIncidence4());
		}

		return factor;
	}

	@Override
	public void prepareCycle() {
		super.prepareCycle();
		
		setIncidence1(0.0);
		setIncidence2(0.0);
		setIncidence3(0.0);
		setIncidence4(0.0);
	}

	@Override
	public void reset() {
		super.reset();

		setE1(0.0);
		setE2(0.0);
		setE3(0.0);
		setE4(0.0);

		setI1(0.0);
		setI2(0.0);
		setI3(0.0);
		setI4(0.0);

		setIncidence1(0.0);
		setIncidence2(0.0);
		setIncidence3(0.0);
		setIncidence4(0.0);
		
		getArrivals().clear();
		getDepartures().clear();
	}

	@Override
	public double getPopulationCount() {
		double count = super.getPopulationCount();
		
		count += getE1();
		count += getE2();
		count += getE3();
		count += getE4();
		
		count += getI1();
		count += getI2();
		count += getI3();
		count += getI4();
		
		return count;
	}
	
	@Override
	public IntegrationLabelValue add(double addition) {
		super.add(addition);

		setE1(getE1() + addition);
		setE2(getE2() + addition);
		setE3(getE3() + addition);
		setE4(getE4() + addition);

		setI1(getI1() + addition);
		setI2(getI2() + addition);
		setI3(getI3() + addition);
		setI4(getI4() + addition);

		return this;
	}

	@Override
	public IntegrationLabelValue abs() {
		super.abs();

		setE1(Math.abs(getE1()));
		setE2(Math.abs(getE2()));
		setE3(Math.abs(getE3()));
		setE4(Math.abs(getE4()));

		setI1(Math.abs(getI1()));
		setI2(Math.abs(getI2()));
		setI3(Math.abs(getI3()));
		setI4(Math.abs(getI4()));

		return this;
	}

	@Override
	public IntegrationLabelValue divide(IntegrationLabelValue value) {
		DengueModelVectorLabelValue v = (DengueModelVectorLabelValue) value;

		super.divide(value);

		setE1(Math.abs(getE1() / v.getE1()));
		setE2(Math.abs(getE2() / v.getE2()));
		setE3(Math.abs(getE3() / v.getE3()));
		setE4(Math.abs(getE4() / v.getE4()));

		setI1(Math.abs(getI1() / v.getI1()));
		setI2(Math.abs(getI2() / v.getI2()));
		setI3(Math.abs(getI3() / v.getI3()));
		setI4(Math.abs(getI4() / v.getI4()));

		return this;
	}

	@Override
	public double max() {
		double max = super.max();

		max = Math.max(max, getE1());
		max = Math.max(max, getE2());
		max = Math.max(max, getE3());
		max = Math.max(max, getE4());

		max = Math.max(max, getI1());
		max = Math.max(max, getI2());
		max = Math.max(max, getI3());
		max = Math.max(max, getI4());

		return max;
	}

	@Override
	public boolean sameValue(LabelValue otherLabelValue) {
		DengueModelVectorLabelValue v = (DengueModelVectorLabelValue) otherLabelValue;

		if (!super.sameValue(otherLabelValue)){
			return false;
		}

		if (getE1() != v.getE1()) {
			return false;
		}
		if (getE2() != v.getE2()) {
			return false;
		}
		if (getE3() != v.getE3()) {
			return false;
		}
		if (getE4() != v.getE4()) {
			return false;
		}

		if (getI1() != v.getI1()) {
			return false;
		}
		if (getI2() != v.getI2()) {
			return false;
		}
		if (getI3() != v.getI3()) {
			return false;
		}
		if (getI4() != v.getI4()) {
			return false;
		}

		if (getIncidence1() != v.getIncidence1()) {
			return false;
		}
		if (getIncidence2() != v.getIncidence2()) {
			return false;
		}
		if (getIncidence3() != v.getIncidence3()) {
			return false;
		}
		if (getIncidence4() != v.getIncidence4()) {
			return false;
		}

		return true;
	}
	
} // DengueModelVectorLabelValueImpl
