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