In this code, I want to explore aribtrary means of establshing "compatibility"
between objects (two personalities, in this context, but could just as easily
be compatibility between a personality and a conversation topic).

 * I'll be using the OCEAN/Big Five approach.
 * Initially, I'll stay in 5-space.
 * Later I will use the contributing factors (30-space).
 * Initially compatibility will be crude where "same" is compatible and
   "different" is not.
 * Next, the naive compatibility that is defined in personality.interfaces will
   be used.
 * Finally, a compatibility that takes not only its respective value in the
   partner into account, but all other component values as well will be used.


Personalities as Equations
--------------------------

A personality will be represented by a linear equation in 5 variables, limited
to a unit basis:
  .5o + .7c + .4e + .8a + .3n = 0

As such, each personality will be represented by a 4-dimentional surface in a
5-dimensioanl vector space.

The five variables used correspond to the first letter of the personality
component in the OCEAN Big Five model.

Example in 3-space
------------------

Four planes:
0 = .5x + .7y + .1z
0 = .4x + .7y + .1z
0 = .4x + .8y + .1z
0 = .9x + .1y + .1z

z1 = array([.5, .7, .1])
z2 = array([.4, .7, .1])
z3 = array([.4, .8, .1])
z4 = array([.9, .1, .1])

# z1 & z2
theta12 = arccos(dot(z1, z2) / (sqrt(dot(z1, z1)) * sqrt(dot(z2, z2))))
# z1 & z3
theta13 = arccos(dot(z1, z3) / (sqrt(dot(z1, z1)) * sqrt(dot(z3, z3))))
# z2 & z3
theta23 = arccos(dot(z2, z3) / (sqrt(dot(z2, z2)) * sqrt(dot(z3, z3))))
# z3 & z4
theta34 = arccos(dot(z3, z4) / (sqrt(dot(z3, z3)) * sqrt(dot(z4, z4))))


Compatibility
-------------

For two 4-surfaces, the compatibility is determined by their intersection (a
3-surface). The angle between the two 4-surfaces will (for now) determine the
compatibility between the two 4-surfaces (personalities): the smaller the
angle, the creater the compatibility.

p1 = array([.5, .7, .4, .8, .3])
p2 = array([.3, .6, .6, .7, .3])
p3 = array([.8, .9, .7, .2, .6])
p4 = array([.8, .9, .7, .3, .6])
# for p1 & p2
theta12 = arccos(dot(p1, p2) / (sqrt(dot(p1, p1)) * sqrt(dot(p2, p2))))
# for p2 & p3
theta23 = arccos(dot(p2, p3) / (sqrt(dot(p2, p2)) * sqrt(dot(p3, p3))))
# for p3 & p4
theta34 = arccos(dot(p3, p4) / (sqrt(dot(p3, p3)) * sqrt(dot(p4, p4))))

The intersection of two personalities is the 3-space solution where those two
personalities are equal.

