/* * Copyright (c) 2005-2006 Erik Tigerholm * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; namespace OpenTraffic.Model.StopCriteria { public class MeanNormalised : AbstractStopCriteria { [XmlAttribute(AttributeName = "MaxValue")] public float MaxValue { get; set; } private AbstractStopCriteria.StopCriteriaFunction func; public MeanNormalised() { func = null; } public MeanNormalised(AbstractStopCriteria.StopCriteriaFunction func) { this.func = func; } public MeanNormalised(float maxValue) { this.MaxValue = maxValue; func = null; } public override bool CheckCriteria(Result.ResultData newFrame, Result.ResultData oldFrame, TrafficModel m) { float value = Compare(newFrame, oldFrame, m); Console.WriteLine("RMS(" + MaxValue + "): " + value); if (value > Math.Abs(MaxValue)) return false; return true; } public override float Compare(Result.ResultData simFrame, Result.ResultData obsFrame, TrafficModel m) { float value = 0; if (obsFrame != null && m != null) { int nTest = 100; for (float i = obsFrame.startTime; i < obsFrame.stopTime; i += (obsFrame.stopTime - obsFrame.startTime) / nTest) { foreach (TrafficModelLink l in m.TrafficModelLinks) { float v1 = func(simFrame, i, l); float v2 = func(obsFrame, i, l); if (v1 != 0 && v2 != 0) { float v = (v1 - v2); value += v / v2; } } } value = (value) / nTest / m.TrafficModelLinks.Count; } return value; } } }