/[xulu]/trunk/src/appl/parallel/spmd/split/AbstractSplitMap.java
ViewVC logotype

Contents of /trunk/src/appl/parallel/spmd/split/AbstractSplitMap.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (show annotations)
Wed Feb 25 11:54:01 2009 UTC (15 years, 9 months ago) by mojays
File size: 6743 byte(s)
First Commit, corresponds to Revision 1008 of Wikisquare-SVN 
1 package appl.parallel.spmd.split;
2
3 import java.awt.Rectangle;
4 import java.awt.geom.Rectangle2D;
5
6 /**
7 * This class can be used for the implementation of {@link SplitMap}s. It already
8 * provides most of the functions. Normally subclasses only have to implement the methods
9 * {@link SplitMap#makeMap()} and {@link SplitMap#getNeighborsForPosition(int)}.
10 *
11 * @see SplitMap
12 *
13 * @author Dominik Appl
14 */
15 public abstract class AbstractSplitMap implements SplitMap {
16
17 public enum NeighborhoodBoxingMode {
18 inBoxing, outBoxing
19 }
20
21 protected NeighborhoodBoxingMode boxingMode;
22 protected int noOfPartitions;
23 protected int globalHeight;
24 protected int globalWidth;
25
26 /**
27 * a value of weights determines how big the share of the
28 * partition with this position is. The sum of all values
29 * should be 1 or near to 1.
30 */
31 protected double[] weights;
32 protected int neighborhoodRange;
33
34 /** the Rectangle of the whole Grid **/
35 protected Rectangle globalBounds;
36 /** the calculation area of each partition */
37 protected Rectangle[] partitionCalculationBounds;
38 /** the bounds of the neighborhood data of the partition */
39 protected Rectangle[] partitionNeighborhoodBounds;
40 protected String[] IPs;
41
42 public AbstractSplitMap(SplittableResource splittable, int neighborhoodRange,
43 int noOfPartitions,
44 NeighborhoodBoxingMode boxingMode) {
45 this(splittable.getSplitWidth(),splittable.getSplitHeight(),neighborhoodRange, noOfPartitions, boxingMode);
46
47 }
48
49 public AbstractSplitMap() {
50 this.globalWidth = 1;
51 this.globalHeight = 1;
52 this.neighborhoodRange = 0;
53 this.noOfPartitions = 1;
54 this.boxingMode = NeighborhoodBoxingMode.inBoxing;
55 init();
56 makeMap();
57 }
58
59 /**
60 * @param width
61 * @param height
62 * @param neighborhoodRange
63 * @param noOfPartitions
64 * @param boxingMode
65 */
66 public AbstractSplitMap(int width, int height, int neighborhoodRange, int noOfPartitions, NeighborhoodBoxingMode boxingMode) {
67 this.globalWidth = width;
68 this.globalHeight = height;
69 this.neighborhoodRange = neighborhoodRange;
70 this.noOfPartitions = noOfPartitions;
71 this.boxingMode = boxingMode;
72 init();
73 makeMap();
74 }
75
76 /* non java-doc
77 * @see appl.parallel.spmd.split.SplitMap#setParameters(SplittableResource, int, int, appl.parallel.spmd.split.AbstractSplitMap.NeighborhoodBoxingMode)
78 */
79 public void setParameters(SplittableResource splittable, int neighborhoodRange, int noOfPartitions, NeighborhoodBoxingMode boxingMode) {
80 this.globalWidth = splittable.getSplitWidth();
81 this.globalHeight = splittable.getSplitHeight();
82 this.neighborhoodRange = neighborhoodRange;
83 this.noOfPartitions = noOfPartitions;
84 this.boxingMode = boxingMode;
85 init();
86 }
87
88 /**
89 * Initializes the bounds of the partitions
90 */
91 protected void init() {
92 if (noOfPartitions < 1)
93 throw new UnsupportedOperationException(
94 "Number of Partions must be > 0");
95
96 //Initialize the weight for equal split (should not matter if not excactly 100%)
97 weights = new double[noOfPartitions];
98 for (int i = 0; i < noOfPartitions; i++)
99 weights[i] = (1.0 / noOfPartitions);
100 globalBounds = new Rectangle(0, 0, globalWidth, globalHeight);
101 partitionCalculationBounds = new Rectangle[noOfPartitions];
102 partitionNeighborhoodBounds = new Rectangle[noOfPartitions];
103
104 }
105
106
107
108 public void setWeights(double... weights) {
109 if (weights.length != noOfPartitions)
110 throw new UnsupportedOperationException("The number of weights ("
111 + weights.length
112 + ") does not match the number of partitions ("
113 + noOfPartitions + ")");
114 //check if the weights are valid
115 for (double weight : weights) {
116 if(weight <=0 || weight > 1)
117 throw new UnsupportedOperationException("A weight was '" + weight + "' but must be between 0 and 1");
118 }
119 this.weights = weights;
120 }
121
122 /* (non-Javadoc)
123 * @see appl.parallel.spmd.split.SplitMap#getDescription()
124 */
125 public abstract String getDescription();
126
127 /* (non-Javadoc)
128 * @see appl.parallel.spmd.split.SplitMap#getNeighborsForPosition(int)
129 */
130 public abstract int[] getNeighborsForPosition(int pos);
131
132 /* (non-Javadoc)
133 * @see appl.parallel.spmd.split.SplitMap#makeMap()
134 */
135 public abstract void makeMap();
136
137
138 /* (non-Javadoc)
139 * @see appl.parallel.spmd.split.SplitMap#getGlobalCalculationBounds()
140 */
141 public Rectangle getGlobalCalculationBounds() {
142 return globalBounds;
143 }
144
145
146
147 /* (non-Javadoc)
148 * @see appl.parallel.spmd.split.SplitMap#getLocalCalculationArea(int)
149 */
150 public Rectangle getLocalCalculationBounds(int pos){
151 Rectangle localBounds = (Rectangle) partitionCalculationBounds[pos].clone();
152 //move relative to the partition bounds
153 double xdiff=partitionCalculationBounds[pos].getX()-partitionNeighborhoodBounds[pos].getX();
154 double ydiff=partitionCalculationBounds[pos].getY()-partitionNeighborhoodBounds[pos].getY();
155 //set to the local coordinates
156 localBounds.setLocation((int) xdiff, (int) ydiff);
157 return localBounds;
158 }
159
160
161 /* (non-Javadoc)
162 * @see appl.parallel.spmd.split.SplitMap#getLocalNeighborhoodArea(int)
163 */
164 public Rectangle getLocalNeighborhoodBounds(int pos) {
165 Rectangle localBounds = (Rectangle) partitionNeighborhoodBounds[pos]
166 .clone();
167 //move to (0,0)
168 localBounds.setLocation(0, 0);
169 return localBounds;
170 }
171
172 /* (non-Javadoc)
173 * @see appl.parallel.spmd.split.SplitMap#getPartitionCalculationArea(int)
174 */
175 public Rectangle getPartitionCalculationBounds(int pos) {
176 return partitionCalculationBounds[pos];
177 }
178
179 public Rectangle getPartitionNeighborhoodBounds(int pos) {
180 return partitionNeighborhoodBounds[pos];
181 }
182
183
184 /* (non-Javadoc)
185 * @see appl.parallel.spmd.split.SplitMap#getGlobalBounds()
186 */
187 public Rectangle getGlobalBounds() {
188 return globalBounds;
189 }
190
191 /* (non-Javadoc)
192 * @see appl.parallel.spmd.split.SplitMap#getPartitionBounds(int)
193 */
194 public Rectangle getPartitionBounds(int pos) {
195 return partitionNeighborhoodBounds[pos];
196 }
197
198 public Rectangle getLocalBounds(int pos)
199 {
200 return getLocalNeighborhoodBounds(pos);
201 }
202
203
204 /* (non-Javadoc)
205 * @see appl.parallel.spmd.split.SplitMap#getIP(int)
206 */
207 public String getIP(int pos) {
208 if(IPs==null)
209 return null;
210 if(IPs.length!=noOfPartitions)
211 return null;
212 return IPs[pos];
213 }
214
215 /* (non-Javadoc)
216 * @see appl.parallel.spmd.split.SplitMap#setIPs(java.lang.String[])
217 */
218 public void setIPs(String[] IPs) {
219 this.IPs = IPs;
220 }
221
222 /**
223 * @return the neighborhoodRange
224 */
225 public int getNeighborhoodRange() {
226 return neighborhoodRange;
227 }
228
229 public int getCount(){
230 return noOfPartitions;
231 }
232 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26