MOOCHO (Single Doxygen Collection) Version of the Day
DenseLinAlgPack_assert_print_nan_inf.cpp
Go to the documentation of this file.
00001 // @HEADER
00002 // ***********************************************************************
00003 //
00004 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
00005 //                  Copyright (2003) Sandia Corporation
00006 //
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov)
00038 //
00039 // ***********************************************************************
00040 // @HEADER
00041 
00042 #include <ostream>
00043 #include <sstream>
00044 #include <iomanip>
00045 
00046 #include "DenseLinAlgPack_assert_print_nan_inf.hpp"
00047 #include "DenseLinAlgPack_DVectorClass.hpp"
00048 #include "DenseLinAlgPack_DMatrixClass.hpp"
00049 #include "check_nan_inf.h"
00050 
00051 bool DenseLinAlgPack::assert_print_nan_inf( const value_type& val
00052   , const std::string & name, bool throw_excpt, std::ostream* out )
00053 {
00054 
00055   if( RTOp_is_nan_inf(val) ) {
00056     std::ostringstream omsg;
00057     omsg
00058       << "The scalar \"" << name
00059       << "\" = " << val << " is not a valid bounded number";
00060     if(out)
00061       *out << omsg.str() << std::endl;
00062     if( throw_excpt ) {
00063       if(out)
00064         out->flush();
00065       throw NaNInfException( "assert_print_nan_inf(...) : Error, "
00066         + omsg.str() );
00067     }
00068     return false;
00069   }
00070   return true;
00071 }
00072 
00073 bool DenseLinAlgPack::assert_print_nan_inf( const DVectorSlice& v
00074   , const std::string & name, bool throw_excpt, std::ostream* out )
00075 {
00076 
00077   bool has_nan_or_inf = false;
00078   bool printed_header = false;
00079 
00080   for( DVectorSlice::const_iterator v_itr = v.begin(); v_itr != v.end(); ++v_itr ) {
00081     if( RTOp_is_nan_inf(*v_itr) ) {
00082       if(out) {
00083         if(!printed_header) {
00084           *out
00085             << "The vector \"" << name
00086             << "\" has the following NaN or Inf entries\n";
00087           printed_header = true;
00088         }
00089         *out
00090           << name << "(" << v_itr - v.begin() + 1 << ") = "
00091           << *v_itr << std::endl;
00092       }
00093       has_nan_or_inf = true;
00094     }
00095   }
00096   if( has_nan_or_inf && throw_excpt ) {
00097     if(out)
00098       out->flush();
00099     std::ostringstream omsg;
00100     omsg
00101       << "assert_print_nan_inf(...) : Error, the vector named "
00102       << name << " has at least one element which is NaN or Inf";
00103     throw NaNInfException( omsg.str() );
00104   }
00105 
00106   return !has_nan_or_inf;
00107 }
00108 
00109 bool DenseLinAlgPack::assert_print_nan_inf( const DMatrixSlice& m
00110   , const std::string & name, bool throw_excpt, std::ostream* out )
00111 {
00112 
00113   bool has_nan_or_inf = false;
00114   bool printed_header = false;
00115 
00116   for( size_type j = 1; j <= m.cols(); ++j ) {
00117     const DVectorSlice& v = m.col(j);
00118     for( DVectorSlice::const_iterator v_itr = v.begin(); v_itr != v.end(); ++v_itr ) {
00119       if( RTOp_is_nan_inf(*v_itr) ) {
00120         if(out) {
00121           if(!printed_header) {
00122             *out
00123               << "The matrix \"" << name
00124               << "\" has the following NaN or Inf entries\n";
00125             printed_header = true;
00126           }
00127           *out
00128             << name << "(" << v_itr - v.begin() + 1 << "," << j << ") = "
00129             << *v_itr << std::endl;
00130         }
00131         has_nan_or_inf = true;
00132       }
00133     }
00134   }
00135 
00136   if( has_nan_or_inf && throw_excpt ) {
00137     if(out)
00138       out->flush();
00139     std::ostringstream omsg;
00140     omsg
00141       << "assert_print_nan_inf(...) : Error, the matrix named "
00142       << name << " has at least one element which is NaN or Inf";
00143     throw NaNInfException( omsg.str() );
00144   }
00145 
00146   return has_nan_or_inf;
00147 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines