/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.eclipse.stem.diseasemodels.vector;


/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Simple Dengue Model</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getBitingRate <em>Biting Rate</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostInfectivity1 <em>Host Infectivity1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostInfectivity2 <em>Host Infectivity2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostInfectivity3 <em>Host Infectivity3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostInfectivity4 <em>Host Infectivity4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getCrossImmunity1 <em>Cross Immunity1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getCrossImmunity2 <em>Cross Immunity2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getCrossImmunity3 <em>Cross Immunity3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getCrossImmunity4 <em>Cross Immunity4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostPrimaryIncubationRate <em>Host Primary Incubation Rate</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostPrimaryRecoveryRate <em>Host Primary Recovery Rate</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostPrimaryImmunityLossRate <em>Host Primary Immunity Loss Rate</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostPrimaryDeathRate <em>Host Primary Death Rate</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostADE1 <em>Host ADE1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostADE2 <em>Host ADE2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostADE3 <em>Host ADE3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostADE4 <em>Host ADE4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostSecondaryIncubationRate <em>Host Secondary Incubation Rate</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostSecondaryRecoveryRate <em>Host Secondary Recovery Rate</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostSecondaryDeathRate <em>Host Secondary Death Rate</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorInfectivity1 <em>Vector Infectivity1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorInfectivity2 <em>Vector Infectivity2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorInfectivity3 <em>Vector Infectivity3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorInfectivity4 <em>Vector Infectivity4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorADE1 <em>Vector ADE1</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorADE2 <em>Vector ADE2</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorADE3 <em>Vector ADE3</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorADE4 <em>Vector ADE4</em>}</li>
 *   <li>{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorIncubationRate <em>Vector Incubation Rate</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel()
 * @model
 * @generated
 */
public interface SimpleDengueModel extends VectorDiseaseModel {
	/**
	 * Returns the value of the '<em><b>Biting Rate</b></em>' attribute.
	 * The default value is <code>"1.0"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Biting Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Biting Rate</em>' attribute.
	 * @see #setBitingRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_BitingRate()
	 * @model default="1.0"
	 * @generated
	 */
	double getBitingRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getBitingRate <em>Biting Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Biting Rate</em>' attribute.
	 * @see #getBitingRate()
	 * @generated
	 */
	void setBitingRate(double value);

	/**
	 * Returns the value of the '<em><b>Host Infectivity1</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Infectivity1</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Infectivity1</em>' attribute.
	 * @see #setHostInfectivity1(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostInfectivity1()
	 * @model default="0.5"
	 * @generated
	 */
	double getHostInfectivity1();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostInfectivity1 <em>Host Infectivity1</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Infectivity1</em>' attribute.
	 * @see #getHostInfectivity1()
	 * @generated
	 */
	void setHostInfectivity1(double value);

	/**
	 * Returns the value of the '<em><b>Host Infectivity2</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Infectivity2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Infectivity2</em>' attribute.
	 * @see #setHostInfectivity2(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostInfectivity2()
	 * @model default="0.5"
	 * @generated
	 */
	double getHostInfectivity2();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostInfectivity2 <em>Host Infectivity2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Infectivity2</em>' attribute.
	 * @see #getHostInfectivity2()
	 * @generated
	 */
	void setHostInfectivity2(double value);

	/**
	 * Returns the value of the '<em><b>Host Infectivity3</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Infectivity3</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Infectivity3</em>' attribute.
	 * @see #setHostInfectivity3(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostInfectivity3()
	 * @model default="0.5"
	 * @generated
	 */
	double getHostInfectivity3();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostInfectivity3 <em>Host Infectivity3</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Infectivity3</em>' attribute.
	 * @see #getHostInfectivity3()
	 * @generated
	 */
	void setHostInfectivity3(double value);

	/**
	 * Returns the value of the '<em><b>Host Infectivity4</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Infectivity4</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Infectivity4</em>' attribute.
	 * @see #setHostInfectivity4(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostInfectivity4()
	 * @model default="0.5"
	 * @generated
	 */
	double getHostInfectivity4();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostInfectivity4 <em>Host Infectivity4</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Infectivity4</em>' attribute.
	 * @see #getHostInfectivity4()
	 * @generated
	 */
	void setHostInfectivity4(double value);

	/**
	 * Returns the value of the '<em><b>Cross Immunity1</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Cross Immunity1</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Cross Immunity1</em>' attribute.
	 * @see #setCrossImmunity1(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_CrossImmunity1()
	 * @model default="0.5"
	 * @generated
	 */
	double getCrossImmunity1();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getCrossImmunity1 <em>Cross Immunity1</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Cross Immunity1</em>' attribute.
	 * @see #getCrossImmunity1()
	 * @generated
	 */
	void setCrossImmunity1(double value);

	/**
	 * Returns the value of the '<em><b>Cross Immunity2</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Cross Immunity2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Cross Immunity2</em>' attribute.
	 * @see #setCrossImmunity2(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_CrossImmunity2()
	 * @model default="0.5"
	 * @generated
	 */
	double getCrossImmunity2();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getCrossImmunity2 <em>Cross Immunity2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Cross Immunity2</em>' attribute.
	 * @see #getCrossImmunity2()
	 * @generated
	 */
	void setCrossImmunity2(double value);

	/**
	 * Returns the value of the '<em><b>Cross Immunity3</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Cross Immunity3</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Cross Immunity3</em>' attribute.
	 * @see #setCrossImmunity3(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_CrossImmunity3()
	 * @model default="0.5"
	 * @generated
	 */
	double getCrossImmunity3();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getCrossImmunity3 <em>Cross Immunity3</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Cross Immunity3</em>' attribute.
	 * @see #getCrossImmunity3()
	 * @generated
	 */
	void setCrossImmunity3(double value);

	/**
	 * Returns the value of the '<em><b>Cross Immunity4</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Cross Immunity4</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Cross Immunity4</em>' attribute.
	 * @see #setCrossImmunity4(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_CrossImmunity4()
	 * @model default="0.5"
	 * @generated
	 */
	double getCrossImmunity4();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getCrossImmunity4 <em>Cross Immunity4</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Cross Immunity4</em>' attribute.
	 * @see #getCrossImmunity4()
	 * @generated
	 */
	void setCrossImmunity4(double value);

	/**
	 * Returns the value of the '<em><b>Host Primary Incubation Rate</b></em>' attribute.
	 * The default value is <code>"0.2"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Primary Incubation Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Primary Incubation Rate</em>' attribute.
	 * @see #setHostPrimaryIncubationRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostPrimaryIncubationRate()
	 * @model default="0.2"
	 * @generated
	 */
	double getHostPrimaryIncubationRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostPrimaryIncubationRate <em>Host Primary Incubation Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Primary Incubation Rate</em>' attribute.
	 * @see #getHostPrimaryIncubationRate()
	 * @generated
	 */
	void setHostPrimaryIncubationRate(double value);

	/**
	 * Returns the value of the '<em><b>Host Primary Recovery Rate</b></em>' attribute.
	 * The default value is <code>"0.14"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Primary Recovery Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Primary Recovery Rate</em>' attribute.
	 * @see #setHostPrimaryRecoveryRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostPrimaryRecoveryRate()
	 * @model default="0.14"
	 * @generated
	 */
	double getHostPrimaryRecoveryRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostPrimaryRecoveryRate <em>Host Primary Recovery Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Primary Recovery Rate</em>' attribute.
	 * @see #getHostPrimaryRecoveryRate()
	 * @generated
	 */
	void setHostPrimaryRecoveryRate(double value);

	/**
	 * Returns the value of the '<em><b>Host Primary Immunity Loss Rate</b></em>' attribute.
	 * The default value is <code>"0.024"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Primary Immunity Loss Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Primary Immunity Loss Rate</em>' attribute.
	 * @see #setHostPrimaryImmunityLossRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostPrimaryImmunityLossRate()
	 * @model default="0.024"
	 * @generated
	 */
	double getHostPrimaryImmunityLossRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostPrimaryImmunityLossRate <em>Host Primary Immunity Loss Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Primary Immunity Loss Rate</em>' attribute.
	 * @see #getHostPrimaryImmunityLossRate()
	 * @generated
	 */
	void setHostPrimaryImmunityLossRate(double value);

	/**
	 * Returns the value of the '<em><b>Host Primary Death Rate</b></em>' attribute.
	 * The default value is <code>"0.0000001"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Primary Death Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Primary Death Rate</em>' attribute.
	 * @see #setHostPrimaryDeathRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostPrimaryDeathRate()
	 * @model default="0.0000001"
	 * @generated
	 */
	double getHostPrimaryDeathRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostPrimaryDeathRate <em>Host Primary Death Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Primary Death Rate</em>' attribute.
	 * @see #getHostPrimaryDeathRate()
	 * @generated
	 */
	void setHostPrimaryDeathRate(double value);

	/**
	 * Returns the value of the '<em><b>Host ADE1</b></em>' attribute.
	 * The default value is <code>"1.8"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host ADE1</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host ADE1</em>' attribute.
	 * @see #setHostADE1(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostADE1()
	 * @model default="1.8"
	 * @generated
	 */
	double getHostADE1();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostADE1 <em>Host ADE1</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host ADE1</em>' attribute.
	 * @see #getHostADE1()
	 * @generated
	 */
	void setHostADE1(double value);

	/**
	 * Returns the value of the '<em><b>Host ADE2</b></em>' attribute.
	 * The default value is <code>"1.8"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host ADE2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host ADE2</em>' attribute.
	 * @see #setHostADE2(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostADE2()
	 * @model default="1.8"
	 * @generated
	 */
	double getHostADE2();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostADE2 <em>Host ADE2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host ADE2</em>' attribute.
	 * @see #getHostADE2()
	 * @generated
	 */
	void setHostADE2(double value);

	/**
	 * Returns the value of the '<em><b>Host ADE3</b></em>' attribute.
	 * The default value is <code>"1.8"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host ADE3</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host ADE3</em>' attribute.
	 * @see #setHostADE3(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostADE3()
	 * @model default="1.8"
	 * @generated
	 */
	double getHostADE3();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostADE3 <em>Host ADE3</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host ADE3</em>' attribute.
	 * @see #getHostADE3()
	 * @generated
	 */
	void setHostADE3(double value);

	/**
	 * Returns the value of the '<em><b>Host ADE4</b></em>' attribute.
	 * The default value is <code>"1.8"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host ADE4</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host ADE4</em>' attribute.
	 * @see #setHostADE4(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostADE4()
	 * @model default="1.8"
	 * @generated
	 */
	double getHostADE4();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostADE4 <em>Host ADE4</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host ADE4</em>' attribute.
	 * @see #getHostADE4()
	 * @generated
	 */
	void setHostADE4(double value);

	/**
	 * Returns the value of the '<em><b>Host Secondary Incubation Rate</b></em>' attribute.
	 * The default value is <code>"0.2"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Secondary Incubation Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Secondary Incubation Rate</em>' attribute.
	 * @see #setHostSecondaryIncubationRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostSecondaryIncubationRate()
	 * @model default="0.2"
	 * @generated
	 */
	double getHostSecondaryIncubationRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostSecondaryIncubationRate <em>Host Secondary Incubation Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Secondary Incubation Rate</em>' attribute.
	 * @see #getHostSecondaryIncubationRate()
	 * @generated
	 */
	void setHostSecondaryIncubationRate(double value);

	/**
	 * Returns the value of the '<em><b>Host Secondary Recovery Rate</b></em>' attribute.
	 * The default value is <code>"0.1"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Secondary Recovery Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Secondary Recovery Rate</em>' attribute.
	 * @see #setHostSecondaryRecoveryRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostSecondaryRecoveryRate()
	 * @model default="0.1"
	 * @generated
	 */
	double getHostSecondaryRecoveryRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostSecondaryRecoveryRate <em>Host Secondary Recovery Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Secondary Recovery Rate</em>' attribute.
	 * @see #getHostSecondaryRecoveryRate()
	 * @generated
	 */
	void setHostSecondaryRecoveryRate(double value);

	/**
	 * Returns the value of the '<em><b>Host Secondary Death Rate</b></em>' attribute.
	 * The default value is <code>"0.00123"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Host Secondary Death Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Host Secondary Death Rate</em>' attribute.
	 * @see #setHostSecondaryDeathRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_HostSecondaryDeathRate()
	 * @model default="0.00123"
	 * @generated
	 */
	double getHostSecondaryDeathRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getHostSecondaryDeathRate <em>Host Secondary Death Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Host Secondary Death Rate</em>' attribute.
	 * @see #getHostSecondaryDeathRate()
	 * @generated
	 */
	void setHostSecondaryDeathRate(double value);

	/**
	 * Returns the value of the '<em><b>Vector Infectivity1</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector Infectivity1</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector Infectivity1</em>' attribute.
	 * @see #setVectorInfectivity1(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorInfectivity1()
	 * @model default="0.5"
	 * @generated
	 */
	double getVectorInfectivity1();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorInfectivity1 <em>Vector Infectivity1</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector Infectivity1</em>' attribute.
	 * @see #getVectorInfectivity1()
	 * @generated
	 */
	void setVectorInfectivity1(double value);

	/**
	 * Returns the value of the '<em><b>Vector Infectivity2</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector Infectivity2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector Infectivity2</em>' attribute.
	 * @see #setVectorInfectivity2(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorInfectivity2()
	 * @model default="0.5"
	 * @generated
	 */
	double getVectorInfectivity2();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorInfectivity2 <em>Vector Infectivity2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector Infectivity2</em>' attribute.
	 * @see #getVectorInfectivity2()
	 * @generated
	 */
	void setVectorInfectivity2(double value);

	/**
	 * Returns the value of the '<em><b>Vector Infectivity3</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector Infectivity3</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector Infectivity3</em>' attribute.
	 * @see #setVectorInfectivity3(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorInfectivity3()
	 * @model default="0.5"
	 * @generated
	 */
	double getVectorInfectivity3();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorInfectivity3 <em>Vector Infectivity3</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector Infectivity3</em>' attribute.
	 * @see #getVectorInfectivity3()
	 * @generated
	 */
	void setVectorInfectivity3(double value);

	/**
	 * Returns the value of the '<em><b>Vector Infectivity4</b></em>' attribute.
	 * The default value is <code>"0.5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector Infectivity4</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector Infectivity4</em>' attribute.
	 * @see #setVectorInfectivity4(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorInfectivity4()
	 * @model default="0.5"
	 * @generated
	 */
	double getVectorInfectivity4();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorInfectivity4 <em>Vector Infectivity4</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector Infectivity4</em>' attribute.
	 * @see #getVectorInfectivity4()
	 * @generated
	 */
	void setVectorInfectivity4(double value);

	/**
	 * Returns the value of the '<em><b>Vector ADE1</b></em>' attribute.
	 * The default value is <code>"1.8"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector ADE1</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector ADE1</em>' attribute.
	 * @see #setVectorADE1(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorADE1()
	 * @model default="1.8"
	 * @generated
	 */
	double getVectorADE1();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorADE1 <em>Vector ADE1</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector ADE1</em>' attribute.
	 * @see #getVectorADE1()
	 * @generated
	 */
	void setVectorADE1(double value);

	/**
	 * Returns the value of the '<em><b>Vector ADE2</b></em>' attribute.
	 * The default value is <code>"1.8"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector ADE2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector ADE2</em>' attribute.
	 * @see #setVectorADE2(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorADE2()
	 * @model default="1.8"
	 * @generated
	 */
	double getVectorADE2();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorADE2 <em>Vector ADE2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector ADE2</em>' attribute.
	 * @see #getVectorADE2()
	 * @generated
	 */
	void setVectorADE2(double value);

	/**
	 * Returns the value of the '<em><b>Vector ADE3</b></em>' attribute.
	 * The default value is <code>"1.8"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector ADE3</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector ADE3</em>' attribute.
	 * @see #setVectorADE3(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorADE3()
	 * @model default="1.8"
	 * @generated
	 */
	double getVectorADE3();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorADE3 <em>Vector ADE3</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector ADE3</em>' attribute.
	 * @see #getVectorADE3()
	 * @generated
	 */
	void setVectorADE3(double value);

	/**
	 * Returns the value of the '<em><b>Vector ADE4</b></em>' attribute.
	 * The default value is <code>"1.8"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector ADE4</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector ADE4</em>' attribute.
	 * @see #setVectorADE4(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorADE4()
	 * @model default="1.8"
	 * @generated
	 */
	double getVectorADE4();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorADE4 <em>Vector ADE4</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector ADE4</em>' attribute.
	 * @see #getVectorADE4()
	 * @generated
	 */
	void setVectorADE4(double value);

	/**
	 * Returns the value of the '<em><b>Vector Incubation Rate</b></em>' attribute.
	 * The default value is <code>"0.1"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Vector Incubation Rate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Vector Incubation Rate</em>' attribute.
	 * @see #setVectorIncubationRate(double)
	 * @see org.eclipse.stem.diseasemodels.vector.VectorPackage#getSimpleDengueModel_VectorIncubationRate()
	 * @model default="0.1"
	 * @generated
	 */
	double getVectorIncubationRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.vector.SimpleDengueModel#getVectorIncubationRate <em>Vector Incubation Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Vector Incubation Rate</em>' attribute.
	 * @see #getVectorIncubationRate()
	 * @generated
	 */
	void setVectorIncubationRate(double value);

} // SimpleDengueModel
