sumolib.scenario.runsdb

  1# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
  2# Copyright (C) 2012-2026 German Aerospace Center (DLR) and others.
  3# This program and the accompanying materials are made available under the
  4# terms of the Eclipse Public License 2.0 which is available at
  5# https://www.eclipse.org/legal/epl-2.0/
  6# This Source Code may also be made available under the following Secondary
  7# Licenses when the conditions for such availability set forth in the Eclipse
  8# Public License 2.0 are satisfied: GNU General Public License, version 2
  9# or later which is available at
 10# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
 11# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
 12
 13# @file    runsdb.py
 14# @author  Daniel Krajzewicz
 15# @date    2014-07-21
 16
 17
 18from __future__ import absolute_import
 19import sqlite3
 20import os
 21
 22
 23class RunsDB:
 24
 25    def __init__(self):
 26        self.conn = None
 27        self.cursor = None
 28        # !!! if an old db is opened to be extended, this should be read from the db
 29        self.run = -1
 30
 31    def buildDB(self, dbName="results.db", deletePrior=True):
 32        if deletePrior and os.path.exists(dbName):
 33            os.remove(dbName)
 34        self.conn = sqlite3.connect(dbName)
 35        self.cursor = self.conn.cursor()
 36        self.cursor.execute(
 37            'CREATE TABLE run (id integer, key text, value text)')
 38        self.cursor.execute(
 39            'CREATE TABLE result (runID integer, denominator integer, key text, value real)')
 40        self.cursor.execute(
 41            'CREATE TABLE timed_result (runID integer, denominator integer, aib real, aie real, key text, value real)')
 42        self.conn.commit()
 43        self.run = 0
 44
 45    def open(self, dbName="results.db"):
 46        self.conn = sqlite3.connect(dbName)
 47        self.cursor = self.conn.cursor()
 48        self.cursor.execute("SELECT MAX(id) FROM run")
 49        v = self.cursor.fetchall()
 50        if len(v) != 0 and v[0][0] is not None:
 51            self.run = v[0][0] + 1
 52        else:
 53            self.run = 0
 54
 55    def addRun(self, scenario, kvDesc):
 56        if self.run < 0:
 57            raise RuntimeError("Database was not initialised")
 58        self.run = self.run + 1
 59        cid = self.run - 1
 60        for k in kvDesc:
 61            self.cursor.execute(
 62                "INSERT INTO run VALUES (?,?,?)", (cid, k, kvDesc[k]))
 63        return cid
 64
 65    def addResult(self, runID, denominator, key, value):
 66        self.cursor.execute(
 67            "INSERT INTO result VALUES (?,?,?,?)", (runID, denominator, key, value))
 68        self.conn.commit()
 69
 70    def addTimedResult(self, runID, denominator, aib, aie, key, value):
 71        self.cursor.execute(
 72            "INSERT INTO timed_result VALUES (?,?,?,?,?,?)", (runID, denominator, aib, aie, key, value))
 73        self.conn.commit()
 74
 75    def addResults(self, results):
 76        self.cursor.executemany("INSERT INTO result VALUES (?,?,?,?)", results)
 77        self.conn.commit()
 78
 79    def addTimedResults(self, results):
 80        self.cursor.executemany(
 81            "INSERT INTO timed_result VALUES (?,?,?,?,?,?)", results)
 82        self.conn.commit()
 83
 84    def toList(self, what):
 85        ret = []
 86        for r in what:
 87            ret.append(r[0])
 88        return ret
 89
 90    def getRunIDs(self):
 91        self.cursor.execute("SELECT DISTINCT id FROM run")
 92        return self.toList(self.cursor.fetchall())
 93
 94    def getMatchingRunIDs(self, key, value):
 95        self.cursor.execute(
 96            "SELECT DISTINCT id FROM run WHERE key=? AND value=?;", (key, value))
 97        return self.toList(self.cursor.fetchall())
 98
 99    def getRunsData(self, runs=None):
