/// <summary> /// Split the set according to a test. /// </summary> /// <param name="test"></param> /// <returns></returns> public override IEnumerable <ItemSet> Split(Test test) { WeightedItemSet[] sets = new WeightedItemSet[test.NumOfIssues]; double[] setSizes = new double[test.NumOfIssues]; double setSizeSum = 0.0d; List <Item> unkonwnItems = new List <Item>(); List <double> unknownItemsWeights = new List <double>(); for (int i = 0; i < sets.Length; i++) { sets[i] = new WeightedItemSet(this._attributeSet); } for (int i = 0; i < this._items.Count; i++) { Item it = this._items[i]; double weight = this._weights[i]; AttributeValue val = it.ValueOf(this._attributeSet, test.Attribute); if (val.IsUnknown()) { unkonwnItems.Add(it); unknownItemsWeights.Add(weight); } else { int id = test.Perform(val); sets[id].Add(it, weight); } } for (int i = 0; i < sets.Length; i++) { setSizes[i] = sets[i].Size(); setSizeSum += setSizes[i]; } for (int i = 0; i < unkonwnItems.Count; i++) { Item it = unkonwnItems[i]; double weight = unknownItemsWeights[i]; for (int j = 0; j < sets.Length; j++) { sets[j].Add(it, weight * setSizes[j] / setSizeSum); } } return(sets); }
/// <summary> /// Applies the test. The test checks if an attribute value belongs to a given set of values. /// </summary> /// <param name="val">The value to test. </param> /// <returns>1 - the value belongs to the set of admitted values, 0 - otherwise.</returns> public override int Perform(AttributeValue val) { if (val.IsUnknown()) { throw new ArgumentException("Cannot perform test on an unknow value.s"); } if (!(val is KnownSymbolicValue)) { throw new InvalidOperationException("Value is not KnowSymbolicValue"); } return(Perform((KnownSymbolicValue)val)); }