|
|
- #!/usr/bin/env python3
-
- from util import randomSAT
- from util import kSAT
- import util.script as scriptUtils
- import pymongo
- import ssl
-
- def main():
- args = __parseArguments()
-
- dbContext = __getDBContext(args["dbConfigPath"])
-
- __generateExperiment(args, dbContext)
-
- dbContext["client"].close()
-
- def __generateExperiment(args, dbContext):
- experimentScope = __prepareExperimentScope(args)
-
- for i in range(args["instances"]):
- sat = randomSAT.generateRandomKSAT(args["clauses"],
- args["variables"],
- args["variablesPerClause"])
-
-
- instanceId = dbContext["instances"].insert_one(__packDocument(sat)).inserted_id
-
- experimentScope["instances"].append(instanceId)
-
- dbContext["experimentScopes"].insert_one(experimentScope)
-
- def __packDocument(instance):
- doc = instance.writeJSONLike();
-
- doc["degrees_of_variables"] = __packDegreesOfVariables(instance)
-
- doc["conflicts"] = __packConflicts(instance)
-
- return doc
-
- def __packDegreesOfVariables(instance):
- doc = []
-
- for var, degree in instance.getDegreesOfVariables().items():
- doc.append({"var": var, "deg": degree})
-
- return doc
-
- def __packConflicts(instance):
- doc = [{"var": i + 1,
- "clauses": {
- "pos_lit": [],
- "neg_lit": []}} for i in range(instance.getNumberOfVariables())]
-
- for conflict in instance.getConflicts():
-
- for binding in conflict:
- clause = binding[0]
- lit = binding[1]
- varIndex = abs(lit) - 1
-
- if lit > 0:
- if clause not in doc[varIndex]["clauses"]["pos_lit"]:
- doc[varIndex]["clauses"]["pos_lit"].append(clause)
- else:
- if clause not in doc[varIndex]["clauses"]["neg_lit"]:
- doc[varIndex]["clauses"]["neg_lit"].append(clause)
-
-
- return doc
-
- def __prepareExperimentScope(args):
- experimentScope = {}
- experimentScope["instances"] = []
-
- description = "This experiment contains %d instances " % args["instances"]
- description += "each with %d clauses, %d variables " % (args["clauses"],
- args["variables"])
- description += ("and %d variables per clause (c/v = %.2f)"
- %(args["variablesPerClause"],
- float(args["clauses"]) / float(args["variables"])))
-
- experimentScope["description"] = description
-
- experimentScope["_id"] = args["experimentId"].strip()
-
- return experimentScope
-
-
- def __getDBClient(dbConfigPath):
- dbConf = scriptUtils.readConfig(dbConfigPath)
- dbConf["CONNECTION"]
-
- return pymongo.MongoClient(
- "mongodb://%s:%s@%s:%s/%s"
- % ( dbConf["CONNECTION"]["user"],
- dbConf["CONNECTION"]["pw"],
- dbConf["CONNECTION"]["url"],
- dbConf["CONNECTION"]["port"],
- dbConf["CONNECTION"]["database"]),
- ssl=True,
- ssl_cert_reqs=ssl.CERT_NONE)
-
-
- def __getDBContext(dbConfigPath):
- dbContext = {}
-
- dbContext["client"] = __getDBClient(dbConfigPath)
- dbContext["db"] = dbContext["client"]["experiments"]
- dbContext["instances"] = dbContext["db"]["instances"]
- dbContext["experimentScopes"] = dbContext["db"]["experiment_scopes"]
-
- return dbContext
-
- def __parseArguments():
- parser = scriptUtils.ArgParser()
-
- parser.addArg(alias="instances", shortFlag="i", longFlag="instances",
- help="number of random kSAT instances", type=int)
-
- parser.addArg(alias="variables", shortFlag="v", longFlag="variables",
- help="number of variables in the ksat instances", type=int)
-
- parser.addArg(alias="clauses", shortFlag="c", longFlag="clauses",
- help="number of clauses in the ksat instances", type=int)
-
- parser.addArg(alias="variablesPerClause", shortFlag="vpc",
- longFlag="variables_per_clause",
- help="variables per clause in the kSAT instances", type=int,
- default=3)
-
- parser.addArg(alias="dbConfigPath", shortFlag="d", longFlag="db_config",
- help="path to the database config file", type=str,
- default="database.config")
-
- parser.addArg(alias="experimentId", shortFlag="id", longFlag="experiment_id",
- help="the name or id of the experiment", type=str)
-
-
- return parser.parse()
-
- if __name__ == "__main__":
- main()
|