100        if runs is None:
101            runs = self.getRunIDs()
102        ret = {}
103        for r in runs:
104            ret[r] = {}
105            for row in self.cursor.execute("SELECT id FROM run WHERE id=?", (r)):
106                ret[r][row[1]] = row[2]
107        return ret
108
109    def getRunID(self, kvMap):
110        stmt = ""
111        params = []
112        for k in kvMap:
113            if len(stmt) != 0:
114                stmt = stmt + " AND "
115            else:
116                stmt = stmt + " WHERE "
117            stmt = stmt + "id IN (SELECT id FROM run WHERE key=? AND value=?)"
118            params.extend([k, kvMap[k]])
119        self.cursor.execute("SELECT DISTINCT id FROM run %s;" % stmt, params)
120        return self.toList(self.cursor.fetchall())
121
122    """
123  Returns a map:
124    runID->denominator->measure->value
125  """
126
127    def fetchResults(self, runs=None, measure=None, denominator=None):
128        if runs is None:
129            runs = self.getRunIDs()
130        ret = {}
131        for r in runs:
132            ret[r] = {}
133            if measure is None:
134                i = self.cursor.execute(
135                    "SELECT * FROM result WHERE runID=?", (r,))
136            else:
137                if denominator is None:
138                    i = self.cursor.execute(
139                        "SELECT * FROM result WHERE runID=? AND key=?", (r, measure))
140                else:
141                    i = self.cursor.execute(
142                        "SELECT * FROM result WHERE runID=? AND key=? AND denominator=?", (r, measure, denominator))
143            for row in i:
144                if row[1] not in ret[r]:
145                    ret[r][row[1]] = {}
146                if row[2] in ret[r][row[1]]:
147                    raise RuntimeError("set twice!!")
148                ret[r][row[1]][row[2]] = row[3]
149        return ret
150
151    def getMeasures(self):
152        self.cursor.execute("SELECT DISTINCT key FROM result")
153        return self.toList(self.cursor.fetchall())
154
155    def getDenominators(self):
156        self.cursor.execute("SELECT DISTINCT denominator FROM result")
157        return self.toList(self.cursor.fetchall())
158
159    def getNamedRunAttribute(self, attr):
160        self.cursor.execute(
161            "SELECT DISTINCT value FROM run WHERE key=?;", (attr,))
162        return self.toList(self.cursor.fetchall())
163
164    def getNamedAttributeFromRun(self, rid, key):
165        self.cursor.execute(
166            "SELECT DISTINCT value FROM run WHERE id=? and key=?;", (rid, key))
167        return self.toList(self.cursor.fetchall())
168
169    def close(self):
170        self.conn.close()
class RunsDB:
 24class RunsDB:
 25
 26    def __init__(self):
 27        self.conn = None
 28        self.cursor = None
 29        # !!! if an old db is opened to be extended, this should be read from the db
 30        self.run = -1
 31
 32    def buildDB(self, dbName="results.db", deletePrior=True):
 33        if deletePrior and os.path.exists(dbName):
 34            os.remove(dbName)
 35        self.conn = sqlite3.connect(dbName)
 36        self.cursor = self.conn.cursor()
 37        self.cursor.execute(
 38            'CREATE TABLE run (id integer, key text, value text)')
 39        self.cursor.execute(
 40            'CREATE TABLE result (runID integer, denominator integer, key text, value real)')
 41        self.cursor.execute(
 42            'CREATE TABLE timed_result (runID integer, denominator integer, aib real, aie real, key text, value real)')
 43        self.conn.commit()
 44        self.run = 0
 45
 46    def open(self, dbName="results.db"):
 47        self.conn = sqlite3.connect(dbName)
 48        self.cursor = self.conn.cursor()
 49        self.cursor.execute("SELECT MAX(id) FROM run")
 50        v = self.cursor.fetchall()
 51        if len(v) != 0 and v[0][0] is not None:
 52            self.run = v[0][0] + 1
 53        else:
 54            self.run = 0
 55
 56    def addRun(self, scenario, kvDesc):
 57        if self.run < 0:
 58            raise RuntimeError("Database was not initialised")
 59        self.run = self.run + 1
 60        cid = self.run - 1
 61        for k in kvDesc:
 62            self.cursor.execute(
 63                "INSERT INTO run VALUES (?,?,?)", (cid, k, kvDesc[k]))
 64        return cid
 65
 66    def addResult(self, runID, denominator, key, value):
 67        self.cursor.execute(
 68            "INSERT INTO result VALUES (?,?,?,?)", (runID, denominator, key, value))
 69        self.conn.commit()
 70
 71    def addTimedResult(self, runID, denominator, aib, aie, key, value):
 72        self.cursor.execute(
 73            "INSERT INTO timed_result VALUES (?,?,?,?,?,?)", (runID, denominator, aib, aie, key, value))
 74        self.conn.commit()
 75
 76    def addResults(self, results):
 77        self.cursor.executemany("INSERT INTO result VALUES (?,?,?,?)", results)
 78        self.conn.commit()
 79
 80    def addTimedResults(self, results):
 81        self.cursor.executemany(
 82            "INSERT INTO timed_result VALUES (?,?,?,?,?,?)", results)
 83        self.conn.commit()
 84
 85    def toList(self, what):
 86        ret = []
 87        for r in what:
 88            ret.append(r[0])
 89        return ret
 90
 91    def getRunIDs(self):
 92        self.cursor.execute("SELECT DISTINCT id FROM run")
 93        return self.toList(self.cursor.fetchall())
 94
 95    def getMatchingRunIDs(self, key, value):
 96        self.cursor.execute(
 97            "SELECT DISTINCT id FROM run WHERE key=? AND value=?;", (key, value))
 98        return self.toList(self.cursor.fetchall())
 99
