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: 2007/09/11 17:10:20 $
00023  * $Revision: 1.7 $
00024  * $Name: uves-3_4_5 $
00025  * $Log: uves_polynomial-test.c,v $
00026  * Revision 1.7  2007/09/11 17:10:20  amodigli
00027  * moved test_midas_poly to test_dfs
00028  *
00029  * Revision 1.6  2007/06/20 13:04:26  amodigli
00030  * fix interface to
00031  *
00032  * Revision 1.5  2007/05/23 06:43:23  jmlarsen
00033  * Removed unused variables
00034  *
00035  * Revision 1.4  2007/05/03 15:18:22  jmlarsen
00036  * Added function to add polynomials
00037  *
00038  * Revision 1.3  2007/04/24 12:50:29  jmlarsen
00039  * Replaced cpl_propertylist -> uves_propertylist which is much faster
00040  *
00041  * Revision 1.2  2007/03/19 13:51:41  jmlarsen
00042  * Added test of 2d fitting
00043  *
00044  * Revision 1.1  2007/03/15 12:27:18  jmlarsen
00045  * Moved unit tests to ./uves/tests and ./flames/tests
00046  *
00047  * Revision 1.3  2007/02/27 14:04:14  jmlarsen
00048  * Move unit test infrastructure to IRPLIB
00049  *
00050  * Revision 1.2  2007/01/29 12:17:54  jmlarsen
00051  * Support setting verbosity from command line
00052  *
00053  * Revision 1.1  2006/11/24 09:40:17  jmlarsen
00054  * Added polynomial tests
00055  *
00056  * Revision 1.1  2006/11/22 08:04:59  jmlarsen
00057  * Added uves_dfs unit test module
00058  *
00059  * Revision 1.20  2006/11/16 09:49:25  jmlarsen
00060  * Fixed doxygen bug
00061  *
00062  * Revision 1.19  2006/11/08 14:04:03  jmlarsen
00063  * Doxybugfix
00064  *
00065  */
00066 
00067 /*-----------------------------------------------------------------------------
00068                                 Includes
00069  -----------------------------------------------------------------------------*/
00070 
00071 #ifdef HAVE_CONFIG_H
00072 #  include <config.h>
00073 #endif
00074 
00075 #include <uves_utils_polynomial.h>
00076 #include <uves_error.h>
00077 #include <uves_utils_wrappers.h>
00078 #include <irplib_test.h>
00079 
00080 #include <cpl.h>
00081 /*-----------------------------------------------------------------------------
00082                                 Defines
00083  -----------------------------------------------------------------------------*/
00084 
00085 /*----------------------------------------------------------------------------*/
00089 /*----------------------------------------------------------------------------*/
00093 /*----------------------------------------------------------------------------*/
00097 /*----------------------------------------------------------------------------*/
00098 static void
00099 test_polynomial_fit_2d(void)
00100 {
00101     polynomial *pol = NULL;
00102     cpl_vector *x = NULL;
00103     cpl_vector *y = NULL;
00104     cpl_bivector *xy = NULL;
00105     cpl_vector *z = NULL;
00106 /*    cpl_vector *sigma = NULL;*/
00107     int degx, degy;
00108 
00109     /* build data */
00110     double coeff[3] = {43, -0.3, 0.0001};
00111     double valx, valy, valz;
00112     int npoints = 0;
00113     x = cpl_vector_new(1);
00114     y = cpl_vector_new(1);
00115     z = cpl_vector_new(1);
00116     
00117     for (valx = -10; valx <= 50; valx += 4.7)
00118         for (valy = 0.001; valy <= 0.002; valy *= 1.1)
00119             {
00120                 /* z = (2, 4) degree polynomial in x, y */
00121                 valz = coeff[0]*valx*valx + coeff[1]*valy*valx + coeff[2]*valy*valy*valy*valy;
00122                 npoints++;
00123                 cpl_vector_set_size(x, npoints);
00124                 cpl_vector_set_size(y, npoints);
00125                 cpl_vector_set_size(z, npoints);
00126                 cpl_vector_set(x, npoints-1, valx);
00127                 cpl_vector_set(y, npoints-1, valy);
00128                 cpl_vector_set(z, npoints-1, valz);
00129             }
00130     
00131     /* call function */
00132     for (degx = 0; degx <= 5; degx++)
00133         for (degy = 0; degy <= 5; degy++) {
00134             uves_unwrap_bivector_vectors(&xy);
00135             xy = cpl_bivector_wrap_vectors(x, y);
00136             
00137             uves_polynomial_delete(&pol);                    
00138             check_nomsg( pol = uves_polynomial_fit_2d(xy,
00139                                                       z,
00140                                                       NULL, /* sigma */
00141                                                       degx, degy,
00142                                                       NULL, NULL, NULL));
00143             
00144             /* test results */
00145             if (degx >= 2 && degy >= 4) {
00146                 /* Then we should have reproduced the input polynomial */
00147                 int i;
00148                 for (i = 0; i < cpl_vector_get_size(x); i++)
00149                     {
00150                         irplib_test_rel(uves_polynomial_evaluate_2d(pol, 
00151                                                                     cpl_vector_get(x, i),
00152                                                                     cpl_vector_get(y, i)),
00153                                         cpl_vector_get(z, i), 0.001);
00154                     }
00155                 
00156                 /* comparing the actual coefficients is less reliable */
00157 #if 0
00158                 for (i = 0; i <= degx; i++)
00159                     for (j = 0; j <= degy; j++)
00160                         if (i == 2 && j == 0)
00161                             irplib_test_rel(uves_polynomial_get_coeff_2d(pol, i, j), coeff[0], 0.0001);
00162                         else if (i == 1 && j == 1)
00163                             irplib_test_rel(uves_polynomial_get_coeff_2d(pol, i, j), coeff[1], 0.0001);
00164                         else if (i == 0 && j == 4)
00165                             irplib_test_rel(uves_polynomial_get_coeff_2d(pol, i, j), coeff[2], 0.0001);
00166                         else
00167                             {
00168                                 uves_msg_warning("%d, %d", i, j);
00169                                 irplib_test_abs(uves_polynomial_get_coeff_2d(pol, i, j), 0, 0.1);
00170                             }
00171 #endif
00172             }
00173         }
00174     
00175   cleanup:
00176     uves_free_vector(&x);
00177     uves_free_vector(&y);
00178     uves_free_vector(&z);
00179     uves_unwrap_bivector_vectors(&xy);
00180     uves_polynomial_delete(&pol);                    
00181     return;
00182 }
00183 
00184 /*----------------------------------------------------------------------------*/
00188 /*----------------------------------------------------------------------------*/
00189 static void
00190 test_polynomial(void)
00191 {
00192     cpl_polynomial *cp1 = cpl_polynomial_new(2);
00193     cpl_polynomial *cp2 = cpl_polynomial_new(2);
00194     int power[2] = {0, 3};
00195     polynomial *p1;
00196     polynomial *p2;
00197     polynomial *p3;
00198 
00199     cpl_polynomial_set_coeff(cp1, power, 7.0);
00200     cpl_polynomial_set_coeff(cp2, power, 9.0);
00201 
00202     p1 = uves_polynomial_new(cp1);
00203     p2 = uves_polynomial_new(cp2);
00204 
00205     uves_polynomial_rescale(p1, 0, 2.0);
00206     uves_polynomial_rescale(p2, 0, 2.0);
00207 
00208     check_nomsg( p3 = uves_polynomial_add_2d(p1, p2) );
00209 
00210     irplib_test_abs(uves_polynomial_get_coeff_2d(p3, 0, 0), 0 , 0.0001);
00211     irplib_test_abs(uves_polynomial_get_coeff_2d(p3, 0, 3), 7*2+9*2, 0.0001);
00212     
00213   cleanup:
00214     uves_free_polynomial(&cp1);
00215     uves_free_polynomial(&cp2);
00216     uves_polynomial_delete(&p1);
00217     uves_polynomial_delete(&p2);
00218     uves_polynomial_delete(&p3);
00219     return;
00220     
00221 }
00222    
00223 /*----------------------------------------------------------------------------*/
00227 /*----------------------------------------------------------------------------*/
00228 
00229 int main(void)
00230 {
00231     IRPLIB_TEST_INIT;
00232 
00233     test_polynomial_fit_2d();
00234 
00235     check_nomsg( test_polynomial() );
00236 
00237   cleanup:
00238     IRPLIB_TEST_END;
00239 }
00240 
00241 

Generated on Thu Nov 15 14:32:29 2007 for UVES Pipeline Reference Manual by  doxygen 1.5.1