package NFP.Algorithms;

import java.util.List;

import seg.jUCMNav.nfp.generated.*;

public class AggregateReliability {

	private List<Reliability> Reliabilities;
	private CompositionType composition;
	private Reliability aggregatedReliability;
	
	public Reliability getAggregateReliability
	(List<Reliability> Reliabilities,CompositionType composition){
		this.Reliabilities=Reliabilities;
		this.composition=composition;
		initialize();
		if(this.composition == CompositionType.Sequence || this.composition == CompositionType.Loop
				|| this.composition == CompositionType.Concurrency){
			for (Reliability RE : this.Reliabilities) {
				aggregatedReliability.setReliabilityLevel
				(aggregatedReliability.getReliabilityLevel()*RE.getReliabilityLevel());
			}
		}
		if(this.composition == CompositionType.ConditionalBranching){
			for (Reliability RE : this.Reliabilities) {
				aggregatedReliability.setReliabilityLevel
				(Math.min(aggregatedReliability.getReliabilityLevel(),RE.getReliabilityLevel()));
			}
		}
		if(this.composition == CompositionType.Discriminator){
			for (Reliability RE : this.Reliabilities) {
				aggregatedReliability.setReliabilityLevel
				(1-(aggregatedReliability.getReliabilityLevel()*(1-RE.getReliabilityLevel())));
			}
		}
		return aggregatedReliability;
	}

	private void initialize() {
		aggregatedReliability= new Reliability();
		aggregatedReliability.setReliabilityLevel(1);
	}
}