100    def getRunsData(self, runs=None):
101        if runs is None:
102            runs = self.getRunIDs()
103        ret = {}
104        for r in runs:
105            ret[r] = {}
106            for row in self.cursor.execute("SELECT id FROM run WHERE id=?", (r)):
107                ret[r][row[1]] = row[2]
108        return ret
109
110    def getRunID(self, kvMap):
111        stmt = ""
112        params = []
113        for k in kvMap:
114            if len(stmt) != 0:
115                stmt = stmt + " AND "
116            else:
117                stmt = stmt + " WHERE "
118            stmt = stmt + "id IN (SELECT id FROM run WHERE key=? AND value=?)"
119            params.extend([k, kvMap[k]])
120        self.cursor.execute("SELECT DISTINCT id FROM run %s;" % stmt, params)
121        return self.toList(self.cursor.fetchall())
122
123    """
124  Returns a map:
125    runID->denominator->measure->value
126  """
127
128    def fetchResults(self, runs=None, measure=None, denominator=None):
129        if runs is None:
130            runs = self.getRunIDs()
131        ret = {}
132        for r in runs:
133            ret[r] = {}
134            if measure is None:
135                i = self.cursor.execute(
136                    "SELECT * FROM result WHERE runID=?", (r,))
137            else:
138                if denominator is None:
139                    i = self.cursor.execute(
140                        "SELECT * FROM result WHERE runID=? AND key=?", (r, measure))
141                else:
142                    i = self.cursor.execute(
143                        "SELECT * FROM result WHERE runID=? AND key=? AND denominator=?", (r, measure, denominator))
144            for row in i:
145                if row[1] not in ret[r]:
146                    ret[r][row[1]] = {}
147                if row[2] in ret[r][row[1]]:
148                    raise RuntimeError("set twice!!")
149                ret[r][row[1]][row[2]] = row[3]
150        return ret
151
152    def getMeasures(self):
153        self.cursor.execute("SELECT DISTINCT key FROM result")
154        return self.toList(self.cursor.fetchall())
155
156    def getDenominators(self):
157        self.cursor.execute("SELECT DISTINCT denominator FROM result")
158        return self.toList(self.cursor.fetchall())
159
160    def getNamedRunAttribute(self, attr):
161        self.cursor.execute(
162            "SELECT DISTINCT value FROM run WHERE key=?;", (attr,))
163        return self.toList(self.cursor.fetchall())
164
165    def getNamedAttributeFromRun(self, rid, key):
166        self.cursor.execute(
167            "SELECT DISTINCT value FROM run WHERE id=? and key=?;", (rid, key))
168        return self.toList(self.cursor.fetchall())
169
170    def close(self):
171        self.conn.close()
conn
cursor
run
def buildDB(self, dbName='results.db', deletePrior=True):
32    def buildDB(self, dbName="results.db", deletePrior=True):
33        if deletePrior and os.path.exists(dbName):
34            os.remove(dbName)
35        self.conn = sqlite3.connect(dbName)
36        self.cursor = self.conn.cursor()
37        self.cursor.execute(
38            'CREATE TABLE run (id integer, key text, value text)')
39        self.cursor.execute(
40            'CREATE TABLE result (runID integer, denominator integer, key text, value real)')
41        self.cursor.execute(
42            'CREATE TABLE timed_result (runID integer, denominator integer, aib real, aie real, key text, value real)')
43        self.conn.commit()
44        self.run = 0
def open(self, dbName='results.db'):
46    def open(self, dbName="results.db"):
47        self.conn = sqlite3.connect(dbName)
48        self.cursor = self.conn.cursor()
49        self.cursor.execute("SELECT MAX(id) FROM run")
50        v = self.cursor.fetchall()
51        if len(v) != 0 and v[0][0] is not None:
52            self.run = v[0][0] + 1
53        else:
54            self.run = 0
def addRun(self, scenario, kvDesc):
56    def addRun(self, scenario, kvDesc):
57        if self.run < 0:
58            raise RuntimeError("Database was not initialised")
59        self.run = self.run + 1
60        cid = self.run - 1
61        for k in kvDesc:
62            self.cursor.execute(
63                "INSERT INTO run VALUES (?,?,?)", (cid, k, kvDesc[k]))
64        return cid
def addResult(self, runID, denominator, key, value):
66    def addResult(self, runID, denominator, key, value):
67        self.cursor.execute(
68            "INSERT INTO result VALUES (?,?,?,?)", (runID, denominator, key, value))
69        self.conn.commit()
def addTimedResult(self, runID, denominator, aib, aie, key, value):
71    def addTimedResult(self, runID, denominator, aib, aie, key, value):
72        self.cursor.execute(
73            "INSERT INTO timed_result VALUES (?,?,?,?,?,?)", (runID, denominator, aib, aie, key, value))
74        self.conn.commit()
def addResults(self, results):
76    def addResults(self, results):
77        self.cursor.executemany("INSERT INTO result VALUES (?,?,?,?)", results)
78        self.conn.commit()
def addTimedResults(self, results):
80    def addTimedResults(self, results):
81        self.cursor.executemany(
82            "INSERT INTO timed_result VALUES (?,?,?,?,?,?)", results)
83        self.conn.commit()
def toList(self, what):
85    def toList(self, what):
86        ret = []
87        for r in what:
88            ret.append(r[0])
89        return ret
def getRunIDs(self):
91    def getRunIDs(self):
92        self.cursor.execute("SELECT DISTINCT id FROM run")
93        return self.toList(self.cursor.fetchall())
def getMatchingRunIDs(self, key, value):
95    def getMatchingRunIDs(self, key, value):
96        self.cursor.execute(
97            "SELECT DISTINCT id FROM run WHERE key=? AND value=?;", (key, value))
98        return self.toList(self.cursor.fetchall())
def getRunsData(self, runs=None):
100    def getRunsData(self, runs=None):
101        if runs is None:
102            runs = self.getRunIDs()
103        ret = {}
104        for r in runs:
105            ret[r] = {}
106            for row in self.cursor.execute("SELECT id FROM run WHERE id=?", (r)):
107                ret[r][row[1]] = row[2]
108        return ret
def getRunID(self, kvMap):
110    def getRunID(self, kvMap):
111        stmt = ""
112        params = []
113        for k in kvMap:
114            if len(stmt) != 0:
115                stmt = stmt + " AND "
116            else:
117                stmt = stmt + " WHERE "
118            stmt = stmt + "id IN (SELECT id FROM run WHERE key=? AND value=?)"
119            params.extend([k, kvMap[k]])
120        self.cursor.execute("SELECT DISTINCT id FROM run %s;" % stmt, params)
121        return self.toList(self.cursor.fetchall())
def fetchResults(self, runs=None, measure=None, denominator=None):
128    def fetchResults(self, runs=None, measure=None, denominator=None):
129        if runs is None:
130            runs = self.getRunIDs()
131        ret = {}
132        for r in runs:
133            ret[r] = {}
134            if measure is None:
135                i = self.cursor.execute(
136                    "SELECT * FROM result WHERE runID=?", (r,))
137            else:
138                if denominator is None:
139                    i = self.cursor.execute(
140                        "SELECT * FROM result WHERE runID=? AND key=?", (r, measure))
141                else:
142                    i = self.cursor.execute(
143                        "SELECT * FROM result WHERE runID=? AND key=? AND denominator=?", (r, measure, denominator))
144            for row in i:
145                if row[1] not in ret[r]:
146                    ret[r][row[1]] = {}
147                if row[2] in ret[r][row[1]]:
148                    raise RuntimeError("set twice!!")
149                ret[r][row[1]][row[2]] = row[3]
150        return ret
def getMeasures(self):
152    def getMeasures(self):
153        self.cursor.execute("SELECT DISTINCT key FROM result")
154        return self.toList(self.cursor.fetchall())
def getDenominators(self):
156    def getDenominators(self):
157        self.cursor.execute("SELECT DISTINCT denominator FROM result")
158        return self.toList(self.cursor.fetchall())
def getNamedRunAttribute(self, attr):
160    def getNamedRunAttribute(self, attr):
161        self.cursor.execute(
162            "SELECT DISTINCT value FROM run WHERE key=?;", (attr,))
163        return self.toList(self.cursor.fetchall())
def getNamedAttributeFromRun(self, rid, key):
165    def getNamedAttributeFromRun(self, rid, key):
166        self.cursor.execute(
167            "SELECT DISTINCT value FROM run WHERE id=? and key=?;", (rid, key))
168        return self.toList(self.cursor.fetchall())
def close(self):
170    def close(self):
171        self.conn.close()