/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.eclipse.stem.diseasemodels.vector;

import org.eclipse.stem.diseasemodels.standard.StandardDiseaseModelLabelValue;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Dengue Model Vector Label Value</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getE1 <em>E1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getE2 <em>E2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getE3 <em>E3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getE4 <em>E4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getI1 <em>I1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getI2 <em>I2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getI3 <em>I3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getI4 <em>I4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getIncidence1 <em>Incidence1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getIncidence2 <em>Incidence2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getIncidence3 <em>Incidence3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getIncidence4 <em>Incidence4</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue()
 * @model
 * @generated
 */
public interface DengueModelVectorLabelValue extends StandardDiseaseModelLabelValue {
	/**
	 * Returns the value of the '<em><b>E1</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>E1</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>E1</em>' attribute.
	 * @see #setE1(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_E1()
	 * @model
	 * @generated
	 */
	double getE1();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getE1 <em>E1</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>E1</em>' attribute.
	 * @see #getE1()
	 * @generated
	 */
	void setE1(double value);

	/**
	 * Returns the value of the '<em><b>E2</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>E2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>E2</em>' attribute.
	 * @see #setE2(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_E2()
	 * @model
	 * @generated
	 */
	double getE2();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getE2 <em>E2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>E2</em>' attribute.
	 * @see #getE2()
	 * @generated
	 */
	void setE2(double value);

	/**
	 * Returns the value of the '<em><b>E3</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>E3</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>E3</em>' attribute.
	 * @see #setE3(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_E3()
	 * @model
	 * @generated
	 */
	double getE3();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getE3 <em>E3</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>E3</em>' attribute.
	 * @see #getE3()
	 * @generated
	 */
	void setE3(double value);

	/**
	 * Returns the value of the '<em><b>E4</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>E4</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>E4</em>' attribute.
	 * @see #setE4(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_E4()
	 * @model
	 * @generated
	 */
	double getE4();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getE4 <em>E4</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>E4</em>' attribute.
	 * @see #getE4()
	 * @generated
	 */
	void setE4(double value);

	/**
	 * Returns the value of the '<em><b>I1</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>I1</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>I1</em>' attribute.
	 * @see #setI1(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_I1()
	 * @model
	 * @generated
	 */
	double getI1();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getI1 <em>I1</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>I1</em>' attribute.
	 * @see #getI1()
	 * @generated
	 */
	void setI1(double value);

	/**
	 * Returns the value of the '<em><b>I2</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>I2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>I2</em>' attribute.
	 * @see #setI2(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_I2()
	 * @model
	 * @generated
	 */
	double getI2();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getI2 <em>I2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>I2</em>' attribute.
	 * @see #getI2()
	 * @generated
	 */
	void setI2(double value);

	/**
	 * Returns the value of the '<em><b>I3</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>I3</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>I3</em>' attribute.
	 * @see #setI3(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_I3()
	 * @model
	 * @generated
	 */
	double getI3();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getI3 <em>I3</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>I3</em>' attribute.
	 * @see #getI3()
	 * @generated
	 */
	void setI3(double value);

	/**
	 * Returns the value of the '<em><b>I4</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>I4</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>I4</em>' attribute.
	 * @see #setI4(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_I4()
	 * @model
	 * @generated
	 */
	double getI4();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getI4 <em>I4</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>I4</em>' attribute.
	 * @see #getI4()
	 * @generated
	 */
	void setI4(double value);

	/**
	 * Returns the value of the '<em><b>Incidence1</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Incidence1</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Incidence1</em>' attribute.
	 * @see #setIncidence1(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_Incidence1()
	 * @model
	 * @generated
	 */
	double getIncidence1();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getIncidence1 <em>Incidence1</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Incidence1</em>' attribute.
	 * @see #getIncidence1()
	 * @generated
	 */
	void setIncidence1(double value);

	/**
	 * Returns the value of the '<em><b>Incidence2</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Incidence2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Incidence2</em>' attribute.
	 * @see #setIncidence2(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_Incidence2()
	 * @model
	 * @generated
	 */
	double getIncidence2();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getIncidence2 <em>Incidence2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Incidence2</em>' attribute.
	 * @see #getIncidence2()
	 * @generated
	 */
	void setIncidence2(double value);

	/**
	 * Returns the value of the '<em><b>Incidence3</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Incidence3</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Incidence3</em>' attribute.
	 * @see #setIncidence3(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_Incidence3()
	 * @model
	 * @generated
	 */
	double getIncidence3();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getIncidence3 <em>Incidence3</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Incidence3</em>' attribute.
	 * @see #getIncidence3()
	 * @generated
	 */
	void setIncidence3(double value);

	/**
	 * Returns the value of the '<em><b>Incidence4</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Incidence4</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Incidence4</em>' attribute.
	 * @see #setIncidence4(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getDengueModelVectorLabelValue_Incidence4()
	 * @model
	 * @generated
	 */
	double getIncidence4();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.DengueModelVectorLabelValue#getIncidence4 <em>Incidence4</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Incidence4</em>' attribute.
	 * @see #getIncidence4()
	 * @generated
	 */
	void setIncidence4(double value);

} // DengueModelVectorLabelValue
