2
* This program is free software; you can redistribute it and/or modify
3
* it under the terms of the GNU General Public License as published by
4
* the Free Software Foundation; either version 2 of the License, or
5
* (at your option) any later version.
7
* This program is distributed in the hope that it will be useful,
8
* but WITHOUT ANY WARRANTY; without even the implied warranty of
9
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
* GNU General Public License for more details.
12
* You should have received a copy of the GNU General Public License
13
* along with this program; if not, write to the Free Software
14
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
* Copyright (C) 2001 University of Waikato, Hamilton, New Zealand
22
package weka.classifiers.bayes.net;
24
import weka.core.Instances;
26
import java.io.Serializable;
29
* Helper class for Bayes Network classifiers. Provides datastructures to
30
* represent a set of parents in a graph.
32
* @author Remco Bouckaert (rrb@xm.co.nz)
33
* @version $Revision: 1.7 $
35
public class ParentSet
36
implements Serializable {
38
/** for serialization */
39
static final long serialVersionUID = 4155021284407181838L;
42
* Holds indexes of parents
44
private int[] m_nParents;
47
* returns index parent of parent specified by index
49
* @param iParent Index of parent
50
* @return index of parent
52
public int getParent(int iParent) {
53
return m_nParents[iParent];
55
public int [] getParents() {return m_nParents;}
58
* sets index parent of parent specified by index
60
* @param iParent Index of parent
61
* @param nNode index of the node that becomes parent
63
public void SetParent(int iParent, int nNode) {
64
m_nParents[iParent] = nNode;
69
* Holds number of parents
71
private int m_nNrOfParents = 0;
74
* returns number of parents
75
* @return number of parents
77
public int getNrOfParents() {
78
return m_nNrOfParents;
82
* test if node is contained in parent set
83
* @param iNode node to test for
84
* @return number of parents
86
public boolean contains(int iNode) {
87
for (int iParent = 0; iParent < m_nNrOfParents; iParent++) {
88
if (m_nParents[iParent] == iNode) {
95
* Holds cardinality of parents (= number of instantiations the parents can take)
97
private int m_nCardinalityOfParents = 1;
100
* returns cardinality of parents
102
* @return the cardinality
104
public int getCardinalityOfParents() {
105
return m_nCardinalityOfParents;
109
* returns cardinality of parents after recalculation
111
* @return the cardinality
113
public int getFreshCardinalityOfParents(Instances _Instances) {
114
m_nCardinalityOfParents = 1;
115
for (int iParent = 0; iParent < m_nNrOfParents; iParent++) {
116
m_nCardinalityOfParents *= _Instances.attribute(m_nParents[iParent]).numValues();
118
return m_nCardinalityOfParents;
121
* default constructor
124
m_nParents = new int[10];
126
m_nCardinalityOfParents = 1;
131
* @param nMaxNrOfParents upper bound on nr of parents
133
public ParentSet(int nMaxNrOfParents) {
134
m_nParents = new int[nMaxNrOfParents];
136
m_nCardinalityOfParents = 1;
141
* @param other other parent set
143
public ParentSet(ParentSet other) {
144
m_nNrOfParents = other.m_nNrOfParents;
145
m_nCardinalityOfParents = other.m_nCardinalityOfParents;
146
m_nParents = new int[m_nNrOfParents];
148
for (int iParent = 0; iParent < m_nNrOfParents; iParent++) {
149
m_nParents[iParent] = other.m_nParents[iParent];
154
* reserve memory for parent set
156
* @param nSize maximum size of parent set to reserver memory for
158
public void maxParentSetSize(int nSize) {
159
m_nParents = new int[nSize];
160
} // MaxParentSetSize
163
* Add parent to parent set and update internals (specifically the cardinality of the parent set)
165
* @param nParent parent to add
166
* @param _Instances used for updating the internals
168
public void addParent(int nParent, Instances _Instances) {
169
if (m_nNrOfParents == 10) {
170
// reserve more memory
171
int [] nParents = new int[50];
172
for (int i = 0; i < m_nNrOfParents; i++) {
173
nParents[i] = m_nParents[i];
175
m_nParents = nParents;
177
m_nParents[m_nNrOfParents] = nParent;
179
m_nCardinalityOfParents *= _Instances.attribute(nParent).numValues();
183
* Add parent to parent set at specific location
184
* and update internals (specifically the cardinality of the parent set)
186
* @param nParent parent to add
187
* @param iParent location to add parent in parent set
188
* @param _Instances used for updating the internals
190
public void addParent(int nParent, int iParent, Instances _Instances) {
191
if (m_nNrOfParents == 10) {
192
// reserve more memory
193
int [] nParents = new int[50];
194
for (int i = 0; i < m_nNrOfParents; i++) {
195
nParents[i] = m_nParents[i];
197
m_nParents = nParents;
199
for (int iParent2 = m_nNrOfParents; iParent2 > iParent; iParent2--) {
200
m_nParents[iParent2] = m_nParents[iParent2 - 1];
202
m_nParents[iParent] = nParent;
204
m_nCardinalityOfParents *= _Instances.attribute(nParent).numValues();
207
/** delete node from parent set
208
* @param nParent node number of the parent to delete
209
* @param _Instances data set
210
* @return location of the parent in the parent set. This information can be
211
* used to restore the parent set using the addParent method.
213
public int deleteParent(int nParent, Instances _Instances) {
215
while ((m_nParents[iParent] != nParent) && (iParent < m_nNrOfParents)) {
219
if (iParent < m_nNrOfParents) {
222
if (iParent < m_nNrOfParents) {
223
while (iParent < m_nNrOfParents - 1) {
224
m_nParents[iParent] = m_nParents[iParent + 1];
228
m_nCardinalityOfParents /= _Instances.attribute(nParent).numValues();
234
* Delete last added parent from parent set and update internals (specifically the cardinality of the parent set)
236
* @param _Instances used for updating the internals
238
public void deleteLastParent(Instances _Instances) {
240
m_nCardinalityOfParents =
241
m_nCardinalityOfParents
242
/ _Instances.attribute(m_nParents[m_nNrOfParents]).numValues();
243
} // DeleteLastParent
245
/** Copy makes current parents set equal to other parent set
247
* @param other : parent set to make a copy from
249
public void copy(ParentSet other) {
250
m_nCardinalityOfParents = other.m_nCardinalityOfParents;
251
m_nNrOfParents = other.m_nNrOfParents;
252
for (int iParent = 0; iParent < m_nNrOfParents; iParent++) {
253
m_nParents[iParent] = other.m_nParents[iParent];