Example #1
0
 protected override string instanceToLibsvm(weka.core.Instance inst)
 {
     //StringBuffer.__<clinit>();
     //StringBuffer buffer = new StringBuffer(new StringBuilder().append("").append(inst.classValue()).toString());
     StringBuffer buffer = new StringBuffer(new StringBuilder().append("").append(inst.classValue() - 1).toString());
     for (int i = 0; i < inst.numAttributes(); i++)
     {
         if ((i != inst.classIndex()) && (inst.value(i) != 0f))
         {
             buffer.append(new StringBuilder().append(" ").append((int)(i + 1)).append(":").append(inst.value(i)).toString());
         }
     }
     return buffer.toString();
 }
Example #2
0
        public override double classifyInstance(weka.core.Instance instance)
        {
            if (m_instances.numInstances() == 0)
                return 2;

            if (m_instances.numAttributes() != instance.numAttributes())
            {
                throw new AssertException("different attribute.");
            }
            int n = (instance.numAttributes() - 1) / 2;
            List<Tuple<int, int>> dist = new List<Tuple<int, int>>();
            for (int i = 0; i < m_instances.numInstances(); ++i)
            {
                int d1 = 0, d2 = 0;
                weka.core.Instance instanceI = m_instances.instance(i);
                for (int j = 0; j < n; ++j)
                {
                    //d += (int)((instanceI.value(j) - instance.value(j)) * (instanceI.value(j) - instance.value(j)));
                    if (instanceI.value(j) != instance.value(j))
                    {
                        if (instance.value(j) == 2 || instanceI.value(j) == 2)
                            d1++;
                        else
                            d1 += 4;
                    }
                }
                for (int j = n; j < 2*n; ++j)
                {
                    //d += (int)((instanceI.value(j) - instance.value(j)) * (instanceI.value(j) - instance.value(j)));
                    if (instanceI.value(j) != instance.value(j))
                        if (instance.value(j) == 2 || instanceI.value(j) == 2)
                            d2++;
                        else
                            d2 += 4;
                }
                int c = (int)instanceI.classValue();
                //if (c == 0)
                //{
                //    if (d1 < n / 4 && d1 < d2)
                //    {
                //        dist.Add(new Tuple<int, int>(d1, c));
                //    }
                //}
                //else if (c == 1)
                //{
                //    if (d2 < n / 4 && d2 < d1)
                //    {
                //        dist.Add(new Tuple<int, int>(d2, c));
                //    }
                //}
                //else
                //{
                //    throw new AssertException("");
                //}
                dist.Add(new Tuple<int, int>(d1 + d2, c));
            }
            if (dist.Count == 0)
                return 2;

            dist.Sort(new Comparison<Tuple<int, int>>((x, y) =>
            {
                return x.Item1.CompareTo(y.Item1);
            }));

            int sum = 0, count = 0;
            for (int i = 0; i < dist.Count; ++i)
            {
                if (dist[i].Item1 < n / 4 * 2 * 4)
                {
                    if (dist[i].Item2 != 2 && dist[i].Item2 != 3)
                    {
                        sum += dist[i].Item2;
                        count++;
                    }
                    else
                    {
                    }
                }
                else
                    break;
            }
            if (count == 0)
                return 2;
            if (count < m_instances.numInstances() / 30)
                return 2;
            return (int)Math.Round((double)sum / count);
        }
