package org.eclipse.stem.diseasemodels.experimental.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.ecore.EClass;
import org.eclipse.stem.core.graph.LabelValue;
import org.eclipse.stem.core.model.STEMTime;
import org.eclipse.stem.diseasemodels.experimental.ExperimentalFactory;
import org.eclipse.stem.diseasemodels.experimental.ExperimentalPackage;
import org.eclipse.stem.diseasemodels.experimental.TBDiseaseModel;
import org.eclipse.stem.diseasemodels.experimental.TBDiseaseModelLabelValue;
import org.eclipse.stem.diseasemodels.standard.DiseaseModelLabel;
import org.eclipse.stem.diseasemodels.standard.DiseaseModelLabelValue;
import org.eclipse.stem.diseasemodels.standard.Infector;
import org.eclipse.stem.diseasemodels.standard.SIInfector;
import org.eclipse.stem.diseasemodels.standard.StandardDiseaseModelLabel;
import org.eclipse.stem.diseasemodels.standard.StandardDiseaseModelLabelValue;
import org.eclipse.stem.diseasemodels.standard.StandardFactory;
import org.eclipse.stem.diseasemodels.standard.impl.StandardDiseaseModelImpl;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>TB Disease Model</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * </p>
 *
 * @generated
 */
public class TBDiseaseModelImpl extends StandardDiseaseModelImpl implements TBDiseaseModel {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated NOT
	 */
	public TBDiseaseModelImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return ExperimentalPackage.Literals.TB_DISEASE_MODEL;
	}

	public void doModelSpecificAdjustments(LabelValue label) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public StandardDiseaseModelLabelValue computeDiseaseDeltas(STEMTime time,
			StandardDiseaseModelLabelValue currentState,
			StandardDiseaseModelLabel diseaseLabel, long timeDelta,
			DiseaseModelLabelValue returnValue) {
		// Just hard code the parameters for now
		
		double beta = 0.4; // Transmission rate;
		double p = 0.6; // Probability that a new infection becomes active infection. (1-p) is probability that it becomes latent
		
		
		TBDiseaseModelLabelValue tbdelta = (TBDiseaseModelLabelValue)returnValue;
		TBDiseaseModelLabelValue tbcurr = (TBDiseaseModelLabelValue)currentState;
		
		double S = tbcurr.getS();
		
		double iaEff = getNormalizedEffectiveInfectious(diseaseLabel.getNode(), diseaseLabel, tbcurr.getIa(), ExperimentalPackage.Literals.TB_DISEASE_MODEL_LABEL_VALUE__IA);
		tbdelta.setIa(beta*S*p*iaEff);
		tbdelta.setIl(beta*S*(1-p)*iaEff);
		
		double incidence = beta*S*tbcurr.getIa() / tbcurr.getPopulationCount();
		tbdelta.setS(-incidence);
		tbdelta.setIncidence(incidence);
		return (StandardDiseaseModelLabelValue)returnValue;
	}

	@Override
	public StandardDiseaseModelLabelValue computeDiseaseDeathsDeltas(
			STEMTime time, StandardDiseaseModelLabel diseaseLabel,
			StandardDiseaseModelLabelValue currentLabelValue, long timeDelta,
			DiseaseModelLabelValue returnValue) {
		// Nothing
		return (StandardDiseaseModelLabelValue)returnValue;
	}

	@Override
	public DiseaseModelLabel createDiseaseModelLabel(String populationIdentifier) {
		return ExperimentalFactory.eINSTANCE.createTBDiseaseModelLabel();
	}

	@Override
	public DiseaseModelLabelValue createDiseaseModelLabelValue(String populationIdentifier) {
		return ExperimentalFactory.eINSTANCE.createTBDiseaseModelLabelValue();
	}

	@Override
	public Infector createInfector() {
		SIInfector retValue = StandardFactory.eINSTANCE.createSIInfector();
		retValue.setDiseaseName(this.getDiseaseName());
		retValue.setPopulationIdentifier(getPopulationIdentifier());
		return retValue;
	}

} //TBDiseaseModelImpl
