00001 #include "mmn_solver.h" 00002 //: 00003 // \file 00004 // \brief Base for classes which solve Markov Random Field problems 00005 // \author Tim Cootes 00006 00007 #include <vsl/vsl_indent.h> 00008 #include <vsl/vsl_binary_loader.h> 00009 #include <vcl_cassert.h> 00010 00011 #include <mbl/mbl_parse_block.h> 00012 #include <mbl/mbl_read_props.h> 00013 #include <mbl/mbl_cloneables_factory.h> 00014 00015 //======================================================================= 00016 // Dflt ctor 00017 //======================================================================= 00018 00019 mmn_solver::mmn_solver() 00020 { 00021 } 00022 00023 //======================================================================= 00024 // Destructor 00025 //======================================================================= 00026 00027 mmn_solver::~mmn_solver() 00028 { 00029 } 00030 00031 00032 //: Initialise from a string stream 00033 bool mmn_solver::set_from_stream(vcl_istream &is) 00034 { 00035 // Cycle through string and produce a map of properties 00036 vcl_string s = mbl_parse_block(is); 00037 vcl_istringstream ss(s); 00038 mbl_read_props_type props = mbl_read_props_ws(ss); 00039 00040 if (props.size()!=0) 00041 { 00042 vcl_cerr<<is_a()<<" does not expect any extra arguments.\n"; 00043 mbl_read_props_look_for_unused_props( 00044 "mmn_solver::set_from_stream", props, mbl_read_props_type()); 00045 } 00046 return true; 00047 } 00048 00049 //======================================================================= 00050 // Method: version_no 00051 //======================================================================= 00052 00053 short mmn_solver::version_no() const 00054 { 00055 return 1; 00056 } 00057 00058 //======================================================================= 00059 // Method: is_a 00060 //======================================================================= 00061 00062 vcl_string mmn_solver::is_a() const 00063 { 00064 return vcl_string("mmn_solver"); 00065 } 00066 00067 //: Allows derived class to be loaded by base-class pointer 00068 void vsl_add_to_binary_loader(const mmn_solver& b) 00069 { 00070 vsl_binary_loader<mmn_solver>::instance().add(b); 00071 } 00072 00073 //: Create a concrete region_model-derived object, from a text specification. 00074 vcl_auto_ptr<mmn_solver> mmn_solver:: 00075 create_from_stream(vcl_istream &is) 00076 { 00077 vcl_string name; 00078 is >> name; 00079 vcl_auto_ptr<mmn_solver> pair_cost; 00080 try { 00081 pair_cost = mbl_cloneables_factory<mmn_solver>::get_clone(name); 00082 } 00083 catch (const mbl_exception_no_name_in_factory & e) 00084 { 00085 throw (mbl_exception_parse_error( e.what() )); 00086 } 00087 pair_cost->set_from_stream(is); 00088 return pair_cost; 00089 } 00090 00091 //======================================================================= 00092 // Associated function: operator<< 00093 //======================================================================= 00094 00095 void vsl_b_write(vsl_b_ostream& bfs, const mmn_solver& b) 00096 { 00097 b.b_write(bfs); 00098 } 00099 00100 //======================================================================= 00101 // Associated function: operator>> 00102 //======================================================================= 00103 00104 void vsl_b_read(vsl_b_istream& bfs, mmn_solver& b) 00105 { 00106 b.b_read(bfs); 00107 } 00108 00109 //======================================================================= 00110 // Associated function: operator<< 00111 //======================================================================= 00112 00113 vcl_ostream& operator<<(vcl_ostream& os,const mmn_solver& b) 00114 { 00115 os << b.is_a() << ": "; 00116 vsl_indent_inc(os); 00117 b.print_summary(os); 00118 vsl_indent_dec(os); 00119 return os; 00120 } 00121 00122 //======================================================================= 00123 // Associated function: operator<< 00124 //======================================================================= 00125 00126 vcl_ostream& operator<<(vcl_ostream& os,const mmn_solver* b) 00127 { 00128 if (b) 00129 return os << *b; 00130 else 00131 return os << "No mmn_solver defined."; 00132 }
1.7.5.1