[GRASS-SVN] r49194 - in grass-addons/grass7/raster/r.agent: libagent libold

svn_grass at osgeo.org svn_grass at osgeo.org
Sun Nov 13 10:49:04 EST 2011


Author: mic
Date: 2011-11-13 07:49:04 -0800 (Sun, 13 Nov 2011)
New Revision: 49194

Added:
   grass-addons/grass7/raster/r.agent/libold/__init__.py
   grass-addons/grass7/raster/r.agent/libold/aco.py
   grass-addons/grass7/raster/r.agent/libold/agent.py
   grass-addons/grass7/raster/r.agent/libold/alltests.py
   grass-addons/grass7/raster/r.agent/libold/ant.py
   grass-addons/grass7/raster/r.agent/libold/error.py
   grass-addons/grass7/raster/r.agent/libold/layer.py
   grass-addons/grass7/raster/r.agent/libold/overview.html
   grass-addons/grass7/raster/r.agent/libold/playground.py
   grass-addons/grass7/raster/r.agent/libold/rasterlayer.py
   grass-addons/grass7/raster/r.agent/libold/vectorlayer.py
   grass-addons/grass7/raster/r.agent/libold/world.py
Removed:
   grass-addons/grass7/raster/r.agent/libagent/__init__.py
   grass-addons/grass7/raster/r.agent/libagent/aco.py
   grass-addons/grass7/raster/r.agent/libagent/agent.py
   grass-addons/grass7/raster/r.agent/libagent/alltests.py
   grass-addons/grass7/raster/r.agent/libagent/ant.py
   grass-addons/grass7/raster/r.agent/libagent/error.py
   grass-addons/grass7/raster/r.agent/libagent/layer.py
   grass-addons/grass7/raster/r.agent/libagent/overview.html
   grass-addons/grass7/raster/r.agent/libagent/playground.py
   grass-addons/grass7/raster/r.agent/libagent/rasterlayer.py
   grass-addons/grass7/raster/r.agent/libagent/vectorlayer.py
   grass-addons/grass7/raster/r.agent/libagent/world.py
Log:
moving original version aside

