00001 #include<scil/scil.h>
00002 #include<scil/column.h>
00003
00004 using namespace SCIL;
00005 using namespace LEDA;
00006
00007 column_entry column::inf(const item i) const
00008 {
00009 return NZ.inf(i);
00010 }
00011
00012 int column::size() {
00013
00014 return NZ.size();
00015 }
00016
00017
00018 column::item column::first_item() const
00019 {
00020
00021 return NZ.first_item();
00022 };
00023
00024
00025 column::column(double d)
00026 {
00027
00028 NZ.append(column_entry(nil, d));
00029 }
00030
00031 column::column (cons v)
00032 {
00033 NZ.append (column_entry (v, 1));
00034 }
00035
00036 column::column (list<column_entry> &L)
00037 {
00038 NZ = L;
00039 }
00040
00041 void
00042 column::normalize ()
00043 {
00044 NZ.sort ();
00045 list_item
00046 li;
00047 forall_items (li, NZ)
00048 {
00049 while ((NZ.succ (li) != nil) && (NZ[li].Cons == NZ[NZ.succ (li)].Cons))
00050 {
00051 NZ[li].coeff += NZ[NZ.succ (li)].coeff;
00052 NZ.del_item (NZ.succ (li));
00053 }
00054 }
00055 }
00056
00057 column
00058 column::operator * (double d)
00059 {
00060 column_entry
00061 st;
00062 list < column_entry > NNZ;
00063 forall (st, NZ)
00064 {
00065 NNZ.append (column_entry (st.Cons, d * st.coeff));
00066 };
00067 return column (NNZ);
00068 }
00069
00070 column
00071 column::operator + (column r)
00072 {
00073 list < column_entry > NNZ;
00074 list_item
00075 l1 = r.NZ.first ();
00076 column_entry
00077 st;
00078 double
00079 d;
00080 forall (st, NZ)
00081 {
00082 d = 0;
00083 while ((l1 != nil) && (r.NZ[l1].Cons <= st.Cons))
00084 {
00085 if (r.NZ[l1].Cons != st.Cons)
00086 {
00087 NNZ.append (r.NZ[l1]);
00088 }
00089 else
00090 {
00091 d = r.NZ[l1].coeff;
00092 }
00093 l1 = r.NZ.succ (l1);
00094 }
00095 NNZ.append (column_entry (st.Cons, st.coeff + d));
00096 }
00097 return column (NNZ);
00098 }
00099
00100 column & column::operator += (column r)
00101 {
00102 column_entry
00103 st;
00104 forall (st, r.NZ)
00105 {
00106 NZ.append (st);
00107 }
00108 return *this;
00109 }
00110
00111 column & column::operator -= (column r)
00112 {
00113 column_entry
00114 st;
00115 forall (st, r.NZ)
00116 {
00117 NZ.append (column_entry (st.Cons, -st.coeff));
00118 };
00119 return *this;
00120 }
00121
00122 column
00123 column::operator + (cons v)
00124 {
00125 return operator + (column (v));
00126 };
00127
00128 column
00129 column::operator + (double d)
00130 {
00131 return operator + (column (d));
00132 };
00133
00134 column
00135 column::operator - (column r)
00136 {
00137 list < column_entry > NNZ;
00138 list_item
00139 l1 = r.NZ.first ();
00140 column_entry
00141 st;
00142 double
00143 d;
00144 forall (st, NZ)
00145 {
00146 d = 0;
00147 while ((l1 != nil) && (r.NZ[l1].Cons <= st.Cons))
00148 {
00149 if (r.NZ[l1].Cons != st.Cons)
00150 {
00151 NNZ.append (column_entry (r.NZ[l1].Cons, -r.NZ[l1].coeff));
00152 }
00153 else
00154 {
00155 d = -r.NZ[l1].coeff;
00156 }
00157 l1 = r.NZ.succ (l1);
00158 }
00159 NNZ.append (column_entry (st.Cons, st.coeff + d));
00160 }
00161 return column (NNZ);
00162 }
00163
00164
00165 column::item column::next_item(item i) const {
00166 return NZ.next_item(i);
00167 }
00168
00169
00170 column operator *(double d, cons i)
00171 {
00172 return column (i) * d;
00173 };
00174
00175 column operator *(double d, column c)
00176 {
00177 return c * d;
00178 };
00179
00180
00181