B E A M - R o b o t i c s - T e k
Biology - Electronics - Aesthetics - Mechanics

Main | Electonics | FAQ's | Definitions | Solar engine | Nervous Networks | Advanced Nervous Networks | Motor drivers | Miscellaneous | Links


Advanced Nervous Networks


Contents

[1.0] Introduction to Advanced Nervous Networks

This document is a more advanced version of the MicroCore FAQ (frequently asked question) list. For those new to this area, please consult the
Nv Network FAQ.

[1.1] BiCore Nv Networks

A note of warning. The BiCore is simpler than the MicroCore, however, only in structure. It gets a bit complicated, especially if you don't have an oscilloscope. So if you have not experienced the pleasures (and pains) of the MicroCore, do yourself a favor and start there. The MicroCore has great potential.

Q: What is a BiCore?

A: A BiCore is a two Nv neuron network connected to form a loop as illustrated below.


  ----------------------------------------
  |                                       |
  |                                       |
  |                                       |
  |   C1     U1    C2       U2            |
  ----||-o---|>o---||---o---|>o-----------
         |              |     
         |              |
          \ R1           \ R2
         /              /
          \              \
         /              /
         |              |
        Gnd            Gnd



Where   U1, U2  = schmitt triggered inverter (74HC14)
        C1, C2  = 0.22 µF capacitor
        R1, R2  = 1 MegaOhm resistor
        Gnd     = power ground




(contributed by John A. de Vries II,
zozzles@lanl.gov)

Phototropisms and Nervous Networks

Most of you are familiar with the quadcore and the MicroCore -- simple loops of Nv elements. However, one of the most interesting and nearly simplest Nv circuits you can make is a BiCore. The BiCore has two active elements (the inverters), and four passive elements (the two capacitors and resistors, respectively.) Very generally speaking, when one of the inverters is on, the other is off so the oscillation chases itself around ying-yang style. One tends to draw this device as a diamond (or square on its corner) where opposing sides are either capacitors or inverters.

Actually, what one might quickly notice is that both of the resistors connect to ground. In a sense, then, they connect to each other. If they -only- connected to each other and not to ground, one would have a floating ground at the connection point. Ignoring that for a moment, one could replace both resistors with a single one and gosh! the circuit keeps on oscillating. Given two equal valued capacitors, the resistor determines the frequency of oscillation, or if a single motor is connected -to-the-outputs- of the two inverters (wheatstone bridge-wise), the width/depth of the motor's swing. If everything is perfectly balanced (and it never is) then the swing would be perfectly symmetrical, i.e., the motor would never turn all the way around.

Here comes the cute part: lets say that we want to track a source of light, something similar to the leaves described above. Well, first off, it is easy enough to replace the resistor that has the mythical floating ground in it somewhere with two back-to-back IR photodetectors. In dark, both will be off and so the swing will be quite large. Maybe. In light, both will be on so the swing will be quite small. And possibly destructive. If one has somewhat more light than the other, then the current path when it 'goes' that direction encounters less resistance (and we are basically ignoring the active resistance of a forward-biased diode as being negligible.) Arranging the to IR photodetectors properly to the shaft of the motor gives something that rather directly tracks light.

Now, the things I've left out are: what about a shunt resistor across the two photodiodes so that there is a reasonably low value of resistance in full dark, how about a series resistor to avoid the difficulty of nearly no resistance when both photodiodes are in bright light, etc.

But it is a way to fairly easily produce phototropic effects.

Diagram of a Suspended BiCore: note that the suspended BiCore uses the 74x240, not the 74x14. The 74x14 doesn't suspend. The original Bicore Configuration uses a 74x240, which has inverter drivers. This means amplification; the 74x14 doesn't do that. It's just a signal level device.

   (a)      U1         (b)
    o------|>o----------o
    | .              |
    |   .            |
    |     .          |
 C1 =      (R1)      = C2
    |         .      |
    |           .    |
    |             .  |
 o---------o<|-------o (c)         U2      (d)

Where   U1, U2  = schmitt triggered inverter drivers (74HC240)
        C1, C2  = 0.22 µF capacitor
        R1      = 1 MegaOhm resistor, connects between points a and d
Symbology

(from a later communication with John A. deVries II, zozzles@lanl.gov)

Suspended BiCores

The point being that the two resistors that would normally be grounded are instead connected together (but NOT) to ground making a floating or virtual ground between them. Anyhow, you don't actually need two resistors at this point since, in effect, only their sum makes any difference. Such a BiCore has (depending on the exact characteristics of the caps and the gates) a completely symmetric response - a process sits in either nervous neurons (Nv) for pretty much the same amount of time.

Photodiodes (or any other photovoltaic sensors) instead of Resistors

Dark Response

If you use back-to-back photodiodes (Pd) and it is dark, dark, dark you will have an extremely high resistance going in both directions. As a result, the BiCore will oscillate (if at all) very very slowly, depending on the reverse-biased leakage of the Pds. The first of the optional biasing resistors (R1 below) comes into play now: you'd pick one that has a resistance value substantially lower than the dynamic resistance of the paired diodes and you'd connect it in parallel to the two Pds. Thus, even in pitch blackness you'd get a 'reasonable' frequency of oscillation.

Differential Response

If there is a fairish difference amount of light striking one Pd compared to the other, then its reverse biased current flow can be higher: it will have less resistance. Pretending, for the moment, that the other diode has no voltage drop when it is forward biased (which it must be if the other one is reverse biased, eh?) then the total resistance -in-that-direction- is much less than it will be in the other direction. Thus one of the Nvs will have a much smaller time constant, i.e., a process will sit there for much less time. Overall, there is a fair asymmetry going on -- one of the outputs of the BiCore will be on for a long time and the other merely a short time. If these are connected to motors somehow, then one motor runs longer than the other. You get a situation very much like the photopopper if you hook this up right, the only difference being that both motors get a chance at some power during one complete oscillation of the BiCore -- rather than seeing steps taken by just one motor, you'd see both motors moving alternately but one runs longer than the other. Depending on the hookup you can make either a light-seeking or light-avoiding critter.

Bright (Dazzle) response

If both Pds have a LOT of light on them, then neither of them will have much in the way of reverse-biased resistance. As a result, the BiCore as a whole will oscillate at a pretty high frequency which usually doesn't get any work done (if connected to motors) and doesn't convey much information (if connected to 'more' network that goes somewhere else.) The second optional biasing resistor (R2 below) can be used here -- it is put in series to the other assembly, providing a certain minimum resistance (thus a certain limit on the maximum frequency.)

Diagram:

  (a)                                     (b)
   o----*----------R1----------*----R2-----o
        |                      |
        |                      |
        |                      |
         ----|>|--------|<|---- D1        D2
Symbology






Master-Slave Nervous Networks

Q: How do I create a heterogeneous nervous network (meaning composed of different networks), such as a dual two-neuron nervous network?

(contributed by Andrew Miller, amiller@golden.net)

A: A master/slave is the best way to describe the relationship between a dual-BiCore (two two-neuron nets) Nv network. The architecture is basically two loosely coupled from the output of the Master to the input of the slave (with one resistor, two resistors crossed resistors - range is in the MegaOhms, experiment!). The coupling can be a trim pot resistor to change the bias on the "Master" in order to make the thing do everything from walk Forward/left/right/backward. Although the "Master" has the most influence, the slave has something to say in the game so the behavior, thus it is very complex - all by changing one (or two) resistor(s).



Inhibitory connections, and photodiodes interfaced to Nv networks

(editor's note: in Janette Frigo and Tilden's paper, SATBOT I: prototype of a biomorphic autonomous spacecraft, there is an error in Figure 1, top part, where it shows a LED, it should be a Photodiode (with the arrows going the -other- way))
Janette Frigo says in her SatBot dissertation about how a photodiode connected in parallel with the usual nervous neuron resistor works as an inhibitory connection. Of course, one has to know her definition of inhibitory, which is basically that when the photodiode provides a relatively low-resistance path to ground that a process is attenuated -- that is, its pulse-width is shortened appreciably. The swing of the pulse remains rail-to-rail at the output of the gate, so really attenuation could only mean this. However, in spite of this explanation being reasonable, it is NOT how things work with biological neurons. Generally speaking, when one neuron makes an inhibitory connection with another, it either is preventing an action potential from reaching some third neuron or it simply makes the second neuron less likely to fire (an action potential.) The use of the _same_ term for something that shortens a process's pulse-width and something that prevents a neuron from firing had me confused for quite some time.