Deleted: grass-addons/grass7/raster/r.agent/libagent/__init__.py
===================================================================
Deleted: grass-addons/grass7/raster/r.agent/libagent/aco.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/aco.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/aco.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,228 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by  Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-from math import sqrt
-from math import exp
-from random import randint
-import world
-import error
-import ant
-
-class ACO(world.World):
-    """Ant Colony Optimization Algorithm for Modelling an Agent Based World"""
-    def __init__(self):
-        world.World.__init__(self, ant.Ant)
-        ### auto/constant
-        self.agentclass = ant.Ant
-        self.ants = self.agents
-        self.artefacts.append([])
-        self.holes = self.artefacts[0]
-        self.artefacts.append([])
-        self.sugar = self.artefacts[1]
-        self.surfaceslope = None
-        self.costsurface = None
-        self.pherovapour = None
-        self.bounds = None
-        self.straight = 0
-        self.diagonal = sqrt(2)-1
-        # count paths
-        self.nrop = 0
-        ### user parameter
-        self.globalfreedom = 8
-        self.rounds = 0
-        self.outrounds = 0
-        self.outfilename = ""
-        self.maxpheromone = 2147483647
-        self.minpheromone = 10
-#        self.maxpenalty = 999
-        self.volatilizationtime = 1
-        self.stepintensity = 10
-        self.pathintensity = 10000
-        self.decisionbase = "standard"
-        self.pheroweight = 1
-        self.randomweight = 1
-        self.validposition = "specials"
-# use fibonacci?
-        self.maxants = 100
-        self.antslife = 0
-    def checkvalues(self):
-        if self.costsurface == None:
-            raise error.DataError("aco.ACO.checkvalues()",
-                    "main input missing: costraster")
-        self.playground.setboundsfromlayer("costs")
-        self.playground.forcelayerbounds()
-        self.bounds = self.playground.getrelativebounds()
-        if self.costsurface == None:
-            raise error.DataError("aco.ACO.checkvalues()",
-                    "input layer missing: costsurface")
-        elif self.costsurface == []:
-            if self.surfaceslope == None:
-                raise error.DataError("aco.ACO.checkvalues()",
-                    "input layer missing: please provide cost or slope layer")
-            else:
-                self.calccostsurface()
-        if self.pherovapour == None:
-            raise error.DataError("aco.ACO.checkvalues()",
-                    "output layer missing: pheromoneraster")
-        if self.holes == None:
-            raise error.DataError("aco.ACO.checkvalues()",
-                    "input layer missing: vectorholes")
-        if self.rounds <= 0:
-            raise error.DataError("aco.ACO.checkvalues()",
-                    "number of rounds is zero or not set.")
-        if self.outrounds <= 0:
-            self.outrounds = self.rounds
-        if self.antslife == 0:
-            self.antslife = (self.bounds[4]+self.bounds[5])
-        if self.volatilizationtime > self.rounds:
-            self.volatilizationtime = self.rounds
-        elif self.volatilizationtime < 0:
-            self.volatilizationtime = 0
-        for hole in self.holes[:]:
-            if self.costsurface[hole[0]][hole[1]] < 0:
-                self.holes.remove(hole)
-            else:
-# TODO if two holes are close, choose outermost.. or so.
-                self.pherovapour[hole[0]][hole[1]] = -1
-    def addneighbour(self, positions, position):
-        position[2] = self.costsurface[position[0]][position[1]]
-# TODO > or >=
-#        if position[2] > self.maxpenalty:
-#            return
-        if position[2] >= 0:
-            position[3] = self.pherovapour[position[0]][position[1]]
-            positions.append(position)
-    def calccostsurface(self):
-        for x in range(self.bounds[2]):
-            for y in range(self.bounds[0]):
-                val = self.surfaceslope[x][y]
-                if self.surfaceslope > 0:
-                    self.costsurface[x][y] = (1/exp(-0.035*abs(val+5)))-1
-    def getneighbourpositions(self, position, freedom=None):
-        # position = [ x, y, surfacecost, special/phero, timecost, direction ]
-        if freedom == None:
-            freedom = self.globalfreedom
-        positions = []
-        if freedom >= 4:
-            #north = 1
-#TODO improve with not creating position in any case..
-            p = [position[0], position[1]+1, 0, 0, self.straight, 1]
-            if p[1] <= self.bounds[0]:
-                self.addneighbour(positions, p)
-            #south = 2
-            p = [position[0], position[1]-1, 0, 0, self.straight, 2]
-            if p[1] >= self.bounds[1]:
-                self.addneighbour(positions, p)
-            #east = 3
-            p = [position[0]+1, position[1], 0, 0, self.straight, 3]
-            if p[0] <= self.bounds[2]:
-                self.addneighbour(positions, p)
-            #west = 4
-            p = [position[0]-1, position[1], 0, 0, self.straight, 4]
-            if p[0] >= self.bounds[3]:
-                self.addneighbour(positions, p)
-        if freedom >= 8:
-            #northeast = 5
-            p = [position[0]+1, position[1]+1, 0, 0, self.diagonal, 5]
-            if p[1] <= self.bounds[0] and p[0] <= self.bounds[2]:
-                self.addneighbour(positions, p)
-            #northwest = 6
-            p = [position[0]-1, position[1]+1, 0, 0, self.diagonal, 6]
-            if p[1] <= self.bounds[0] and p[0] >= self.bounds[3]:
-                self.addneighbour(positions, p)
-            #southeast = 7
-            p = [position[0]+1, position[1]-1, 0, 0, self.diagonal, 7]
-            if p[1] >= self.bounds[1] and p[0] <= self.bounds[2]:
-                self.addneighbour(positions, p)
-            #southwest = 8
-            p = [position[0]-1, position[1]-1, 0, 0, self.diagonal, 8]
-            if p[1] >= self.bounds[1] and p[0] >= self.bounds[3]:
-                self.addneighbour(positions, p)
-        return positions
-    def letantsdance(self):
-        if 0 < self.outrounds < self.rounds:
-            mainloops = self.rounds/self.outrounds
-            loops = self.outrounds
-        else:
-            mainloops = 1
-            loops = self.rounds
-        nrofrounds = mainloops*loops
-        remember = loops
-        while mainloops > 0:
-            loops = remember
-            while loops > 0:
-                if len(self.ants) < self.maxants:
-                    position = self.holes[randint(0, len(self.holes)-1)][0:2]
-                    self.bear(None, self.antslife, position)
-                for ant in self.ants:
-                    ant.walk()
-                self.volatilize()
-                loops -= 1
-            self.export(str(mainloops))
-            print "nrofpaths:", self.nrop
-            mainloops -= 1
-        print "nrofrounds", nrofrounds
-    def volatilize(self):
-        if self.volatilizationtime > 0:
-            limit = self.minpheromone
-            halflife = self.volatilizationtime
-            for x in range(self.bounds[2]):
-                for y in range(self.bounds[0]):
-                    if self.pherovapour[x][y] > limit:
-                        val = int(self.pherovapour[x][y]*0.5**(1.0/halflife))
-                        if val > limit:
-                            self.pherovapour[x][y] = val
-    def export(self, suffix=""):
-        layer = self.playground.getlayer("phero")
-        if self.outfilename == "":
-            self.outfilename = layer.outfilename
-        layer.setoutfilename(self.outfilename+suffix)
-        layer.exportfile()
-
-def test(inraster=False, outraster=False, invector=False, slope=False):
-    """Test suite for ACO Class"""
-    print "creating a new ants world.."
-    w = ACO()
-    if inraster:
-        layer = w.importlayer("costs", "raster", inraster)
-        w.costsurface = layer.raster
-    elif slope:
-        layer = w.importlayer("slope", "raster", slope)
-        w.surfaceslope = layer.raster
-        w.playground.setboundsfromlayer("slope")
-        layer = w.createlayer("costs", "raster", None, None)
-        w.costsurface = layer.raster
-        w.calccostsurface()
-    print "start playing with it.."
-    if outraster and invector:
-        layer = w.createlayer("phero", "raster", None, outraster)
-        w.pherovapour = layer.raster
-        layer = w.importlayer("holes", "vector", invector)
-        w.holes = layer.objects
-        w.rounds = 1
-        w.checkvalues()
-        print "set, within:", w.playground.getbounds()
-        print "this translates to:", w.bounds
-        print " this are the holes:"
-        for hole in w.holes:
-            print str(hole)
-        print "neighbourpositions of [9,9]:", w.getneighbourpositions([9,9])
-        print "setting [9,9] to pheromone 999"
-        w.pherovapour[9][9] = 999
-        w.volatilize()
-        print " after some volatilization:",w.pherovapour[9][9]
-        print "playing with some ants"
-        w.letantsdance()
-        print "rock n' roll"
-        w.export()
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/agent.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/agent.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/agent.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,63 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-import world
-
-class Agent(object):
-    """standard agent"""
-    def __init__(self, timetolive, world, position=[]):
-        self.ttl = timetolive
-        self.world = world
-        self.position = position
-        self.knowscompass = False
-        self.freedom = 0
-    def setposition(self, position):
-        if position and position != []:
-            self.position[0] = position[0]
-            self.position[1] = position[1]
-    def getposition(self):
-        return self.position
-    def move(self, nrofsteps, direction):
-        pass
-    def age(self):
-        if self.ttl > 0:
-            self.ttl -= 1
-            return True
-        else:
-            self.snuffit()
-            return False
-    def snuffit(self):
-        """to die peacefully and without pain."""
-        self.world.kill(self)
-
-def test():
-    """Test suite for Agent Class"""
-    print "create a world with an agent in."
-    w = world.World(Agent)
-    w.bear(Agent,1,[0,0])
-    print "agent seems fine (for now). time to live:", str(w.agents[0].ttl)
-    print "fake-placing it somewhere ([0,1]).."
-    w.agents[0].setposition([0,1])
-    print "getting its position:", w.agents[0].getposition()
-    print "'cause this takes some time.."
-    w.agents[0].age()
-    print "agent should have grown older by now. time to live:", \
-         str(w.agents[0].ttl)
-    print "and now let agent die.."
-    w.agents[0].age()
-    try:
-        print "should be dead by now. time to live:", str(w.agents[0].ttl)
-    except IndexError:
-        print "IndexError catched: ant was not found in the world anymore."
-    print "all done."
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/alltests.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/alltests.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/alltests.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      very basic test collection for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-import sys
-
-import error
-import agent
-import ant
-import layer
-import rasterlayer
-import vectorlayer
-import world
-import aco
-import playground
-
-def dotest(function, argv):
-    while True:
-        n = function.func_doc
-        o = str(argv)
-        if not n:
-            n = str(function)
-        t = str(raw_input("execute this now: '"+n+" - "+o+"'? [y/n/abort] "))
-        if t == "y":
-            if argv != None:
-                function(*argv)
-            else:
-                function()
-            break
-        elif t == "n":
-            break
-        elif t == "abort":
-            exit()
-
-files = ["elev.grid", "elev.grid.out", "arch.vect"]
-
-alltests = [[error.test, None],
-            [agent.test, None],
-            [ant.test, None],
-            [layer.test, [files[2]]],
-            [layer.test, [files[0]]],
-            [rasterlayer.test, [files[0]]],
-            [vectorlayer.test, [files[2]]],
-            [world.test, None],
-            [world.test, files],
-            [aco.test, files],
-            [playground.test, ["raster", files[0], "vector", files[2]]]]
-
-for test in alltests:
-    dotest(test[0], test[1])
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/ant.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/ant.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/ant.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,335 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-from random import choice, randint
-import agent
-import error
-
-class Ant(agent.Agent):
-    """custom"""
-    def __init__(self, timetolive, world, position):
-        agent.Agent.__init__(self, timetolive, world, position)
-        self.position.extend([None,None,0,0])
-        self.home = self.position[:]
-        self.laststeps = [self.position[:]]
-        self.visitedsteps = []
-        self.done = False
-        self.nextstep = [None,None,0,0,0,0]
-        self.goal = []
-        self.penalty = 0.0
-        self.steppaint = world.stepintensity
-        self.pathpaint = world.pathintensity
-        if world.decisionbase == "standard":
-            self.pickaposition = self.smellposition
-            self.pheroweight = self.world.pheroweight * 2
-            self.randomweight = self.world.randomweight * 2
-        elif world.decisionbase == "random":
-            self.pickaposition = self.randomposition
-        elif world.decisionbase == "test":
-            self.pickaposition = self.testposition
-            self.pheroweight = self.world.pheroweight * 2
-            self.randomweight = self.world.randomweight * 2
-        if world.validposition == "avoidloop":
-            self.haspositions = self.avoidloop
-        elif world.validposition == "forgetloop":
-            self.haspositions = self.forgetloop
-        elif world.validposition == "avoidorforgetloop":
-            self.haspositions = self.avoidorforgetloop
-        elif world.validposition == "specials":
-            self.haspositions = self.searchspecials
-    def paint(self, position, value):
-#TODO mv to tests:
-        if self.world.pherovapour[position[0]][position[1]] < 0:
-            print "home:", self.home, "paint:", position, ":", value
-            raise error.Error("Ant.paint()", "Not painting over specials.")
-        if self.world.maxpheromone-value > \
-         self.world.pherovapour[position[0]][position[1]]:
-            self.world.pherovapour[position[0]][position[1]] += value
-    def randomposition(self, positions):
-        self.nextstep = positions[randint(0, len(positions)-1)]
-    def testposition(self, positions):
-        i = 0
-        l = []
-        for pos in positions:
-            l.append([pos[3]/self.randomweight+randint(0,\
-                self.world.maxpheromone)/self.pheroweight, i])
-            i += 1
-        l.sort()
-        self.nextstep = positions[l[0][1]]
-#TODO add some position search alg that avoids high penalties..
-    def smellposition(self, positions):
-        self.nextstep = positions[0]
-        self.nextstep[3] = self.nextstep[3]/self.randomweight+ \
-                    randint(0,self.world.maxpheromone)/self.pheroweight
-        for pos in positions[1:]:
-            pos[3] = pos[3]/self.randomweight+ \
-                    randint(0,self.world.maxpheromone)/self.pheroweight
-            if self.nextstep[3] < pos[3]:
-                self.nextstep = pos
-    def avoidloop(self, positions):
-        ''' This method tries to avoid stepping on already passed
-            nodes. That it is basically. '''
-        # remember all positions for worst case..
-        temppositions = positions[:]
-        for last in self.laststeps[:]:
-            for pos in positions[:]:
-                if last[0] == pos[0] and last[1] == pos[1]:
-                    # position already visited once..
-                    try:
-                        positions.remove(pos)
-                    except ValueError:
-                        pass
-        if len(positions) == 0:
-            # can not be special value, because it would already be visited
-            # make sure it is not home
-            pos = choice(temppositions)
-            if pos[0] == self.home[0] and pos[1] == self.home[1]:
-                temppositions.remove(pos)
-                pos = choice(temppositions)
-            # if none was left: choose another one by chance
-            # no need to proceed with choosing from only one position
-            self.nextstep = pos
-            return True
-        else:
-            for pos in positions[:]:
-                if pos[3] < 0:
-                    # home is already handled because visited
-                    # goal node found. add one to the counter
-                    self.world.nrop += 1
-                    self.done = True
-                    # now, head back home..
-                    self.nextstep = self.laststeps.pop()
-                    return True
-        return False       
-    def avoidorforgetloop(self, positions):
-        ''' This method tries to avoid stepping on already passed
-            nodes. If this is not possible or if a path is coming
-            close to such nodes in the grid, it will grant not to
-            produce loops by deleting all intermediate steps.'''
-        # remember all positions for worst case..
-        temppositions = positions[:]
-        # initially start with no loop found
-        hasposition = False
-        # search for loops, but exclude last step from process (keep it)
-        for last in self.laststeps[:]:
-            if hasposition == True:
-                # remove loop, but remember visited steps
-                self.visitedsteps.append(last)
-                self.laststeps.remove(last)
-            else:
-                # search for loop in positions
-                for pos in positions[:]:
-                    if last[0] == pos[0] and last[1] == pos[1]:
-                        # shortcut found, so remove loop
-                        hasposition = True
-                        # remove that position from possible next ones
-                        positions.remove(pos)
-                        # change direction penalty to new shortcut
-                        self.laststeps[-1][4] = pos[4]
-        # remove all yet visited nodes from possible next positions
-        for visited in self.visitedsteps:
-            for pos in positions[:]:
-                if visited[0] == pos[0] and visited[1] == pos[1]:
-                    # do not step on visited nodes again
-                    positions.remove(pos)
-        if len(positions) == 0:
-            # can not be special value, because it would already be visited
-            # make sure it is not home
-            pos = choice(temppositions)
-            if pos[0] == self.home[0] and pos[1] == self.home[1]:
-                temppositions.remove(pos)
-                pos = choice(temppositions)
-            # if none was left: choose another one by chance
-            # no need to proceed with choosing from only one position
-            self.nextstep = pos
-            return True
-        else:
-            for pos in positions[:]:
-                if pos[3] < 0:
-                    # home is already handled because visited
-                    # goal node found. add one to the counter
-                    self.world.nrop += 1
-                    self.done = True
-                    # now, head back home..
-                    self.nextstep = self.laststeps.pop()
-                    return True
-        return False
-    def forgetloop(self, positions):
-        ''' This method deletes all positions that form a loop in the
-            path. It also prohibits to walk back one step both to the
-            true former position, and to the assumed last step on the
-            newly created shortcut.'''
-        # initially start with no loop found
-        hasposition = False
-        # search for loops, but exclude last step from process (keep it)
-        for last in self.laststeps[:-1]:
-            if hasposition == True:
-                # remove loop
-                self.laststeps.remove(last)
-            else:
-                # search for loop in positions
-                for pos in positions[:]:
-                    if last[0] == pos[0] and last[1] == pos[1]:
-                        # shortcut found, so remove loop
-                        hasposition = True
-                        # remove that position from possible next ones
-                        positions.remove(pos)
-                        # change direction penalty for laststep to new shortcut
-                        self.laststeps[-1][4] = pos[4]
-        for pos in positions[:]:
-            if pos[3] < 0:
-                # promissing, but home is not excluded (only loops are..)
-                if pos[0] == self.home[0] and pos[1] == self.home[1]:
-                    # so, make sure it is not home..
-                    positions.remove(pos)
-                else:
-                    # goal node found. add one to the counter
-                    self.world.nrop += 1
-                    self.done = True
-                    # now, head back home..
-                    self.nextstep = self.laststeps.pop()
-                    return True
-        return False
-    def searchspecials(self, positions):
-        for pos in positions[:]:
-            if pos[3] < 0:
-                # nice value found, goal might be reached
-                if pos[0] == self.home[0] and pos[1] == self.home[1]:
-                    # make sure it is not home..
-                    positions.remove(pos)
-                else:
-                    # this is it! add one to the counter
-                    self.world.nrop += 1
-                    self.done = True
-                    self.nextstep = self.laststeps.pop()
-                    return True
-        return False
-    def choose(self):
-        positions = self.world.getneighbourpositions(self.position)
-        # remove last step from possible neighbourpositions
-        try:
-            positions.remove(self.laststeps[len(self.laststeps)-1])
-        except ValueError:
-            pass
-        if not self.haspositions(positions):
-            self.pickaposition(positions)
-    def walk(self):
-        # we are all only getting older..
-        if self.age() == False:
-            return False
-        # if we do not have decided yet where to go to..
-        if self.nextstep[0] == None:
-            self.choose()
-        # if penalty is positive, wait one round
-        if self.penalty > 0:
-            self.penalty -= 1
-        else:
-            # add penalty from direction or underground
-# TODO: think about adding 1 to each and then multiplicate them ;)
-            self.penalty += self.nextstep[4] + self.nextstep[2]
-            # are we luckily walking home?
-            if self.done == True:
-                # walk back home one step
-                self.position = [self.nextstep[0],self.nextstep[1]]
-                # mark current position as a good choice
-                self.paint(self.position, self.pathpaint)
-                if len(self.laststeps) > 1:
-                    # next step towards back home
-                    self.nextstep = self.laststeps.pop()
-                else:
-                    # retire after work
-                    self.snuffit()
-            else:
-                # make a step
-                self.position = self.nextstep
-                # remember it
-                self.laststeps.append(self.position)
-                # clear nextstep for next round
-                self.nextstep = [None,None,0,0,0,0]
-                # mark current position
-                self.paint(self.position, self.steppaint)
-
-def test():
-    """Test suite for Ant Class"""
-    import aco
-    print "creating a new world"
-    w = aco.ACO()
-    w.bounds = [5,0,5,0,6,6]
-    w.playground.setbounds(5,0,5,0,6,6)
-    print " limits set:",w.playground.getbounds()
-    w.playground.setnewlayer("cost", "raster", True)
-    w.costsurface = w.playground.getlayer("cost").raster
-    w.playground.setnewlayer("phero", "raster", True)
-    w.pherovapour = w.playground.getlayer("phero").raster
-    print " playground looks like (cost+phero)"
-    print " #c#",w.costsurface
-    print " #p#",w.pherovapour
-    w.holes = [[0,0,1]]
-    print ""
-    print "let's put some life in it.."
-    w.bear(Ant,5,[0,0])
-    a = w.agents[0]
-    print " agent seems fine (for now). time to live:",str(a.ttl),\
-        ". location:",a.position
-    a.paint([0,0],500)
-    a.paint([1,1],800)
-    a.paint([1,2],900)
-    print " playground(phero) after some painting:"
-    print " ", w.pherovapour
-    print "look around on positions.."
-    positions = w.getneighbourpositions(a.position)
-    print " tmp positions: ", positions
-    print "- any special cells in raster? ",\
-        a.searchspecials(positions)
-    positions[1][3] = -1
-    print "- any special cells in raster (marking one)? ",\
-        a.searchspecials(positions)
-    print "now die."
-    a.snuffit()
-    print ""
-    print "new ant.."
-    w.bear(Ant,5,[0,0])
-    a = w.agents[0]
-    print " agent seems fine (for now). time to live:",str(a.ttl),\
-        ". location:",a.position
-    print "let's do some positioning..."
-    positions = w.getneighbourpositions(a.position)
-    print "- now pickaposition:"
-    a.randomposition(positions)
-    print " a random choice: ", a.nextstep
-    a.smellposition(positions)
-    print " in smell-mode we would choose: ", a.nextstep
-    a.testposition(positions)
-    print " alternative test:", a.nextstep
-    print "- hasposition alternatives"
-    print " avoid walking in loops:"
-    ps = positions[:]
-    a.avoidloop(ps)
-    print " ",ps
-    ps = positions[:]
-    print " forget loops:"
-    a.forgetloop(ps)
-    print " ",ps
-    ps = positions[:]
-    print " avoid or forget loops:"
-    a.avoidorforgetloop(ps)
-    print " ",ps
-    print "- regularly choose a position now.. based on .. why not: smell."
-    print positions
-    a.choose()
-    print " ant: I'd go there,", a.position
-    print "- make a step forward then.."
-    a.walk()
-    print " ant: I am here now,", a.position
-    print "all done."
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/error.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/error.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/error.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,48 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-class Error(Exception):
-    """Base class for exceptions in this module."""
-    pass
-
-class DataError(Error):
-    """Exception raised for errors in the input.
-
-    Attributes:
-        expr -- Context expression in which the error occurred
-        msg  -- explanation of the error
-    """
-    def __init__(self, expr, msg):
-        self.expr = expr
-        self.msg = msg
-        print "DataError: " + expr + " " + msg
-
-class InputError(Error):
-    """Exception raised for errors in the input.
-
-    Attributes:
-        expr -- input expression in which the error occurred
-        msg  -- explanation of the error
-    """
-    def __init__(self, expr, msg):
-        self.expr = expr
-        self.msg = msg
-        print "InputError: " + expr + " " +msg
-
-def test():
-    """Test suite for Error Class"""
-    try:
-        raise InputError("Error Test Suite", "(no problem with this error)")
-    except InputError:
-        print "catched! all fine."
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/layer.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/layer.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/layer.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,140 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-import error
-
-class Layer():
-    """More like a meta/stub Class (or Interface).
-        To be inherited by children."""
-    def __init__(self):
-        self.infilename = None
-        self.outfilename = None
-        self.offset = [None,None]
-        self.limit = [None,None]
-        self.steps = []
-        self.resolution = [1,1]
-        self.fbuffer = None
-    def setinfilename(self, filename):
-        self.infilename = filename
-    def setoutfilename(self, filename):
-        self.outfilename = filename
-    def clearlayer(self):
-        self.offset = [None, None]
-        self.limit = [None, None]
-        if self.steps != []:
-            self.steps = [None, None]
-    def setbounds(self, north, south, east, west, rows=None, cols=None):
-        self.offset = [west,south]
-        self.limit = [east,north]
-        # here layer decides if steps shall be set (see Playground)
-        if self.steps != []:
-            self.steps = [cols,rows]
-            self.resolution[0] = (self.limit[0]-self.offset[0])/self.steps[0]
-            self.resolution[1] = (self.limit[1]-self.offset[1])/self.steps[1]
-    def getbounds(self):
-        if self.steps != []:
-            rows = self.steps[1]
-            cols = self.steps[0]
-        else:
-            rows = None
-            cols = None
-        return [self.limit[1], self.offset[1], self.limit[0],
-                 self.offset[0], rows, cols]
-    def shiftbound(self, direction, delta):
-        if delta < 0:
-            pass
-        elif delta > 0:
-            pass
-    def comparebounds(self, north, south, east, west, rows=None, cols=None):
-        if [west,south] == self.offset and [east,north] == self.limit:
-            if self.steps == []:
-                return True
-            elif [cols,rows] == self.steps:
-                return True
-        return False
-    def forcebounds(self, north, south, east, west, rows=None, cols=None):
-        if not self.comparebounds(north, south, east, west, rows, cols):
-            if self.resolution[0] and self.resolution[1]:
-                xres = self.resolution[0]
-                yres = self.resolution[1]
-            else:
-                xres = 1
-                yres = 1
-            self.shiftbound('north', (north-self.limit[1])/yres)
-            self.shiftbound('south', (south-self.offset[1])/yres)
-            self.shiftbound('east', (east-self.limit[0])/xres)
-            self.shiftbound('west', (west-self.offset[0])/xres)
-            self.setbounds(north, south, east, west, rows, cols)
-    def parsefile(self, fileh):
-        self.fbuffer = fileh.read()
-    def createfile(self, fileh):
-        if self.fbuffer:
-            fileh.write(self.fbuffer)
-    def importfile(self):
-        try:
-            with open(self.infilename, 'r') as fileh:
-                self.parsefile(fileh)
-        except IOError:
-            print "Error: Can not read " + self.infilename
-        except error.InputError:
-            print "Error: " + self.infilename + \
-                    " is not a valid ascii file"
-    def exportfile(self):
-        try:
-            with open(self.outfilename, "w") as fileh:
-                self.createfile(fileh)
-        except IOError:
-            print "Error: Can not write", self.infilename
-
-def test(infile, export=True, remove=True):
-    """Test suite for Layer Class"""
-    outfile = "out-" + infile
-    import os
-    if os.path.isfile(infile) and not os.path.isfile(outfile):
-        l = Layer()
-        print "setting files.."
-        l.setinfilename(infile)
-        l.setoutfilename(outfile)
-        print " import"
-        l.importfile()
-        if export == True:
-            print " export"
-            l.exportfile()
-            import filecmp
-            if filecmp.cmp(infile, outfile):
-                print "import/export seem ok"
-            else:
-                print "import/export failed"
-            if remove == True:
-                os.remove(outfile)
-        print "setting bounds"
-        l.setbounds(9,0,10,1)
-        print " bounds:", str(l.getbounds())
-        print " offset/limit:", str(l.offset), str(l.limit)
-        print "comparing bounds: "
-        print " True:",str(l.comparebounds(*l.getbounds()))
-        print " False:",str(l.comparebounds(l.offset[0]+1,l.offset[1],*l.limit))
-        print "clear all"
-        print "all again with steps:"
-        l.setbounds(9,0,10,1,1,1)
-        print " bounds:", str(l.getbounds())
-        print " offset/limit:", str(l.offset), str(l.limit)
-        print "comparing bounds: "
-        print " True:",str(l.comparebounds(*l.getbounds()))
-        print " False:",str(l.comparebounds(l.offset[0]+1,l.offset[1],*l.limit))
-        print "clear all"
-        l.clearlayer()
-        print " noting: "+str(l.offset)+str(l.limit)
-    else:
-        print "Error: no " + infile + " or " + outfile + " exists."
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/overview.html
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/overview.html	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/overview.html	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,85 +0,0 @@
-<h2>general oversimplified abstract overview</h2>
-
-<ul><li>world
-<ul><li>e.g. an anthill, or a planet..
-</li><li>organizes how things work together
-</li><li>has:
-<ul><li>playground
-</li><li>list of agents
-<ul><li>killagent(agent)
-</li></ul></li><li>list of artefacts
-</li></ul></li></ul></li><li>aco - world
-<ul><li>is a:
-<ul><li>world
-</li></ul></li><li>for ants as agents with Ant Colony Optimization Algorithm as interaction rule
-</li><li>has:
-<ul><li>playground with
-<ul><li>penalty raster layer
-</li><li>pheromone raster layer
-</li><li>vector layer with holes/anthills
-</li></ul></li><li>list of ants
-</li><li>list of attractors..
-</li><li>list of holes/anthills..
-</li><li>several values that control the behaviour..
-</li></ul></li></ul></li><li>playground
-<ul><li>e.g. dirt, dead wood/leaves/needles, pheromone, etc.
-</li><li>manages layers =&gt; coordinates or graph(?)
-</li><li>has:
-<ul><li>layers
-<ul><li>knows its borders
-<ul><li>start/end coordinates
-</li><li>graph ...
-</li></ul></li><li>calcgraph(raster, degreeoffreedom, sizeofstep)
-</li><li>neighbours(node)-&gt;listofedges
-</li><li>neighbours(coordinates)-&gt;mapofcoordinate=&gt;value's
-</li></ul></li></ul></li></ul></li><li>layer (meta)
-<ul><li>one aspect from playground (one layer therefore..)
-</li></ul></li><li>rasterlayer - layer
-<ul><li>is a:
-<ul><li>layer
-</li></ul></li><li>e.g. pheromone "smell"
-</li><li>represents gis-rasterlayer
-</li><li>has:
-<ul><li>borders
-</li><li>matrix
-</li></ul></li></ul></li><li>vectorlayer - layer
-<ul><li>is a:
-<ul><li>layer
-</li></ul></li><li>e.g. holes in the ground
-</li><li>represents gis-vectorlayer
-</li><li>has:
-<ul><li>borders
-</li><li>list of vector objects/points/..
-</li></ul></li></ul></li><li>graph - layer (not yet available...)
-<ul><li>is a:
-<ul><li>layer
-</li></ul></li><li>made from raster-/vectorlayer
-</li><li>has:
-<ul><li>map of nodes
-<ul><li>node
-<ul><li>id
-</li><li>n:edges list
-</li></ul></li></ul></li><li>list of edges
-<ul><li>edge
-<ul><li>2:nodes
-</li><li>mapof'attribute=value's
-</li></ul></li></ul></li></ul></li></ul></li><li>agent
-<ul><li>e.g. a passenger or an ant
-</li><li>"lives" sort of in the world and on the playground
-</li><li>has:
-<ul><li>ttl
-</li><li>knowscompass
-</li><li>degreeoffreedom - (might be different from playground)
-</li><li>walk()
-</li></ul></li></ul></li><li>ant - agent
-<ul><li>is a:
-<ul><li>agent
-</li></ul></li><li>actor in an aco world
-</li><li>has:
-<ul><li>home position / position of origin / birthplace
-</li><li>list of its positions visited
-</li><li>pheromone intensity to use on certain circumstances
-</li><li>penalty value for its moving velocity
-</li><li>decisionbase for knowing how to find new positions
-</li><li>decisionbase for remembering visited positions
-</li></ul></li></ul></li></ul>

