Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/23/09 15:33:07 (16 years ago)
Author:
gkronber
Message:

Merged r1220 from the CEDMA refactoring branch to the trunk. #494 (Import of missing values given as ;; doesn't work)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.DataAnalysis/DatasetParser.cs

    r620 r1221  
    6565    public string ProblemName {
    6666      get {
    67         if(metadata.ContainsKey(PROBLEMNAME)) {
     67        if (metadata.ContainsKey(PROBLEMNAME)) {
    6868          return metadata[PROBLEMNAME][0].stringValue;
    6969        } else return "-";
     
    7373    public string[] VariableNames {
    7474      get {
    75         if(metadata.ContainsKey(VARIABLENAMES)) {
     75        if (metadata.ContainsKey(VARIABLENAMES)) {
    7676          List<Token> nameList = metadata[VARIABLENAMES];
    7777          string[] names = new string[nameList.Count];
    78           for(int i = 0; i < names.Length; i++) {
     78          for (int i = 0; i < names.Length; i++) {
    7979            names[i] = nameList[i].stringValue;
    8080          }
     
    8282        } else {
    8383          string[] names = new string[columns];
    84           for(int i = 0; i < names.Length; i++) {
     84          for (int i = 0; i < names.Length; i++) {
    8585            names[i] = "X" + i.ToString("000");
    8686          }
     
    9292    public int TargetVariable {
    9393      get {
    94         if(metadata.ContainsKey(TARGETVARIABLE)) {
     94        if (metadata.ContainsKey(TARGETVARIABLE)) {
    9595          return metadata[TARGETVARIABLE][0].intValue;
    9696        } else return 0; // default is the first column
     
    100100    public int MaxTreeHeight {
    101101      get {
    102         if(metadata.ContainsKey(MAXIMUMTREEHEIGHT)) {
     102        if (metadata.ContainsKey(MAXIMUMTREEHEIGHT)) {
    103103          return metadata[MAXIMUMTREEHEIGHT][0].intValue;
    104104        } else return 0;
     
    108108    public int MaxTreeSize {
    109109      get {
    110         if(metadata.ContainsKey(MAXIMUMTREESIZE)) {
     110        if (metadata.ContainsKey(MAXIMUMTREESIZE)) {
    111111          return metadata[MAXIMUMTREESIZE][0].intValue;
    112112        } else return 0;
     
    116116    public int TrainingSamplesStart {
    117117      get {
    118         if(metadata.ContainsKey(TRAININGSAMPLESSTART)) {
     118        if (metadata.ContainsKey(TRAININGSAMPLESSTART)) {
    119119          return metadata[TRAININGSAMPLESSTART][0].intValue;
    120120        } else return 0;
     
    124124    public int TrainingSamplesEnd {
    125125      get {
    126         if(metadata.ContainsKey(TRAININGSAMPLESEND)) {
     126        if (metadata.ContainsKey(TRAININGSAMPLESEND)) {
    127127          return metadata[TRAININGSAMPLESEND][0].intValue;
    128128        } else return rows;
     
    131131    public int ValidationSamplesStart {
    132132      get {
    133         if(metadata.ContainsKey(VALIDATIONSAMPLESSTART)) {
     133        if (metadata.ContainsKey(VALIDATIONSAMPLESSTART)) {
    134134          return metadata[VALIDATIONSAMPLESSTART][0].intValue;
    135135        } else return 0;
     
    139139    public int ValidationSamplesEnd {
    140140      get {
    141         if(metadata.ContainsKey(VALIDATIONSAMPLESEND)) {
     141        if (metadata.ContainsKey(VALIDATIONSAMPLESEND)) {
    142142          return metadata[VALIDATIONSAMPLESEND][0].intValue;
    143143        } else return rows;
     
    146146    public int TestSamplesStart {
    147147      get {
    148         if(metadata.ContainsKey(TESTSAMPLESSTART)) {
     148        if (metadata.ContainsKey(TESTSAMPLESSTART)) {
    149149          return metadata[TESTSAMPLESSTART][0].intValue;
    150150        } else return 0;
     
    154154    public int TestSamplesEnd {
    155155      get {
    156         if(metadata.ContainsKey(TESTSAMPLESEND)) {
     156        if (metadata.ContainsKey(TESTSAMPLESEND)) {
    157157          return metadata[TESTSAMPLESEND][0].intValue;
    158158        } else return rows;
     
    163163      get {
    164164        List<int> disallowedVariables = new List<int>();
    165         if(metadata.ContainsKey(NONINPUTVARIABLES)) {
    166           foreach(Token t in metadata[NONINPUTVARIABLES]) {
     165        if (metadata.ContainsKey(NONINPUTVARIABLES)) {
     166          foreach (Token t in metadata[NONINPUTVARIABLES]) {
    167167            disallowedVariables.Add(t.intValue);
    168168          }
     
    191191      int i = 0;
    192192      int j = 0;
    193       foreach(List<double> row in samplesList) {
     193      foreach (List<double> row in samplesList) {
    194194        j = 0;
    195         foreach(double element in row) {
     195        foreach (double element in row) {
    196196          samples[i * columns + j] = element;
    197197          j++;
     
    204204      Exception lastEx = null;
    205205      NumberFormatInfo[] possibleFormats = new NumberFormatInfo[] { NumberFormatInfo.InvariantInfo, CultureInfo.GetCultureInfo("de-DE").NumberFormat, NumberFormatInfo.CurrentInfo };
    206       foreach(NumberFormatInfo numberFormat in possibleFormats) {
    207         using(StreamReader reader = new StreamReader(importFileName)) {
     206      foreach (NumberFormatInfo numberFormat in possibleFormats) {
     207        using (StreamReader reader = new StreamReader(importFileName)) {
    208208          tokenizer = new Tokenizer(reader, numberFormat);
    209209          try {
     
    211211            Parse(strict);
    212212            return; // parsed without errors -> return;
    213           } catch(DataFormatException ex) {
     213          }
     214          catch (DataFormatException ex) {
    214215            lastEx = ex;
    215216          }
     
    271272
    272273      private void ReadNextTokens() {
    273         if(!reader.EndOfStream) {
     274        if (!reader.EndOfStream) {
    274275          CurrentLine = reader.ReadLine();
    275           Token[] newTokens = Array.ConvertAll(CurrentLine.Split(separators, StringSplitOptions.RemoveEmptyEntries), delegate(string str) {
     276          Token[] newTokens = Array.ConvertAll(CurrentLine.Split(separators, StringSplitOptions.None), delegate(string str) {
    276277            return MakeToken(str.Trim());
    277278          });
    278279
    279           foreach(Token tok in newTokens) {
    280             if(tok != SeparatorToken) tokens.Add(tok);
     280          foreach (Token tok in newTokens) {
     281            if (tok != SeparatorToken) tokens.Add(tok);
    281282          }
    282283          tokens.Add(NewlineToken);
     
    289290
    290291        // try to parse as a number first
    291         if(int.TryParse(strToken, NumberStyles.Integer, numberFormatInfo, out token.intValue)) {
     292        if (int.TryParse(strToken, NumberStyles.Integer, numberFormatInfo, out token.intValue)) {
    292293          token.type = TokenTypeEnum.Int;
    293294          return token;
    294         } else if(double.TryParse(strToken, NumberStyles.Float, numberFormatInfo, out token.doubleValue)) {
     295        } else if (double.TryParse(strToken, NumberStyles.Float, numberFormatInfo, out token.doubleValue)) {
    295296          token.type = TokenTypeEnum.Double;
     297          return token;
     298        } else if (String.IsNullOrEmpty(strToken)) {
     299          token.type = TokenTypeEnum.WhiteSpace;
    296300          return token;
    297301        }
     
    307311        Token next = tokens[0];
    308312        tokens.RemoveAt(0);
    309         if(tokens.Count == 0) {
     313        if (tokens.Count == 0) {
    310314          ReadNextTokens();
    311315        }
     
    322326    private void Parse(bool strict) {
    323327      ParseMetaData(strict);
    324       if(!tokenizer.HasNext()) Error("Couldn't parse data values. Probably because of incorrect number format (the parser expects english number format with a '.' as decimal separator).", "", tokenizer.CurrentLineNumber);
     328      if (!tokenizer.HasNext()) Error("Couldn't parse data values. Probably because of incorrect number format (the parser expects english number format with a '.' as decimal separator).", "", tokenizer.CurrentLineNumber);
    325329      ParseSampleData(strict);
    326       if(samplesList.Count == 0) Error("Couldn't parse data values. Probably because of incorrect number format (the parser expects english number format with a '.' as decimal separator).", "", tokenizer.CurrentLineNumber);
     330      if (samplesList.Count == 0) Error("Couldn't parse data values. Probably because of incorrect number format (the parser expects english number format with a '.' as decimal separator).", "", tokenizer.CurrentLineNumber);
    327331    }
    328332
    329333    private void ParseSampleData(bool strict) {
    330334      List<double> row = new List<double>();
    331       while(tokenizer.HasNext()) {
     335      while (tokenizer.HasNext()) {
    332336        Token current = tokenizer.Next();
    333         if(current.type == TokenTypeEnum.Double) {
     337        if (current.type == TokenTypeEnum.WhiteSpace) {
     338          row.Add(double.NaN);
     339        } else if (current.type == TokenTypeEnum.Double) {
    334340          // just take the value
    335341          row.Add(current.doubleValue);
    336         } else if(current.type == TokenTypeEnum.Int) {
     342        } else if (current.type == TokenTypeEnum.Int) {
    337343          // translate the int value to double
    338344          row.Add((double)current.intValue);
    339         } else if(current == Tokenizer.NewlineToken) {
     345        } else if (current == Tokenizer.NewlineToken) {
    340346          // when parsing strictly all rows have to have the same number of values           
    341           if(strict) {
     347          if (strict) {
    342348            // the first row defines how many samples are needed
    343             if(samplesList.Count > 0 && samplesList[0].Count != row.Count) {
     349            if (samplesList.Count > 0 && samplesList[0].Count != row.Count) {
    344350              Error("The first row of the dataset has " + samplesList[0].Count + " columns." +
    345351                "\nLine " + tokenizer.CurrentLineNumber + " has " + row.Count + " columns.", "", tokenizer.CurrentLineNumber);
    346352            }
    347           } else if(samplesList.Count > 0) {
     353          } else if (samplesList.Count > 0) {
    348354            // when we are not strict then fill or drop elements as needed
    349             if(samplesList[0].Count > row.Count) {
     355            if (samplesList[0].Count > row.Count) {
    350356              // fill with NAN
    351               for(int i = row.Count; i < samplesList[0].Count; i++) {
     357              for (int i = row.Count; i < samplesList[0].Count; i++) {
    352358                row.Add(double.NaN);
    353359              }
    354             } else if(samplesList[0].Count < row.Count) {
     360            } else if (samplesList[0].Count < row.Count) {
    355361              // drop last k elements where k = n - length of first row
    356362              row.RemoveRange(samplesList[0].Count - 1, row.Count - samplesList[0].Count);
     
    364370          // found an unexpected token => return false when parsing strictly
    365371          // when we are parsing non-strictly we also allow unreadable values inserting NAN instead
    366           if(strict) {
     372          if (strict) {
    367373            Error("Unexpected token.", current.stringValue, tokenizer.CurrentLineNumber);
    368374          } else {
     
    374380
    375381    private void ParseMetaData(bool strict) {
    376       while(tokenizer.HasNext() && tokenizer.Peek().type == TokenTypeEnum.String) {
     382      while (tokenizer.HasNext() && (tokenizer.Peek().type == TokenTypeEnum.WhiteSpace || tokenizer.Peek().type == TokenTypeEnum.String)) {
     383        while (tokenizer.HasNext() && tokenizer.Peek().type == TokenTypeEnum.WhiteSpace) tokenizer.Next();
    377384        Token nameToken = tokenizer.Next();
    378         if(nameToken.type != TokenTypeEnum.String)
     385        if (nameToken.type != TokenTypeEnum.String)
    379386          Error("Expected a variable name.", nameToken.stringValue, tokenizer.CurrentLineNumber);
    380387
    381388        List<Token> tokens = new List<Token>();
    382         Token valueToken = tokenizer.Next();
    383         while(valueToken != Tokenizer.NewlineToken) {
     389        Token valueToken;
     390        while (tokenizer.HasNext() && tokenizer.Peek().type == TokenTypeEnum.WhiteSpace) valueToken = tokenizer.Next();
     391        valueToken = tokenizer.Next();
     392        while (valueToken != Tokenizer.NewlineToken) {
    384393          tokens.Add(valueToken);
     394          while (tokenizer.HasNext() && tokenizer.Peek().type == TokenTypeEnum.WhiteSpace) tokenizer.Next();
    385395          valueToken = tokenizer.Next();
    386396        }
     
    392402    private void Expect(Token expectedToken) {
    393403      Token actualToken = tokenizer.Next();
    394       if(actualToken != expectedToken) {
     404      if (actualToken != expectedToken) {
    395405        Error("Expected: " + expectedToken, actualToken.stringValue, tokenizer.CurrentLineNumber);
    396406      }
Note: See TracChangeset for help on using the changeset viewer.