/// <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);
        }
Esempio n. 2
0
        /// <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));
        }