Deleted: grass-addons/grass7/raster/r.agent/libagent/playground.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/playground.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/playground.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,120 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-import rasterlayer
-import vectorlayer
-
-class Playground(object):
-    """..."""
-    def __init__(self):
-        self.layers = dict()
-        self.offset = [None,None]
-        self.limit = [None,None]
-        self.steps = []
-    def setbounds(self, north=None, south=None, east=None, west=None,
-                     rows=None, cols=None):
-        self.offset = [west,south]
-        self.limit = [east,north]
-        # here always try to set steps (see Layer)
-        if rows:
-            self.steps = [cols,rows]
-    def setboundsfromlayer(self, layername):
-        self.setbounds(*self.layers[layername].getbounds())
-    def getbounds(self):
-        if self.steps:
-            rows = self.steps[1]
-            cols = self.steps[0]
-        else:
-            rows = None
-            cols = None
-        return [self.limit[1], self.offset[1], self.limit[0],
-                self.offset[0], rows, cols]
-    def getrelativebounds(self):
-        b = self.getbounds()
-        b = [b[4]-1,0,b[5]-1,0,b[4],b[5]]
-        return b
-    def setlayeralias(self, layername, layer):
-        self.layers[layername] = layer
-    def removelayer(self, layername):
-        del self.layers[layername]
-    def getlayer(self, layername):
-        return self.layers[layername]
-    def setlayer(self, layername, layer, force=False):
-        self.layers[layername] = layer
-        if force and self.offset[0] != None:
-            self.layers[layername].forcebounds(*self.getbounds())
-    def setnewlayer(self, layername, typename, force=False):
-        if typename == "raster":
-            layer = rasterlayer.RasterLayer()
-        elif typename == "vector":
-            layer = vectorlayer.VectorLayer()
-#        elif typename == "graph":
-#            self.layers[layername] = layer.Layer()
-        else:
-            print "layertype not supported (yet)."
-        self.setlayer(layername, layer, force)
-    def setlayerfromfile(self, layername, typename, filename):
-        self.setnewlayer(layername, typename)
-        self.layers[layername].setinfilename(filename)
-        self.layers[layername].importfile()
-        if self.offset[0] != None:
-            self.layers[layername].forcebounds(*self.getbounds())
-    def forcelayerbounds(self):
-        if self.offset[0] != None:
-            for layer in self.layers.itervalues():
-                layer.forcebounds(*self.getbounds())
-
-def test(layer0type=None, layer0=None, layer1type=None, layer1=None):
-    """Test suite for Playground Class"""
-    def testhelper(north=None, south=None, east=None, west=None,
-                     rows=None, cols=None):
-        print " It has this boundaries: "
-        print "  south: " + str(south)
-        print "  west: " + str(west)
-        print "  north: " + str(north)
-        print "  east: " + str(east)
-        print "  rows: " + str(rows)
-        print "  cols: " + str(cols)
-    print "creating new Playground.."
-    pg = Playground()
-    print "start filling it up.."
-    if layer0:
-        pg.setlayerfromfile("l0", layer0type, layer0)
-    else:
-        pg.setbounds(20, 0, 20, 0, 20, 20)
-        pg.setnewlayer("l0", "raster", True)
-        layer0type="raster"
-    print "Layer: "+"l0"+" ("+layer0type+")"
-    testhelper(*pg.layers["l0"].getbounds())
-    if layer1:
-        pg.setlayerfromfile("l1", layer1type, layer1)
-    else:
-        pg.setnewlayer("l1", "vector", True)
-        layer1type="vector"
-    print "Layer: "+"l1"+" ("+layer1type+")"
-    testhelper(*pg.layers["l1"].getbounds())
-    print "Setting global boundaries from layer l0"
-    pg.setboundsfromlayer("l0")
-    testhelper(*pg.getbounds())
-    print "adding new name/alias for l0"
-    pg.setlayeralias("newname", pg.getlayer("l0"))
-    print " " + str(pg.layers.keys())
-    testhelper(*pg.layers["newname"].getbounds())
-    print "remove new name"
-    pg.removelayer("newname")
-    print str(pg.layers.keys())
-    print "force global boundaries on layers"
-    pg.forcelayerbounds()
-    print " l1"
-    testhelper(*pg.layers["l1"].getbounds())
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/rasterlayer.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/rasterlayer.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/rasterlayer.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,254 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-import layer
-import error
-
-class RasterLayer(layer.Layer):
-    """..."""
-    def __init__(self):
-        layer.Layer.__init__(self)
-        self.bkeys = ["north", "south", "east", "west", "rows", "cols"]
-        self.steps = [None,None]
-        self.resolution = [None,None]
-        self.raster = []
-        self.gisempty = "*"
-        self.emptyvalue = -1
-    def clearlayer(self):
-        layer.Layer.clearlayer(self)
-        self.raster = []
-    def xyflipmatrix(self, matrix):
-        newmatrix = []
-        for i in range(len(matrix[0])):
-            newrow = []
-            for j in range(len(matrix)):
-                newrow.append(matrix[j][i])
-            newmatrix.append(newrow)
-        return newmatrix
-    def xflipmatrix(self, matrix):
-        raster = []
-        for i in range(len(matrix)-1, -1, -1):
-            raster.append(matrix[i])
-        return raster
-    def shiftbound(self, direction, delta):
-        if delta < 0:
-            if direction == "east":
-                for i in range(delta, 0):
-                    del self.raster[-1]
-            elif direction == "west":
-                for i in range(delta, 0):
-                    self.raster.insert(0,
-                        [0 for i in range(len(self.raster[0]))])
-            elif direction == "north":
-                for i in range(delta, 0):
-                    for j in range(len(self.raster)):
-                        del self.raster[j][-1]
-            elif direction == "south":
-                for i in range(delta, 0):
-                    for j in range(len(self.raster)):
-                        self.raster[j].insert(0, 0)
-        if delta > 0:
-            if direction == "east":
-                for i in range(delta):
-                    self.raster.append([0 for i in range(len(self.raster[0]))])
-            elif direction == "west":
-                for i in range(delta):
-                    del self.raster[0]
-            elif direction == "north":
-                for i in range(delta):
-                    for j in range(len(self.raster)):
-                        self.raster[j].append(0)
-            elif direction == "south":
-                for i in range(delta):
-                    for j in range(len(self.raster)):
-                        del self.raster[j][0]
-    def testresolution(self, north, south, east, west, rows, cols):
-        if rows > 0 < cols:
-            xres = ( east - west ) / cols
-            yres = ( north - south ) / rows
-            if self.resolution[0] == xres and self.resolution[1] == yres:
-                return True
-        return False
-    def forcebounds(self, north, south, east, west, rows, cols):
-        if self.steps[0] == None and self.raster == []:
-            self.setbounds(north, south, east, west, rows, cols)
-            for i in range(cols):
-                self.raster.append([0 for j in range(rows)])
-        elif not self.testresolution(north, south, east, west, rows, cols):
-            raise error.DataError("raster.forcebounds", "wrong resolution")
-        else:
-            layer.Layer.forcebounds(self, north, south, east, west, rows, cols)
-    def parsefile(self, fileh):
-        self.clearlayer()
-        bounds = []
-        for key in self.bkeys:
-            keylength = len(key)
-            line = fileh.readline()
-            if line[0:keylength] in key:
-                bounds.append(int(line[keylength+2:-1]))
-            else:
-                raise error.InputError(self.infilename, "no valid raster")
-        self.setbounds(*bounds)
-        raster = []
-        for line in fileh:
-            rasterline = []
-            for word in line.split(" "):
-                if word.find(".") > 0:
-                    rasterline.append(float(word))
-                elif word.isdigit():
-                    rasterline.append(int(word))
-                elif word in '\r' '\n' '\r\n':
-                    pass
-                else:
-                    rasterline.append(self.emptyvalue)
-            raster.append(rasterline[:])
-        if not (len(raster) == self.steps[1] and
-                        len(raster[0]) == self.steps[0]):
-            raise error.InputError(self.infilename, "wrong # rows/cols")
-        self.raster = self.xyflipmatrix(self.xflipmatrix(raster))
-    def createfile(self, fileh):
-        if self.limit[0]:
-            raster = self.xflipmatrix(self.xyflipmatrix(self.raster))
-            bounds = self.getbounds()
-            bounds.reverse()
-            for key in self.bkeys:
-                line = key + ": " + str(bounds.pop()) + "\n"
-                fileh.writelines(line)
-            for line in raster:
-                for word in line:
-                    if word == self.emptyvalue:
-                        fileh.write(self.gisempty + " ")
-                    else:
-                        fileh.write(str(word) + " ")
-                fileh.write("\n")
-
-def test(infile, export=True, remove=True):
-    """Test suite for RasterLayer Class"""
-    outfile = "out-" + infile
-    import os
-    if os.path.isfile(infile) and not os.path.isfile(outfile):
-        print "create raster layer"
-        r = RasterLayer()
-        r.setinfilename(infile)
-        r.setoutfilename(outfile)
-        print "importing file.."
-        r.importfile()
-        print "file says:"
-        print " r:", str(r.steps[0])+"; c:", str(r.steps[1])
-        print "matrix:"
-        print " x:", str(len(r.raster))+"; y:", str(len(r.raster[0]))
-        if export == True:
-            r.exportfile()
-            import filecmp
-            if filecmp.cmp(infile, outfile):
-                print "import/export seem ok"
-            else:
-                print "import/export failed"
-            if remove == True:
-                os.remove(outfile)
-        print "properties are still:"
-        print " r:", str(r.steps[0])+"; c:", str(r.steps[1])
-        print "flipping raster on x:"
-        b = r.xflipmatrix(r.raster)               
-        print " x:", str(len(b))+"; y:", str(len(b[0]))
-        print "flipping raster on x/y:"
-        b = r.xyflipmatrix(r.raster)
-        print " x:", str(len(b))+"; y:", str(len(b[0]))
-        print "a little resolution test first (to be True):", \
-                str(r.testresolution(*r.getbounds()))
-        print "now force bounds on raster: "
-        print " the same as now"
-        r.forcebounds(*r.getbounds())
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                    str(r.steps)
-        print "  at position [0,0] we have now:", str(r.raster[0][0])
-        print " setting new values now: 100,0,100,0,1,1"
-        r.clearlayer()
-        r.forcebounds(100,0,100,0,1,1)
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                    str(r.steps)
-        print "  testing wheter they are set now (True):", \
-                str(r.testresolution(100,0,100,0,1,1))
-        print "  at position [0,0] we have now: ", str(r.raster[0][0])
-        print " momentary raster:"
-        print str(r.raster)
-        print " now reforcing these (correct) values: 200,100,200,100,1,1"
-        r.forcebounds(200,100,200,100,1,1)
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                    str(r.steps)
-        print " momentary raster:"
-        print str(r.raster)
-        print " now some wrong values, should throw Error.."
-        try:
-            r.forcebounds(0,0,1,1,1,10000)
-        except error.DataError:
-            print "expected Error received.."
-        print " momentary raster:"
-        print str(r.raster)
-        print " changeing value r[0][0] to 1"
-        r.raster[0][0] = 1
-        print " momentary raster:"
-        print str(r.raster)
-        print "adding some space in the north"
-        print " setting new values now: 400,100,200,100,3,1"
-        r.forcebounds(400,100,200,100,3,1)
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
-        print " momentary raster:"
-        print str(r.raster)
-        print "removing some space in the north"
-        print " setting new values now: 300,100,200,100,2,1"
-        r.forcebounds(300,100,200,100,2,1)
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
-        print " momentary raster:"
-        print str(r.raster)
-        print "adding some space in the east"
-        r.forcebounds(300,100,400,100,2,3)
-        print " momentary raster:"
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
-        print str(r.raster)
-        print "removing some space in the east"
-        r.forcebounds(300,100,300,100,2,2)
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
-        print " momentary raster:"
-        print str(r.raster)
-        print "adding some space in the south"
-        r.forcebounds(300,0,300,100,3,2)
-        print " momentary raster:"
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
-        print str(r.raster)
-        print "removing some space in the south"
-        r.forcebounds(300,100,300,100,2,2)
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
-        print " momentary raster:"
-        print str(r.raster)
-        print "adding some space in the west"
-        r.forcebounds(300,100,300,0,2,3)
-        print " momentary raster:"
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
-        print str(r.raster)
-        print "removing some space in the west"
-        r.forcebounds(300,100,300,100,2,2)
-        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
-                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
-        print " momentary raster:"
-        print str(r.raster)
-    else:
-        print "Failed: no", infile, "or", outfile, "exists."
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/vectorlayer.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/vectorlayer.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/vectorlayer.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,161 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-import layer
-import error
-
-class VectorLayer(layer.Layer):
-    """..."""
-    def __init__(self):
-        layer.Layer.__init__(self)
-        self.objects = []
-        self.gissplit = "|"
-    def clearlayer(self):
-        layer.Layer.clearlayer(self)
-        self.objects = []
-    def shiftbound(self, direction, delta):
-# TODO off by one?
-        for obj in self.objects[:]:
-            if direction == "north":
-                if obj[1] > self.limit[1]+delta:
-                    self.objects.remove(obj)
-            elif direction == "east":
-                if obj[0] > self.limit[0]+delta:
-                    self.objects.remove(obj)
-            elif direction == "south":
-                if obj[1] < self.offset[1]+delta:
-                    self.objects.remove(obj)
-                else:
-                    obj[1] = obj[1]-delta
-            elif direction == "west":
-                if obj[0] < self.offset[0]+delta:
-                    self.objects.remove(obj)
-                else:
-                    obj[0] = obj[0]-delta
-    def reclassify(self, oldres, newres):
-# TODO if nothing changes..?
-# TODO goes to world??
-        dx = (newres[0] + 0.0) / oldres[0]
-        dy = (newres[1] + 0.0) / oldres[1]
-        for obj in self.objects:
-            obj[0] = int(round(obj[0] / dx))
-            obj[1] = int(round(obj[1] / dy))
-    def forcebounds(self, north, south, east, west, norows=None, nocols=None):
-        if self.offset[0] == None or self.offset[0] == self.limit[0]:
-            self.setbounds(north, south, east, west)
-        else:
-            layer.Layer.forcebounds(self, north, south, east, west)
-            if norows != None:
-                newres = [((east-west)/nocols),((north-south)/norows)]
-                self.reclassify(self.resolution, newres)
-                self.resolution = newres
-    def parsefile(self, fileh):
-        self.clearlayer()
-        vectorlist = []
-        self.offset = [0,0]
-        self.limit = [0,0]
-        for line in fileh:
-            if line[-1] in '\r' '\n' '\r\n':
-                line = line[:-1]
-            line = line.split(self.gissplit)
-            avector = []
-            for e in line:
-                avector.append(int(e))
-            vectorlist.append(avector)
-            if avector[0] > int(self.limit[0]):
-                self.limit[0] = avector[0]
-            if avector[1] > int(self.limit[1]):
-                self.limit[1] = avector[1]
-        self.objects = vectorlist
-    def createfile(self, fileh):
-        if self.limit[0] != None:
-            for obj in self.objects:
-                text = ""
-                for element in obj:
-                    if text:
-                        text = text + self.gissplit + str(element)
-                    else:
-                        text = str(element)
-                fileh.write(text + "\n")
-
-def test(infile, export=True, remove=True):
-    """Test suite for VectorLayer Class"""
-    outfile = "out-" + infile
-    import os
-    if os.path.isfile(infile) and not os.path.isfile(outfile):
-        print "create vector layer"
-        v = VectorLayer()
-        v.setinfilename(infile)
-        v.setoutfilename(outfile)
-        print "importing file"
-        v.importfile()
-        print "entries # " + str(len(v.objects))
-        for o in v.objects:
-            print " obj is: x=" + str(o[0]) + " y=" + str(o[1]) + \
-                " cat=" + str(o[2])
-        print "all between:"
-        print " south: " + str(v.offset[1])
-        print " west: " + str(v.offset[0])
-        print " north: " + str(v.limit[1])
-        print " east: " + str(v.limit[0])
-        if export == True:
-            v.exportfile()
-            import filecmp
-            if filecmp.cmp(infile, outfile):
-                print "import/export seem ok"
-            else:
-                print "import/export failed"
-            if remove == True:
-                os.remove(outfile)
-
-        print "creating new example:"
-        print " clear all"
-        v.clearlayer()
-        print " set new values"        
-        print "  setting new boundaries: n9, s0, e9, w0"
-        v.forcebounds( 9, 0, 9, 0 )
-        print "  setting new vectors: 0:5, 5:0, 9:5, 5:9, 5:5"
-        v.objects.append([0, 5, 0])
-        v.objects.append([5, 0, 1])
-        v.objects.append([9, 5, 2])
-        v.objects.append([5, 9, 3])
-        v.objects.append([5, 5, 4])
-        print " set:"
-        print "  south: " + str(v.offset[1])
-        print "  west: " + str(v.offset[0])
-        print "  north: " + str(v.limit[1])
-        print "  east: " + str(v.limit[0])
-        print " entries # " + str(len(v.objects))
-        for o in v.objects:
-            print "  obj is: x=" + str(o[0]) + " y=" + str(o[1]) + " cat=" + \
-                str(o[2])
-        print " set new values"
-        print "  setting new boundaries: n6, s4, e6, w4"
-        v.forcebounds( 6, 4, 6, 4 )
-        print " set:"
-        print "  south: " + str(v.offset[1])
-        print "  west: " + str(v.offset[0])
-        print "  north: " + str(v.limit[1])
-        print "  east: " + str(v.limit[0])
-        print " remaining entries # " + str(len(v.objects))
-        for o in v.objects:             
-            print "  obj is: x=" + str(o[0]) + " y=" + str(o[1]) + " cat=" + \
-                str(o[2])
-        print " again with the old boundaries: n9, s0, e9, w0"
-        v.forcebounds( 9, 0, 9, 0 )
-        for o in v.objects:
-            print "  obj is: x=" + str(o[0]) + " y=" + str(o[1]) + " cat=" + \
-                str(o[2])
-    else:
-        print "Error: no " + infile + " or " + outfile + " exists."
-

