|
||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||
java.lang.Object
|
+--org.abora.gold.java.AboraHeaper
|
+--org.abora.gold.xpp.basic.Heaper
|
+--org.abora.gold.spaces.basic.XnRegion
The design of a new coordinate space consists mostly in the design of the XuRegions which
can be used to describe (possibly infinite) sets of positions in that coordinate space.
It will generally not be the case (for a given coordinate space) that all mathematically
describable sets of positions will be representable by an XuRegion in that space. This
should not be seen as a temporary deficiency of the current implementation of a space, but
rather part of the design of what a given space *means*.
For example, in IntegerSpace, one cannot form the XuRegion whose members are exactly the
even numbers. If this were possible, other desirable properties which are part of the
intent of IntegerSpaces would no longer be possible. For example, any XuRegion should be
able to break itself up into a finite number of simple XuRegions ("simple" is described
below). Were an even number region possible, this would have undesirable consequences for
the definition of "simple" in this space. If you want (for example) to be able to have a
XuRegion which can represent all the even numbers, it probably makes more sense to define
a whole new space in which these new XuRegions apply.
XuRegions should be closed under a large set of operations, such as intersection,
unionWith, complement and minus. ("closed" means that the result of performing this
operation on XuRegions of a given space is another valid XuRegion in the same space.)
Additional guarantees are documented with each operation.
A XuRegion may be classified at one of three levels of "simplicity":
1) The simplest are the *distinctions*. Distinctions are those that answer with (at most)
a single set containing themselves in response to the message "distinctions". (The reason
I say "at most" is that a full region (one that covers the entire coordinate space) may
answer with the empty set.) Distinctions are the simplest XuRegions of a given space out
of which all other XuRegions of that space can be finitely composed. There should
probably be a message "isDistinction" for which exactly the distinctions answer "true".
The complement of a distinction is a distinction. Three examples of distinctions in
spaces are:
a) in IntegerSpace, any simple inequality. For example, all integers < 37.
b) in one kind of 3-space, any half space (all the space on one side of some plane)
c) in another kind of 3-space, any sphere or spherical hole.
Note that "c" could not just have spheres as the distinction because distinctions must be
closed under complement. (We are here ignoring the quite substantial problems that arise
in dealing with approximate (e.g., floating point) which would almost necessarily have to
arise in doing any decent 3-space. 3-space is nevertheless a good intuition pump.)
2) Next are the *simple regions*. Simple regions are exactly those that say "true" to
"isSimple". All distinctions are also simple regions. In response to the message
"distinctions", and simple region must return a finite set of distinctions which, when
intersected together, yield the original simple region. Generally, one tries to define
the simple regions for a space to correspond to some notion of locality in the space. For
example, it may be good for a simple region not to be able to have a hole in it. Or
perhaps a simple region is which must be connected (whatever that means in a given space).
Example non-distinction simple regions for the above example spaces would be:
a) The interval from 3 inclusive to 17 exclusive (intersection of all integers >= 3 and
all < 17)
b) A convex hull (intersection of half spaces)
c) Whatever you get by intersecting a bunch of spheres and sherical holes.
The simple regions for both "a" and "b" would be connected, without holes, and even
convex. This follows directly from the definition of our distinctions. None of these
nice properties holds for "c", and this also follows directly from our decision to start
with spheres. "c" is still perfectly valid, just less preferable by some criteria.
3) Finally, there are the regions of a space in general. Any region must respond to the
message "simpleRegions" with a stepper which will produce a finite number of simple
regions that, when unioned together, yields the original region. A simple region will
return a stepper that will return at most itself ("at most" because an empty region (which
covers no positions) may return an empty stepper). Example non-simple regions are:
a) all integers < 3 and all integers >= 17
b) two convex hulls
c) two disjoint spheres
Note that "a" is the complement of the earlier "a" example, thereby showing why the
complement of a simple region isn`t necessarily simple. Even though the "c" space is so
unconstrained in the properties of its simple regions, there is no way to interect a
finite number of spheres and spherical holes to produce a pair of disjoint spheres.
Therefore the pair is non-simple. Not all spaces must have non-simple regions (or even
non-distinctions). It is interesting to observe for "b" and "c" that even though there is
a natural conversion between their respective positions, (except for the empty and full
regions) there is no conversion at all between their respective regions. The kinds of
sets of positions representable in one space is completely different than those
representable in the other space.
We will use these three example spaces repeatedly in documenting the protocol.
| Field Summary | |
protected static Signal |
CantMixCoordSpacesSignal
|
protected static Signal |
EmptyRegionSignal
|
| Fields inherited from class org.abora.gold.xpp.basic.Heaper |
AllBlasts, BecomeMap, GarbageCount, InGC, InitializedClasses, InitializingClasses, LastMemory, NextClientRequestNumber, NotOneElementSignal, PackageTable, PromiseNameTable, StringHashSBoxes |
| Fields inherited from class org.abora.gold.java.AboraHeaper |
ActiveClubs, CurrentAuthor, CurrentBertCanopyCache, CurrentBertCrum, CurrentChunk, CurrentGrandMap, CurrentKeyMaster, CurrentPacker, CurrentSensorCanopyCache, CurrentServer, CurrentSession, CurrentSessions, CurrentTrace, InitialEditClub, InitialOwner, InitialReadClub, InitialSponsor, InsideTransactionFlag |
| Constructor Summary | |
XnRegion()
|
|
| Method Summary | |
int |
actualHashForEqual()
|
Stepper |
actualStepper(OrderSpec order)
Only called if I've already said I'm enumerable in the originally stated order. |
PtrArray |
asArray(OrderSpec order)
Returns all the Positions in the region in order according to 'order'. |
XnRegion |
asSimpleRegion()
Return a simple region containing all positions contained by myself. If I am simple, then the result must be me. |
XnRegion |
chooseMany(IntegerVar n)
|
XnRegion |
chooseMany(IntegerVar n,
OrderSpec order)
If an OrderSpec is given, return the first n elements according to that OrderSpec. |
Position |
chooseOne()
|
Position |
chooseOne(OrderSpec order)
Essential. |
XnRegion |
complement()
Essential. |
CoordinateSpace |
coordinateSpace()
Essential. |
IntegerVar |
count()
How many positions do I contain? If I am not 'isFinite', then this message will BLAST. |
XnRegion |
delta(XnRegion region)
The region where they differ. a->delta(b) ->isEqual (a->minus(b)->unionWith(b->minus(a))) |
void |
disjointSimpleRegions()
emulate default argument of NULL |
Stepper |
disjointSimpleRegions(OrderSpec order)
break it up into a set of non-empty simple regions which don't overlap. |
ScruSet |
distinctions()
Break it up into a set of non-full distinctions. |
void |
dox(BlockClosure aBlock)
|
boolean |
hasMember(Position atPos)
Do I contain this position? More than anything else, the behavior of this message is the defining characteristic of an XuRegion. |
static ImmuSet |
immuSet(XnRegion region)
Make a set containing all the positions in the region |
static void |
info()
{Position CLIENT} chooseOne: order {OrderSpec default: NULL} {XuRegion CLIENT} complement {CoordinateSpace CLIENT} coordinateSpace {IntegerVar CLIENT} count {BooleanVar CLIENT} hasMember: atPos {Position unused} {XuRegion CLIENT} intersect: other {XuRegion unused} {BooleanVar CLIENT} intersects: other {XuRegion} {BooleanVar CLIENT} isEmpty {BooleanVar CLIENT} isFinite {BooleanVar CLIENT} isFull {BooleanVar CLIENT} isSubsetOf: other {XuRegion} {XuRegion CLIENT} minus: other {XuRegion} {Stepper CLIENT of: Position} stepper: order {OrderSpec default: NULL} {Position CLIENT} theOne {XuRegion CLIENT} unionWith: other {XuRegion unused} {XuRegion CLIENT} with: pos {Position} {XuRegion CLIENT} without: pos {Position} |
XnRegion |
intersect(XnRegion other)
Essential. |
boolean |
intersects(XnRegion other)
Essential. |
boolean |
isDistinction()
Am I a distinction. |
boolean |
isEmpty()
Every coordinate space has exactly one empty region. |
boolean |
isEnumerable()
emulate default argument of NULL |
boolean |
isEnumerable(OrderSpec order)
See comment in XuRegion::stepper. a->stepper(os) won't BLAST iff a->isEnumerable(os) |
boolean |
isEqual(Heaper other)
Two regions are equal iff they contain exactly the same set of positions |
boolean |
isFinite()
Essential. |
boolean |
isFull()
true if this is the largest possible region in this space -- the region that contains all positions in the space. |
boolean |
isSimple()
Am I a simple region. |
boolean |
isSubsetOf(XnRegion other)
I'm a subset of other if I don't have any positions that he doesn't. |
Mapping |
mapping(PrimArray data)
|
XnRegion |
minus(XnRegion other)
The region containing all my position which aren't in other. |
void |
simpleRegions()
emulate default argument of NULL |
Stepper |
simpleRegions(OrderSpec order)
Break myself up into a finite set of non-empty simple regions which, when unionWith'ed together will yield me. |
XnRegion |
simpleUnion(XnRegion other)
The result must contain all positions contained by either of the two original regions, and the result must be simple. |
Stepper |
stepper()
emulate default argument of NULL |
Stepper |
stepper(OrderSpec order)
Essential. |
Position |
theOne()
Iff I contain exactly one position, return it. |
XnRegion |
unionWith(XnRegion other)
The result has as members exactly those positions which are members of either of the original two regions. |
XnRegion |
with(Position pos)
the region with one more position. |
XnRegion |
without(Position pos)
the region with one less position. |
| Methods inherited from class org.abora.gold.java.AboraHeaper |
asOop, basicInspect, displayString, error, hack, halt, inspect, knownBug, mightNotImplement, REQUIRES, shouldImplement, shouldNotImplement, stubbleForSubclassResponsibility, thingToDo, willNotImplement |
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
protected static Signal CantMixCoordSpacesSignal
protected static Signal EmptyRegionSignal
| Constructor Detail |
public XnRegion()
| Method Detail |
public XnRegion asSimpleRegion()
public CoordinateSpace coordinateSpace()
public XnRegion complement()
public XnRegion delta(XnRegion region)
public XnRegion intersect(XnRegion other)
public XnRegion minus(XnRegion other)
public XnRegion simpleUnion(XnRegion other)
public XnRegion unionWith(XnRegion other)
public XnRegion with(Position pos)
public XnRegion without(Position pos)
public int actualHashForEqual()
actualHashForEqual in class Heaperpublic boolean hasMember(Position atPos)
public boolean intersects(XnRegion other)
public boolean isDistinction()
public boolean isEmpty()
public boolean isEqual(Heaper other)
isEqual in class Heaperpublic boolean isFinite()
public boolean isFull()
public boolean isSimple()
public boolean isSubsetOf(XnRegion other)
public XnRegion chooseMany(IntegerVar n)
public Position chooseOne()
public void disjointSimpleRegions()
public boolean isEnumerable()
public Mapping mapping(PrimArray data)
public void simpleRegions()
public Stepper stepper()
public XnRegion chooseMany(IntegerVar n,
OrderSpec order)
public Position chooseOne(OrderSpec order)
public IntegerVar count()
public Stepper disjointSimpleRegions(OrderSpec order)
public ScruSet distinctions()
public Stepper simpleRegions(OrderSpec order)
public Stepper stepper(OrderSpec order)
public Position theOne()
public void dox(BlockClosure aBlock)
public Stepper actualStepper(OrderSpec order)
public PtrArray asArray(OrderSpec order)
public boolean isEnumerable(OrderSpec order)
public static ImmuSet immuSet(XnRegion region)
public static void info()
|
||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||