00001 /* 00002 File: SubSVec.cc 00003 00004 Function: Implements SubSVec.h 00005 00006 Author(s): Andrew Willmott 00007 00008 Copyright: (c) 1995-2000, Andrew Willmott 00009 00010 Notes: 00011 00012 */ 00013 00014 00015 #include "vl/SubSVec.h" 00016 #include "vl/SparseVec.h" 00017 00018 00019 // --- Vector Memory Management ----------------------------------------------- 00020 00021 00022 TSubSVec::TSubSVec(Int start, Int length, TSparseVec *target, Int span) : 00023 start(start), elts(length), target(target) 00024 { 00025 if (span == 1) 00026 { 00027 colSpan = 1; 00028 rowSpan = 0; 00029 } 00030 else 00031 { 00032 rowSpan = span / target->Elts(); 00033 colSpan = span % target->Elts(); 00034 } 00035 } 00036 00037 TSubSVec::TSubSVec(const TSubSVec &v) : elts(v.elts), start(v.start), 00038 colSpan(v.colSpan), rowSpan(v.rowSpan), target(v.target) 00039 { 00040 } 00041 00042 TSubSVec &TSubSVec::operator = (const TSparseVec &v) 00043 { 00044 if (rowSpan) 00045 { 00046 TSVIter j; 00047 00048 for (j.Begin(v); !j.AtEnd(); j.Inc()) 00049 target[j.Index() * rowSpan] 00050 .Set(start + j.Index() * colSpan, j.Data()); 00051 } 00052 else 00053 { 00054 Int i, srcSize, dstSize, cstart, k; 00055 TSVIter j(target[0]); 00056 00057 // find indices of the first & last ... 00058 00059 srcSize = v.NumItems() - 1; 00060 j.IncTo(start); 00061 cstart = j.PairIdx(); 00062 j.IncTo(start + colSpan * v.Elts()); 00063 dstSize = j.PairIdx() - cstart; 00064 00065 // resize the hole in the index/elt array 00066 00067 if (srcSize > dstSize) 00068 target->Insert(cstart, srcSize - dstSize); 00069 else if (dstSize > srcSize) 00070 target->Delete(cstart, dstSize - srcSize); 00071 00072 // copy over the source vector pairs 00073 00074 for (i = 0, k = cstart; i < srcSize; i++, k++) 00075 { 00076 target->Item(k).elt = v.Item(i).elt; 00077 target->Item(k).index = v.Item(i).index + start; 00078 } 00079 } 00080 00081 return(SELF); 00082 } 00083 00084 TSubSVec &TSubSVec::operator = (const TSubSVec &v) 00085 { 00086 // for the moment, use a cast... inefficient! XXX 00087 00088 return(SELF = TSparseVec(v)); 00089 } 00090 00091 Void TSubSVec::Store(TSparseVec &sv) const 00092 { 00093 sv.SetNumElts(Elts()); 00094 sv.Begin(); 00095 00096 if (rowSpan) 00097 { 00098 Int i, ccol = start; 00099 00100 for (i = 0; i < Elts(); i++) 00101 { 00102 // We only want one element from each SparseVec, so 00103 // use Get()... 00104 sv.AddElt(i, target[i].Get(ccol)); 00105 ccol += colSpan; 00106 } 00107 } 00108 else 00109 { 00110 Int endIndex = start + elts * colSpan; 00111 TSVIter j(target[0]); 00112 00113 for (j.IncTo(start); j.PairIdx() < endIndex; j.Inc()) 00114 sv.AddNZElt(j.Index() - start, j.Data()); 00115 } 00116 00117 sv.End(); 00118 } 00119 00120 // --- Sub-vector function ---------------------------------------------------- 00121 00122 TSubSVec sub(const TSparseVec &v, Int start, Int length) 00123 { 00124 Assert(start >= 0 && length > 0 && start + length <= v.Elts(), 00125 "(sub(SparseVec)) illegal subset of vector"); 00126 00127 return(TSubSVec(start, length, (TSparseVec*) &v)); 00128 } 00129