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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26