/// <summary> /// Checks whether the two population data added together are equal with this. /// </summary> /// <param name="data1">First datapoint.</param> /// <param name="data2">Second datapoint.</param> /// <returns>Maximum deviation in one of the sum, <c>0</c> if equal.</returns> public Int32 SumError(PopulationDataPoint data1, PopulationDataPoint data2) { var sum = new PopulationDataPoint(); if (data1 != null) { sum.Add(data1); } if (data2 != null) { sum.Add(data2); } return(this.MaxDeviation(sum)); }
/// <summary> /// Checks whether the <see cref="agetable"/> fits to self. /// </summary> /// <returns><c>true</c> if age table if valid, <c>false</c> otherwise.</returns> /// <remarks>Also returns <c>true</c> if there is no age table.</remarks> public Boolean AgeTableValid() { var result = true; if (agetable != null && agetable.age.Any()) { var ageSum = new PopulationDataPoint(); foreach (var ageEntry in agetable.age) { ageSum.Add(ageEntry); } ageSum.Add(agetable.unknown); result &= ageSum.IsEqual(this); } return(result); }
/// <summary> /// Calculates the maximum deviation of the sum of the partial data point. /// </summary> /// <returns>Maximum deviation, <c>0</c> if all parts sum up correctly.</returns> public Int32 SumError() { Int32 maxError = 0; var validData = data.Where(x => x.valid); // DOPA data can contain more than one municipal entry with different geocodes PopulationDataPoint municipal = null; var municipalData = validData.Where(x => x.type == PopulationDataType.municipal); if (municipalData.Any()) { municipal = new PopulationDataPoint(); foreach (var dataPoint in municipalData) { municipal.Add(dataPoint); } } var rural = validData.FirstOrDefault(x => x.type == PopulationDataType.nonmunicipal); if ((municipal != null) && (rural != null)) { maxError = Math.Max(maxError, TotalPopulation.SumError(municipal, rural)); } var collectivehouseholds = validData.FirstOrDefault(x => x.type == PopulationDataType.collectivehouseholds); var privatehouseholds = validData.FirstOrDefault(x => x.type == PopulationDataType.privatehouseholds); if ((collectivehouseholds != null) && (privatehouseholds != null)) { maxError = Math.Max(maxError, TotalPopulation.SumError(collectivehouseholds, privatehouseholds)); } var agricultural = validData.FirstOrDefault(x => x.type == PopulationDataType.agricultural); var nonagricultural = validData.FirstOrDefault(x => x.type == PopulationDataType.nonagricultural); if ((agricultural != null) && (nonagricultural != null)) { maxError = Math.Max(maxError, TotalPopulation.SumError(agricultural, nonagricultural)); } var sanitary = validData.FirstOrDefault(x => x.type == PopulationDataType.sanitary); var urbanSanitary = validData.FirstOrDefault(x => x.type == PopulationDataType.urbansanitary); var ruralSanitary = validData.FirstOrDefault(x => x.type == PopulationDataType.ruralsanitary); if ((urbanSanitary != null) && (ruralSanitary != null) && (sanitary != null)) { maxError = Math.Max(maxError, sanitary.SumError(urbanSanitary, ruralSanitary)); } var thai = validData.FirstOrDefault(x => x.type == PopulationDataType.thai); var foreigner = validData.FirstOrDefault(x => x.type == PopulationDataType.foreigner); if ((thai != null) && (foreigner != null)) { maxError = Math.Max(maxError, TotalPopulation.SumError(thai, foreigner)); } return(maxError); }
/// <summary> /// Checks whether the two population data added together are equal with this. /// </summary> /// <param name="data1">First datapoint.</param> /// <param name="data2">Second datapoint.</param> /// <returns>Maximum deviation in one of the sum, <c>0</c> if equal.</returns> public Int32 SumError(PopulationDataPoint data1, PopulationDataPoint data2) { var sum = new PopulationDataPoint(); if ( data1 != null ) { sum.Add(data1); } if ( data2 != null ) { sum.Add(data2); } return this.MaxDeviation(sum); }