// DiseaseModel.java
package org.eclipse.stem.diseasemodels.standard;

/*******************************************************************************
 * Copyright (c) 2006 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.stem.core.common.SanityChecker;
import org.eclipse.stem.core.model.NodeDecorator;
import org.eclipse.stem.core.modifier.Modifiable;

/**
 * This interface defines a class in an EMF model for an STEM Disease model. It
 * is the top-level disease model, all other disease models derive from this
 * class.
 * 
 * @model abstract="true"
 */
public interface DiseaseModel extends NodeDecorator, SanityChecker, Modifiable {

	/**
	 * This is the segment of the type URI that prefixes all other segments in a
	 * disease model type URI.
	 */
	String URI_TYPE_DISEASEMODEL_SEGMENT = "diseasemodel";

	/**
	 * This is the "background" rate (i.e., in the absence of disease) at which
	 * population members (on average) transition from all of the other states
	 * (except <em>Pre-Born</em> and including Infectious) to the state
	 * <em>Dead</em>, per time period. For the population in the Infectious
	 * state the mortality rate may also be increased. This is specified by
	 * {@link #getInfectiousMortality()}.
	 * 
	 * 1/mortalityRate is the average life span in time periods, on average,
	 * that is takes for a population member to die from any state.
	 * 
	 * In typical models, the background mortality rate is specified to be the
	 * same as the "birth rate" to keep the population fixed.
	 * 
	 * @return the number of population members that die per time period
	 * @model default="5.5E-5"
	 */
	double getBackgroundMortalityRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.standard.DiseaseModel#getBackgroundMortalityRate <em>Background Mortality Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Background Mortality Rate</em>' attribute.
	 * @see #getBackgroundMortalityRate()
	 * @generated
	 */
	void setBackgroundMortalityRate(double value);

	/**
	 * Compute the background mortality rate adjusted for a time delta
	 * potentially different from the time period specified for the rate.
	 * 
	 * @param timeDelta
	 *            the time period (milliseconds) to which the rate is to be
	 *            adjusted.
	 * @return the adjusted rate
	 * 
	 * @model volatile="true" transient="true" changeable="false"
	 */
	double getAdjustedBackgroundMortalityRate(final long timeDelta);

	/**
	 * This is the name of the disease
	 * @return the name of the disease
	 * 
	 * @model
	 */
	String getDiseaseName();
	
	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.standard.DiseaseModel#getDiseaseName <em>Disease Name</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Disease Name</em>' attribute.
	 * @see #getDiseaseName()
	 * @generated
	 */
	void setDiseaseName(String value);

	/**
	 * Returns the value of the '<em><b>Relative Tolerance</b></em>' attribute.
	 * The default value is <code>"1E-9"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Relative Tolerance</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Relative Tolerance</em>' attribute.
	 * @see #setRelativeTolerance(double)
	 * @see org.eclipse.stem.diseasemodels.standard.StandardPackage#getDiseaseModel_RelativeTolerance()
	 * @model default="1E-9"
	 * @generated
	 */
	double getRelativeTolerance();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.standard.DiseaseModel#getRelativeTolerance <em>Relative Tolerance</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Relative Tolerance</em>' attribute.
	 * @see #getRelativeTolerance()
	 * @generated
	 */
	void setRelativeTolerance(double value);

	/**
	 * Returns the value of the '<em><b>Finite Difference</b></em>' attribute.
	 * The default value is <code>"true"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Finite Difference</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Finite Difference</em>' attribute.
	 * @see #setFiniteDifference(boolean)
	 * @see org.eclipse.stem.diseasemodels.standard.StandardPackage#getDiseaseModel_FiniteDifference()
	 * @model default="true"
	 * @generated
	 */
	boolean isFiniteDifference();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.standard.DiseaseModel#isFiniteDifference <em>Finite Difference</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Finite Difference</em>' attribute.
	 * @see #isFiniteDifference()
	 * @generated
	 */
	void setFiniteDifference(boolean value);

