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()
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
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