-
Notifications
You must be signed in to change notification settings - Fork 1
/
xValInstanceStream.cpp
98 lines (87 loc) · 2.45 KB
/
xValInstanceStream.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "xValInstanceStream.h"
XValInstanceStream::XValInstanceStream(InstanceStream *source, const unsigned int noOfFolds, const unsigned int seed)
: source_(source), noOfFolds_(noOfFolds), seed_(seed)
{ metaData_ = source->getMetaData();
startSubstream(0, true);
}
XValInstanceStream::~XValInstanceStream(void)
{
}
/// start training or testing for a new fold
void XValInstanceStream::startSubstream(const unsigned int fold, const bool training) {
fold_ = fold;
training_ = training;
rewind();
}
/// return to the first instance in the stream
void XValInstanceStream::rewind() {
source_->rewind();
rand_.seed(seed_);
count_ = 0;
}
/// advance, discarding the next instance in the stream. Return true iff successful.
bool XValInstanceStream::advance() {
while (source_->advance()) {
if (rand_() % noOfFolds_ == fold_) {
// test instance
if (!training_) {
count_++;
return true;
}
}
else {
// training instance
if (training_) {
count_++;
return true;
}
}
}
return false;
}
/// advance to the next instance in the stream.Return true iff successful. @param inst the instance record to receive the new instance.
bool XValInstanceStream::advance(instance &inst) {
while (!source_->isAtEnd()) {
if (rand_() % noOfFolds_ == fold_) {
// test instance
if (training_) {
source_->advance();
}
else {
// testing
if (source_->advance(inst)) {
count_++;
return true;
}
else return false;
}
}
else {
// training instance
if (training_) {
if (source_->advance(inst)) {
count_++;
return true;
}
else return false;
}
else {
// testing
source_->advance();
}
}
}
return false;
}
/// true if we have advanced past the last instance
bool XValInstanceStream::isAtEnd() {
return source_->isAtEnd();
}
/// the number of instances in the stream. This may require a pass through the stream to determine so should be used only if absolutely necessary. The stream state is undefined after a call to size(), so a rewind shouldbe performed before the next advance.
InstanceCount XValInstanceStream::size() {
if (!isAtEnd()) {
instance inst(*this);
while (!isAtEnd()) advance(inst);
}
return count_;
}