The reason that I'm interested in this is that with the exception of a very small set of experiments (the 6 element hextile tower, several hextile tetrahedra, a couple of entire hextile boards, the mechon [which is sort of an octahedron], and the 11-or-so neuron Walkman) there seem to be NO examples of non-degenerate nervous nets. In this case, I mean that the most common nervous nets (i.e., one to six nervous neurons) are simple loops, that none of them have an innode of more than one. Even the experiments noted parenthetically above only have an innode of two, and the extra connections are almost all excitatory (in order to stimulate chaotic behavior, according to Tilden.)

It is my thought that simple loops aren't likely to provide more than a handful or so of interesting behaviors, that emulating the complexity of connection seen in biological nervous systems (even if it were to be done in a regular fashion) will provide an exponential growth in the number of behaviors available. THAT is why it is vitally important for us (as a community) to understand more than the "basic" process-through-the-differentiating-capacitor sort of connections that Tilden has invented. Perhaps the excitatory, inhibitory and open-collector circuits have been well documented already and it is merely the case that I'm ignorant as to where to find this information. If so, I'm exceedingly interested in reading it because at this point I am still in the dark as to how they work. Knowing how they work and possibly some basic applications of each would be of enormous value in designing and constructing complex nets -- perhaps aiding in guessing what the emergent behaviors of such nets might be like.




[1.2] Miscellaneous Nv Network Topics

Memories in Nv Tech

In the creation of some sort of low level memory in BEAM robotics (say to remember that a certain stimulus was good or bad), there are three main issues:
  • input methodology-what is the meaning of storing a signal and how is that signal being received (or should i say perceived)?
  • forgetting-how?
  • output methodology-how is the remembered signal utilized?


First some notions of the environment and their relevance to memory. Steven Bolt (
sbolt@xs4all.nl) said the strong point of neural networks as conceived by Mark Tilden is that they acknowledge the role played by the environment. Behavior, memory and even intelligence are not contained within the individual; it all happens as a reaction between the individual and its environment. You remember things somewhat like DRAM does, rather well as long as you see what you remember around you. Things that disappear from your environment also fade from memory. You are intelligent about things you see happening around you; you don't even think about what isn't there. Smart animals (people) are smart mostly because they are more aware of what is in their environment.


Some ideas from Mark W. Dalton (mwd@cray.com) on memories from the view point of biology transferred to Nv tech. A crude version of this would be more similar to a nervous system acts on the following basic principles:


This is just a rough sketch of ideas on how to implement the above in BEAM tech. Mark W. Tilden and the others are better at the electronics interpretation.

Now some thoughts from John A. deVries II (zozzles@lanl.gov) on memory and forgetting:

Someone learning about nervous nets commented that there didn't seem any nice way to implement memory in Nv tech. I'm sure that there are a lot of different ways, but it occurred to me that the only conceptual problem is making such a memory forget in some interesting way, because it is easy enough to represent the occurrence of an "event" (say, a flash of infrared detected and channeled through an integrative nervous neuron) as a process. One would have to be aware of the limitation that saturation brings, but still it is a fairly intuitive way of "remembering" things. So, here's a possible architecture: one loop with some to-be-determined number of neurons that acts as the memory "element". One of those neurons is a process generator (the IR detector noted above, for example) and some other neuron is used as the pick-off. Just for jollies, let's say the pick-off feeds a motor driver. There would be another loop, probably with a fair number MORE neurons than in the memory element. Either it would be "primed" at start-up with a process, or some other method would put at least one (possibly more) process into this loop, which acts as the decay mechanism which implements forgetting. What connects the two loops, of course, would be a variation on the Pulse Neutralizing Circuit (PNC), right out of Tilden's patent. The decay loop would be the controller and the memory loop the controlled. The process of "forgetting" would be largely a statistical or chaotically characterized thing, depending on the real-time coincidence of process arrivals at the PNC. Of course, this isn't patentable, being derivative of H. Grey Walter's work from the 50's as well as the DES (Data Encryption Standard) to mention just two sources. I still think it is an eminently suitable notion for rewarding experimentation, however.

