-
Notifications
You must be signed in to change notification settings - Fork 1
/
instanceStreamClassFilter.cpp
81 lines (65 loc) · 2.51 KB
/
instanceStreamClassFilter.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
#include "instanceStreamClassFilter.h"
#include "utils.h"
InstanceStreamClassFilter::InstanceStreamClassFilter(InstanceStream *src, const char* posClassName, char*const*& argv, char*const* end) : metaData_(src->getMetaData(), posClassName)
{
// get arguments
// no arguments currently supported
//while (argv != end) {
// if (**argv == '-' && argv[0][1] == 's') {
// getUIntFromStr(argv[0]+2, targetSampleSize_, "s");
// ++argv;
// }
// else {
// break; // do not consume the remaining arguments
// }
//}
source_ = src;
InstanceStream::metaData_ = &metaData_;
for (posClass_ = 0; posClass_ < src->getNoClasses(); posClass_++) {
if (streq(posClassName, src->getClassName(posClass_), src->areNamesCaseSensitive())) break;
}
if (posClass_ > src->getNoClasses()) {
error("%s is not a class", posClassName);
}
}
InstanceStreamClassFilter::~InstanceStreamClassFilter(void)
{
}
/// return to the first instance in the stream
void InstanceStreamClassFilter::rewind() {
source_->rewind();
}
/// advance, discarding the next instance in the stream. Return true iff successful.
bool InstanceStreamClassFilter::advance() {
return source_->advance();
}
/// advance to the next instance in the stream. Return true iff successful. @param inst the instance record to receive the new instance.
bool InstanceStreamClassFilter::advance(instance &inst) {
if (!source_->advance(inst)) return false;
setClass(inst, inst.getClass() == posClass_);
return true;
}
/// true if we have advanced past the last instance
bool InstanceStreamClassFilter::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.
InstanceCount InstanceStreamClassFilter::size() {
return source_->size();
}
InstanceStreamClassFilter::MetaData::MetaData(InstanceStream::MetaData* meta, const char* posClassname) : posClassName_(posClassname) {
source_ = meta;
}
/// return the number of classes
unsigned int InstanceStreamClassFilter::MetaData::getNoClasses() const {
return 2;
}
/// return the name for a class
const char* InstanceStreamClassFilter::MetaData::getClassName(CatValue y) const {
if (y == 0) return "Negative";
else return posClassName_;
}
/// return a string that gives a meaningful name for the stream
const char* InstanceStreamClassFilter::MetaData::getName() {
return "Two class instance stream";
}