/*
* SVM.NET Library
* Copyright (C) 2008 Matthew Johnson
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
using System;
using System.IO;
using System.Collections.Generic;
using System.Threading;
using System.Globalization;
namespace SVM
{
///
/// Encapsulates a problem, or set of vectors which must be classified.
///
[Serializable]
public class Problem
{
private int _count;
private double[] _Y;
private Node[][] _X;
private int _maxIndex;
///
/// Constructor.
///
/// Number of vectors
/// The class labels
/// Vector data.
/// Maximum index for a vector
public Problem(int count, double[] y, Node[][] x, int maxIndex)
{
_count = count;
_Y = y;
_X = x;
_maxIndex = maxIndex;
}
///
/// Empty Constructor. Nothing is initialized.
///
public Problem()
{
}
///
/// Number of vectors.
///
public int Count
{
get
{
return _count;
}
set
{
_count = value;
}
}
///
/// Class labels.
///
public double[] Y
{
get
{
return _Y;
}
set
{
_Y = value;
}
}
///
/// Vector data.
///
public Node[][] X
{
get
{
return _X;
}
set
{
_X = value;
}
}
///
/// Maximum index for a vector.
///
public int MaxIndex
{
get
{
return _maxIndex;
}
set
{
_maxIndex = value;
}
}
///
/// Reads a problem from a stream.
///
/// Stream to read from
/// The problem
public static Problem Read(Stream stream)
{
TemporaryCulture.Start();
StreamReader input = new StreamReader(stream);
List vy = new List();
List vx = new List();
int max_index = 0;
while (input.Peek() > -1)
{
string[] parts = input.ReadLine().Trim().Split();
vy.Add(double.Parse(parts[0]));
int m = parts.Length - 1;
Node[] x = new Node[m];
for (int j = 0; j < m; j++)
{
x[j] = new Node();
string[] nodeParts = parts[j + 1].Split(':');
x[j].Index = int.Parse(nodeParts[0]);
x[j].Value = double.Parse(nodeParts[1]);
}
if (m > 0)
max_index = Math.Max(max_index, x[m - 1].Index);
vx.Add(x);
}
TemporaryCulture.Stop();
return new Problem(vy.Count, vy.ToArray(), vx.ToArray(), max_index);
}
///
/// Writes a problem to a stream.
///
/// The stream to write the problem to.
/// The problem to write.
public static void Write(Stream stream, Problem problem)
{
TemporaryCulture.Start();
StreamWriter output = new StreamWriter(stream);
for (int i = 0; i < problem.Count; i++)
{
output.Write(problem.Y[i]);
for (int j = 0; j < problem.X[i].Length; j++)
output.Write(" {0}:{1}", problem.X[i][j].Index, problem.X[i][j].Value);
output.WriteLine();
}
output.Flush();
TemporaryCulture.Stop();
}
///
/// Reads a Problem from a file.
///
/// The file to read from.
/// the Probem
public static Problem Read(string filename)
{
FileStream input = File.OpenRead(filename);
try
{
return Read(input);
}
finally
{
input.Close();
}
}
///
/// Writes a problem to a file. This will overwrite any previous data in the file.
///
/// The file to write to
/// The problem to write
public static void Write(string filename, Problem problem)
{
FileStream output = File.Open(filename, FileMode.Create);
try
{
Write(output, problem);
}
finally
{
output.Close();
}
}
}
}