If you were wondering what the DES had to do with anything, it is the lengths (by neuron count) of the two loops -- in a synchronous digital circuit, if those lengths are relatively prime to each other, the cycle length of the combination tends to be maximized (that is, it might take a Long Time for the entire cycle.) This, of course, is a Good Thing for encryption. Using nervous neurons is basically like using asynchronous logic in some ways, so what applies to synchronous circuits is at least analogous -- unless the delays of each and every neuron was exactly the same, then those delays can make a huge difference on the cycle length. One might hope for self-consistency in the delays so that even if things were exactly predictable, then at least they'd be amenable to some kind of qualitative analysis. And Now for something Completely Different: I think that the design of the memory loop (input, the loop itself, output, process neutralizer) is reasonably complete in itself. On the other hand, there might be some controversy about the decay loop, for which I only supposed one process cycling around forever, occasionally killing processes in the other loop. One might want more control over that -- for example, kill the process in the decay loop or create a new one or do things more algorithmically (use other digital logic, for instance.) I mean, if the decay loop is saturated (again, for example) then nothing much is likely to survive in the memory loop for very long. But then you get in a recursion problem that is alluded to by the title of this message... if you are going to "decay" stuff in the decay loop, then who runs THAT ("who guards those selfsame guards" goes the Latin quote, more or less.) That is why I proposed the simplest structure that would still work: a single, recirculating process. Still, what if the memory loop excited the decay loop which inhibits the memory loop which?

Proprioception and kinesthesia

(contributed by John A. de Vries II, zozzles@lanl.gov, response from Keith McClary, kmcclary@hamjudo.com)

Proprioception and kinesthesia are related concepts that deal with a creature's sense of posture, of physical being in the world. The first is a nearly unconscious feeling of how your body is set and the other is the much more conscious sense of the angles of your joints, the stresses on your muscles and tendons and so forth. Unlike many other robotic models, nervous net creatures have a unique ability to implement and use these concepts.

Let's go through a little bit of simulated evolution.

A primitive nervous net walker created using conventional parts (74x14, 74x240 or the like) could conceivably use sub-milliamp motors/actuators. Such a walker will be able to handle certain classes of obstacles (for example, a leg in a hole) because of the feedback from the motors to the neurons. That is, the reverse EMF created by the motor turning (or lack thereof because the leg is bound by some object) would cause the process in the corresponding neuron to be attenuated (i.e., its pulse-width is shortened.) Thus the creature would appear, as an emergent behavior, to spend less time and energy on a stuck leg. The roboethologist would say that the creature "feels" that its leg is stuck and is expending more of its energy on the other legs in order to get unstuck. In a sense, the creature would have proprioception that is really quite useful.

The next step in evolution would be a more powerful creature -- powerful because of bipolar buffering between the nervous neuron and the motor itself. A transistor (not a FET, by the way) can take the neuron's signal and provide substantially more current and thus more power to the motor. There would be a definite loss in the creature's "sense" of where its legs are, however. There is a reciprocal relationship that occurs when looking "into" vs "out of" a transistor. If a transistor produces a gain of 100 (from neuron to motor) then the effect of the motor back to the neuron is correspondingly reduced (i.e., is only 1%.) This more powerful creature isn't going to have the feedback of the more primitive one, but almost certainly could make up for it with power.

Then comes the current phase in our little ecology. Instead of using bipolar transistors to drive the motors, we see buffer chips (e.g., 74x240) and FETs being used. The motors the creatures have can be quite massive and extremely powerful as a result. However, the only feedback from the motors to the neurons might be Vcc loading -- which would affect all of the neurons pretty much equally (but might have some chaotic, semiconductor-processing effect.) Lost would be any real notion of the position of a leg or its loading -- in effect, the computational loop from outside world through the creature back to outside world would be lost. One presumes that higher-order sensing (e.g., a head) would be used to make up for this loss, but on a lower level it is likely that the creature would be substantially less flexible, less agile in different environments. Once tuned for sand, it would find itself far less graceful on rocky terrain.

I've seen some of these effects -- I'm privileged in that I've been able to watch Mark Tilden and Matt Moses craft some of the largest autonomous robots currently in existence. In particular, one problem that Matt had with the machine that he is finishing is that there was drift in one of the sets of legs. No matter how he tuned the neurons, the leg would show angular drift and was stopped (well, sort of, the motors are rather powerful) when it began to hit the body of the creature. The solution currently in place is the use of limit switches that strongly attenuate the driving neuron when activated. Thus the process moves along the loop reaching the neuron that drives the leg in the opposite direction -- which would be "fired" for the normal amount of time, thus correcting the drift dynamically. I also understand that there are limit switches on the other set of legs, but they are used to drive a multiplexer that allows immediate reversal of the leg's direction.

