uves_polynomial-test.c

00001 /*                                                                              *
00002  *   This file is part of the ESO UVES Pipeline                                 *
00003  *   Copyright (C) 2004,2005 European Southern Observatory                      *
00004  *                                                                              *
00005  *   This library is free software; you can redistribute it and/or modify       *
00006  *   it under the terms of the GNU General Public License as published by       *
00007  *   the Free Software Foundation; either version 2 of the License, or          *
00008  *   (at your option) any later version.                                        *
00009  *                                                                              *
00010  *   This program is distributed in the hope that it will be useful,            *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of             *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
00013  *   GNU General Public License for more details.                               *
00014  *                                                                              *
00015  *   You should have received a copy of the GNU General Public License          *
00016  *   along with this program; if not, write to the Free Software                *
00017  *   Foundation, 51 Franklin St, Fifth Floor, Boston, MA  02111-1307  USA       *
00018  *                                                                              */
00019  
00020 /*
00021  * $Author: amodigli $
00022  * $Date: 2009/06/05 05:49:02 $
00023  * $Revision: 1.8 $
00024  * $Name: uves-4_9_1 $
00025  * $Log: uves_polynomial-test.c,v $
00026  * Revision 1.8  2009/06/05 05:49:02  amodigli
00027  * updated init/end to cpl5
00028  *
00029  * Revision 1.7  2007/09/11 17:10:20  amodigli
00030  * moved test_midas_poly to test_dfs
00031  *
00032  * Revision 1.6  2007/06/20 13:04:26  amodigli
00033  * fix interface to
00034  *
00035  * Revision 1.5  2007/05/23 06:43:23  jmlarsen
00036  * Removed unused variables
00037  *
00038  * Revision 1.4  2007/05/03 15:18:22  jmlarsen
00039  * Added function to add polynomials
00040  *
00041  * Revision 1.3  2007/04/24 12:50:29  jmlarsen
00042  * Replaced cpl_propertylist -> uves_propertylist which is much faster
00043  *
00044  * Revision 1.2  2007/03/19 13:51:41  jmlarsen
00045  * Added test of 2d fitting
00046  *
00047  * Revision 1.1  2007/03/15 12:27:18  jmlarsen
00048  * Moved unit tests to ./uves/tests and ./flames/tests
00049  *
00050  * Revision 1.3  2007/02/27 14:04:14  jmlarsen
00051  * Move unit test infrastructure to IRPLIB
00052  *
00053  * Revision 1.2  2007/01/29 12:17:54  jmlarsen
00054  * Support setting verbosity from command line
00055  *
00056  * Revision 1.1  2006/11/24 09:40:17  jmlarsen
00057  * Added polynomial tests
00058  *
00059  * Revision 1.1  2006/11/22 08:04:59  jmlarsen
00060  * Added uves_dfs unit test module
00061  *
00062  * Revision 1.20  2006/11/16 09:49:25  jmlarsen
00063  * Fixed doxygen bug
00064  *
00065  * Revision 1.19  2006/11/08 14:04:03  jmlarsen
00066  * Doxybugfix
00067  *
00068  */
00069 
00070 /*-----------------------------------------------------------------------------
00071                                 Includes
00072  -----------------------------------------------------------------------------*/
00073 
00074 #ifdef HAVE_CONFIG_H
00075 #  include <config.h>
00076 #endif
00077 
00078 #include <uves_utils_polynomial.h>
00079 #include <uves_error.h>
00080 #include <uves_utils_wrappers.h>
00081 #include <cpl_test.h>
00082 
00083 #include <cpl.h>
00084 /*-----------------------------------------------------------------------------
00085                                 Defines
00086  -----------------------------------------------------------------------------*/
00087 
00088 /*----------------------------------------------------------------------------*/
00092 /*----------------------------------------------------------------------------*/
00096 /*----------------------------------------------------------------------------*/
00100 /*----------------------------------------------------------------------------*/
00101 static void
00102 test_polynomial_fit_2d(void)
00103 {
00104     polynomial *pol = NULL;
00105     cpl_vector *x = NULL;
00106     cpl_vector *y = NULL;
00107     cpl_bivector *xy = NULL;
00108     cpl_vector *z = NULL;
00109 /*    cpl_vector *sigma = NULL;*/
00110     int degx, degy;
00111 
00112     /* build data */
00113     double coeff[3] = {43, -0.3, 0.0001};
00114     double valx, valy, valz;
00115     int npoints = 0;
00116     x = cpl_vector_new(1);
00117     y = cpl_vector_new(1);
00118     z = cpl_vector_new(1);
00119     
00120     for (valx = -10; valx <= 50; valx += 4.7)
00121         for (valy = 0.001; valy <= 0.002; valy *= 1.1)
00122             {
00123                 /* z = (2, 4) degree polynomial in x, y */
00124                 valz = coeff[0]*valx*valx + coeff[1]*valy*valx + coeff[2]*valy*valy*valy*valy;
00125                 npoints++;
00126                 cpl_vector_set_size(x, npoints);
00127                 cpl_vector_set_size(y, npoints);
00128                 cpl_vector_set_size(z, npoints);
00129                 cpl_vector_set(x, npoints-1, valx);
00130                 cpl_vector_set(y, npoints-1, valy);
00131                 cpl_vector_set(z, npoints-1, valz);
00132             }
00133     
00134     /* call function */
00135     for (degx = 0; degx <= 5; degx++)
00136         for (degy = 0; degy <= 5; degy++) {
00137             uves_unwrap_bivector_vectors(&xy);
00138             xy = cpl_bivector_wrap_vectors(x, y);
00139             
00140             uves_polynomial_delete(&pol);                    
00141             check_nomsg( pol = uves_polynomial_fit_2d(xy,
00142                                                       z,
00143                                                       NULL, /* sigma */
00144                                                       degx, degy,
00145                                                       NULL, NULL, NULL));
00146             
00147             /* test results */
00148             if (degx >= 2 && degy >= 4) {
00149                 /* Then we should have reproduced the input polynomial */
00150                 int i;
00151                 for (i = 0; i < cpl_vector_get_size(x); i++)
00152                     {
00153                         cpl_test_rel(uves_polynomial_evaluate_2d(pol, 
00154                                                                     cpl_vector_get(x, i),
00155                                                                     cpl_vector_get(y, i)),
00156                                         cpl_vector_get(z, i), 0.001);
00157                     }
00158                 
00159                 /* comparing the actual coefficients is less reliable */
00160 #if 0
00161                 for (i = 0; i <= degx; i++)
00162                     for (j = 0; j <= degy; j++)
00163                         if (i == 2 && j == 0)
00164                             cpl_test_rel(uves_polynomial_get_coeff_2d(pol, i, j), coeff[0], 0.0001);
00165                         else if (i == 1 && j == 1)
00166                             cpl_test_rel(uves_polynomial_get_coeff_2d(pol, i, j), coeff[1], 0.0001);
00167                         else if (i == 0 && j == 4)
00168                             cpl_test_rel(uves_polynomial_get_coeff_2d(pol, i, j), coeff[2], 0.0001);
00169                         else
00170                             {
00171                                 uves_msg_warning("%d, %d", i, j);
00172                                 cpl_test_abs(uves_polynomial_get_coeff_2d(pol, i, j), 0, 0.1);
00173                             }
00174 #endif
00175             }
00176         }
00177     
00178   cleanup:
00179     uves_free_vector(&x);
00180     uves_free_vector(&y);
00181     uves_free_vector(&z);
00182     uves_unwrap_bivector_vectors(&xy);
00183     uves_polynomial_delete(&pol);                    
00184     return;
00185 }
00186 
00187 /*----------------------------------------------------------------------------*/
00191 /*----------------------------------------------------------------------------*/
00192 static void
00193 test_polynomial(void)
00194 {
00195     cpl_polynomial *cp1 = cpl_polynomial_new(2);
00196     cpl_polynomial *cp2 = cpl_polynomial_new(2);
00197     int power[2] = {0, 3};
00198     polynomial *p1;
00199     polynomial *p2;
00200     polynomial *p3;
00201 
00202     cpl_polynomial_set_coeff(cp1, power, 7.0);
00203     cpl_polynomial_set_coeff(cp2, power, 9.0);
00204 
00205     p1 = uves_polynomial_new(cp1);
00206     p2 = uves_polynomial_new(cp2);
00207 
00208     uves_polynomial_rescale(p1, 0, 2.0);
00209     uves_polynomial_rescale(p2, 0, 2.0);
00210 
00211     check_nomsg( p3 = uves_polynomial_add_2d(p1, p2) );
00212 
00213     cpl_test_abs(uves_polynomial_get_coeff_2d(p3, 0, 0), 0 , 0.0001);
00214     cpl_test_abs(uves_polynomial_get_coeff_2d(p3, 0, 3), 7*2+9*2, 0.0001);
00215     
00216   cleanup:
00217     uves_free_polynomial(&cp1);
00218     uves_free_polynomial(&cp2);
00219     uves_polynomial_delete(&p1);
00220     uves_polynomial_delete(&p2);
00221     uves_polynomial_delete(&p3);
00222     return;
00223     
00224 }
00225    
00226 /*----------------------------------------------------------------------------*/
00230 /*----------------------------------------------------------------------------*/
00231 
00232 int main(void)
00233 {
00234     cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
00235 
00236     test_polynomial_fit_2d();
00237 
00238     check_nomsg( test_polynomial() );
00239 
00240   cleanup:
00241     return cpl_test_end(0);
00242 }
00243 
00244 

Generated on 8 Mar 2011 for UVES Pipeline Reference Manual by  doxygen 1.6.1