test/data_lookup_1d.cc

Code
Comments
Other
Rev Date Author Line
537 05 Mar 06 peter 1 // $Id$
537 05 Mar 06 peter 2
675 10 Oct 06 jari 3 /*
2119 12 Dec 09 peter 4   Copyright (C) 2006 Jari Häkkinen, Peter Johansson, Markus Ringnér
2119 12 Dec 09 peter 5   Copyright (C) 2007, 2008 Jari Häkkinen, Peter Johansson
4207 26 Aug 22 peter 6   Copyright (C) 2009, 2012, 2013, 2022 Peter Johansson
537 05 Mar 06 peter 7
1437 25 Aug 08 peter 8   This file is part of the yat library, http://dev.thep.lu.se/yat
675 10 Oct 06 jari 9
675 10 Oct 06 jari 10   The yat library is free software; you can redistribute it and/or
675 10 Oct 06 jari 11   modify it under the terms of the GNU General Public License as
1486 09 Sep 08 jari 12   published by the Free Software Foundation; either version 3 of the
675 10 Oct 06 jari 13   License, or (at your option) any later version.
675 10 Oct 06 jari 14
675 10 Oct 06 jari 15   The yat library is distributed in the hope that it will be useful,
675 10 Oct 06 jari 16   but WITHOUT ANY WARRANTY; without even the implied warranty of
675 10 Oct 06 jari 17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
675 10 Oct 06 jari 18   General Public License for more details.
675 10 Oct 06 jari 19
675 10 Oct 06 jari 20   You should have received a copy of the GNU General Public License
1487 10 Sep 08 jari 21   along with yat. If not, see <http://www.gnu.org/licenses/>.
675 10 Oct 06 jari 22 */
675 10 Oct 06 jari 23
2881 18 Nov 12 peter 24 #include <config.h>
2881 18 Nov 12 peter 25
1233 15 Mar 08 peter 26 #include "Suite.h"
1233 15 Mar 08 peter 27
1121 22 Feb 08 peter 28 #include "yat/utility/Matrix.h"
675 10 Oct 06 jari 29 #include "yat/classifier/DataLookup1D.h"
675 10 Oct 06 jari 30 #include "yat/classifier/MatrixLookup.h"
820 17 Mar 07 peter 31 #include "yat/classifier/utility.h"
675 10 Oct 06 jari 32
679 11 Oct 06 markus 33
679 11 Oct 06 markus 34 #include <cstdio>
537 05 Mar 06 peter 35 #include <fstream>
537 05 Mar 06 peter 36 #include <iostream>
2055 08 Sep 09 peter 37 #include <limits>
537 05 Mar 06 peter 38 #include <vector>
593 25 Aug 06 markus 39 #include <cmath>
537 05 Mar 06 peter 40
680 11 Oct 06 jari 41 using namespace theplu::yat;
537 05 Mar 06 peter 42
1121 22 Feb 08 peter 43 utility::Matrix matrix(size_t n);
537 05 Mar 06 peter 44
1233 15 Mar 08 peter 45 int main(int argc, char* argv[])
537 05 Mar 06 peter 46 {
1233 15 Mar 08 peter 47   theplu::yat::test::Suite suite(argc, argv);
680 11 Oct 06 jari 48   using namespace theplu::yat::classifier;
537 05 Mar 06 peter 49
1233 15 Mar 08 peter 50   suite.err() << "Testing Lookup Classes" << std::endl;
1233 15 Mar 08 peter 51   suite.err() << "Testing DataLookup1D" << std::endl;
1121 22 Feb 08 peter 52   utility::Matrix gsl_m1(matrix(5));
537 05 Mar 06 peter 53   std::vector<size_t> index_odd;
537 05 Mar 06 peter 54   index_odd.push_back(1);
537 05 Mar 06 peter 55   index_odd.push_back(3);
537 05 Mar 06 peter 56   std::vector<size_t> index_even;
537 05 Mar 06 peter 57   index_even.push_back(2);
537 05 Mar 06 peter 58   index_even.push_back(0);
537 05 Mar 06 peter 59   index_even.push_back(4);
1134 23 Feb 08 peter 60   classifier::MatrixLookup m1(gsl_m1,utility::Index(index_odd),
1134 23 Feb 08 peter 61                               utility::Index(index_even));
1233 15 Mar 08 peter 62   suite.err() << gsl_m1 << std::endl << '\n';
1233 15 Mar 08 peter 63   suite.err() << m1 << std::endl;
1233 15 Mar 08 peter 64   suite.err() << "DataLookup1D::DataLookup1D(const MatrixLookup&\n"
537 05 Mar 06 peter 65          << "                           const size_t, const bool)...";
565 16 Mar 06 peter 66   classifier::DataLookup1D v1(m1,1, true);
4200 19 Aug 22 peter 67   if (v1.size()!=m1.columns() || v1(0)!=m1(1,0) ||
537 05 Mar 06 peter 68       v1(1)!=m1(1,1) ) {
3103 02 Nov 13 peter 69     suite.add(false);
1233 15 Mar 08 peter 70     suite.err() << "\nERROR" << std::endl;
4200 19 Aug 22 peter 71     suite.err() << "size: " << v1.size() << " expected " << m1.columns() << "\n"
537 05 Mar 06 peter 72            << "v1(0): " << v1(0) << " expected " << m1(1,0) << "\n"
4200 19 Aug 22 peter 73            << "v1(1): " << v1(1) << " expected " << m1(1,1)
537 05 Mar 06 peter 74            << std::endl;
537 05 Mar 06 peter 75   }
537 05 Mar 06 peter 76   else
1233 15 Mar 08 peter 77     suite.err() << "Ok" << std::endl;
537 05 Mar 06 peter 78
1233 15 Mar 08 peter 79   suite.err() << "DataLookup1D::DataLookup1D(const MatrixLookup&\n"
537 05 Mar 06 peter 80          << "                           const size_t, const bool false)...";
537 05 Mar 06 peter 81   classifier::DataLookup1D v2(m1,1,false);
537 05 Mar 06 peter 82   if (v2.size()!=m1.rows() || v2(0)!=m1(0,1) || v2(1)!=m1(1,1) ) {
3103 02 Nov 13 peter 83     suite.add(false);
1233 15 Mar 08 peter 84     suite.err() << "\nERROR\n"
4200 19 Aug 22 peter 85            << "size: " << v2.size() << " expected " << m1.rows() << "\n"
537 05 Mar 06 peter 86            << "v2(0): " << v2(0) << " expected " << m1(0,1) << "\n"
4200 19 Aug 22 peter 87            << "v2(1): " << v2(1) << " expected " << m1(1,1)
537 05 Mar 06 peter 88            << std::endl;
537 05 Mar 06 peter 89   }
537 05 Mar 06 peter 90   else
1233 15 Mar 08 peter 91     suite.err() << "Ok" << std::endl;
537 05 Mar 06 peter 92
1233 15 Mar 08 peter 93   suite.err() << "DataLookup1D::DataLookup1D(const DataLookup1D&)...";
537 05 Mar 06 peter 94   classifier::DataLookup1D v3(v2);
537 05 Mar 06 peter 95   if (v3.size()!=v2.size() || v3(0)!=v2(0) || v3(1)!=v2(1) ) {
3103 02 Nov 13 peter 96     suite.add(false);
1233 15 Mar 08 peter 97     suite.err() << "\nERROR\n"
4200 19 Aug 22 peter 98            << "size: " << v3.size() << " expected " << v2.size() << "\n"
537 05 Mar 06 peter 99            << "v2(0): " << v3(0) << " expected " << v2(0) << "\n"
537 05 Mar 06 peter 100            << "v2(1): " << v3(1) << " expected " <<  v2(1)
537 05 Mar 06 peter 101            << std::endl;
537 05 Mar 06 peter 102   }
537 05 Mar 06 peter 103   else
1233 15 Mar 08 peter 104     suite.err() << "Ok" << std::endl;
537 05 Mar 06 peter 105
1233 15 Mar 08 peter 106   suite.err() << "DataLookup1D::DataLookup1D(const size_t, const double)...";
537 05 Mar 06 peter 107   classifier::DataLookup1D v4(12,3);
537 05 Mar 06 peter 108   if (v4.size()!=12 || v4(10)!=3 ) {
3103 02 Nov 13 peter 109     suite.add(false);
1233 15 Mar 08 peter 110     suite.err() << "\nERROR\n"
4200 19 Aug 22 peter 111            << "size: " << v4.size() << " expected " << 12 << "\n"
4200 19 Aug 22 peter 112            << "v2(0): " << v4(10) << " expected " << 3
537 05 Mar 06 peter 113            << std::endl;
537 05 Mar 06 peter 114   }
537 05 Mar 06 peter 115   else
1233 15 Mar 08 peter 116     suite.err() << "Ok" << std::endl;
537 05 Mar 06 peter 117
1233 15 Mar 08 peter 118   suite.err() << "Testing that output from ostream operator for DataLookup1D"
616 31 Aug 06 jari 119          << " can be used by the utility::vector istream constructor...";
593 25 Aug 06 markus 120
593 25 Aug 06 markus 121   // First with a vector with no missing values separated by ' '.
1251 03 Apr 08 peter 122   std::ofstream my_out("/tmp/yat_test_datalookup1D.txt");
593 25 Aug 06 markus 123   my_out << v1;
593 25 Aug 06 markus 124   my_out.close();
1251 03 Apr 08 peter 125   std::ifstream is("/tmp/yat_test_datalookup1D.txt");
1120 21 Feb 08 peter 126   utility::Vector v5(is);
593 25 Aug 06 markus 127   is.close();
593 25 Aug 06 markus 128   if (v5.size()!=v1.size() || v5(0)!=v1(0) || v5(1)!=v1(1) ||
593 25 Aug 06 markus 129       v5(2)!=v1(2)) {
3103 02 Nov 13 peter 130     suite.add(false);
1233 15 Mar 08 peter 131     suite.err() << "\nERROR\n" << std::endl;
593 25 Aug 06 markus 132   }
1251 03 Apr 08 peter 133   std::remove("/tmp/yat_test_datalookup1D.txt");
4200 19 Aug 22 peter 134
593 25 Aug 06 markus 135   // Second with a vector with a missing value separated by '\t'.
593 25 Aug 06 markus 136   gsl_m1(3,0)=std::numeric_limits<double>::quiet_NaN();
4200 19 Aug 22 peter 137   classifier::DataLookup1D v6(m1,1, true);
1251 03 Apr 08 peter 138   my_out.open("/tmp/yat_test_datalookup1D.txt");
593 25 Aug 06 markus 139   char prev=my_out.fill('\t');
593 25 Aug 06 markus 140   my_out << v1;
593 25 Aug 06 markus 141   my_out.fill(prev);
593 25 Aug 06 markus 142   my_out.close();
1251 03 Apr 08 peter 143   is.open("/tmp/yat_test_datalookup1D.txt");
1120 21 Feb 08 peter 144   utility::Vector v7(is,'\t');
593 25 Aug 06 markus 145   is.close();
593 25 Aug 06 markus 146   if (v7.size()!=v6.size() || !std::isnan(v7(1))) {
3103 02 Nov 13 peter 147     suite.add(false);
1233 15 Mar 08 peter 148     suite.err() << "\nERROR\n"
4200 19 Aug 22 peter 149            << "size: " << v7.size() << " expected " << v6.size() << "\n"
4200 19 Aug 22 peter 150            << "v7(1): " << v7(1) << " expected nan\n"
593 25 Aug 06 markus 151            << std::endl;
593 25 Aug 06 markus 152   }
1251 03 Apr 08 peter 153   std::remove("data/yat_test_datalookup1D.txt");
1233 15 Mar 08 peter 154   suite.err() << "\n";
820 17 Mar 07 peter 155
820 17 Mar 07 peter 156   DataLookup1D dl(v5);
1120 21 Feb 08 peter 157   utility::Vector v8;
820 17 Mar 07 peter 158   classifier::convert(dl, v8);
820 17 Mar 07 peter 159   if (!v5.equal(v8,0.0)) {
3103 02 Nov 13 peter 160     suite.add(false);
1233 15 Mar 08 peter 161     suite.err() << "Error: Creating a DataLookup1D(utility::vector)\n"
820 17 Mar 07 peter 162            << "and classifier::convert(DataLookup, utility::vector)\n"
820 17 Mar 07 peter 163            << "does not give back original vector\n"
820 17 Mar 07 peter 164            << "orginal:      " << v5 << "\n"
820 17 Mar 07 peter 165            << "DataLookup1D: " << dl << "\n"
820 17 Mar 07 peter 166            << "final result: " << v8 << "\n"
820 17 Mar 07 peter 167            << std::endl;
820 17 Mar 07 peter 168   }
820 17 Mar 07 peter 169
1233 15 Mar 08 peter 170   return suite.return_value();
537 05 Mar 06 peter 171 }
537 05 Mar 06 peter 172
1121 22 Feb 08 peter 173 utility::Matrix matrix(size_t n)
537 05 Mar 06 peter 174 {
1121 22 Feb 08 peter 175   utility::Matrix res(n,n);
537 05 Mar 06 peter 176   for (size_t i=0;i<n;i++)
537 05 Mar 06 peter 177     for (size_t j=0;j<n;j++)
537 05 Mar 06 peter 178       res(i,j)=10*i+j;
537 05 Mar 06 peter 179   return res;
537 05 Mar 06 peter 180 }