It is my claim that successful creatures would have a somewhat more subtle form of kinesthesia. That I can use the term "limit switch" already evokes an old, crude style of technology more fitted to elevators and machine tools than the elegant beasts I've seen this readership create. I have thought about this problem for some time and have come up with one solution that I believe is simple and effective (explained shortly below) but I'm certain that you guys can come up with others -- ideas that I (for one) would love to read and think about.

So -- here's a bit of a solution - plain old potentiometers attached to the leg, wired back into the neuron as a bias. I'm not sure whether it ought to be a positive or negative bias (haven't thought that far) but in any case there would be a feedback of position to the neuron.

What is needed, however, are other ideas, implementations that would handle measure how much resistance a given leg is getting and so forth. The MIT crowd tend to use motor current measurements for this, but that might not be very applicable to the use of stepping motors.

(contributed by Keith McClary, kmcclary@hamjudo.com)

Note: This describes animal muscle "active muscle feedback sensing systems" in detail, a drug that interferes with it, and the design of a simple "servo string pot" to emulate it.

Most muscle driven organics apparently do NOT use a position sensor akin to a potentiometer. Instead, they use an active sensing system for the kinesthesic sense. Small, separate muscles are placed alongside or within the main (big) muscle set. They are not run by the "motion" command. Instead, they have their own control net. As I understand it, when the big muscle flexes, the small muscle servo-loops based on simple strain detection. If the strain increases, it loosens up. If it goes slack, it tightens. The "sensing muscle" therefore hovers at a fixed strain point.

This loop is "spinally local". That is, the control loop exists only between the muscle and one spinal vertebra, where the data can affect the associated main muscle. The brain is not involved, which speeds up the response time and reduces wiring tremendously.

Just as you can use a phase locked loop's feedback loop as an AM output to demodulate an FM signal, the output from the independent small muscle's driving neural loop is available to the rest of the main network.

IMPORTANT: The output is directly and proportionally related to whatever position the small muscle is forced to assume to maintain a static strain.

Although this seems screwy at first, it is really very elegant, for several reasons:

Data from this control loop interacts with "desired position" data coming from the brain and modulates the big muscle's drive in the spine. Your "servo control" is therefore local at the vertebrae level, and this position feedback data helps you achieve proper target stabilization of the limb, with just a simple brain gross positioning command. In other words, this makes your limb position load independent for small changes in load.

It took me a long time to piece this together, as the available information was not couched in these kind of terms. (To my knowledge, this may be the first time it has ever been written up this way.)

I know this, because I was personally open looped by medication once. I did some research after the fact to try to understand what happened to me.

An example of a drug that affects this control loop is Parafon Forte (PF). Spinal accident victims (like yours truly, from a car accident :-) often have temporary swelling of tissue around the spine from the injury. This causes nerve compression, thereby false triggering muscles. That in turn creates horrible "charlie horse feedback loops" causing severe cramping over entire limbs and the back, with pain, and additional damage potential (spine positioning muscles are affected too, compressing the nerves further).

PF is considered a "spinal muscle relaxant". In reality, it interferes with the feedback from this sensing system by "open looping" your spine, keeping this data from assisting in position modulation. I was on PF for a few weeks after the accident until the swelling subsided.

When they gave it to me, it released the cramping, but I felt "rubbery". Very amusing. It was as if my limbs were loosely connected to my body, like a marionette. Although perfectly alert, it seemed like only my limbs were a little drunk.

I'd swing my arm back an forth, and it followed a very underdamped "soft" path, along the general expected line. However it was nowhere near as precise as before, and it sagged noticeably. No wavering (tremor) occurred, but I had to consciously target things by watching the hand and directing it. Otherwise, I might be slightly offset, or undershoot the motion in the favor of gravity entirely. Repeatability of going to another position and back wasn't there for some reason, either.

The path was incredibly load dependent. If I added a weight to an outstretched limb, like holding a glass, it would load down, and I would have to consciously increase the force a lot to put it back into position. Bizarre. I was running totally open loop for the first time in my life, and my brain had to take over targeting control.

Under full dose, it took massive concentration to move around and stay balanced. Exhausting mentally, I became prone to banging myself up if I didn't pay strict attention to my movements. I ended up shuffle stepping, to prevent me from extending my legs too far and losing it. I only took partial doses after that, just barely enough to eliminate cramping (which was still a significant dose).

What was interesting about this drug is that it was very specific in its action. It only affected my spine, and wiped out my navigational compass sense. (Now I really wonder if our compass sense is also an active servo loop of some kind, but I digress) It did not affect any congnitive, motor or sensory "skills" such as strength, "proprioception" (to use John's term), or touch. It only affected motor output positional control accuracy.

I now realize (and appreciate) how much of our internal position sensing and corrective feedback is automatic, and is buried deep down in the spine.

Now, this should be easily modeled in simple hardware. Create a "servo string pot" thus, take a second servo. Replace the single turn pot with a ten turn, and remove the limit tab. Replace the normal servo electronics with an H-bridge and a few gates.

Place a drum of string on the output shaft. The string runs to the far point, and is attached via a small spring. Create a simple homebrew SPDT-CenterOff switch within the spring such that as long as the spring is 1/2 stretched, the switch is open.

If tension increases, the spring stretches more and closes the switch one way, which via simple gates drives the H-bridge to loosen the string until the switch opens again. Conversely, if it relaxes, the other contact closes, causing the logic to reel in the string until it opens once again.

If you don't mind the power consumption, have the bridge enabled all of the time and the servo hovering around a SPST point instead (yuck, but it does eliminate the switch's deadband.

The 10-turn pot now gives you your cord extension "position". Wire it into your other nets as a modulation. If you want to be fancy, mount the entire servo on a rotary version of the switch along the output shaft's axis with a pair of "centering springs" so that string tension runs the switch via torque, and everything is local. No wires run to the far end, and the string is hard anchored there as well, OR, hard mount the servo, create a spring torque-switch sensor between the drum and the shaft, and connect it back via rings and brushes if necessary.

Another improvement would be to use the original servo electronics along with the original pot plus a torque spring as a fancier tension sensor to create a variable duty cycle PWM modulator, giving a proportional variable speed to the motor.

Advantages of this system is that: (1) the servo is kept within the main body frame, and (2) you are using a string "tendon", that can be routed to your limb's far point via many methods and circuitous routes.

I remember somewhere in my web travels of hitting a robotic lab a few months back that had a working physical good model of the "active sensing" muscle system, but it used a different hardware approach. They used something like piston air cylinders, one large and one small, and a simple sensor (maybe a strain guage with a simple signal conditioner, or a switch set on a loose mechanical connection or the like to simulate the action). Air gave the "spring" buffering effect.




[1.3] Digital Interfaces to Nv Networks

The consensus is that a digital computer (usually in the form of a microcontroller in robotics) will not make a better controller for a walking machine than the MicroCore. The MicroCore is simple, elegant and powerful without the expense of complicated code and power-hungry processors. As it has been pointed out, MicroCore (nervous networks in general) technology is excellent at making a smart body.

The only reasons that makes sense (to me) is to add a microcontroller for higher level functions, such as a communications controller, sensor controller/filter, etc., which would send analog control signals to the Nv based on the result. A simple high level command mode, such as:

  • auto-reset
  • shutdown to low-power mode
  • turn left or right
  • seek or avoid light
  • reverse
These "high level" commands are simple to understand and implement in code. Other commands are possible. There have been some implementations of such a interface from digital processors to nervous networks, namely by
Andrew Miller and another by Terry Newton.

Now, suppose that you've got these various nervous networks and each network shows extremely robust and capable behavior within some portion of your problem space (i.e., seeing, navigation, locomotion, coordination, etc.). Enter the Microchip PIC processor (used in the BASIC Stamp) or the Atmel AT90S1200. Both of these RISC-based microcontrollers can be used to implement decision trees or fuzzy logic or what-have-you (and alot of implementations are simply to remove many logic gates with a simple low-power microcontroller). And you've got something like the 74x244 buffer (used as a Multiplexer) which allows you to enable or disable four lines all at once (tristate at that.) That means that your processor can say: "Since I'm in condition X, I think that behavior-set Y is called for..." It then connects up the nervous network(s) appropriately, which then do their thing efficiently and smoothly -- and don't even really need much supervision by the processor. An amazing non-linear increase in ability with mere linear increase of complexity.

Copyleft 1996-1998, Brian O. Bush

Brian O. Bush / bushbo@mediaone.net
Updated: July 16th, 1998