Example #3
0
        public override double classifyInstance(weka.core.Instance instance)
        {
            if (m_instances.numInstances() == 0)
                return 2;

            if (m_instances.numAttributes() != instance.numAttributes())
            {
                throw new AssertException("different attribute.");
            }
            int n = instance.numAttributes();
            List<Tuple<int, int>> dist = new List<Tuple<int, int>>();
            for (int i = 0; i < m_instances.numInstances(); ++i)
            {
                int d1 = 0, d2 = 0;
                weka.core.Instance instanceI = m_instances.instance(i);
                for (int j = 0; j < n; ++j)
                {
                    //d += (int)((instanceI.value(j) - instance.value(j)) * (instanceI.value(j) - instance.value(j)));
                    if (instanceI.value(j) != instance.value(j))
                    {
                        d1++;
                    }
                    if (instance.value(j) != 0)
                    {
                        d2++;
                    }
                }
                int c = (int)instanceI.classValue();

                dist.Add(new Tuple<int, int>(d1, c));
            }
            if (dist.Count == 0)
                return 2;

            dist.Sort(new Comparison<Tuple<int, int>>((x, y) =>
            {
                return x.Item1.CompareTo(y.Item1);
            }));

            int sum = 0, count = 0;
            for (int i = 0; i < dist.Count; ++i)
            {
                if (dist[i].Item1 < 4)
                {
                    sum += dist[i].Item2;
                    count++;
                }
                else
                    break;
            }
            if (count == 0)
                return 2;
            if (count < m_instances.numInstances() / 70)
                return 2;
            return (int)Math.Round((double)sum / count);
        }
        public weka.core.Instance GenerateFeatures(PokerHand hand, int rIdx, int aIdx, weka.core.Instances data, bool generateClass = true)
        {
            // Check that we are using limit betting.
            Debug.Assert(hand.Context.BettingType == BettingType.FixedLimit);

            var results = new weka.core.Instance(data.numAttributes());
            results.setDataset(data);
            int attIdx = 0;
            foreach (var method in typeof(LimitFeatureGenerator).GetMethods())
            {
                // Get all the features of this class.
                var attributes = method.GetCustomAttributes(typeof(Feature), true);
                if (attributes.Length == 0)
                    continue;

                // Get the feature attribute on this method.
                var attr = ((Feature)attributes[0]);

                // Get the name for this attribute
                string name = attr.Name;
                //Console.WriteLine("Hand: {0} Feature: {1}", hand.Context.ID, name);

                // Get the feature only if it's applicable to this situation.
                object feature = null;
                if(rIdx >= (int)attr.MinRound && rIdx <= (int)attr.MaxRound)
                    feature = method.Invoke(this, new object[] { hand, rIdx, aIdx });

                if (SkipMissingFeatures && (feature == null || feature.ToString() == "?"))
                    continue;

                switch (attr.FType) {
                case FeatureType.Continuous:
                    results.setValue(attIdx, (double)feature);
                    break;
                case FeatureType.Discrete:
                    results.setValue(attIdx, (int)feature);
                    break;
                case FeatureType.Boolean:
                case FeatureType.Nominal:
                case FeatureType.Enum:
                {
                    var attribute = data.attribute(attIdx);
                    var attVal = attribute.indexOfValue(feature.ToString());
                    if(attVal < 0 || attVal > attribute.numValues())
                        throw new Exception(string.Format ("Invalid attribute value: {0} for attribute {1} (idx: {2} total values: {3}", feature.ToString(), name, attVal, attribute.numValues()));
                    results.setValue(attribute, attVal);
                }
                    break;
                case FeatureType.String:
                {
                    var attribute = data.attribute(attIdx);
                    results.setValue(attribute, feature.ToString());
                }
                    break;
                default: throw new Exception("Unspecified feature type for feature: " + method.Name);
                }

                attIdx++;
            }

            if(generateClass)
            {
                var classAttr = data.classAttribute();
                switch (hand.Rounds[rIdx].Actions[aIdx].Type)
                {
                case ActionType.Bet:
                case ActionType.Raise: results.setClassValue(classAttr.indexOfValue("Raise"));
                    break;
                case ActionType.Call:
                case ActionType.Check: results.setClassValue(classAttr.indexOfValue("Call"));
                    break;
                case ActionType.Fold: results.setClassValue(classAttr.indexOfValue("Fold"));;
                    break;
                default:
                    break;
                }
            }

            return results;
        }
Example #5
0
 private static void writeFile(weka.core.Instances features, string filename)
 {
     if(FILE_FORMAT == "csv")
     {
         using (TextWriter writer = new StreamWriter(filename))
         {
             if(features.numInstances() == 0)
                 return;
             for(int i = 0; i < features.numAttributes(); i++)
             {
                 writer.Write(features.attribute(i));
                 if(i < features.numAttributes() - 1)
                     writer.Write(DELIMITER);
             }
             writer.WriteLine();
             for(int i = 0; i < features.numInstances(); i++)
             {
                 for(int j = 0; j < features.numAttributes(); j++)
                 {
                     writer.Write(features.instance(i).value(j));
                     if(j < features.numAttributes() - 1)
                         writer.Write(DELIMITER);
                 }
                 writer.WriteLine();
             }
         }
     } else if (FILE_FORMAT == "arff")
     {
         using (TextWriter writer = new StreamWriter(filename))
         {
             writer.WriteLine(features.toString());
         }
     }
 }