	/**
	 * Returns the value of the '<em><b>Frequency Dependent</b></em>' attribute.
	 * The default value is <code>"true"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Frequency Dependent</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Frequency Dependent</em>' attribute.
	 * @see #setFrequencyDependent(boolean)
	 * @see org.eclipse.stem.diseasemodels.standard.StandardPackage#getDiseaseModel_FrequencyDependent()
	 * @model default="true"
	 * @generated
	 */
	boolean isFrequencyDependent();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.standard.DiseaseModel#isFrequencyDependent <em>Frequency Dependent</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Frequency Dependent</em>' attribute.
	 * @see #isFrequencyDependent()
	 * @generated
	 */
	void setFrequencyDependent(boolean value);

	/**
	 * Returns the value of the '<em><b>Background Birth Rate</b></em>' attribute.
	 * The default value is <code>"5.5E-5"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Background Birth 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>Background Birth Rate</em>' attribute.
	 * @see #setBackgroundBirthRate(double)
	 * @see org.eclipse.stem.diseasemodels.standard.StandardPackage#getDiseaseModel_BackgroundBirthRate()
	 * @model default="5.5E-5"
	 * @generated
	 */
	double getBackgroundBirthRate();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.standard.DiseaseModel#getBackgroundBirthRate <em>Background Birth Rate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Background Birth Rate</em>' attribute.
	 * @see #getBackgroundBirthRate()
	 * @generated
	 */
	void setBackgroundBirthRate(double value);

	/**
	 * This is the identifier of the population being infected by a Disease.
	 * 
	 * @return the identifier of the Population affected by the disease.
	 * 
	 * @model default="human"
	 */
	String getPopulationIdentifier();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.standard.DiseaseModel#getPopulationIdentifier <em>Population Identifier</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @param value the new value of the '<em>Population Identifier</em>' attribute.
	 * @see #getPopulationIdentifier()
	 * @generated
	 */
	void setPopulationIdentifier(String value);

	/**
	 * The time period for the specified rates.  Default: 1 Day
	 * @return the time period (milliseconds) of the rates specified for this
	 *         disease model
	 * 
	 * @model default="86400000"
	 */
	long getTimePeriod();

	/**
	 * Sets the value of the '{@link org.eclipse.stem.diseasemodels.standard.DiseaseModel#getTimePeriod <em>Time Period</em>}' attribute.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @param value the new value of the '<em>Time Period</em>' attribute.
	 * @see #getTimePeriod()
	 * @generated
	 */
	void setTimePeriod(long value);

	/**
	 * @return an instance of the disease model label that this disease model
	 *         updates.
	 * @model abstract="true"
	 */
	DiseaseModelLabel createDiseaseModelLabel();

	/**
	 * @return an instance of the disease model label value that this disease model
	 *         updates.
	 * @model abstract="true"
	 */
	DiseaseModelLabelValue createDiseaseModelLabelValue();
	
	/**
	 * @return an instance of the disease model state that this disease model
	 *         would use to hold computation state information attached to a
	 *         disease model label.
	 * @model abstract="true"
	 */
	DiseaseModelState createDiseaseModelState();

	/**
	 * @param diseaseModelState
	 *            the state information to be initialized
	 * @param diseaseModelLabel
	 *            the label to use to initialize the state information
	 * @return the initialized disease model state instance
	 * @model volatile="true" transient="true" changeable="false"
	 */
	DiseaseModelState initializeDiseaseState(
			DiseaseModelState diseaseModelState,
			DiseaseModelLabel diseaseModelLabel);

	
	/**
	 * @param diseaseModelLabel
	 *            the label to use to initialize the state information
	 * @model volatile="true" transient="true" changeable="false"
	 */
	void initializeDiseaseState(
			DiseaseModelLabel diseaseModelLabel);

	/**
	 * @return a new instance of an infector for this disease model.
	 * 
	 * @model volatile="true" transient="true" changeable="false"
	 */
	Infector createInfector();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @model
	 * @generated
	 */
	double getAdjustedBackgroundBirthRate(long timeDelta);

} // DiseaseModel