Deleted: grass-addons/grass7/raster/r.agent/libagent/world.py
===================================================================
--- grass-addons/grass7/raster/r.agent/libagent/world.py	2011-11-13 15:47:34 UTC (rev 49193)
+++ grass-addons/grass7/raster/r.agent/libagent/world.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -1,128 +0,0 @@
-############################################################################
-#
-# MODULE:       r.agent.*
-# AUTHOR(S):    michael lustenberger inofix.ch
-# PURPOSE:      library file for the r.agent.* suite
-# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
-#
-#               This program is free software under the GNU General Public
-#               License (>=v2). Read the file COPYING that comes with GRASS
-#               for details.
-#
-#############################################################################
-
-import error
-import agent
-import playground
-
-class World(object):
-    """meta class"""
-    def __init__(self, agenttype=None, pg=None):
-        if pg == None:
-            self.playground = playground.Playground()
-        else:
-            self.playground = pg
-        self.agentclass = agent.Agent
-        if agenttype == None:
-            self.agenttype = self.agentclass
-        else:
-            self.setagenttype(agenttype)
-        self.agents = []
-        self.artefacts = []
-    def importlayer(self, name, typename=None, filename=None):
-        if typename != None:
-            self.playground.setlayerfromfile(name, typename, filename)
-        elif filename != None:
-            self.playground.getlayer(name).setinfilename(filename)
-            self.playground.getlayer(name).importfile()
-        else:
-            self.playground.getlayer(name).importfile()
-        return self.playground.getlayer(name)
-    def createlayer(self, name, typename, infile=None, outfile=None):
-        self.playground.setnewlayer(name, typename, False)
-        if infile:
-            self.playground.getlayer(name).setinfilename(infile)
-        if outfile:
-            self.playground.getlayer(name).setoutfilename(outfile)
-        return self.playground.getlayer(name)
-    def exportlayer(self, name, typename=None, filename=None):
-        if filename == None:
-            self.playground.getlayer(name).exportfile()
-        elif typename == None:
-            self.playground.getlayer(name).setoutfilename(filename)
-        else:
-            if not self.playground.getlayer(name):
-                self.playground.setnewlayer(name, typename)
-            self.playground.getlayer(name).setoutfilename(filename)
-            self.playground.getlayer(name).exportfile()
-    def setagenttype(self, agenttype):
-        if issubclass(agenttype, self.agentclass):
-            self.agenttype = agenttype
-    def getagenttype(self):
-        return self.agenttype
-    def bear(self, agenttype=None, timetolife=0, position=[]):
-        if agenttype == None:
-            agenttype = self.agenttype
-        if issubclass(agenttype, self.agentclass):
-            self.agents.append(agenttype(timetolife, self, position))
-    def moveto(self, agent, position):
-        pass
-    def move(self, agent, nrofsteps, direction="random"):
-        pass
-#        print "moving " + self.agent + self.nrofsteps + \
-#            " steps towards " + self.direction
-#    def letwalk(self, agent, nrofsteps=1, direction="random"):
-#        position = agent.getposition()
-#        npositions = self.playground.getneighbourpositions("costs", position)
-        #agent.move()
-    def kill(self, agent):
-        self.agents.remove(agent)
-#    def build(self, artefact):
-#        self.artefacts.add(artefact)
-#    def place(self, artefact, position):
-#        pass
-#    def destroy(self, artefact):
-#        self.artefacts.remove(artefact)
-
-def test(inraster=None, outraster=None, invector=None):
-    """Test suite for World Class"""
-    print "creating world"
-    w = World()
-    print "playing with agents"
-    print " nothing changed.."
-    print "  Agenttype is:", w.getagenttype()
-    print " illegaly overwriting agent.."
-    w.agenttype = ""
-    print "  Agenttype is:", w.getagenttype()
-    print " set new agenttype.."
-    w.setagenttype(agent.Agent)
-    print "  Agenttype is:", w.getagenttype()
-    print "giving birth to some agents"
-    w.bear()
-    w.bear(agent.Agent)
-    print " Agentlist:", w.agents
-    print "killing an agent"
-    w.kill(w.agents[0])
-    print " Agentlist:", w.agents
-#??    w.build()..
-#??    w.moveto()..
-#??    w.move()..
-#??    w.place()..
-#??    w.letwalk()..
-#??    w.destroy()..
-    print "adding layers?"
-    if inraster:
-        print "  adding raster"
-        w.importlayer("raster", "raster", inraster)
-        print "  re-adding again in diffrent way"
-        w.createlayer("raster", "raster", inraster, inraster)
-        w.importlayer("raster")
-        print "  is set."
-        if outraster:
-            w.exportlayer("raster", "raster", outraster)
-            print "  exported to:", str(outraster), "- check and remove.."
-        if invector:
-            print "  adding vectors"
-            w.importlayer("vector", "vector", invector)
-            print "  is set."
-

