00001 00002 // 00003 // FreeLing - Open Source Language Analyzers 00004 // 00005 // Copyright (C) 2004 TALP Research Center 00006 // Universitat Politecnica de Catalunya 00007 // 00008 // This library is free software; you can redistribute it and/or 00009 // modify it under the terms of the GNU Lesser General Public 00010 // License as published by the Free Software Foundation; either 00011 // version 2.1 of the License, or (at your option) any later version. 00012 // 00013 // This library is distributed in the hope that it will be useful, 00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 // Lesser General Public License for more details. 00017 // 00018 // You should have received a copy of the GNU Lesser General Public 00019 // License along with this library; if not, write to the Free Software 00020 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00021 // 00022 // contact: Lluis Padro (padro@lsi.upc.es) 00023 // TALP Research Center 00024 // despatx C6.212 - Campus Nord UPC 00025 // 08034 Barcelona. SPAIN 00026 // 00028 00029 #ifndef _RELAX 00030 #define _RELAX 00031 00032 #include <list> 00033 #include <vector> 00034 00035 using namespace std; 00036 00037 // just declaring to break ciclic references 00038 class constraint; 00039 00051 00052 class problem : vector<list<double> > { 00053 friend class relax; 00054 public: 00056 problem(int); 00058 void add_label(int, double); 00059 }; 00060 00061 00068 00069 class label { 00070 friend class relax; 00071 protected: 00073 double weight[2]; 00075 list<constraint> constraints; 00076 00077 public: 00079 label(); 00080 00081 }; 00082 00089 00090 class constraint : public vector<vector<double*> > { 00091 private: 00092 double compatibility; 00093 00094 public: 00096 constraint(); 00097 00099 void set_compatibility(double); 00100 double get_compatibility() const; 00101 }; 00102 00109 00110 class relax { 00111 private: 00113 vector<vector<label> > vars; 00115 int CURRENT, NEXT; 00117 int MaxIter; 00119 double ScaleFactor; 00121 double Epsilon; 00122 00124 double NormalizeSupport(double) const; 00125 bool there_are_changes() const; 00126 00127 public: 00129 relax(int, double, double); 00130 00132 void reset(const problem &); 00134 void add_constraint (int, int, const list<list<pair<int,int> > > &, double); 00136 void solve(); 00138 list<int> best_label(int) const; 00139 }; 00140 00141 00142 #endif