Copied: grass-addons/grass7/raster/r.agent/libold/__init__.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/__init__.py)
===================================================================
Copied: grass-addons/grass7/raster/r.agent/libold/aco.py (from rev 49187, grass-addons/grass7/raster/r.agent/libagent/aco.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/aco.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/aco.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,228 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by  Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+from math import sqrt
+from math import exp
+from random import randint
+import world
+import error
+import ant
+
+class ACO(world.World):
+    """Ant Colony Optimization Algorithm for Modelling an Agent Based World"""
+    def __init__(self):
+        world.World.__init__(self, ant.Ant)
+        ### auto/constant
+        self.agentclass = ant.Ant
+        self.ants = self.agents
+        self.artefacts.append([])
+        self.holes = self.artefacts[0]
+        self.artefacts.append([])
+        self.sugar = self.artefacts[1]
+        self.surfaceslope = None
+        self.costsurface = None
+        self.pherovapour = None
+        self.bounds = None
+        self.straight = 0
+        self.diagonal = sqrt(2)-1
+        # count paths
+        self.nrop = 0
+        ### user parameter
+        self.globalfreedom = 8
+        self.rounds = 0
+        self.outrounds = 0
+        self.outfilename = ""
+        self.maxpheromone = 2147483647
+        self.minpheromone = 10
+#        self.maxpenalty = 999
+        self.volatilizationtime = 1
+        self.stepintensity = 10
+        self.pathintensity = 10000
+        self.decisionbase = "standard"
+        self.pheroweight = 1
+        self.randomweight = 1
+        self.validposition = "specials"
+# use fibonacci?
+        self.maxants = 100
+        self.antslife = 0
+    def checkvalues(self):
+        if self.costsurface == None:
+            raise error.DataError("aco.ACO.checkvalues()",
+                    "main input missing: costraster")
+        self.playground.setboundsfromlayer("costs")
+        self.playground.forcelayerbounds()
+        self.bounds = self.playground.getrelativebounds()
+        if self.costsurface == None:
+            raise error.DataError("aco.ACO.checkvalues()",
+                    "input layer missing: costsurface")
+        elif self.costsurface == []:
+            if self.surfaceslope == None:
+                raise error.DataError("aco.ACO.checkvalues()",
+                    "input layer missing: please provide cost or slope layer")
+            else:
+                self.calccostsurface()
+        if self.pherovapour == None:
+            raise error.DataError("aco.ACO.checkvalues()",
+                    "output layer missing: pheromoneraster")
+        if self.holes == None:
+            raise error.DataError("aco.ACO.checkvalues()",
+                    "input layer missing: vectorholes")
+        if self.rounds <= 0:
+            raise error.DataError("aco.ACO.checkvalues()",
+                    "number of rounds is zero or not set.")
+        if self.outrounds <= 0:
+            self.outrounds = self.rounds
+        if self.antslife == 0:
+            self.antslife = (self.bounds[4]+self.bounds[5])
+        if self.volatilizationtime > self.rounds:
+            self.volatilizationtime = self.rounds
+        elif self.volatilizationtime < 0:
+            self.volatilizationtime = 0
+        for hole in self.holes[:]:
+            if self.costsurface[hole[0]][hole[1]] < 0:
+                self.holes.remove(hole)
+            else:
+# TODO if two holes are close, choose outermost.. or so.
+                self.pherovapour[hole[0]][hole[1]] = -1
+    def addneighbour(self, positions, position):
+        position[2] = self.costsurface[position[0]][position[1]]
+# TODO > or >=
+#        if position[2] > self.maxpenalty:
+#            return
+        if position[2] >= 0:
+            position[3] = self.pherovapour[position[0]][position[1]]
+            positions.append(position)
+    def calccostsurface(self):
+        for x in range(self.bounds[2]):
+            for y in range(self.bounds[0]):
+                val = self.surfaceslope[x][y]
+                if self.surfaceslope > 0:
+                    self.costsurface[x][y] = (1/exp(-0.035*abs(val+5)))-1
+    def getneighbourpositions(self, position, freedom=None):
+        # position = [ x, y, surfacecost, special/phero, timecost, direction ]
+        if freedom == None:
+            freedom = self.globalfreedom
+        positions = []
+        if freedom >= 4:
+            #north = 1
+#TODO improve with not creating position in any case..
+            p = [position[0], position[1]+1, 0, 0, self.straight, 1]
+            if p[1] <= self.bounds[0]:
+                self.addneighbour(positions, p)
+            #south = 2
+            p = [position[0], position[1]-1, 0, 0, self.straight, 2]
+            if p[1] >= self.bounds[1]:
+                self.addneighbour(positions, p)
+            #east = 3
+            p = [position[0]+1, position[1], 0, 0, self.straight, 3]
+            if p[0] <= self.bounds[2]:
+                self.addneighbour(positions, p)
+            #west = 4
+            p = [position[0]-1, position[1], 0, 0, self.straight, 4]
+            if p[0] >= self.bounds[3]:
+                self.addneighbour(positions, p)
+        if freedom >= 8:
+            #northeast = 5
+            p = [position[0]+1, position[1]+1, 0, 0, self.diagonal, 5]
+            if p[1] <= self.bounds[0] and p[0] <= self.bounds[2]:
+                self.addneighbour(positions, p)
+            #northwest = 6
+            p = [position[0]-1, position[1]+1, 0, 0, self.diagonal, 6]
+            if p[1] <= self.bounds[0] and p[0] >= self.bounds[3]:
+                self.addneighbour(positions, p)
+            #southeast = 7
+            p = [position[0]+1, position[1]-1, 0, 0, self.diagonal, 7]
+            if p[1] >= self.bounds[1] and p[0] <= self.bounds[2]:
+                self.addneighbour(positions, p)
+            #southwest = 8
+            p = [position[0]-1, position[1]-1, 0, 0, self.diagonal, 8]
+            if p[1] >= self.bounds[1] and p[0] >= self.bounds[3]:
+                self.addneighbour(positions, p)
+        return positions
+    def letantsdance(self):
+        if 0 < self.outrounds < self.rounds:
+            mainloops = self.rounds/self.outrounds
+            loops = self.outrounds
+        else:
+            mainloops = 1
+            loops = self.rounds
+        nrofrounds = mainloops*loops
+        remember = loops
+        while mainloops > 0:
+            loops = remember
+            while loops > 0:
+                if len(self.ants) < self.maxants:
+                    position = self.holes[randint(0, len(self.holes)-1)][0:2]
+                    self.bear(None, self.antslife, position)
+                for ant in self.ants:
+                    ant.walk()
+                self.volatilize()
+                loops -= 1
+            self.export(str(mainloops))
+            print "nrofpaths:", self.nrop
+            mainloops -= 1
+        print "nrofrounds", nrofrounds
+    def volatilize(self):
+        if self.volatilizationtime > 0:
+            limit = self.minpheromone
+            halflife = self.volatilizationtime
+            for x in range(self.bounds[2]):
+                for y in range(self.bounds[0]):
+                    if self.pherovapour[x][y] > limit:
+                        val = int(self.pherovapour[x][y]*0.5**(1.0/halflife))
+                        if val > limit:
+                            self.pherovapour[x][y] = val
+    def export(self, suffix=""):
+        layer = self.playground.getlayer("phero")
+        if self.outfilename == "":
+            self.outfilename = layer.outfilename
+        layer.setoutfilename(self.outfilename+suffix)
+        layer.exportfile()
+
+def test(inraster=False, outraster=False, invector=False, slope=False):
+    """Test suite for ACO Class"""
+    print "creating a new ants world.."
+    w = ACO()
+    if inraster:
+        layer = w.importlayer("costs", "raster", inraster)
+        w.costsurface = layer.raster
+    elif slope:
+        layer = w.importlayer("slope", "raster", slope)
+        w.surfaceslope = layer.raster
+        w.playground.setboundsfromlayer("slope")
+        layer = w.createlayer("costs", "raster", None, None)
+        w.costsurface = layer.raster
+        w.calccostsurface()
+    print "start playing with it.."
+    if outraster and invector:
+        layer = w.createlayer("phero", "raster", None, outraster)
+        w.pherovapour = layer.raster
+        layer = w.importlayer("holes", "vector", invector)
+        w.holes = layer.objects
+        w.rounds = 1
+        w.checkvalues()
+        print "set, within:", w.playground.getbounds()
+        print "this translates to:", w.bounds
+        print " this are the holes:"
+        for hole in w.holes:
+            print str(hole)
+        print "neighbourpositions of [9,9]:", w.getneighbourpositions([9,9])
+        print "setting [9,9] to pheromone 999"
+        w.pherovapour[9][9] = 999
+        w.volatilize()
+        print " after some volatilization:",w.pherovapour[9][9]
+        print "playing with some ants"
+        w.letantsdance()
+        print "rock n' roll"
+        w.export()
+

Copied: grass-addons/grass7/raster/r.agent/libold/agent.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/agent.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/agent.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/agent.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,63 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+import world
+
+class Agent(object):
+    """standard agent"""
+    def __init__(self, timetolive, world, position=[]):
+        self.ttl = timetolive
+        self.world = world
+        self.position = position
+        self.knowscompass = False
+        self.freedom = 0
+    def setposition(self, position):
+        if position and position != []:
+            self.position[0] = position[0]
+            self.position[1] = position[1]
+    def getposition(self):
+        return self.position
+    def move(self, nrofsteps, direction):
+        pass
+    def age(self):
+        if self.ttl > 0:
+            self.ttl -= 1
+            return True
+        else:
+            self.snuffit()
+            return False
+    def snuffit(self):
+        """to die peacefully and without pain."""
+        self.world.kill(self)
+
+def test():
+    """Test suite for Agent Class"""
+    print "create a world with an agent in."
+    w = world.World(Agent)
+    w.bear(Agent,1,[0,0])
+    print "agent seems fine (for now). time to live:", str(w.agents[0].ttl)
+    print "fake-placing it somewhere ([0,1]).."
+    w.agents[0].setposition([0,1])
+    print "getting its position:", w.agents[0].getposition()
+    print "'cause this takes some time.."
+    w.agents[0].age()
+    print "agent should have grown older by now. time to live:", \
+         str(w.agents[0].ttl)
+    print "and now let agent die.."
+    w.agents[0].age()
+    try:
+        print "should be dead by now. time to live:", str(w.agents[0].ttl)
+    except IndexError:
+        print "IndexError catched: ant was not found in the world anymore."
+    print "all done."
+

Copied: grass-addons/grass7/raster/r.agent/libold/alltests.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/alltests.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/alltests.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/alltests.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      very basic test collection for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+import sys
+
+import error
+import agent
+import ant
+import layer
+import rasterlayer
+import vectorlayer
+import world
+import aco
+import playground
+
+def dotest(function, argv):
+    while True:
+        n = function.func_doc
+        o = str(argv)
+        if not n:
+            n = str(function)
+        t = str(raw_input("execute this now: '"+n+" - "+o+"'? [y/n/abort] "))
+        if t == "y":
+            if argv != None:
+                function(*argv)
+            else:
+                function()
+            break
+        elif t == "n":
+            break
+        elif t == "abort":
+            exit()
+
+files = ["elev.grid", "elev.grid.out", "arch.vect"]
+
+alltests = [[error.test, None],
+            [agent.test, None],
+            [ant.test, None],
+            [layer.test, [files[2]]],
+            [layer.test, [files[0]]],
+            [rasterlayer.test, [files[0]]],
+            [vectorlayer.test, [files[2]]],
+            [world.test, None],
+            [world.test, files],
+            [aco.test, files],
+            [playground.test, ["raster", files[0], "vector", files[2]]]]
+
+for test in alltests:
+    dotest(test[0], test[1])
+

Copied: grass-addons/grass7/raster/r.agent/libold/ant.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/ant.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/ant.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/ant.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,335 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+from random import choice, randint
+import agent
+import error
+
+class Ant(agent.Agent):
+    """custom"""
+    def __init__(self, timetolive, world, position):
+        agent.Agent.__init__(self, timetolive, world, position)
+        self.position.extend([None,None,0,0])
+        self.home = self.position[:]
+        self.laststeps = [self.position[:]]
+        self.visitedsteps = []
+        self.done = False
+        self.nextstep = [None,None,0,0,0,0]
+        self.goal = []
+        self.penalty = 0.0
+        self.steppaint = world.stepintensity
+        self.pathpaint = world.pathintensity
+        if world.decisionbase == "standard":
+            self.pickaposition = self.smellposition
+            self.pheroweight = self.world.pheroweight * 2
+            self.randomweight = self.world.randomweight * 2
+        elif world.decisionbase == "random":
+            self.pickaposition = self.randomposition
+        elif world.decisionbase == "test":
+            self.pickaposition = self.testposition
+            self.pheroweight = self.world.pheroweight * 2
+            self.randomweight = self.world.randomweight * 2
+        if world.validposition == "avoidloop":
+            self.haspositions = self.avoidloop
+        elif world.validposition == "forgetloop":
+            self.haspositions = self.forgetloop
+        elif world.validposition == "avoidorforgetloop":
+            self.haspositions = self.avoidorforgetloop
+        elif world.validposition == "specials":
+            self.haspositions = self.searchspecials
+    def paint(self, position, value):
+#TODO mv to tests:
+        if self.world.pherovapour[position[0]][position[1]] < 0:
+            print "home:", self.home, "paint:", position, ":", value
+            raise error.Error("Ant.paint()", "Not painting over specials.")
+        if self.world.maxpheromone-value > \
+         self.world.pherovapour[position[0]][position[1]]:
+            self.world.pherovapour[position[0]][position[1]] += value
+    def randomposition(self, positions):
+        self.nextstep = positions[randint(0, len(positions)-1)]
+    def testposition(self, positions):
+        i = 0
+        l = []
+        for pos in positions:
+            l.append([pos[3]/self.randomweight+randint(0,\
+                self.world.maxpheromone)/self.pheroweight, i])
+            i += 1
+        l.sort()
+        self.nextstep = positions[l[0][1]]
+#TODO add some position search alg that avoids high penalties..
+    def smellposition(self, positions):
+        self.nextstep = positions[0]
+        self.nextstep[3] = self.nextstep[3]/self.randomweight+ \
+                    randint(0,self.world.maxpheromone)/self.pheroweight
+        for pos in positions[1:]:
+            pos[3] = pos[3]/self.randomweight+ \
+                    randint(0,self.world.maxpheromone)/self.pheroweight
+            if self.nextstep[3] < pos[3]:
+                self.nextstep = pos
+    def avoidloop(self, positions):
+        ''' This method tries to avoid stepping on already passed
+            nodes. That it is basically. '''
+        # remember all positions for worst case..
+        temppositions = positions[:]
+        for last in self.laststeps[:]:
+            for pos in positions[:]:
+                if last[0] == pos[0] and last[1] == pos[1]:
+                    # position already visited once..
+                    try:
+                        positions.remove(pos)
+                    except ValueError:
+                        pass
+        if len(positions) == 0:
+            # can not be special value, because it would already be visited
+            # make sure it is not home
+            pos = choice(temppositions)
+            if pos[0] == self.home[0] and pos[1] == self.home[1]:
+                temppositions.remove(pos)
+                pos = choice(temppositions)
+            # if none was left: choose another one by chance
+            # no need to proceed with choosing from only one position
+            self.nextstep = pos
+            return True
+        else:
+            for pos in positions[:]:
+                if pos[3] < 0:
+                    # home is already handled because visited
+                    # goal node found. add one to the counter
+                    self.world.nrop += 1
+                    self.done = True
+                    # now, head back home..
+                    self.nextstep = self.laststeps.pop()
+                    return True
+        return False       
+    def avoidorforgetloop(self, positions):
+        ''' This method tries to avoid stepping on already passed
+            nodes. If this is not possible or if a path is coming
+            close to such nodes in the grid, it will grant not to
+            produce loops by deleting all intermediate steps.'''
+        # remember all positions for worst case..
+        temppositions = positions[:]
+        # initially start with no loop found
+        hasposition = False
+        # search for loops, but exclude last step from process (keep it)
+        for last in self.laststeps[:]:
+            if hasposition == True:
+                # remove loop, but remember visited steps
+                self.visitedsteps.append(last)
+                self.laststeps.remove(last)
+            else:
+                # search for loop in positions
+                for pos in positions[:]:
+                    if last[0] == pos[0] and last[1] == pos[1]:
+                        # shortcut found, so remove loop
+                        hasposition = True
+                        # remove that position from possible next ones
+                        positions.remove(pos)
+                        # change direction penalty to new shortcut
+                        self.laststeps[-1][4] = pos[4]
+        # remove all yet visited nodes from possible next positions
+        for visited in self.visitedsteps:
+            for pos in positions[:]:
+                if visited[0] == pos[0] and visited[1] == pos[1]:
+                    # do not step on visited nodes again
+                    positions.remove(pos)
+        if len(positions) == 0:
+            # can not be special value, because it would already be visited
+            # make sure it is not home
+            pos = choice(temppositions)
+            if pos[0] == self.home[0] and pos[1] == self.home[1]:
+                temppositions.remove(pos)
+                pos = choice(temppositions)
+            # if none was left: choose another one by chance
+            # no need to proceed with choosing from only one position
+            self.nextstep = pos
+            return True
+        else:
+            for pos in positions[:]:
+                if pos[3] < 0:
+                    # home is already handled because visited
+                    # goal node found. add one to the counter
+                    self.world.nrop += 1
+                    self.done = True
+                    # now, head back home..
+                    self.nextstep = self.laststeps.pop()
+                    return True
+        return False
+    def forgetloop(self, positions):
+        ''' This method deletes all positions that form a loop in the
+            path. It also prohibits to walk back one step both to the
+            true former position, and to the assumed last step on the
+            newly created shortcut.'''
+        # initially start with no loop found
+        hasposition = False
+        # search for loops, but exclude last step from process (keep it)
+        for last in self.laststeps[:-1]:
+            if hasposition == True:
+                # remove loop
+                self.laststeps.remove(last)
+            else:
+                # search for loop in positions
+                for pos in positions[:]:
+                    if last[0] == pos[0] and last[1] == pos[1]:
+                        # shortcut found, so remove loop
+                        hasposition = True
+                        # remove that position from possible next ones
+                        positions.remove(pos)
+                        # change direction penalty for laststep to new shortcut
+                        self.laststeps[-1][4] = pos[4]
+        for pos in positions[:]:
+            if pos[3] < 0:
+                # promissing, but home is not excluded (only loops are..)
+                if pos[0] == self.home[0] and pos[1] == self.home[1]:
+                    # so, make sure it is not home..
+                    positions.remove(pos)
+                else:
+                    # goal node found. add one to the counter
+                    self.world.nrop += 1
+                    self.done = True
+                    # now, head back home..
+                    self.nextstep = self.laststeps.pop()
+                    return True
+        return False
+    def searchspecials(self, positions):
+        for pos in positions[:]:
+            if pos[3] < 0:
+                # nice value found, goal might be reached
+                if pos[0] == self.home[0] and pos[1] == self.home[1]:
+                    # make sure it is not home..
+                    positions.remove(pos)
+                else:
+                    # this is it! add one to the counter
+                    self.world.nrop += 1
+                    self.done = True
+                    self.nextstep = self.laststeps.pop()
+                    return True
+        return False
+    def choose(self):
+        positions = self.world.getneighbourpositions(self.position)
+        # remove last step from possible neighbourpositions
+        try:
+            positions.remove(self.laststeps[len(self.laststeps)-1])
+        except ValueError:
+            pass
+        if not self.haspositions(positions):
+            self.pickaposition(positions)
+    def walk(self):
+        # we are all only getting older..
+        if self.age() == False:
+            return False
+        # if we do not have decided yet where to go to..
+        if self.nextstep[0] == None:
+            self.choose()
+        # if penalty is positive, wait one round
+        if self.penalty > 0:
+            self.penalty -= 1
+        else:
+            # add penalty from direction or underground
+# TODO: think about adding 1 to each and then multiplicate them ;)
+            self.penalty += self.nextstep[4] + self.nextstep[2]
+            # are we luckily walking home?
+            if self.done == True:
+                # walk back home one step
+                self.position = [self.nextstep[0],self.nextstep[1]]
+                # mark current position as a good choice
+                self.paint(self.position, self.pathpaint)
+                if len(self.laststeps) > 1:
+                    # next step towards back home
+                    self.nextstep = self.laststeps.pop()
+                else:
+                    # retire after work
+                    self.snuffit()
+            else:
+                # make a step
+                self.position = self.nextstep
+                # remember it
+                self.laststeps.append(self.position)
+                # clear nextstep for next round
+                self.nextstep = [None,None,0,0,0,0]
+                # mark current position
+                self.paint(self.position, self.steppaint)
+
+def test():
+    """Test suite for Ant Class"""
+    import aco
+    print "creating a new world"
+    w = aco.ACO()
+    w.bounds = [5,0,5,0,6,6]
+    w.playground.setbounds(5,0,5,0,6,6)
+    print " limits set:",w.playground.getbounds()
+    w.playground.setnewlayer("cost", "raster", True)
+    w.costsurface = w.playground.getlayer("cost").raster
+    w.playground.setnewlayer("phero", "raster", True)
+    w.pherovapour = w.playground.getlayer("phero").raster
+    print " playground looks like (cost+phero)"
+    print " #c#",w.costsurface
+    print " #p#",w.pherovapour
+    w.holes = [[0,0,1]]
+    print ""
+    print "let's put some life in it.."
+    w.bear(Ant,5,[0,0])
+    a = w.agents[0]
+    print " agent seems fine (for now). time to live:",str(a.ttl),\
+        ". location:",a.position
+    a.paint([0,0],500)
+    a.paint([1,1],800)
+    a.paint([1,2],900)
+    print " playground(phero) after some painting:"
+    print " ", w.pherovapour
+    print "look around on positions.."
+    positions = w.getneighbourpositions(a.position)
+    print " tmp positions: ", positions
+    print "- any special cells in raster? ",\
+        a.searchspecials(positions)
+    positions[1][3] = -1
+    print "- any special cells in raster (marking one)? ",\
+        a.searchspecials(positions)
+    print "now die."
+    a.snuffit()
+    print ""
+    print "new ant.."
+    w.bear(Ant,5,[0,0])
+    a = w.agents[0]
+    print " agent seems fine (for now). time to live:",str(a.ttl),\
+        ". location:",a.position
+    print "let's do some positioning..."
+    positions = w.getneighbourpositions(a.position)
+    print "- now pickaposition:"
+    a.randomposition(positions)
+    print " a random choice: ", a.nextstep
+    a.smellposition(positions)
+    print " in smell-mode we would choose: ", a.nextstep
+    a.testposition(positions)
+    print " alternative test:", a.nextstep
+    print "- hasposition alternatives"
+    print " avoid walking in loops:"
+    ps = positions[:]
+    a.avoidloop(ps)
+    print " ",ps
+    ps = positions[:]
+    print " forget loops:"
+    a.forgetloop(ps)
+    print " ",ps
+    ps = positions[:]
+    print " avoid or forget loops:"
+    a.avoidorforgetloop(ps)
+    print " ",ps
+    print "- regularly choose a position now.. based on .. why not: smell."
+    print positions
+    a.choose()
+    print " ant: I'd go there,", a.position
+    print "- make a step forward then.."
+    a.walk()
+    print " ant: I am here now,", a.position
+    print "all done."
+

Copied: grass-addons/grass7/raster/r.agent/libold/error.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/error.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/error.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/error.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,48 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+class Error(Exception):
+    """Base class for exceptions in this module."""
+    pass
+
+class DataError(Error):
+    """Exception raised for errors in the input.
+
+    Attributes:
+        expr -- Context expression in which the error occurred
+        msg  -- explanation of the error
+    """
+    def __init__(self, expr, msg):
+        self.expr = expr
+        self.msg = msg
+        print "DataError: " + expr + " " + msg
+
+class InputError(Error):
+    """Exception raised for errors in the input.
+
+    Attributes:
+        expr -- input expression in which the error occurred
+        msg  -- explanation of the error
+    """
+    def __init__(self, expr, msg):
+        self.expr = expr
+        self.msg = msg
+        print "InputError: " + expr + " " +msg
+
+def test():
+    """Test suite for Error Class"""
+    try:
+        raise InputError("Error Test Suite", "(no problem with this error)")
+    except InputError:
+        print "catched! all fine."
+

Copied: grass-addons/grass7/raster/r.agent/libold/layer.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/layer.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/layer.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/layer.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,140 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+import error
+
+class Layer():
+    """More like a meta/stub Class (or Interface).
+        To be inherited by children."""
+    def __init__(self):
+        self.infilename = None
+        self.outfilename = None
+        self.offset = [None,None]
+        self.limit = [None,None]
+        self.steps = []
+        self.resolution = [1,1]
+        self.fbuffer = None
+    def setinfilename(self, filename):
+        self.infilename = filename
+    def setoutfilename(self, filename):
+        self.outfilename = filename
+    def clearlayer(self):
+        self.offset = [None, None]
+        self.limit = [None, None]
+        if self.steps != []:
+            self.steps = [None, None]
+    def setbounds(self, north, south, east, west, rows=None, cols=None):
+        self.offset = [west,south]
+        self.limit = [east,north]
+        # here layer decides if steps shall be set (see Playground)
+        if self.steps != []:
+            self.steps = [cols,rows]
+            self.resolution[0] = (self.limit[0]-self.offset[0])/self.steps[0]
+            self.resolution[1] = (self.limit[1]-self.offset[1])/self.steps[1]
+    def getbounds(self):
+        if self.steps != []:
+            rows = self.steps[1]
+            cols = self.steps[0]
+        else:
+            rows = None
+            cols = None
+        return [self.limit[1], self.offset[1], self.limit[0],
+                 self.offset[0], rows, cols]
+    def shiftbound(self, direction, delta):
+        if delta < 0:
+            pass
+        elif delta > 0:
+            pass
+    def comparebounds(self, north, south, east, west, rows=None, cols=None):
+        if [west,south] == self.offset and [east,north] == self.limit:
+            if self.steps == []:
+                return True
+            elif [cols,rows] == self.steps:
+                return True
+        return False
+    def forcebounds(self, north, south, east, west, rows=None, cols=None):
+        if not self.comparebounds(north, south, east, west, rows, cols):
+            if self.resolution[0] and self.resolution[1]:
+                xres = self.resolution[0]
+                yres = self.resolution[1]
+            else:
+                xres = 1
+                yres = 1
+            self.shiftbound('north', (north-self.limit[1])/yres)
+            self.shiftbound('south', (south-self.offset[1])/yres)
+            self.shiftbound('east', (east-self.limit[0])/xres)
+            self.shiftbound('west', (west-self.offset[0])/xres)
+            self.setbounds(north, south, east, west, rows, cols)
+    def parsefile(self, fileh):
+        self.fbuffer = fileh.read()
+    def createfile(self, fileh):
+        if self.fbuffer:
+            fileh.write(self.fbuffer)
+    def importfile(self):
+        try:
+            with open(self.infilename, 'r') as fileh:
+                self.parsefile(fileh)
+        except IOError:
+            print "Error: Can not read " + self.infilename
+        except error.InputError:
+            print "Error: " + self.infilename + \
+                    " is not a valid ascii file"
+    def exportfile(self):
+        try:
+            with open(self.outfilename, "w") as fileh:
+                self.createfile(fileh)
+        except IOError:
+            print "Error: Can not write", self.infilename
+
+def test(infile, export=True, remove=True):
+    """Test suite for Layer Class"""
+    outfile = "out-" + infile
+    import os
+    if os.path.isfile(infile) and not os.path.isfile(outfile):
+        l = Layer()
+        print "setting files.."
+        l.setinfilename(infile)
+        l.setoutfilename(outfile)
+        print " import"
+        l.importfile()
+        if export == True:
+            print " export"
+            l.exportfile()
+            import filecmp
+            if filecmp.cmp(infile, outfile):
+                print "import/export seem ok"
+            else:
+                print "import/export failed"
+            if remove == True:
+                os.remove(outfile)
+        print "setting bounds"
+        l.setbounds(9,0,10,1)
+        print " bounds:", str(l.getbounds())
+        print " offset/limit:", str(l.offset), str(l.limit)
+        print "comparing bounds: "
+        print " True:",str(l.comparebounds(*l.getbounds()))
+        print " False:",str(l.comparebounds(l.offset[0]+1,l.offset[1],*l.limit))
+        print "clear all"
+        print "all again with steps:"
+        l.setbounds(9,0,10,1,1,1)
+        print " bounds:", str(l.getbounds())
+        print " offset/limit:", str(l.offset), str(l.limit)
+        print "comparing bounds: "
+        print " True:",str(l.comparebounds(*l.getbounds()))
+        print " False:",str(l.comparebounds(l.offset[0]+1,l.offset[1],*l.limit))
+        print "clear all"
+        l.clearlayer()
+        print " noting: "+str(l.offset)+str(l.limit)
+    else:
+        print "Error: no " + infile + " or " + outfile + " exists."
+

Copied: grass-addons/grass7/raster/r.agent/libold/overview.html (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/overview.html)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/overview.html	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/overview.html	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,85 @@
+<h2>general oversimplified abstract overview</h2>
+
+<ul><li>world
+<ul><li>e.g. an anthill, or a planet..
+</li><li>organizes how things work together
+</li><li>has:
+<ul><li>playground
+</li><li>list of agents
+<ul><li>killagent(agent)
+</li></ul></li><li>list of artefacts
+</li></ul></li></ul></li><li>aco - world
+<ul><li>is a:
+<ul><li>world
+</li></ul></li><li>for ants as agents with Ant Colony Optimization Algorithm as interaction rule
+</li><li>has:
+<ul><li>playground with
+<ul><li>penalty raster layer
+</li><li>pheromone raster layer
+</li><li>vector layer with holes/anthills
+</li></ul></li><li>list of ants
+</li><li>list of attractors..
+</li><li>list of holes/anthills..
+</li><li>several values that control the behaviour..
+</li></ul></li></ul></li><li>playground
+<ul><li>e.g. dirt, dead wood/leaves/needles, pheromone, etc.
+</li><li>manages layers =&gt; coordinates or graph(?)
+</li><li>has:
+<ul><li>layers
+<ul><li>knows its borders
+<ul><li>start/end coordinates
+</li><li>graph ...
+</li></ul></li><li>calcgraph(raster, degreeoffreedom, sizeofstep)
+</li><li>neighbours(node)-&gt;listofedges
+</li><li>neighbours(coordinates)-&gt;mapofcoordinate=&gt;value's
+</li></ul></li></ul></li></ul></li><li>layer (meta)
+<ul><li>one aspect from playground (one layer therefore..)
+</li></ul></li><li>rasterlayer - layer
+<ul><li>is a:
+<ul><li>layer
+</li></ul></li><li>e.g. pheromone "smell"
+</li><li>represents gis-rasterlayer
+</li><li>has:
+<ul><li>borders
+</li><li>matrix
+</li></ul></li></ul></li><li>vectorlayer - layer
+<ul><li>is a:
+<ul><li>layer
+</li></ul></li><li>e.g. holes in the ground
+</li><li>represents gis-vectorlayer
+</li><li>has:
+<ul><li>borders
+</li><li>list of vector objects/points/..
+</li></ul></li></ul></li><li>graph - layer (not yet available...)
+<ul><li>is a:
+<ul><li>layer
+</li></ul></li><li>made from raster-/vectorlayer
+</li><li>has:
+<ul><li>map of nodes
+<ul><li>node
+<ul><li>id
+</li><li>n:edges list
+</li></ul></li></ul></li><li>list of edges
+<ul><li>edge
+<ul><li>2:nodes
+</li><li>mapof'attribute=value's
+</li></ul></li></ul></li></ul></li></ul></li><li>agent
+<ul><li>e.g. a passenger or an ant
+</li><li>"lives" sort of in the world and on the playground
+</li><li>has:
+<ul><li>ttl
+</li><li>knowscompass
+</li><li>degreeoffreedom - (might be different from playground)
+</li><li>walk()
+</li></ul></li></ul></li><li>ant - agent
+<ul><li>is a:
+<ul><li>agent
+</li></ul></li><li>actor in an aco world
+</li><li>has:
+<ul><li>home position / position of origin / birthplace
+</li><li>list of its positions visited
+</li><li>pheromone intensity to use on certain circumstances
+</li><li>penalty value for its moving velocity
+</li><li>decisionbase for knowing how to find new positions
+</li><li>decisionbase for remembering visited positions
+</li></ul></li></ul></li></ul>

Copied: grass-addons/grass7/raster/r.agent/libold/playground.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/playground.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/playground.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/playground.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,120 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+import rasterlayer
+import vectorlayer
+
+class Playground(object):
+    """..."""
+    def __init__(self):
+        self.layers = dict()
+        self.offset = [None,None]
+        self.limit = [None,None]
+        self.steps = []
+    def setbounds(self, north=None, south=None, east=None, west=None,
+                     rows=None, cols=None):
+        self.offset = [west,south]
+        self.limit = [east,north]
+        # here always try to set steps (see Layer)
+        if rows:
+            self.steps = [cols,rows]
+    def setboundsfromlayer(self, layername):
+        self.setbounds(*self.layers[layername].getbounds())
+    def getbounds(self):
+        if self.steps:
+            rows = self.steps[1]
+            cols = self.steps[0]
+        else:
+            rows = None
+            cols = None
+        return [self.limit[1], self.offset[1], self.limit[0],
+                self.offset[0], rows, cols]
+    def getrelativebounds(self):
+        b = self.getbounds()
+        b = [b[4]-1,0,b[5]-1,0,b[4],b[5]]
+        return b
+    def setlayeralias(self, layername, layer):
+        self.layers[layername] = layer
+    def removelayer(self, layername):
+        del self.layers[layername]
+    def getlayer(self, layername):
+        return self.layers[layername]
+    def setlayer(self, layername, layer, force=False):
+        self.layers[layername] = layer
+        if force and self.offset[0] != None:
+            self.layers[layername].forcebounds(*self.getbounds())
+    def setnewlayer(self, layername, typename, force=False):
+        if typename == "raster":
+            layer = rasterlayer.RasterLayer()
+        elif typename == "vector":
+            layer = vectorlayer.VectorLayer()
+#        elif typename == "graph":
+#            self.layers[layername] = layer.Layer()
+        else:
+            print "layertype not supported (yet)."
+        self.setlayer(layername, layer, force)
+    def setlayerfromfile(self, layername, typename, filename):
+        self.setnewlayer(layername, typename)
+        self.layers[layername].setinfilename(filename)
+        self.layers[layername].importfile()
+        if self.offset[0] != None:
+            self.layers[layername].forcebounds(*self.getbounds())
+    def forcelayerbounds(self):
+        if self.offset[0] != None:
+            for layer in self.layers.itervalues():
+                layer.forcebounds(*self.getbounds())
+
+def test(layer0type=None, layer0=None, layer1type=None, layer1=None):
+    """Test suite for Playground Class"""
+    def testhelper(north=None, south=None, east=None, west=None,
+                     rows=None, cols=None):
+        print " It has this boundaries: "
+        print "  south: " + str(south)
+        print "  west: " + str(west)
+        print "  north: " + str(north)
+        print "  east: " + str(east)
+        print "  rows: " + str(rows)
+        print "  cols: " + str(cols)
+    print "creating new Playground.."
+    pg = Playground()
+    print "start filling it up.."
+    if layer0:
+        pg.setlayerfromfile("l0", layer0type, layer0)
+    else:
+        pg.setbounds(20, 0, 20, 0, 20, 20)
+        pg.setnewlayer("l0", "raster", True)
+        layer0type="raster"
+    print "Layer: "+"l0"+" ("+layer0type+")"
+    testhelper(*pg.layers["l0"].getbounds())
+    if layer1:
+        pg.setlayerfromfile("l1", layer1type, layer1)
+    else:
+        pg.setnewlayer("l1", "vector", True)
+        layer1type="vector"
+    print "Layer: "+"l1"+" ("+layer1type+")"
+    testhelper(*pg.layers["l1"].getbounds())
+    print "Setting global boundaries from layer l0"
+    pg.setboundsfromlayer("l0")
+    testhelper(*pg.getbounds())
+    print "adding new name/alias for l0"
+    pg.setlayeralias("newname", pg.getlayer("l0"))
+    print " " + str(pg.layers.keys())
+    testhelper(*pg.layers["newname"].getbounds())
+    print "remove new name"
+    pg.removelayer("newname")
+    print str(pg.layers.keys())
+    print "force global boundaries on layers"
+    pg.forcelayerbounds()
+    print " l1"
+    testhelper(*pg.layers["l1"].getbounds())
+

Copied: grass-addons/grass7/raster/r.agent/libold/rasterlayer.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/rasterlayer.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/rasterlayer.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/rasterlayer.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,254 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+import layer
+import error
+
+class RasterLayer(layer.Layer):
+    """..."""
+    def __init__(self):
+        layer.Layer.__init__(self)
+        self.bkeys = ["north", "south", "east", "west", "rows", "cols"]
+        self.steps = [None,None]
+        self.resolution = [None,None]
+        self.raster = []
+        self.gisempty = "*"
+        self.emptyvalue = -1
+    def clearlayer(self):
+        layer.Layer.clearlayer(self)
+        self.raster = []
+    def xyflipmatrix(self, matrix):
+        newmatrix = []
+        for i in range(len(matrix[0])):
+            newrow = []
+            for j in range(len(matrix)):
+                newrow.append(matrix[j][i])
+            newmatrix.append(newrow)
+        return newmatrix
+    def xflipmatrix(self, matrix):
+        raster = []
+        for i in range(len(matrix)-1, -1, -1):
+            raster.append(matrix[i])
+        return raster
+    def shiftbound(self, direction, delta):
+        if delta < 0:
+            if direction == "east":
+                for i in range(delta, 0):
+                    del self.raster[-1]
+            elif direction == "west":
+                for i in range(delta, 0):
+                    self.raster.insert(0,
+                        [0 for i in range(len(self.raster[0]))])
+            elif direction == "north":
+                for i in range(delta, 0):
+                    for j in range(len(self.raster)):
+                        del self.raster[j][-1]
+            elif direction == "south":
+                for i in range(delta, 0):
+                    for j in range(len(self.raster)):
+                        self.raster[j].insert(0, 0)
+        if delta > 0:
+            if direction == "east":
+                for i in range(delta):
+                    self.raster.append([0 for i in range(len(self.raster[0]))])
+            elif direction == "west":
+                for i in range(delta):
+                    del self.raster[0]
+            elif direction == "north":
+                for i in range(delta):
+                    for j in range(len(self.raster)):
+                        self.raster[j].append(0)
+            elif direction == "south":
+                for i in range(delta):
+                    for j in range(len(self.raster)):
+                        del self.raster[j][0]
+    def testresolution(self, north, south, east, west, rows, cols):
+        if rows > 0 < cols:
+            xres = ( east - west ) / cols
+            yres = ( north - south ) / rows
+            if self.resolution[0] == xres and self.resolution[1] == yres:
+                return True
+        return False
+    def forcebounds(self, north, south, east, west, rows, cols):
+        if self.steps[0] == None and self.raster == []:
+            self.setbounds(north, south, east, west, rows, cols)
+            for i in range(cols):
+                self.raster.append([0 for j in range(rows)])
+        elif not self.testresolution(north, south, east, west, rows, cols):
+            raise error.DataError("raster.forcebounds", "wrong resolution")
+        else:
+            layer.Layer.forcebounds(self, north, south, east, west, rows, cols)
+    def parsefile(self, fileh):
+        self.clearlayer()
+        bounds = []
+        for key in self.bkeys:
+            keylength = len(key)
+            line = fileh.readline()
+            if line[0:keylength] in key:
+                bounds.append(int(line[keylength+2:-1]))
+            else:
+                raise error.InputError(self.infilename, "no valid raster")
+        self.setbounds(*bounds)
+        raster = []
+        for line in fileh:
+            rasterline = []
+            for word in line.split(" "):
+                if word.find(".") > 0:
+                    rasterline.append(float(word))
+                elif word.isdigit():
+                    rasterline.append(int(word))
+                elif word in '\r' '\n' '\r\n':
+                    pass
+                else:
+                    rasterline.append(self.emptyvalue)
+            raster.append(rasterline[:])
+        if not (len(raster) == self.steps[1] and
+                        len(raster[0]) == self.steps[0]):
+            raise error.InputError(self.infilename, "wrong # rows/cols")
+        self.raster = self.xyflipmatrix(self.xflipmatrix(raster))
+    def createfile(self, fileh):
+        if self.limit[0]:
+            raster = self.xflipmatrix(self.xyflipmatrix(self.raster))
+            bounds = self.getbounds()
+            bounds.reverse()
+            for key in self.bkeys:
+                line = key + ": " + str(bounds.pop()) + "\n"
+                fileh.writelines(line)
+            for line in raster:
+                for word in line:
+                    if word == self.emptyvalue:
+                        fileh.write(self.gisempty + " ")
+                    else:
+                        fileh.write(str(word) + " ")
+                fileh.write("\n")
+
+def test(infile, export=True, remove=True):
+    """Test suite for RasterLayer Class"""
+    outfile = "out-" + infile
+    import os
+    if os.path.isfile(infile) and not os.path.isfile(outfile):
+        print "create raster layer"
+        r = RasterLayer()
+        r.setinfilename(infile)
+        r.setoutfilename(outfile)
+        print "importing file.."
+        r.importfile()
+        print "file says:"
+        print " r:", str(r.steps[0])+"; c:", str(r.steps[1])
+        print "matrix:"
+        print " x:", str(len(r.raster))+"; y:", str(len(r.raster[0]))
+        if export == True:
+            r.exportfile()
+            import filecmp
+            if filecmp.cmp(infile, outfile):
+                print "import/export seem ok"
+            else:
+                print "import/export failed"
+            if remove == True:
+                os.remove(outfile)
+        print "properties are still:"
+        print " r:", str(r.steps[0])+"; c:", str(r.steps[1])
+        print "flipping raster on x:"
+        b = r.xflipmatrix(r.raster)               
+        print " x:", str(len(b))+"; y:", str(len(b[0]))
+        print "flipping raster on x/y:"
+        b = r.xyflipmatrix(r.raster)
+        print " x:", str(len(b))+"; y:", str(len(b[0]))
+        print "a little resolution test first (to be True):", \
+                str(r.testresolution(*r.getbounds()))
+        print "now force bounds on raster: "
+        print " the same as now"
+        r.forcebounds(*r.getbounds())
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                    str(r.steps)
+        print "  at position [0,0] we have now:", str(r.raster[0][0])
+        print " setting new values now: 100,0,100,0,1,1"
+        r.clearlayer()
+        r.forcebounds(100,0,100,0,1,1)
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                    str(r.steps)
+        print "  testing wheter they are set now (True):", \
+                str(r.testresolution(100,0,100,0,1,1))
+        print "  at position [0,0] we have now: ", str(r.raster[0][0])
+        print " momentary raster:"
+        print str(r.raster)
+        print " now reforcing these (correct) values: 200,100,200,100,1,1"
+        r.forcebounds(200,100,200,100,1,1)
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                    str(r.steps)
+        print " momentary raster:"
+        print str(r.raster)
+        print " now some wrong values, should throw Error.."
+        try:
+            r.forcebounds(0,0,1,1,1,10000)
+        except error.DataError:
+            print "expected Error received.."
+        print " momentary raster:"
+        print str(r.raster)
+        print " changeing value r[0][0] to 1"
+        r.raster[0][0] = 1
+        print " momentary raster:"
+        print str(r.raster)
+        print "adding some space in the north"
+        print " setting new values now: 400,100,200,100,3,1"
+        r.forcebounds(400,100,200,100,3,1)
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
+        print " momentary raster:"
+        print str(r.raster)
+        print "removing some space in the north"
+        print " setting new values now: 300,100,200,100,2,1"
+        r.forcebounds(300,100,200,100,2,1)
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
+        print " momentary raster:"
+        print str(r.raster)
+        print "adding some space in the east"
+        r.forcebounds(300,100,400,100,2,3)
+        print " momentary raster:"
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
+        print str(r.raster)
+        print "removing some space in the east"
+        r.forcebounds(300,100,300,100,2,2)
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
+        print " momentary raster:"
+        print str(r.raster)
+        print "adding some space in the south"
+        r.forcebounds(300,0,300,100,3,2)
+        print " momentary raster:"
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
+        print str(r.raster)
+        print "removing some space in the south"
+        r.forcebounds(300,100,300,100,2,2)
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
+        print " momentary raster:"
+        print str(r.raster)
+        print "adding some space in the west"
+        r.forcebounds(300,100,300,0,2,3)
+        print " momentary raster:"
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
+        print str(r.raster)
+        print "removing some space in the west"
+        r.forcebounds(300,100,300,100,2,2)
+        print "  n/w:", str(r.offset), "s/e:", str(r.limit), "r/c:", \
+                str(r.steps), "::", str(len(r.raster[0]))+":"+str(len(r.raster))
+        print " momentary raster:"
+        print str(r.raster)
+    else:
+        print "Failed: no", infile, "or", outfile, "exists."
+

Copied: grass-addons/grass7/raster/r.agent/libold/vectorlayer.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/vectorlayer.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/vectorlayer.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/vectorlayer.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,161 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+import layer
+import error
+
+class VectorLayer(layer.Layer):
+    """..."""
+    def __init__(self):
+        layer.Layer.__init__(self)
+        self.objects = []
+        self.gissplit = "|"
+    def clearlayer(self):
+        layer.Layer.clearlayer(self)
+        self.objects = []
+    def shiftbound(self, direction, delta):
+# TODO off by one?
+        for obj in self.objects[:]:
+            if direction == "north":
+                if obj[1] > self.limit[1]+delta:
+                    self.objects.remove(obj)
+            elif direction == "east":
+                if obj[0] > self.limit[0]+delta:
+                    self.objects.remove(obj)
+            elif direction == "south":
+                if obj[1] < self.offset[1]+delta:
+                    self.objects.remove(obj)
+                else:
+                    obj[1] = obj[1]-delta
+            elif direction == "west":
+                if obj[0] < self.offset[0]+delta:
+                    self.objects.remove(obj)
+                else:
+                    obj[0] = obj[0]-delta
+    def reclassify(self, oldres, newres):
+# TODO if nothing changes..?
+# TODO goes to world??
+        dx = (newres[0] + 0.0) / oldres[0]
+        dy = (newres[1] + 0.0) / oldres[1]
+        for obj in self.objects:
+            obj[0] = int(round(obj[0] / dx))
+            obj[1] = int(round(obj[1] / dy))
+    def forcebounds(self, north, south, east, west, norows=None, nocols=None):
+        if self.offset[0] == None or self.offset[0] == self.limit[0]:
+            self.setbounds(north, south, east, west)
+        else:
+            layer.Layer.forcebounds(self, north, south, east, west)
+            if norows != None:
+                newres = [((east-west)/nocols),((north-south)/norows)]
+                self.reclassify(self.resolution, newres)
+                self.resolution = newres
+    def parsefile(self, fileh):
+        self.clearlayer()
+        vectorlist = []
+        self.offset = [0,0]
+        self.limit = [0,0]
+        for line in fileh:
+            if line[-1] in '\r' '\n' '\r\n':
+                line = line[:-1]
+            line = line.split(self.gissplit)
+            avector = []
+            for e in line:
+                avector.append(int(e))
+            vectorlist.append(avector)
+            if avector[0] > int(self.limit[0]):
+                self.limit[0] = avector[0]
+            if avector[1] > int(self.limit[1]):
+                self.limit[1] = avector[1]
+        self.objects = vectorlist
+    def createfile(self, fileh):
+        if self.limit[0] != None:
+            for obj in self.objects:
+                text = ""
+                for element in obj:
+                    if text:
+                        text = text + self.gissplit + str(element)
+                    else:
+                        text = str(element)
+                fileh.write(text + "\n")
+
+def test(infile, export=True, remove=True):
+    """Test suite for VectorLayer Class"""
+    outfile = "out-" + infile
+    import os
+    if os.path.isfile(infile) and not os.path.isfile(outfile):
+        print "create vector layer"
+        v = VectorLayer()
+        v.setinfilename(infile)
+        v.setoutfilename(outfile)
+        print "importing file"
+        v.importfile()
+        print "entries # " + str(len(v.objects))
+        for o in v.objects:
+            print " obj is: x=" + str(o[0]) + " y=" + str(o[1]) + \
+                " cat=" + str(o[2])
+        print "all between:"
+        print " south: " + str(v.offset[1])
+        print " west: " + str(v.offset[0])
+        print " north: " + str(v.limit[1])
+        print " east: " + str(v.limit[0])
+        if export == True:
+            v.exportfile()
+            import filecmp
+            if filecmp.cmp(infile, outfile):
+                print "import/export seem ok"
+            else:
+                print "import/export failed"
+            if remove == True:
+                os.remove(outfile)
+
+        print "creating new example:"
+        print " clear all"
+        v.clearlayer()
+        print " set new values"        
+        print "  setting new boundaries: n9, s0, e9, w0"
+        v.forcebounds( 9, 0, 9, 0 )
+        print "  setting new vectors: 0:5, 5:0, 9:5, 5:9, 5:5"
+        v.objects.append([0, 5, 0])
+        v.objects.append([5, 0, 1])
+        v.objects.append([9, 5, 2])
+        v.objects.append([5, 9, 3])
+        v.objects.append([5, 5, 4])
+        print " set:"
+        print "  south: " + str(v.offset[1])
+        print "  west: " + str(v.offset[0])
+        print "  north: " + str(v.limit[1])
+        print "  east: " + str(v.limit[0])
+        print " entries # " + str(len(v.objects))
+        for o in v.objects:
+            print "  obj is: x=" + str(o[0]) + " y=" + str(o[1]) + " cat=" + \
+                str(o[2])
+        print " set new values"
+        print "  setting new boundaries: n6, s4, e6, w4"
+        v.forcebounds( 6, 4, 6, 4 )
+        print " set:"
+        print "  south: " + str(v.offset[1])
+        print "  west: " + str(v.offset[0])
+        print "  north: " + str(v.limit[1])
+        print "  east: " + str(v.limit[0])
+        print " remaining entries # " + str(len(v.objects))
+        for o in v.objects:             
+            print "  obj is: x=" + str(o[0]) + " y=" + str(o[1]) + " cat=" + \
+                str(o[2])
+        print " again with the old boundaries: n9, s0, e9, w0"
+        v.forcebounds( 9, 0, 9, 0 )
+        for o in v.objects:
+            print "  obj is: x=" + str(o[0]) + " y=" + str(o[1]) + " cat=" + \
+                str(o[2])
+    else:
+        print "Error: no " + infile + " or " + outfile + " exists."
+

Copied: grass-addons/grass7/raster/r.agent/libold/world.py (from rev 49186, grass-addons/grass7/raster/r.agent/libagent/world.py)
===================================================================
--- grass-addons/grass7/raster/r.agent/libold/world.py	                        (rev 0)
+++ grass-addons/grass7/raster/r.agent/libold/world.py	2011-11-13 15:49:04 UTC (rev 49194)
@@ -0,0 +1,128 @@
+############################################################################
+#
+# MODULE:       r.agent.*
+# AUTHOR(S):    michael lustenberger inofix.ch
+# PURPOSE:      library file for the r.agent.* suite
+# COPYRIGHT:    (C) 2011 by Michael Lustenberger and the GRASS Development Team
+#
+#               This program is free software under the GNU General Public
+#               License (>=v2). Read the file COPYING that comes with GRASS
+#               for details.
+#
+#############################################################################
+
+import error
+import agent
+import playground
+
+class World(object):
+    """meta class"""
+    def __init__(self, agenttype=None, pg=None):
+        if pg == None:
+            self.playground = playground.Playground()
+        else:
+            self.playground = pg
+        self.agentclass = agent.Agent
+        if agenttype == None:
+            self.agenttype = self.agentclass
+        else:
+            self.setagenttype(agenttype)
+        self.agents = []
+        self.artefacts = []
+    def importlayer(self, name, typename=None, filename=None):
+        if typename != None:
+            self.playground.setlayerfromfile(name, typename, filename)
+        elif filename != None:
+            self.playground.getlayer(name).setinfilename(filename)
+            self.playground.getlayer(name).importfile()
+        else:
+            self.playground.getlayer(name).importfile()
+        return self.playground.getlayer(name)
+    def createlayer(self, name, typename, infile=None, outfile=None):
+        self.playground.setnewlayer(name, typename, False)
+        if infile:
+            self.playground.getlayer(name).setinfilename(infile)
+        if outfile:
+            self.playground.getlayer(name).setoutfilename(outfile)
+        return self.playground.getlayer(name)
+    def exportlayer(self, name, typename=None, filename=None):
+        if filename == None:
+            self.playground.getlayer(name).exportfile()
+        elif typename == None:
+            self.playground.getlayer(name).setoutfilename(filename)
+        else:
+            if not self.playground.getlayer(name):
+                self.playground.setnewlayer(name, typename)
+            self.playground.getlayer(name).setoutfilename(filename)
+            self.playground.getlayer(name).exportfile()
+    def setagenttype(self, agenttype):
+        if issubclass(agenttype, self.agentclass):
+            self.agenttype = agenttype
+    def getagenttype(self):
+        return self.agenttype
+    def bear(self, agenttype=None, timetolife=0, position=[]):
+        if agenttype == None:
+            agenttype = self.agenttype
+        if issubclass(agenttype, self.agentclass):
+            self.agents.append(agenttype(timetolife, self, position))
+    def moveto(self, agent, position):
+        pass
+    def move(self, agent, nrofsteps, direction="random"):
+        pass
+#        print "moving " + self.agent + self.nrofsteps + \
+#            " steps towards " + self.direction
+#    def letwalk(self, agent, nrofsteps=1, direction="random"):
+#        position = agent.getposition()
+#        npositions = self.playground.getneighbourpositions("costs", position)
+        #agent.move()
+    def kill(self, agent):
+        self.agents.remove(agent)
+#    def build(self, artefact):
+#        self.artefacts.add(artefact)
+#    def place(self, artefact, position):
+#        pass
+#    def destroy(self, artefact):
+#        self.artefacts.remove(artefact)
+
+def test(inraster=None, outraster=None, invector=None):
+    """Test suite for World Class"""
+    print "creating world"
+    w = World()
+    print "playing with agents"
+    print " nothing changed.."
+    print "  Agenttype is:", w.getagenttype()
+    print " illegaly overwriting agent.."
+    w.agenttype = ""
+    print "  Agenttype is:", w.getagenttype()
+    print " set new agenttype.."
+    w.setagenttype(agent.Agent)
+    print "  Agenttype is:", w.getagenttype()
+    print "giving birth to some agents"
+    w.bear()
+    w.bear(agent.Agent)
+    print " Agentlist:", w.agents
+    print "killing an agent"
+    w.kill(w.agents[0])
+    print " Agentlist:", w.agents
+#??    w.build()..
+#??    w.moveto()..
+#??    w.move()..
+#??    w.place()..
+#??    w.letwalk()..
+#??    w.destroy()..
+    print "adding layers?"
+    if inraster:
+        print "  adding raster"
+        w.importlayer("raster", "raster", inraster)
+        print "  re-adding again in diffrent way"
+        w.createlayer("raster", "raster", inraster, inraster)
+        w.importlayer("raster")
+        print "  is set."
+        if outraster:
+            w.exportlayer("raster", "raster", outraster)
+            print "  exported to:", str(outraster), "- check and remove.."
+        if invector:
+            print "  adding vectors"
+            w.importlayer("vector", "vector", invector)
+            print "  is set."
+



More information about the grass-commit mailing list