{
"cells": [
{
"cell_type": "markdown",
"id": "korean-footage",
"metadata": {},
"source": [
"# Comprehensive Constraints Analysis - Final\n",
"\n",
"In this notebook, for the original dataset, the violations are determined in total."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "juvenile-ability",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "349f5cc52068481facf1df0e1bdece67",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/1149471184 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import gzip\n",
"from tqdm.notebook import tqdm\n",
"propFileDict = {}\n",
"fileLineCount = 1149471184\n",
"with gzip.open('../../gdrive-kgtk-dump-2020-12-07/claims.tsv.gz','r') as fin: \n",
" headerLine = next(fin).decode(\"utf-8\")\n",
"# tstCount = 0\n",
" for line in tqdm(fin, total = fileLineCount):\n",
" line = line.decode(\"utf-8\")\n",
" lineP = line.rstrip().split(\"\\t\")\n",
" if \"external-id\" in lineP[-1]:\n",
" continue\n",
" prop = lineP[2]\n",
" if prop not in propFileDict:\n",
" propFileDict[prop] = open(\"../../propertiesSplit_Final/claims.\"+str(prop)+\".tsv\",\"w\")\n",
" propFileDict[prop].write(headerLine)\n",
" propFileDict[prop].write(line)\n",
"# tstCount += 1\n",
"# if tstCount == 10:\n",
"# break\n",
" for file1 in propFileDict.values():\n",
" file1.close()"
]
},
{
"cell_type": "markdown",
"id": "matched-strength",
"metadata": {},
"source": [
"# Generate Queries"
]
},
{
"cell_type": "markdown",
"id": "black-insured",
"metadata": {},
"source": [
"## Type Constraint\n",
"\n",
"Type constraint indicates that node1 must be an instance of or subclass of the class specified."
]
},
{
"cell_type": "markdown",
"id": "interior-humor",
"metadata": {},
"source": [
"### Understand Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "brown-packing",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-05-10 20:16:55 sqlstore]: IMPORT graph directly into table graph_1 from /data/wd-correctness/gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz ...\n",
"[2021-05-10 20:16:55 sqlstore]: IMPORT graph directly into table graph_2 from /data/wd-correctness/gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz ...\n",
"[2021-05-10 20:16:56 query]: SQL Translation:\n",
"---------------------------------------------\n",
" SELECT graph_1_c1.\"id\" \"_aLias.id\", graph_1_c1.\"node1\" \"_aLias.node1\", graph_2_c2.\"label\" \"_aLias.label\", graph_2_c2.\"node2\" \"_aLias.node2\", graph_1_c1.\"node2;wikidatatype\" \"_aLias.node2;wikidatatype\"\n",
" FROM graph_1 AS graph_1_c1, graph_2 AS graph_2_c2\n",
" WHERE graph_1_c1.\"label\"=?\n",
" AND graph_1_c1.\"node2;wikidatatype\"=graph_1_c1.\"node2;wikidatatype\"\n",
" AND ((graph_1_c1.\"id\" = graph_2_c2.\"node1\") AND (graph_1_c1.\"node2\" = ?))\n",
" PARAS: ['P2302', 'Q21503250']\n",
"---------------------------------------------\n",
"[2021-05-10 20:16:56 sqlstore]: CREATE INDEX on table graph_1 column label ...\n",
"[2021-05-10 20:16:56 sqlstore]: ANALYZE INDEX on table graph_1 column label ...\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz \\\n",
" ../../gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz \\\n",
" --match \"p: (nodeProp1)-[nodePropEdge:P2302]->(nodeabc{wikidatatype:wikidatatype}), q: (nodePropEdge1)-[nodePropEdgeProps]->(val)\" \\\n",
" --where 'nodePropEdge.id = nodePropEdge1 and nodeabc = \"Q21503250\"' \\\n",
" --return 'nodePropEdge.id as id, nodeProp1 as node1, nodePropEdgeProps.label as label, val as node2, wikidatatype as `node2;wikidatatype`' \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints_all.tsv \\\n",
" --graph-cache ../../sqlite3_caches/temp156.sqlite3.db"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "clinical-brunei",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"df = pd.read_csv('../../constraintsOP/typeConstraint/claims.type-constraints_all.tsv',sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "assured-cleaners",
"metadata": {},
"outputs": [],
"source": [
"df1 = df.groupby(['node1','label']).node2.apply(lambda p: p.tolist()).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "sharing-evolution",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" node1 \n",
" label \n",
" node2 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" P1001 \n",
" P2308 \n",
" [Q102496, Q105985, Q1140371, Q1151067, Q119768... \n",
" \n",
" \n",
" 1 \n",
" P1001 \n",
" P2309 \n",
" [Q30208840] \n",
" \n",
" \n",
" 2 \n",
" P1002 \n",
" P2308 \n",
" [Q630010] \n",
" \n",
" \n",
" 3 \n",
" P1002 \n",
" P2309 \n",
" [Q21514624] \n",
" \n",
" \n",
" 4 \n",
" P1004 \n",
" P2308 \n",
" [Q2221906, Q23413, Q3947, Q41176, Q88291] \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" node1 label node2\n",
"0 P1001 P2308 [Q102496, Q105985, Q1140371, Q1151067, Q119768...\n",
"1 P1001 P2309 [Q30208840]\n",
"2 P1002 P2308 [Q630010]\n",
"3 P1002 P2309 [Q21514624]\n",
"4 P1004 P2308 [Q2221906, Q23413, Q3947, Q41176, Q88291]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "still-trail",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" node1 \n",
" label \n",
" node2 \n",
" \n",
" \n",
" \n",
" \n",
" 9318 \n",
" P8138 \n",
" P2308 \n",
" [Q27096213] \n",
" \n",
" \n",
" 9319 \n",
" P8138 \n",
" P2309 \n",
" [Q21514624] \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" node1 label node2\n",
"9318 P8138 P2308 [Q27096213]\n",
"9319 P8138 P2309 [Q21514624]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1[df1['node1'] == 'P8138']"
]
},
{
"cell_type": "markdown",
"id": "solid-browser",
"metadata": {},
"source": [
"### Query Generator"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "bright-impossible",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5d29b6306baa42f2ac3d05865c80f312",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/4810 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Something failed for prop: P1249\n",
"Something failed for prop: P6790\n"
]
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 1\n",
"\n",
"fOP = None\n",
"\n",
"for prop in tqdm(df1.node1.unique()):\n",
" try:\n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" relation = df1[(df1['node1'] == prop) & (df1['label'] == 'P2309')].node2.values[0][0]\n",
" type1 = df1[(df1['node1'] == prop) & (df1['label'] == 'P2316')].node2.values\n",
"# print(type1)\n",
"\n",
" parents = df1[(df1['node1'] == prop) & (df1['label'] == 'P2308')].node2.values[0]\n",
" exceptions = df1[(df1['node1'] == prop) & (df1['label'] == 'P2303')].node2.values\n",
" \n",
" if relation == \"Q21503252\":\n",
" parentFile = \"P31\"\n",
" parentTitle = 'instanceOf'\n",
" elif relation == \"Q21514624\":\n",
" parentFile = \"P279\"\n",
" parentTitle = 'subclass'\n",
" else:\n",
" parentFile = \"isa\"\n",
" parentTitle = 'instanceOfOrSubclass'\n",
"\n",
" if len(type1) != 0 and type1[0][0] == \"Q21502408\":\n",
" typeVal = \"mandatory\"\n",
" elif len(type1) != 0 and type1[0][0] == \"Q62026391\":\n",
" typeVal = \"suggestion\"\n",
" else:\n",
" typeVal = \"normal\"\n",
"\n",
" if len(exceptions):\n",
" exceptionPart = \"or node1 in \" + str(exceptions[0]).replace(\"'\",'\"')\n",
" else:\n",
" exceptionPart = \"\"\n",
" \n",
" folderName = 'typeConstraint'\n",
" shellFileSuffix = 'typeConstraintValidator'\n",
" \n",
" if cnt % 150 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" fCnt += 1\n",
" \n",
" fOP.write(\"{ time (kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" ../../wikidata-20210215/derived.\" + parentFile + \".tsv.gz \\\n",
" ../../wikidata-20210215/derived.P279star.tsv.gz \\\n",
" --match 'm: (node1)-[nodeProp]->(node2), \" + parentFile + \": (node1)-[]->(nodex), P279star: (nodex)-[]->(par)' \\\n",
" --where 'par in \" + str(parents).replace(\"'\",'\"') + \" \" + exceptionPart + \"' \\\n",
" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp.tsv \\\n",
" --graph-cache ../../sqlite3_caches/type_new_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect_temp.tsv ;\\\n",
" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect_temp.tsv \\\n",
" ../../wikidata-20210215/derived.\" + parentFile + \".tsv.gz \\\n",
" --match 'm: (node1)-[nodeProp]->(node2), \" + parentFile + \": (node1)-[]->(par)' \\\n",
" --where 'par in \" + str(parents).replace(\"'\",'\"') + \" \" + exceptionPart + \"' \\\n",
" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp2.tsv \\\n",
" --graph-cache ../../sqlite3_caches/type_new_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect_temp.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp2.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect.tsv ; \\\n",
" kgtk --debug cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp2.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct.tsv ; \\\n",
" ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/\" + shellFileSuffix + str(fCnt) + \".txt;\\n\")\n",
"\n",
" cnt += 1\n",
" except:\n",
" print(\"Something failed for prop:\",prop)\n",
"\n",
"if fOP:\n",
" fOP.close()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "electrical-agreement",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1456"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "outside-stupid",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,14):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/typeConstraintValidator\"+str(i)+\".sh\")\n",
" "
]
},
{
"cell_type": "markdown",
"id": "competitive-canvas",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "casual-perth",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "eab7c7290e7748a1b59fbedaa7537bad",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7da52562efb548ef9209ef336c1922ab",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/825 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3cf38a90180c483b805b65a71892b10b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/55 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e761a56b4c9c426ca936dff29115a31d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/6400 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"typeConstViolations = {}\n",
"\n",
"def countLines(fname):\n",
" cnt = -1\n",
" with open(fname, 'r') as f:\n",
" for line in f:\n",
" cnt += 1\n",
" return cnt\n",
"\n",
"propList = set()\n",
"\n",
"violations = {}\n",
"\n",
"for folder in tqdm(iter(['mandatory', 'suggestion', 'normal'])):\n",
" typeConstViolations[folder] = {'instanceOf': {'correct': 0, 'incorrect': 0}, 'subclass': {'correct': 0, 'incorrect': 0}, 'instanceOfOrSubclass': {'correct': 0, 'incorrect': 0},'propCount': 0}\n",
" filePath = \"../../allConstraintsAnalysis_Final/typeConstraint/\"+folder+\"/\"\n",
" for filename in tqdm(os.listdir(filePath)):\n",
" type1 = filename.split(\".\")[2]\n",
" prop = filename.split(\".\")[3]\n",
" propList.add(prop)\n",
" correctness = filename.split(\".\")[4]\n",
" count1 = countLines(filePath+filename)\n",
" if correctness not in ['correct','incorrect']:\n",
" continue\n",
" typeConstViolations[folder][type1][correctness] += count1\n",
" if prop not in violations:\n",
" violations[prop] = {'correct': 0, 'incorrect': 0, 'paths': []}\n",
" violations[prop][correctness] = count1\n",
" violations[prop]['paths'].append(filePath+filename)\n",
" if correctness == 'correct':\n",
" typeConstViolations[folder]['propCount'] += 1\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "golden-affiliate",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1456 properties processed for type constraint for 513424170 statements\n"
]
}
],
"source": [
"recordCount = 0\n",
"for elem in typeConstViolations.keys():\n",
" for key1 in typeConstViolations[elem].keys():\n",
" try:\n",
" recordCount += typeConstViolations[elem][key1]['correct'] + typeConstViolations[elem][key1]['incorrect']\n",
" except:\n",
" continue\n",
"print(f\"{len(propList)} properties processed for type constraint for {recordCount} statements\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "needed-portfolio",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"typeConstDF = pd.DataFrame(violations).T"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "lesser-thomson",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF['violation_ratio'] = typeConstDF.apply(lambda p: p.incorrect / (p.correct + p.incorrect), axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "flying-context",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P8379 \n",
" 29 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.093750 \n",
" \n",
" \n",
" P5105 \n",
" 1919 \n",
" 95 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.047170 \n",
" \n",
" \n",
" P720 \n",
" 403 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.000000 \n",
" \n",
" \n",
" P3022 \n",
" 3743 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.000000 \n",
" \n",
" \n",
" P512 \n",
" 101717 \n",
" 95 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.000933 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P8379 29 3 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P5105 1919 95 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P720 403 0 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P3022 3743 0 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P512 101717 95 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"\n",
" violation_ratio \n",
"P8379 0.093750 \n",
"P5105 0.047170 \n",
"P720 0.000000 \n",
"P3022 0.000000 \n",
"P512 0.000933 "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "competitive-peeing",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P8138 \n",
" 0 \n",
" 461 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P5051 \n",
" 0 \n",
" 64 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P2303 \n",
" 0 \n",
" 39 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P1227 \n",
" 0 \n",
" 19 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P2308 \n",
" 0 \n",
" 17 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P6001 \n",
" 0 \n",
" 16 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P8738 \n",
" 0 \n",
" 14 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P538 \n",
" 0 \n",
" 10 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P8004 \n",
" 0 \n",
" 6 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P5589 \n",
" 0 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P6510 \n",
" 0 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P7174 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P6014 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P817 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
" P4882 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P8138 0 461 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P5051 0 64 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P2303 0 39 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P1227 0 19 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P2308 0 17 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P6001 0 16 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P8738 0 14 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P538 0 10 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P8004 0 6 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P5589 0 4 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P6510 0 4 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P7174 0 3 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P6014 0 3 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P817 0 3 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P4882 0 3 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"\n",
" violation_ratio \n",
"P8138 1.0 \n",
"P5051 1.0 \n",
"P2303 1.0 \n",
"P1227 1.0 \n",
"P2308 1.0 \n",
"P6001 1.0 \n",
"P8738 1.0 \n",
"P538 1.0 \n",
"P8004 1.0 \n",
"P5589 1.0 \n",
"P6510 1.0 \n",
"P7174 1.0 \n",
"P6014 1.0 \n",
"P817 1.0 \n",
"P4882 1.0 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF.sort_values(by=['violation_ratio','incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "clinical-lawsuit",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 1456.000000\n",
"mean 0.100094\n",
"std 0.222405\n",
"min 0.000000\n",
"25% 0.000708\n",
"50% 0.009036\n",
"75% 0.061943\n",
"max 1.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "wanted-domestic",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Type Constraint Violation Ratios')"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"typeConstDF['violation_ratio'].plot.hist(bins=100).set_title(\"Type Constraint Violation Ratios\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "sufficient-hollywood",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Type Constraint Violation Ratios (<=0.05)')"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"typeConstDF[typeConstDF['violation_ratio'] <= 0.05].violation_ratio.plot.hist(bins=100).set_title(\"Type Constraint Violation Ratios (<=0.05)\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "minor-marshall",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"No. of constraints whose violation ratio is greater than mean :0/1456\n"
]
}
],
"source": [
"print(f\"No. of constraints whose violation ratio is greater than mean :{sum(typeConstDF['violation_ratio'] >= 5.286054)}/{len(typeConstDF)}\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "revolutionary-violence",
"metadata": {},
"outputs": [],
"source": [
"for key1 in typeConstViolations.keys():\n",
" typeConstViolations[key1]['correct'] = typeConstViolations[key1]['instanceOf']['correct'] + typeConstViolations[key1]['subclass']['correct'] + typeConstViolations[key1]['instanceOfOrSubclass']['correct']\n",
" typeConstViolations[key1]['incorrect'] = typeConstViolations[key1]['instanceOf']['incorrect'] + typeConstViolations[key1]['subclass']['incorrect'] + typeConstViolations[key1]['instanceOfOrSubclass']['incorrect']\n",
" typeConstViolations[key1]['VR'] = typeConstViolations[key1]['incorrect'] / (typeConstViolations[key1]['correct'] + typeConstViolations[key1]['incorrect'])\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "emotional-favorite",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'mandatory': {'instanceOf': {'correct': 44771087, 'incorrect': 37435},\n",
" 'subclass': {'correct': 1966, 'incorrect': 30},\n",
" 'instanceOfOrSubclass': {'correct': 221394, 'incorrect': 204},\n",
" 'propCount': 165,\n",
" 'correct': 44994447,\n",
" 'incorrect': 37669,\n",
" 'VR': 0.0008364918939185536},\n",
" 'suggestion': {'instanceOf': {'correct': 61720, 'incorrect': 18709},\n",
" 'subclass': {'correct': 0, 'incorrect': 0},\n",
" 'instanceOfOrSubclass': {'correct': 23314, 'incorrect': 2939},\n",
" 'propCount': 11,\n",
" 'correct': 85034,\n",
" 'incorrect': 21648,\n",
" 'VR': 0.20292083013066872},\n",
" 'normal': {'instanceOf': {'correct': 398242129, 'incorrect': 3281243},\n",
" 'subclass': {'correct': 96605, 'incorrect': 9501},\n",
" 'instanceOfOrSubclass': {'correct': 66370309, 'incorrect': 285585},\n",
" 'propCount': 1280,\n",
" 'correct': 464709043,\n",
" 'incorrect': 3576329,\n",
" 'VR': 0.007637071781093346}}"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstViolations"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "aggregate-impact",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" total \n",
" \n",
" \n",
" \n",
" \n",
" P2093 \n",
" 134805165 \n",
" 543246 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.004014 \n",
" 135348411 \n",
" \n",
" \n",
" P1476 \n",
" 39898142 \n",
" 1858292 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.044503 \n",
" 41756434 \n",
" \n",
" \n",
" P577 \n",
" 38855314 \n",
" 33977 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.000874 \n",
" 38889291 \n",
" \n",
" \n",
" P1433 \n",
" 36723283 \n",
" 12050 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.000328 \n",
" 36735333 \n",
" \n",
" \n",
" P1215 \n",
" 33099195 \n",
" 24104 \n",
" [../../allConstraintsAnalysis_Final/typeConstr... \n",
" 0.000728 \n",
" 33123299 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2093 134805165 543246 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P1476 39898142 1858292 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P577 38855314 33977 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P1433 36723283 12050 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"P1215 33099195 24104 [../../allConstraintsAnalysis_Final/typeConstr... \n",
"\n",
" violation_ratio total \n",
"P2093 0.004014 135348411 \n",
"P1476 0.044503 41756434 \n",
"P577 0.000874 38889291 \n",
"P1433 0.000328 36735333 \n",
"P1215 0.000728 33123299 "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF['total'] = typeConstDF['correct'] + typeConstDF['incorrect']\n",
"typeConstDF.sort_values(by=['total'],ascending=False).head()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "grateful-telling",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF.to_csv('../../allConstraintsAnalysis_Final/typeConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "bearing-kruger",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 124,
"id": "veterinary-fault",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9b0ae1938e10429e8c42a485d82b5dcf",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/52 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"codepConstViolations = {}\n",
"\n",
"codepConstViolations = {}\n",
"codepConstPropList = set()\n",
"\n",
"def extractTimes(filename):\n",
" times = []\n",
" with open(filename) as f:\n",
" for line in f:\n",
" if \"real\" in line:\n",
" line = line.strip()\n",
" time1 = line.split(\"\\t\")[1]\n",
" mins, sec = time1.split(\"m\")\n",
" mins = int(mins)\n",
" sec = float(sec[:-1])\n",
" times.append(60 * mins + sec)\n",
" return times\n",
"\n",
"# codepConstViolationsSummary = {}\n",
"times = []\n",
"filePath = '/data/wd-correctness/propertiesSplit_Final/checkViolations/exec_logs/'\n",
"for filename in tqdm(os.listdir(filePath)):\n",
" if filename.startswith(\"typeConstraintValidator\"):\n",
" tempTimes = extractTimes(filePath + filename)\n",
" times += tempTimes"
]
},
{
"cell_type": "code",
"execution_count": 125,
"id": "infinite-assembly",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 1456.000000\n",
"mean 366.161277\n",
"std 486.075212\n",
"min 4.953000\n",
"25% 102.821500\n",
"50% 174.777000\n",
"75% 455.812750\n",
"max 5231.151000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 126,
"id": "opened-essex",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Distribution of times (in s) taken for type constraint checks')"
]
},
"execution_count": 126,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"sns.lineplot(data=pd.Series(times)).set_title(\"Distribution of times (in s) taken for type constraint checks\")"
]
},
{
"cell_type": "markdown",
"id": "intense-computer",
"metadata": {},
"source": [
"## Value Type Constraint\n",
"\n",
"Here, the constraint indicates that node2 must be an instance of or subclass of the specified class"
]
},
{
"cell_type": "markdown",
"id": "animated-companion",
"metadata": {},
"source": [
"### Understand Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "preceding-distribution",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-05-10 20:31:12 sqlstore]: IMPORT graph directly into table graph_1 from /data/wd-correctness/gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz ...\n",
"[2021-05-10 20:31:14 sqlstore]: IMPORT graph directly into table graph_2 from /data/wd-correctness/gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz ...\n",
"[2021-05-10 20:31:15 query]: SQL Translation:\n",
"---------------------------------------------\n",
" SELECT graph_1_c1.\"id\" \"_aLias.id\", graph_1_c1.\"node1\" \"_aLias.node1\", graph_2_c2.\"label\" \"_aLias.label\", graph_2_c2.\"node2\" \"_aLias.node2\", graph_1_c1.\"node2;wikidatatype\" \"_aLias.node2;wikidatatype\"\n",
" FROM graph_1 AS graph_1_c1, graph_2 AS graph_2_c2\n",
" WHERE graph_1_c1.\"label\"=?\n",
" AND graph_1_c1.\"node2;wikidatatype\"=graph_1_c1.\"node2;wikidatatype\"\n",
" AND ((graph_1_c1.\"id\" = graph_2_c2.\"node1\") AND (graph_1_c1.\"node2\" = ?))\n",
" PARAS: ['P2302', 'Q21510865']\n",
"---------------------------------------------\n",
"[2021-05-10 20:31:15 sqlstore]: CREATE INDEX on table graph_1 column label ...\n",
"[2021-05-10 20:31:15 sqlstore]: ANALYZE INDEX on table graph_1 column label ...\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz \\\n",
" ../../gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz \\\n",
" --match \"p: (nodeProp1)-[nodePropEdge:P2302]->(nodeabc{wikidatatype:wikidatatype}), q: (nodePropEdge1)-[nodePropEdgeProps]->(val)\" \\\n",
" --where 'nodePropEdge.id = nodePropEdge1 and nodeabc = \"Q21510865\"' \\\n",
" --return 'nodePropEdge.id as id, nodeProp1 as node1, nodePropEdgeProps.label as label, val as node2, wikidatatype as `node2;wikidatatype`' \\\n",
" -o ../../constraintsOP/valuetypeConstraint/claims.type-constraints_all1.tsv \\\n",
" --graph-cache ../../sqlite3_caches/temp1345.valuetype.sqlite3.db"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "static-profit",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"dfValueType = pd.read_csv('../../constraintsOP/valuetypeConstraint/claims.type-constraints_all1.tsv',sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "worthy-malawi",
"metadata": {},
"outputs": [],
"source": [
"dfValueType = dfValueType.groupby(['node1','label']).node2.apply(lambda p: p.tolist()).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "eleven-tiffany",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" node1 \n",
" label \n",
" node2 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" P1000 \n",
" P2308 \n",
" [Q1241356] \n",
" \n",
" \n",
" 1 \n",
" P1000 \n",
" P2309 \n",
" [Q30208840] \n",
" \n",
" \n",
" 2 \n",
" P1001 \n",
" P2308 \n",
" [Q20926517, Q2881272, Q2882257, Q3624078, Q389... \n",
" \n",
" \n",
" 3 \n",
" P1001 \n",
" P2309 \n",
" [Q30208840] \n",
" \n",
" \n",
" 4 \n",
" P1002 \n",
" P2308 \n",
" [Q2576663] \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" node1 label node2\n",
"0 P1000 P2308 [Q1241356]\n",
"1 P1000 P2309 [Q30208840]\n",
"2 P1001 P2308 [Q20926517, Q2881272, Q2882257, Q3624078, Q389...\n",
"3 P1001 P2309 [Q30208840]\n",
"4 P1002 P2308 [Q2576663]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfValueType.head()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "expired-stuff",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['P2308', 'P2309', 'P2303', 'P2316', 'P6607', 'P2304'], dtype=object)"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfValueType['label'].unique()"
]
},
{
"cell_type": "markdown",
"id": "digital-harvard",
"metadata": {},
"source": [
"### Query Generator"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "white-badge",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "113614976cb74d2ba2e2f42741d14d93",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/932 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Something failed for prop: P1389\n"
]
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 1\n",
"\n",
"fOP = None\n",
"\n",
"for prop in tqdm(dfValueType.node1.unique()):\n",
" try:\n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" relation = dfValueType[(dfValueType['node1'] == prop) & (dfValueType['label'] == 'P2309')].node2.values[0][0]\n",
" type1 = dfValueType[(dfValueType['node1'] == prop) & (dfValueType['label'] == 'P2316')].node2.values\n",
"# print(type1)\n",
"\n",
" parents = dfValueType[(dfValueType['node1'] == prop) & (dfValueType['label'] == 'P2308')].node2.values[0]\n",
" exceptions = dfValueType[(dfValueType['node1'] == prop) & (dfValueType['label'] == 'P2303')].node2.values\n",
" \n",
" if relation == \"Q21503252\":\n",
" parentFile = \"P31\"\n",
" parentTitle = 'instanceOf'\n",
" elif relation == \"Q21514624\":\n",
" parentFile = \"P279\"\n",
" parentTitle = 'subclass'\n",
" else:\n",
" parentFile = \"isa\"\n",
" parentTitle = 'instanceOfOrSubclass'\n",
"\n",
" if len(type1) != 0 and type1[0][0] == \"Q21502408\":\n",
" typeVal = \"mandatory\"\n",
" elif len(type1) != 0 and type1[0][0] == \"Q62026391\":\n",
" typeVal = \"suggestion\"\n",
" else:\n",
" typeVal = \"normal\"\n",
"\n",
" if len(exceptions):\n",
" exceptionPart = \"or node2 in \" + str(exceptions[0]).replace(\"'\",'\"')\n",
" else:\n",
" exceptionPart = \"\"\n",
" \n",
" folderName = 'valueTypeConstraint'\n",
" shellFileSuffix = 'valueTypeConstraintValidator'\n",
" \n",
" if cnt % 120 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" fCnt += 1\n",
" \n",
" fOP.write(\"{ time (kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" ../../wikidata-20210215/derived.\" + parentFile + \".tsv.gz \\\n",
" ../../wikidata-20210215/derived.P279star.tsv.gz \\\n",
" --match 'm: (node1)-[nodeProp]->(node2), \" + parentFile + \": (node2)-[]->(nodex), P279star: (nodex)-[]->(par)' \\\n",
" --where 'par in \" + str(parents).replace(\"'\",'\"') + \" \" + exceptionPart + \"' \\\n",
" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp.tsv \\\n",
" --graph-cache ../../sqlite3_caches/valueType_new_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect_temp.tsv ;\\\n",
" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect_temp.tsv \\\n",
" ../../wikidata-20210215/derived.\" + parentFile + \".tsv.gz \\\n",
" --match 'm: (node1)-[nodeProp]->(node2), \" + parentFile + \": (node2)-[]->(par)' \\\n",
" --where 'par in \" + str(parents).replace(\"'\",'\"') + \" \" + exceptionPart + \"' \\\n",
" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp2.tsv \\\n",
" --graph-cache ../../sqlite3_caches/valueType_new_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect_temp.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp2.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect.tsv ; \\\n",
" kgtk --debug cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct_temp2.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct.tsv ; \\\n",
" ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/\" + shellFileSuffix + str(fCnt) + \".txt;\\n\")\n",
"\n",
" cnt += 1\n",
" except:\n",
" print(\"Something failed for prop:\",prop)\n",
"\n",
"if fOP:\n",
" fOP.close()"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "qualified-cursor",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"897"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "simplified-cameroon",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,9):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/valueTypeConstraintValidator\"+str(i)+\".sh\")\n",
" "
]
},
{
"cell_type": "markdown",
"id": "spectacular-warner",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "valid-defense",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "83b35f4c4ef243f6b3b9404cf9b6a64f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "78d004eb1661492f996d5525cb14d403",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/530 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "698daea7d1ac4e569b2625a3c25713ce",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/25 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "31d53a0c0bbe465493440be05085fa0a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/3930 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"valueTypeConstViolations = {}\n",
"\n",
"def countLines(fname):\n",
" cnt = -1\n",
" with open(fname, 'r') as f:\n",
" for line in f:\n",
" cnt += 1\n",
" return cnt\n",
"\n",
"valueTypePropList = set()\n",
"\n",
"violations = {}\n",
"\n",
"for folder in tqdm(iter(['mandatory', 'suggestion', 'normal'])):\n",
" valueTypeConstViolations[folder] = {'instanceOf': {'correct': 0, 'incorrect': 0}, 'subclass': {'correct': 0, 'incorrect': 0}, 'instanceOfOrSubclass': {'correct': 0, 'incorrect': 0}, 'propCount':0}\n",
" filePath = \"../../allConstraintsAnalysis_Final/valueTypeConstraint/\"+folder+\"/\"\n",
" for filename in tqdm(os.listdir(filePath)):\n",
" type1 = filename.split(\".\")[2]\n",
" prop = filename.split(\".\")[3]\n",
" valueTypePropList.add(prop)\n",
" correctness = filename.split(\".\")[4]\n",
" count1 = countLines(filePath+filename)\n",
" if correctness not in ['correct','incorrect']:\n",
" continue\n",
" valueTypeConstViolations[folder][type1][correctness] += count1\n",
" if prop not in violations:\n",
" violations[prop] = {'correct': 0, 'incorrect': 0, 'paths': []}\n",
" violations[prop][correctness] = count1\n",
" violations[prop]['paths'].append(filePath+filename)\n",
" if correctness == 'correct':\n",
" valueTypeConstViolations[folder]['propCount'] += 1\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "refined-speaking",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"897 properties processed for value type constraint for 182087480 statements\n"
]
}
],
"source": [
"recordCount = 0\n",
"for elem in valueTypeConstViolations.keys():\n",
" for key1 in valueTypeConstViolations[elem].keys():\n",
" try:\n",
" recordCount += valueTypeConstViolations[elem][key1]['correct'] + valueTypeConstViolations[elem][key1]['incorrect']\n",
" except:\n",
" continue\n",
"print(f\"{len(valueTypePropList)} properties processed for value type constraint for {recordCount} statements\")"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "designed-christian",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"valTypeConstDF = pd.DataFrame(violations).T"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "spare-hawaiian",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF['violation_ratio'] = valTypeConstDF.apply(lambda p: p.incorrect / (p.incorrect + p.correct), axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "provincial-diploma",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2302 \n",
" 42211 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 0.000000 \n",
" \n",
" \n",
" P3092 \n",
" 4620 \n",
" 29 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 0.006238 \n",
" \n",
" \n",
" P3096 \n",
" 11150 \n",
" 2 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 0.000179 \n",
" \n",
" \n",
" P3156 \n",
" 348 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 0.000000 \n",
" \n",
" \n",
" P3179 \n",
" 5057 \n",
" 8 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 0.001579 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2302 42211 0 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P3092 4620 29 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P3096 11150 2 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P3156 348 0 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P3179 5057 8 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"\n",
" violation_ratio \n",
"P2302 0.000000 \n",
"P3092 0.006238 \n",
"P3096 0.000179 \n",
"P3156 0.000000 \n",
"P3179 0.001579 "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valTypeConstDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "neural-trail",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P5008 \n",
" 0 \n",
" 331026 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P6104 \n",
" 0 \n",
" 9764 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P7374 \n",
" 0 \n",
" 32 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P2839 \n",
" 0 \n",
" 14 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P3028 \n",
" 0 \n",
" 13 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P3027 \n",
" 0 \n",
" 12 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P538 \n",
" 0 \n",
" 10 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P143 \n",
" 0 \n",
" 7 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P4425 \n",
" 0 \n",
" 6 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P6191 \n",
" 0 \n",
" 5 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P6533 \n",
" 0 \n",
" 5 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P6534 \n",
" 0 \n",
" 5 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P7174 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P922 \n",
" 0 \n",
" 2 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
" P660 \n",
" 0 \n",
" 2 \n",
" [../../allConstraintsAnalysis_Final/valueTypeC... \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P5008 0 331026 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P6104 0 9764 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P7374 0 32 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P2839 0 14 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P3028 0 13 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P3027 0 12 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P538 0 10 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P143 0 7 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P4425 0 6 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P6191 0 5 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P6533 0 5 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P6534 0 5 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P7174 0 3 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P922 0 2 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"P660 0 2 [../../allConstraintsAnalysis_Final/valueTypeC... \n",
"\n",
" violation_ratio \n",
"P5008 1.0 \n",
"P6104 1.0 \n",
"P7374 1.0 \n",
"P2839 1.0 \n",
"P3028 1.0 \n",
"P3027 1.0 \n",
"P538 1.0 \n",
"P143 1.0 \n",
"P4425 1.0 \n",
"P6191 1.0 \n",
"P6533 1.0 \n",
"P6534 1.0 \n",
"P7174 1.0 \n",
"P922 1.0 \n",
"P660 1.0 "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valTypeConstDF.sort_values(by=['violation_ratio','incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "cutting-polyester",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 897.000000\n",
"mean 0.087631\n",
"std 0.201504\n",
"min 0.000000\n",
"25% 0.000867\n",
"50% 0.008197\n",
"75% 0.053288\n",
"max 1.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valTypeConstDF['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "alert-receiver",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Value Type Constraint Violation Ratios')"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"valTypeConstDF['violation_ratio'].plot.hist(bins=100).set_title(\"Value Type Constraint Violation Ratios\")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "italian-motel",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Value Type Constraint Violation Ratios (<=0.04)')"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"valTypeConstDF[valTypeConstDF['violation_ratio'] <= 0.04].violation_ratio.plot.hist(bins=100).set_title(\"Value Type Constraint Violation Ratios (<=0.04)\")"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "prescription-ceramic",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"No. of constraints whose violation ratio is greater than mean :0/897\n"
]
}
],
"source": [
"print(f\"No. of constraints whose violation ratio is greater than mean :{sum(valTypeConstDF['violation_ratio'] >= 3.950680)}/{len(valTypeConstDF)}\")"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "tutorial-mineral",
"metadata": {},
"outputs": [],
"source": [
"for key1 in valueTypeConstViolations.keys():\n",
" valueTypeConstViolations[key1]['correct'] = valueTypeConstViolations[key1]['instanceOf']['correct'] + valueTypeConstViolations[key1]['subclass']['correct'] + valueTypeConstViolations[key1]['instanceOfOrSubclass']['correct']\n",
" valueTypeConstViolations[key1]['incorrect'] = valueTypeConstViolations[key1]['instanceOf']['incorrect'] + valueTypeConstViolations[key1]['subclass']['incorrect'] + valueTypeConstViolations[key1]['instanceOfOrSubclass']['incorrect']\n",
" valueTypeConstViolations[key1]['VR'] = valueTypeConstViolations[key1]['incorrect'] / (valueTypeConstViolations[key1]['correct'] + valueTypeConstViolations[key1]['incorrect'])\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "satellite-concern",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'mandatory': {'instanceOf': {'correct': 11391695, 'incorrect': 5338},\n",
" 'subclass': {'correct': 44764, 'incorrect': 1},\n",
" 'instanceOfOrSubclass': {'correct': 11638, 'incorrect': 47},\n",
" 'propCount': 106,\n",
" 'correct': 11448097,\n",
" 'incorrect': 5386,\n",
" 'VR': 0.0004702499667568372},\n",
" 'suggestion': {'instanceOf': {'correct': 46036, 'incorrect': 486},\n",
" 'subclass': {'correct': 118, 'incorrect': 26},\n",
" 'instanceOfOrSubclass': {'correct': 0, 'incorrect': 0},\n",
" 'propCount': 5,\n",
" 'correct': 46154,\n",
" 'incorrect': 512,\n",
" 'VR': 0.010971585308361549},\n",
" 'normal': {'instanceOf': {'correct': 88862554, 'incorrect': 847461},\n",
" 'subclass': {'correct': 4373665, 'incorrect': 11677},\n",
" 'instanceOfOrSubclass': {'correct': 76234049, 'incorrect': 257925},\n",
" 'propCount': 786,\n",
" 'correct': 169470268,\n",
" 'incorrect': 1117063,\n",
" 'VR': 0.0065483350577775325}}"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valueTypeConstViolations"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "fabulous-sudan",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF.to_csv('../../allConstraintsAnalysis_Final/valueTypeConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "traditional-shakespeare",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 127,
"id": "spoken-symphony",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5275228e86554cfeb4ac2ffbbf029d30",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/52 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"codepConstViolations = {}\n",
"\n",
"codepConstViolations = {}\n",
"codepConstPropList = set()\n",
"\n",
"def extractTimes(filename):\n",
" times = []\n",
" with open(filename) as f:\n",
" for line in f:\n",
" if \"real\" in line:\n",
" line = line.strip()\n",
" time1 = line.split(\"\\t\")[1]\n",
" mins, sec = time1.split(\"m\")\n",
" mins = int(mins)\n",
" sec = float(sec[:-1])\n",
" times.append(60 * mins + sec)\n",
" return times\n",
"\n",
"# codepConstViolationsSummary = {}\n",
"times = []\n",
"filePath = '/data/wd-correctness/propertiesSplit_Final/checkViolations/exec_logs/'\n",
"for filename in tqdm(os.listdir(filePath)):\n",
" if filename.startswith(\"valueTypeConstraintValidator\"):\n",
" tempTimes = extractTimes(filePath + filename)\n",
" times += tempTimes"
]
},
{
"cell_type": "code",
"execution_count": 128,
"id": "heavy-argentina",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 897.000000\n",
"mean 352.077361\n",
"std 612.832794\n",
"min 11.407000\n",
"25% 102.123000\n",
"50% 144.146000\n",
"75% 300.513000\n",
"max 5323.176000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 129,
"id": "organized-mixer",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Distribution of times (in s) taken for value type constraint checks')"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"sns.lineplot(data=pd.Series(times)).set_title(\"Distribution of times (in s) taken for value type constraint checks\")"
]
},
{
"cell_type": "markdown",
"id": "motivated-sympathy",
"metadata": {},
"source": [
"\n",
"## Item Requires Statement Constraint\n",
"\n",
"Here, the constraint mentions the other properties that node1 must have and the values that this property must have in few cases\n",
"\n",
"For a property, codependency constraint mentions the list of other properties that this node must have. If the property mentions an exception, this listed node is exempt from this constraint. If the property mentions an item of property constraint this node-property value must have the mentioned value . Keeping this in mind, this is how we have structured the set of queries:\n",
"\n",
"* Correct Statements without exceptions: Here, we extract all statements where the node has all other properties mentioned. Along with this, I also check if the values for each of the properties are as expected.\n",
"\n",
"\n",
"```\n",
"kgtk --debug query -i ../../propertiesSplit_Final/claims.P1421.tsv ../../propertiesSplit_Final/claims.P225.tsv ../../propertiesSplit_Final/claims.P105.tsv \n",
"--match 'P1421: (node1)-[nodeProp]->(node2), P225: (node1)-[]->(), P105: (node1)-[]->(node2_P105)' \n",
"--where 'node2_P105 in [\"Q164280\", \"Q227936\", \"Q279749\", \"Q3025161\", \"Q3181348\", \"Q3238261\", \"Q34740\", \"Q35409\", \"Q3965313\", \"Q5998839\", \"Q630771\", \"Q68947\", \"Q7432\", \"Q767728\"]' \n",
"--return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \n",
"-o ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.correct_wo_exceptions.tsv \n",
"--graph-cache ../../sqlite3_caches/cache_new_2_1.sqlite3.db;\n",
"```\n",
"\n",
"* Incorrect Statements without exceptions: Here, we just take the complement using `ifnotexists`. This might include cases where the exceptions are not exempt and hence are being called incorrect. We handle this in the next query.\n",
"\n",
"```\n",
"kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.P1421.tsv \n",
"--filter-on ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.correct_wo_exceptions.tsv \n",
"-o ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.incorrect_wo_exceptions.tsv\n",
"```\n",
"\n",
"* Incorrect with exceptions: This file will have the list of statements from the incorrect file where node1 is exempted. Now, the trick we used here is that, if there are say 3 properties which have exceptions listed, we take the intersection of all the 3 lists and use it here. This would mean a node will be called as exempted only if all 3 properties have it mentioned as an exception.\n",
"\n",
"```\n",
"kgtk --debug query -i ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.incorrect_wo_exceptions.tsv \n",
"--match '(node1)-[]->()' \n",
"--where 'node1 in [\"Q18674606\", \"Q2591510\"]' \n",
"-o ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.incorrect_w_exceptions.tsv \n",
"--graph-cache ../../sqlite3_caches/cache_new_2_1.sqlite3.db;\n",
"```\n",
"\n",
"* Pure incorrect set: This is `Incorrect Statements without exceptions` minus `Incorrect with exceptions`\n",
"\n",
"```\n",
"kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.incorrect_wo_exceptions.tsv \n",
"--filter-on ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.incorrect_w_exceptions.tsv \n",
"-o ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.incorrect.tsv;\n",
"```\n",
"\n",
"* Final correct set: This is `Correct Statements without exceptions` plus `Incorrect with exceptions`\n",
"\n",
"```\n",
"kgtk cat -i ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.correct_wo_exceptions.tsv ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.incorrect_w_exceptions.tsv \n",
"-o ../../allConstraintsAnalysis_Final/codependencyConstraint/Mand_Normal/claims.P1421.correct.tsv\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "chubby-glass",
"metadata": {},
"source": [
"### Understand Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "expired-amplifier",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-05-13 13:12:05 query]: SQL Translation:\r\n",
"---------------------------------------------\r\n",
" SELECT graph_1_c1.\"id\" \"_aLias.id\", graph_1_c1.\"node1\" \"_aLias.node1\", graph_2_c2.\"label\" \"_aLias.label\", graph_2_c2.\"node2\" \"_aLias.node2\"\r\n",
" FROM graph_1 AS graph_1_c1, graph_2 AS graph_2_c2\r\n",
" WHERE graph_1_c1.\"label\"=?\r\n",
" AND graph_1_c1.\"node2\"=?\r\n",
" AND (graph_1_c1.\"id\" = graph_2_c2.\"node1\")\r\n",
" PARAS: ['P2302', 'Q21503247']\r\n",
"---------------------------------------------\r\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz \\\n",
" ../../gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz \\\n",
" --match \"p: (nodeProp1)-[nodePropEdge:P2302]->(:Q21503247), q: (nodePropEdge1)-[nodePropEdgeProps]->(val)\" \\\n",
" --where 'nodePropEdge.id = nodePropEdge1' \\\n",
" --return 'nodePropEdge.id as id, nodeProp1 as node1, nodePropEdgeProps.label as label, val as node2' \\\n",
" -o ../../constraintsOP/itemRequiresConstraint/claims.type-constraints_all.tsv \\\n",
" --graph-cache ../../sqlite3_caches/temp1345.valuetype.sqlite3.db"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "funny-batch",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import math\n",
"dfItemRequires = pd.read_csv('../../constraintsOP/itemRequiresConstraint/claims.type-constraints_all.tsv',sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "original-expression",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.groupby(['id','node1','label']).node2.apply(lambda p: p.tolist()).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "adequate-symphony",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['P2306', 'P2305', 'P2316', 'P2304', 'P2303', 'P6607', 'P4155',\n",
" 'P31', 'P2916', 'P4680', 'P2308'], dtype=object)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "infrared-canal",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"P2306 7182\n",
"P2305 2540\n",
"P2316 2523\n",
"P2303 422\n",
"P6607 14\n",
"P2304 14\n",
"P2916 5\n",
"P4680 2\n",
"P4155 1\n",
"P2308 1\n",
"P31 1\n",
"Name: label, dtype: int64"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "focused-karen",
"metadata": {},
"outputs": [],
"source": [
"#Reference: https://stackoverflow.com/a/17298454\n",
"# dfItemRequires.pivot_table('node2', ['node1', 'id'], 'label')\n",
"dfItemRequires = dfItemRequires.pivot(index=['node1','id'], columns='label', values='node2')"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "private-boundary",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" label \n",
" P2303 \n",
" P2304 \n",
" P2305 \n",
" P2306 \n",
" P2308 \n",
" P2316 \n",
" P2916 \n",
" P31 \n",
" P4155 \n",
" P4680 \n",
" P6607 \n",
" \n",
" \n",
" node1 \n",
" id \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P1006 \n",
" P1006-P2302-Q21503247-0451ef47-0 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [P214] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1010 \n",
" P1010-P2302-Q21503247-56183614-0 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [P31] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1010-P2302-Q21503247-fd256eaf-0 \n",
" NaN \n",
" NaN \n",
" [Q794] \n",
" [P17] \n",
" NaN \n",
" [Q21502408] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1015 \n",
" P1015-P2302-Q21503247-20e3bfc5-0 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [P31] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1017 \n",
" P1017-P2302-Q21503247-bbac2ce3-0 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [P214] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"label P2303 P2304 P2305 P2306 P2308 \\\n",
"node1 id \n",
"P1006 P1006-P2302-Q21503247-0451ef47-0 NaN NaN NaN [P214] NaN \n",
"P1010 P1010-P2302-Q21503247-56183614-0 NaN NaN NaN [P31] NaN \n",
" P1010-P2302-Q21503247-fd256eaf-0 NaN NaN [Q794] [P17] NaN \n",
"P1015 P1015-P2302-Q21503247-20e3bfc5-0 NaN NaN NaN [P31] NaN \n",
"P1017 P1017-P2302-Q21503247-bbac2ce3-0 NaN NaN NaN [P214] NaN \n",
"\n",
"label P2316 P2916 P31 P4155 P4680 \\\n",
"node1 id \n",
"P1006 P1006-P2302-Q21503247-0451ef47-0 NaN NaN NaN NaN NaN \n",
"P1010 P1010-P2302-Q21503247-56183614-0 NaN NaN NaN NaN NaN \n",
" P1010-P2302-Q21503247-fd256eaf-0 [Q21502408] NaN NaN NaN NaN \n",
"P1015 P1015-P2302-Q21503247-20e3bfc5-0 NaN NaN NaN NaN NaN \n",
"P1017 P1017-P2302-Q21503247-bbac2ce3-0 NaN NaN NaN NaN NaN \n",
"\n",
"label P6607 \n",
"node1 id \n",
"P1006 P1006-P2302-Q21503247-0451ef47-0 NaN \n",
"P1010 P1010-P2302-Q21503247-56183614-0 NaN \n",
" P1010-P2302-Q21503247-fd256eaf-0 NaN \n",
"P1015 P1015-P2302-Q21503247-20e3bfc5-0 NaN \n",
"P1017 P1017-P2302-Q21503247-bbac2ce3-0 NaN "
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "conceptual-schedule",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.droplevel(1)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "third-hayes",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" label \n",
" P2303 \n",
" P2304 \n",
" P2305 \n",
" P2306 \n",
" P2308 \n",
" P2316 \n",
" P2916 \n",
" P31 \n",
" P4155 \n",
" P4680 \n",
" P6607 \n",
" \n",
" \n",
" node1 \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P1006 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [P214] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1010 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [P31] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1010 \n",
" NaN \n",
" NaN \n",
" [Q794] \n",
" [P17] \n",
" NaN \n",
" [Q21502408] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1015 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [P31] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1017 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [P214] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"label P2303 P2304 P2305 P2306 P2308 P2316 P2916 P31 P4155 P4680 \\\n",
"node1 \n",
"P1006 NaN NaN NaN [P214] NaN NaN NaN NaN NaN NaN \n",
"P1010 NaN NaN NaN [P31] NaN NaN NaN NaN NaN NaN \n",
"P1010 NaN NaN [Q794] [P17] NaN [Q21502408] NaN NaN NaN NaN \n",
"P1015 NaN NaN NaN [P31] NaN NaN NaN NaN NaN NaN \n",
"P1017 NaN NaN NaN [P214] NaN NaN NaN NaN NaN NaN \n",
"\n",
"label P6607 \n",
"node1 \n",
"P1006 NaN \n",
"P1010 NaN \n",
"P1010 NaN \n",
"P1015 NaN \n",
"P1017 NaN "
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "markdown",
"id": "shaped-companion",
"metadata": {},
"source": [
"However, there is one anomaly where the property does not have a co-dependency constraint associated with it, but still has a link to this constraint."
]
},
{
"cell_type": "markdown",
"id": "forced-christmas",
"metadata": {},
"source": [
"### Query Generator"
]
},
{
"cell_type": "markdown",
"id": "acquired-floor",
"metadata": {},
"source": [
"#### Version 1 - Mandatory + Suggestion + Normal"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "turkish-establishment",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1e84de79091d4a59a015c9b8b72bfc84",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/3147 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"File: ../../propertiesSplit_Final/claims.P345.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2604.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2355.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P3350.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1014.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2636.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1771.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2755.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8326.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P5128.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1627.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P954.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P498.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1297.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8680.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P715.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2606.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8303.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1874.tsv does not exist\n"
]
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 0\n",
"\n",
"fOP = None\n",
"\n",
"folderName = 'codependencyConstraint'\n",
"subFolderName = \"Mand_Sugg_Normal\"\n",
"shellFileSuffix = 'codepConst_MSN_Validator'\n",
"graph_cache_file_prefix = \"cache_new_1_\"\n",
"\n",
"for prop in tqdm(dfItemRequires.index.unique()):\n",
"# try:\n",
" mandatory = []\n",
" suggestion = []\n",
" normal = []\n",
" prop = str(prop)\n",
" \n",
" for _, constraint in dfItemRequires.loc[[prop]].iterrows():\n",
" if type(constraint['P2316']) == list:\n",
" if constraint['P2316'][0] == 'Q21502408':\n",
" mandatory.append(constraint)\n",
" elif constraint['P2316'][0] == 'Q62026391':\n",
" suggestion.append(constraint)\n",
" else:\n",
" normal.append(constraint)\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \"\n",
" commandOtherFiles = \"\"\n",
" commandMatch = \"--match '\"\n",
" commandMatchMoreFiles = [f\"{prop}: (node1)-[nodeProp]->(node2)\"]\n",
" commandWhere = \" --where '\"\n",
" commandWhere = []\n",
" \n",
" # Version 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
" constSet = mandatory + suggestion + normal\n",
" \n",
" if len(constSet) == 0:\n",
" continue\n",
" excptns = set()\n",
" for (rowNo, constraint) in enumerate(constSet):\n",
" prop2 = constraint['P2306']\n",
" \n",
" if type(prop2) != list:\n",
" continue\n",
" prop2 = prop2[0]\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit_Final/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv \"\n",
" if type(constraint['P2303']) == list: # Exceptions present\n",
" if len(excptns) == 0:\n",
" excptns = set(constraint['P2303'])\n",
" else:\n",
" excptns = excptns.intersection(set(constraint['P2303']))\n",
" if type(constraint['P2305']) == list:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->(node2_{prop2})\"]\n",
" commandWhere += [\"node2_\" + prop2 + \" in \" + str(list(constraint['P2305'])).replace(\"'\",'\"')]\n",
" else:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->()\"]\n",
"# print(commandMatchMoreFiles)\n",
" if len(commandWhere) == 0:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\"\n",
" else:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\" + \" --where '\"+(\" and \".join(commandWhere))+\"'\"\n",
" \n",
" if cnt % 60 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" \n",
" if len(excptns) == 0:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt;\\n\"\n",
" fOP.write(command)\n",
" else:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect_wo_exceptions.tsv\\n\"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt; \\n\"\n",
" fOP.write(command)\n",
" \n",
" \n",
" cnt += 1\n",
"# except:\n",
"# print(\"Something failed for prop:\",prop)\n",
"if fOP:\n",
" fOP.close()"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "peripheral-herald",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"527"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "incorporated-logistics",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fCnt"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "optimum-blowing",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,28):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/codepConst_MSN_Validator\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "indoor-verse",
"metadata": {},
"source": [
"#### Version 2 - Mandatory + Normal"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "furnished-paradise",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "35900bc92f3742b89eb5f6919bfb62cb",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/3147 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"File: ../../propertiesSplit_Final/claims.P345.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2604.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2355.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1014.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2636.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1771.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2755.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8326.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1627.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P954.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P498.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1297.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8680.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P715.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2606.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8303.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1874.tsv does not exist\n"
]
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 0\n",
"\n",
"fOP = None\n",
"\n",
"folderName = 'codependencyConstraint'\n",
"subFolderName = \"Mand_Normal\"\n",
"shellFileSuffix = 'codepConst_MN_Validator'\n",
"graph_cache_file_prefix = \"cache_new_2_\"\n",
"\n",
"for prop in tqdm(dfItemRequires.index.unique()):\n",
"# try:\n",
" mandatory = []\n",
" suggestion = []\n",
" normal = []\n",
" prop = str(prop)\n",
" \n",
" for _, constraint in dfItemRequires.loc[[prop]].iterrows():\n",
" if type(constraint['P2316']) == list:\n",
" if constraint['P2316'][0] == 'Q21502408':\n",
" mandatory.append(constraint)\n",
" elif constraint['P2316'][0] == 'Q62026391':\n",
" suggestion.append(constraint)\n",
" else:\n",
" normal.append(constraint)\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \"\n",
" commandOtherFiles = \"\"\n",
" commandMatch = \"--match '\"\n",
" commandMatchMoreFiles = [f\"{prop}: (node1)-[nodeProp]->(node2)\"]\n",
" commandWhere = \" --where '\"\n",
" commandWhere = []\n",
" \n",
" # Version 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
" constSet = mandatory + normal\n",
" \n",
" if len(constSet) == 0:\n",
" continue\n",
" excptns = set()\n",
" for (rowNo, constraint) in enumerate(constSet):\n",
" prop2 = constraint['P2306']\n",
" \n",
" if type(prop2) != list:\n",
" continue\n",
" prop2 = prop2[0]\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit_Final/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv \"\n",
" if type(constraint['P2303']) == list: # Exceptions present\n",
" if len(excptns) == 0:\n",
" excptns = set(constraint['P2303'])\n",
" else:\n",
" excptns = excptns.intersection(set(constraint['P2303']))\n",
" if type(constraint['P2305']) == list:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->(node2_{prop2})\"]\n",
" commandWhere += [\"node2_\" + prop2 + \" in \" + str(list(constraint['P2305'])).replace(\"'\",'\"')]\n",
" else:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->()\"]\n",
"# print(commandMatchMoreFiles)\n",
" if len(commandWhere) == 0:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\"\n",
" else:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\" + \" --where '\"+(\" and \".join(commandWhere))+\"'\"\n",
" \n",
" if cnt % 60 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" \n",
" if len(excptns) == 0:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt;\\n\"\n",
" fOP.write(command)\n",
" else:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect_wo_exceptions.tsv\\n\"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt; \\n\"\n",
" fOP.write(command)\n",
" \n",
" \n",
" cnt += 1\n",
"# except:\n",
"# print(\"Something failed for prop:\",prop)\n",
"if fOP:\n",
" fOP.close()"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "searching-individual",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"468"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "silver-clarity",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,25):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/codepConst_MN_Validator\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "prescription-access",
"metadata": {},
"source": [
"#### Version 3 - Mandatory"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "married-porter",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4c720c0c129f45e48fdf9152a95249c5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/3147 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"File: ../../propertiesSplit_Final/claims.P1627.tsv does not exist\n"
]
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 0\n",
"\n",
"folderName = 'codependencyConstraint'\n",
"subFolderName = \"Mand\"\n",
"shellFileSuffix = 'codepConst_M_Validator'\n",
"graph_cache_file_prefix = \"cache_3_new_\"\n",
"\n",
"for prop in tqdm(dfItemRequires.index.unique()):\n",
"# try:\n",
" mandatory = []\n",
" suggestion = []\n",
" normal = []\n",
" prop = str(prop)\n",
" \n",
" for _, constraint in dfItemRequires.loc[[prop]].iterrows():\n",
" if type(constraint['P2316']) == list:\n",
" if constraint['P2316'][0] == 'Q21502408':\n",
" mandatory.append(constraint)\n",
" elif constraint['P2316'][0] == 'Q62026391':\n",
" suggestion.append(constraint)\n",
" else:\n",
" normal.append(constraint)\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \"\n",
" commandOtherFiles = \"\"\n",
" commandMatch = \"--match '\"\n",
" commandMatchMoreFiles = [f\"{prop}: (node1)-[nodeProp]->(node2)\"]\n",
" commandWhere = \" --where '\"\n",
" commandWhere = []\n",
" \n",
" # Version 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
" constSet = mandatory\n",
" \n",
" if len(constSet) == 0:\n",
" continue\n",
" excptns = set()\n",
" for (rowNo, constraint) in enumerate(constSet):\n",
" prop2 = constraint['P2306']\n",
" \n",
" if type(prop2) != list:\n",
" continue\n",
" prop2 = prop2[0]\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit_Final/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv \"\n",
" if type(constraint['P2303']) == list: # Exceptions present\n",
" if len(excptns) == 0:\n",
" excptns = set(constraint['P2303'])\n",
" else:\n",
" excptns = excptns.intersection(set(constraint['P2303']))\n",
" if type(constraint['P2305']) == list:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->(node2_{prop2})\"]\n",
" commandWhere += [\"node2_\" + prop2 + \" in \" + str(list(constraint['P2305'])).replace(\"'\",'\"')]\n",
" else:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->()\"]\n",
"# print(commandMatchMoreFiles)\n",
" if len(commandWhere) == 0:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\"\n",
" else:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\" + \" --where '\"+(\" and \".join(commandWhere))+\"'\"\n",
" \n",
" if cnt % 60 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" \n",
" if len(excptns) == 0:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt;\\n\"\n",
" fOP.write(command)\n",
" else:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect_wo_exceptions.tsv\\n\"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt; \\n\"\n",
" fOP.write(command)\n",
" \n",
" \n",
" cnt += 1\n",
"# except:\n",
"# print(\"Something failed for prop:\",prop)\n",
"if fOP:\n",
" fOP.close()"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "according-blackberry",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"78"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "extraordinary-drawing",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,5):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/codepConst_M_Validator\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "subsequent-brown",
"metadata": {},
"source": [
"#### Version 4 - Normal"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "operational-migration",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5112a04504a94ca3931f2a5db93c6ae5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/3147 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"File: ../../propertiesSplit_Final/claims.P345.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2604.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2355.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1014.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2636.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1771.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2755.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8326.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P954.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P498.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1297.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8680.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P715.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2606.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8303.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1874.tsv does not exist\n"
]
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 0\n",
"\n",
"fOP = None\n",
"\n",
"folderName = 'codependencyConstraint'\n",
"subFolderName = \"Normal\"\n",
"shellFileSuffix = 'codepConst_N_Validator'\n",
"graph_cache_file_prefix = \"cache_4_new_\"\n",
"\n",
"for prop in tqdm(dfItemRequires.index.unique()):\n",
"# try:\n",
" mandatory = []\n",
" suggestion = []\n",
" normal = []\n",
" prop = str(prop)\n",
" \n",
" for _, constraint in dfItemRequires.loc[[prop]].iterrows():\n",
" if type(constraint['P2316']) == list:\n",
" if constraint['P2316'][0] == 'Q21502408':\n",
" mandatory.append(constraint)\n",
" elif constraint['P2316'][0] == 'Q62026391':\n",
" suggestion.append(constraint)\n",
" else:\n",
" normal.append(constraint)\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \"\n",
" commandOtherFiles = \"\"\n",
" commandMatch = \"--match '\"\n",
" commandMatchMoreFiles = [f\"{prop}: (node1)-[nodeProp]->(node2)\"]\n",
" commandWhere = \" --where '\"\n",
" commandWhere = []\n",
" \n",
" # Version 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
" constSet = normal\n",
" \n",
" if len(constSet) == 0:\n",
" continue\n",
" excptns = set()\n",
" for (rowNo, constraint) in enumerate(constSet):\n",
" prop2 = constraint['P2306']\n",
" \n",
" if type(prop2) != list:\n",
" continue\n",
" prop2 = prop2[0]\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit_Final/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv \"\n",
" if type(constraint['P2303']) == list: # Exceptions present\n",
" if len(excptns) == 0:\n",
" excptns = set(constraint['P2303'])\n",
" else:\n",
" excptns = excptns.intersection(set(constraint['P2303']))\n",
" if type(constraint['P2305']) == list:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->(node2_{prop2})\"]\n",
" commandWhere += [\"node2_\" + prop2 + \" in \" + str(list(constraint['P2305'])).replace(\"'\",'\"')]\n",
" else:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->()\"]\n",
"# print(commandMatchMoreFiles)\n",
" if len(commandWhere) == 0:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\"\n",
" else:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\" + \" --where '\"+(\" and \".join(commandWhere))+\"'\"\n",
" \n",
" if cnt % 60 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" \n",
" if len(excptns) == 0:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt;\\n\"\n",
" fOP.write(command)\n",
" else:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect_wo_exceptions.tsv\\n\"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv\\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt; \\n\"\n",
" fOP.write(command)\n",
" \n",
" \n",
" cnt += 1\n",
"# except:\n",
"# print(\"Something failed for prop:\",prop)\n",
"if fOP:\n",
" fOP.close()"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "harmful-binary",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"418"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "advance-married",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,23):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/codepConst_N_Validator\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "ranging-journal",
"metadata": {},
"source": [
"#### Version 5 - Suggestion"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "missing-jordan",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7db5ffb8ea4c4778aaf92a4c4d752040",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/3147 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"File: ../../propertiesSplit_Final/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P3350.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P5128.tsv does not exist\n"
]
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 0\n",
"\n",
"folderName = 'codependencyConstraint'\n",
"subFolderName = \"Suggestion\"\n",
"shellFileSuffix = 'codepConst_S_Validator'\n",
"graph_cache_file_prefix = \"codep_new_6_1_\"\n",
"\n",
"fOP = None\n",
"\n",
"for prop in tqdm(dfItemRequires.index.unique()):\n",
"# try:\n",
" mandatory = []\n",
" suggestion = []\n",
" normal = []\n",
" prop = str(prop)\n",
" \n",
" for _, constraint in dfItemRequires.loc[[prop]].iterrows():\n",
" if type(constraint['P2316']) == list:\n",
" if constraint['P2316'][0] == 'Q21502408':\n",
" mandatory.append(constraint)\n",
" elif constraint['P2316'][0] == 'Q62026391':\n",
" suggestion.append(constraint)\n",
" else:\n",
" normal.append(constraint)\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \"\n",
" commandOtherFiles = \"\"\n",
" commandMatch = \"--match '\"\n",
" commandMatchMoreFiles = [f\"{prop}: (node1)-[nodeProp]->(node2)\"]\n",
" commandWhere = \" --where '\"\n",
" commandWhere = []\n",
" \n",
" # Version 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
" constSet = suggestion\n",
" \n",
" if len(constSet) == 0:\n",
" continue\n",
" excptns = set()\n",
" for (rowNo, constraint) in enumerate(constSet):\n",
" prop2 = constraint['P2306']\n",
" \n",
" if type(prop2) != list:\n",
" continue\n",
" prop2 = prop2[0]\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit_Final/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv \"\n",
" if type(constraint['P2303']) == list: # Exceptions present\n",
" if len(excptns) == 0:\n",
" excptns = set(constraint['P2303'])\n",
" else:\n",
" excptns = excptns.intersection(set(constraint['P2303']))\n",
" if type(constraint['P2305']) == list:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->(node2_{prop2})\"]\n",
" commandWhere += [\"node2_\" + prop2 + \" in \" + str(list(constraint['P2305'])).replace(\"'\",'\"')]\n",
" else:\n",
" commandMatchMoreFiles += [f\"{prop2}: (node1)-[]->()\"]\n",
"# print(commandMatchMoreFiles)\n",
" if len(commandWhere) == 0:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\"\n",
" else:\n",
" command = commandInit + commandOtherFiles + commandMatch + (\", \".join(commandMatchMoreFiles)) + \"'\" + \" --where '\"+(\" and \".join(commandWhere))+\"'\"\n",
" \n",
" if cnt % 60 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" \n",
" if len(excptns) == 0:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt;\\n\"\n",
" fOP.write(command)\n",
" else:\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect_wo_exceptions.tsv\\n\"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/timeLog_\" + shellFileSuffix + str(fCnt) + \".txt; \\n\"\n",
" fOP.write(command)\n",
" \n",
" \n",
" cnt += 1\n",
"# except:\n",
"# print(\"Something failed for prop:\",prop)\n",
"if fOP:\n",
" fOP.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "soviet-forth",
"metadata": {},
"outputs": [],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "racial-stationery",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,6):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/codepConst_S_Validator\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "homeless-pleasure",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "welcome-dependence",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "94838068c0034792846bf1103e76dfc1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c72ed8fa7449495986c6aea38cfec315",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/1192 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a619f51c168340dcb0268d1363dabcd1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/1053 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "50c08060e0754d62bf953d216b4671f4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/156 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b85d7e61bd7b432888f8e691ad5460b1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/953 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f8e78f63140b4dedbc5bf5822db3deec",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/215 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"codepConstViolations = {}\n",
"\n",
"def countLines(fname):\n",
" cnt = -1\n",
" with open(fname, 'r') as f:\n",
" for line in f:\n",
" cnt += 1\n",
" return cnt\n",
"\n",
"codepConstViolations = {}\n",
"codepConstPropList = set()\n",
"\n",
"# codepConstViolationsSummary = {}\n",
"\n",
"for folder in tqdm(iter(['Mand_Sugg_Normal', 'Mand_Normal', 'Mand', 'Normal','Suggestion'])):\n",
" filePath = \"../../allConstraintsAnalysis_Final/codependencyConstraint/\"+folder+\"/\"\n",
" for filename in tqdm(os.listdir(filePath)):\n",
" prop = filename.split(\".\")[1]\n",
" correctness = filename.split(\".\")[2]\n",
" if correctness not in ['correct','incorrect']:\n",
" continue\n",
" codepConstPropList.add(prop)\n",
" count1 = countLines(filePath+filename)\n",
" if folder not in codepConstViolations:\n",
" codepConstViolations[folder] = {}\n",
" if prop not in codepConstViolations[folder]:\n",
" codepConstViolations[folder][prop] = {'correct': 0, 'incorrect': 0, 'paths': []}\n",
" codepConstViolations[folder][prop][correctness] = count1\n",
" codepConstViolations[folder][prop]['paths'].append(filePath+filename)\n",
" \n",
"# if folder not in codepConstViolationsSummary:\n",
"# codepConstViolationsSummary[folder] = {'correct': 0, 'incorrect': 0}\n",
"# codepConstViolationsSummary[folder][correctness] += count1"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "heated-astrology",
"metadata": {},
"outputs": [],
"source": [
"codepConstViolationsSummary = {}\n",
"for folder in codepConstViolations.keys():\n",
" for prop in codepConstViolations[folder].keys():\n",
" if folder not in codepConstViolationsSummary:\n",
" codepConstViolationsSummary[folder] = {'correct': 0, 'incorrect': 0, 'propCount': 0}\n",
" codepConstViolationsSummary[folder]['correct'] += codepConstViolations[folder][prop]['correct']\n",
" codepConstViolationsSummary[folder]['incorrect'] += codepConstViolations[folder][prop]['incorrect']\n",
" codepConstViolationsSummary[folder]['propCount'] += 1"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "grateful-catalog",
"metadata": {},
"outputs": [],
"source": [
"for elem in codepConstViolationsSummary.keys():\n",
" codepConstViolationsSummary[elem]['total'] = codepConstViolationsSummary[elem]['correct'] + codepConstViolationsSummary[elem]['incorrect']\n",
" codepConstViolationsSummary[elem]['percIncorrect'] = codepConstViolationsSummary[elem]['incorrect'] / codepConstViolationsSummary[elem]['total'] * 100"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "physical-soviet",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'Mand_Sugg_Normal': {'correct': 298173993,\n",
" 'incorrect': 4468153,\n",
" 'propCount': 527,\n",
" 'total': 302642146,\n",
" 'percIncorrect': 1.47638161407962},\n",
" 'Mand_Normal': {'correct': 273602683,\n",
" 'incorrect': 2248323,\n",
" 'propCount': 468,\n",
" 'total': 275851006,\n",
" 'percIncorrect': 0.815049773644835},\n",
" 'Mand': {'correct': 3984740,\n",
" 'incorrect': 767,\n",
" 'propCount': 78,\n",
" 'total': 3985507,\n",
" 'percIncorrect': 0.019244728462401398},\n",
" 'Normal': {'correct': 272710532,\n",
" 'incorrect': 2247659,\n",
" 'propCount': 418,\n",
" 'total': 274958191,\n",
" 'percIncorrect': 0.8174548253410643},\n",
" 'Suggestion': {'correct': 25729758,\n",
" 'incorrect': 2240178,\n",
" 'propCount': 97,\n",
" 'total': 27969936,\n",
" 'percIncorrect': 8.009235344692959}}"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstViolationsSummary"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "permanent-triumph",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3e7eafb70a1b42eba5baaffd906ee678",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/3147 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"File: ../../propertiesSplit_Final/claims.P345.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2604.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2355.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P3350.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1014.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2636.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1771.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2755.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8326.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P5128.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1627.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P954.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P498.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1297.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8680.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P715.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P2606.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P8303.tsv does not exist\n",
"File: ../../propertiesSplit_Final/claims.P1874.tsv does not exist\n"
]
}
],
"source": [
"mandatoryPropCount = 0\n",
"suggestionPropCount = 0\n",
"normalPropCount = 0\n",
"for prop in tqdm(dfItemRequires.index.unique()):\n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" prop = str(prop)\n",
" hasMandatory = False\n",
" hasSuggestion = False\n",
" hasNormal = False\n",
"\n",
" for _, constraint in dfItemRequires.loc[[prop]].iterrows():\n",
" prop2 = constraint['P2306']\n",
" \n",
" if type(prop2) != list:\n",
" continue\n",
" prop2 = prop2[0]\n",
"\n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit_Final/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" if type(constraint['P2316']) == list:\n",
" if constraint['P2316'][0] == 'Q21502408':\n",
" hasMandatory = True\n",
" elif constraint['P2316'][0] == 'Q62026391':\n",
" hasSuggestion = True\n",
" else:\n",
" hasNormal = True\n",
" if hasMandatory:\n",
" mandatoryPropCount += 1\n",
" if hasSuggestion:\n",
" suggestionPropCount += 1\n",
" if hasNormal:\n",
" normalPropCount += 1"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "boring-tooth",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"No. of props having at least 1 mandatory constraint: 76\n",
"No. of props having at least 1 suggestion constraint: 95\n",
"No. of props having at least 1 normal constraint: 408\n"
]
}
],
"source": [
"print(f\"No. of props having at least 1 mandatory constraint: {mandatoryPropCount}\")\n",
"print(f\"No. of props having at least 1 suggestion constraint: {suggestionPropCount}\")\n",
"print(f\"No. of props having at least 1 normal constraint: {normalPropCount}\")"
]
},
{
"cell_type": "markdown",
"id": "loving-double",
"metadata": {},
"source": [
"#### Version 1 - Mand Sugg Normal"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "beautiful-xerox",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"codepConstDF1 = pd.DataFrame(codepConstViolations['Mand_Sugg_Normal']).T"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "genetic-venezuela",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" \n",
" \n",
" \n",
" \n",
" P1018 \n",
" 156 \n",
" 28 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P1464 \n",
" 35000 \n",
" 831 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P1906 \n",
" 316 \n",
" 186 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2322 \n",
" 1207 \n",
" 65 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2916 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P5460 \n",
" 523 \n",
" 29 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2873 \n",
" 642 \n",
" 8 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2875 \n",
" 3547 \n",
" 16 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2876 \n",
" 51 \n",
" 14 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2900 \n",
" 21844 \n",
" 813 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
"
\n",
"
527 rows × 3 columns
\n",
"
"
],
"text/plain": [
" correct incorrect paths\n",
"P1018 156 28 [../../allConstraintsAnalysis_Final/codependen...\n",
"P1464 35000 831 [../../allConstraintsAnalysis_Final/codependen...\n",
"P1906 316 186 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2322 1207 65 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2916 0 1 [../../allConstraintsAnalysis_Final/codependen...\n",
"... ... ... ...\n",
"P5460 523 29 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2873 642 8 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2875 3547 16 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2876 51 14 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2900 21844 813 [../../allConstraintsAnalysis_Final/codependen...\n",
"\n",
"[527 rows x 3 columns]"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF1"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "powered-residence",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1['violation_ratio'] = codepConstDF1.apply(lambda p: p.incorrect / (p.correct + p.incorrect), axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "chinese-pressing",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P1111 \n",
" 0 \n",
" 46327 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2302 \n",
" 0 \n",
" 42211 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P3063 \n",
" 0 \n",
" 549 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2303 \n",
" 0 \n",
" 39 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P5447 \n",
" 0 \n",
" 23 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P5448 \n",
" 0 \n",
" 23 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2308 \n",
" 0 \n",
" 17 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P7569 \n",
" 0 \n",
" 8 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P7903 \n",
" 0 \n",
" 7 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P574 \n",
" 0 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2306 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2916 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P8264 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2307 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2309 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P1111 0 46327 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2302 0 42211 [../../allConstraintsAnalysis_Final/codependen... \n",
"P3063 0 549 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2303 0 39 [../../allConstraintsAnalysis_Final/codependen... \n",
"P5447 0 23 [../../allConstraintsAnalysis_Final/codependen... \n",
"P5448 0 23 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2308 0 17 [../../allConstraintsAnalysis_Final/codependen... \n",
"P7569 0 8 [../../allConstraintsAnalysis_Final/codependen... \n",
"P7903 0 7 [../../allConstraintsAnalysis_Final/codependen... \n",
"P574 0 4 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2306 0 3 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2916 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P8264 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2307 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2309 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"\n",
" violation_ratio \n",
"P1111 1.0 \n",
"P2302 1.0 \n",
"P3063 1.0 \n",
"P2303 1.0 \n",
"P5447 1.0 \n",
"P5448 1.0 \n",
"P2308 1.0 \n",
"P7569 1.0 \n",
"P7903 1.0 \n",
"P574 1.0 \n",
"P2306 1.0 \n",
"P2916 1.0 \n",
"P8264 1.0 \n",
"P2307 1.0 \n",
"P2309 1.0 "
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF1.sort_values(by=['violation_ratio', 'incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "demonstrated-debut",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2214 \n",
" 2962988 \n",
" 711699 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.193676 \n",
" \n",
" \n",
" P734 \n",
" 2001246 \n",
" 704728 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.260434 \n",
" \n",
" \n",
" P433 \n",
" 31028893 \n",
" 435543 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.013842 \n",
" \n",
" \n",
" P195 \n",
" 1132062 \n",
" 384602 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.253584 \n",
" \n",
" \n",
" P569 \n",
" 4646728 \n",
" 241105 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.049328 \n",
" \n",
" \n",
" P131 \n",
" 10056935 \n",
" 198870 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.019391 \n",
" \n",
" \n",
" P275 \n",
" 5955 \n",
" 123578 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.954027 \n",
" \n",
" \n",
" P2860 \n",
" 174402886 \n",
" 114713 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.000657 \n",
" \n",
" \n",
" P2017 \n",
" 84792 \n",
" 101300 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.544354 \n",
" \n",
" \n",
" P570 \n",
" 2332611 \n",
" 94455 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.038917 \n",
" \n",
" \n",
" P1435 \n",
" 1893874 \n",
" 79479 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.040276 \n",
" \n",
" \n",
" P1922 \n",
" 30451 \n",
" 63926 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.677347 \n",
" \n",
" \n",
" P708 \n",
" 45253 \n",
" 54258 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.545246 \n",
" \n",
" \n",
" P197 \n",
" 117522 \n",
" 49904 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.298066 \n",
" \n",
" \n",
" P1598 \n",
" 36544 \n",
" 46915 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.562132 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2214 2962988 711699 [../../allConstraintsAnalysis_Final/codependen... \n",
"P734 2001246 704728 [../../allConstraintsAnalysis_Final/codependen... \n",
"P433 31028893 435543 [../../allConstraintsAnalysis_Final/codependen... \n",
"P195 1132062 384602 [../../allConstraintsAnalysis_Final/codependen... \n",
"P569 4646728 241105 [../../allConstraintsAnalysis_Final/codependen... \n",
"P131 10056935 198870 [../../allConstraintsAnalysis_Final/codependen... \n",
"P275 5955 123578 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2860 174402886 114713 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2017 84792 101300 [../../allConstraintsAnalysis_Final/codependen... \n",
"P570 2332611 94455 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1435 1893874 79479 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1922 30451 63926 [../../allConstraintsAnalysis_Final/codependen... \n",
"P708 45253 54258 [../../allConstraintsAnalysis_Final/codependen... \n",
"P197 117522 49904 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1598 36544 46915 [../../allConstraintsAnalysis_Final/codependen... \n",
"\n",
" violation_ratio \n",
"P2214 0.193676 \n",
"P734 0.260434 \n",
"P433 0.013842 \n",
"P195 0.253584 \n",
"P569 0.049328 \n",
"P131 0.019391 \n",
"P275 0.954027 \n",
"P2860 0.000657 \n",
"P2017 0.544354 \n",
"P570 0.038917 \n",
"P1435 0.040276 \n",
"P1922 0.677347 \n",
"P708 0.545246 \n",
"P197 0.298066 \n",
"P1598 0.562132 "
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF1.sort_values(by=['incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "developed-zimbabwe",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"count 527.000000\n",
"mean 0.209456\n",
"std 0.306132\n",
"min 0.000000\n",
"25% 0.001024\n",
"50% 0.037037\n",
"75% 0.300012\n",
"max 1.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF1['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "unknown-johnston",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 1 - Violation Ratios')"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"codepConstDF1['violation_ratio'].plot.hist(bins=100).set_title(\"Co-Dependency Constraint - Version 1 - Violation Ratios\")"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "exceptional-dakota",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 1 - Violation Ratios <= 0.5')"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"codepConstDF1[codepConstDF1['violation_ratio'] <= 0.5].violation_ratio.plot.hist(bins=100).set_title(\"Co-Dependency Constraint - Version 1 - Violation Ratios <= 0.5\")"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "interior-joseph",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"No. of properties whose violation ratio is greater than mean: 0/527\n"
]
}
],
"source": [
"print(f\"No. of properties whose violation ratio is greater than mean: {sum(codepConstDF1['violation_ratio'] >= 3.539484)}/{len(codepConstDF1)}\")"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "english-difference",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1.to_csv('../../allConstraintsAnalysis_Final/codepConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "greater-genetics",
"metadata": {},
"source": [
"#### Version 2 - Mand Normal"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "constant-chance",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"codepConstDF2 = pd.DataFrame(codepConstViolations['Mand_Normal']).T"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "included-adjustment",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" \n",
" \n",
" \n",
" \n",
" P1538 \n",
" 194334 \n",
" 152 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2010 \n",
" 963 \n",
" 2 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P1018 \n",
" 156 \n",
" 28 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2429 \n",
" 2228 \n",
" 236 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P3864 \n",
" 301 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P3816 \n",
" 17 \n",
" 7 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P3823 \n",
" 7376 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P3834 \n",
" 2070 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P3842 \n",
" 9338 \n",
" 338 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P3858 \n",
" 3336 \n",
" 106 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
"
\n",
"
468 rows × 3 columns
\n",
"
"
],
"text/plain": [
" correct incorrect paths\n",
"P1538 194334 152 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2010 963 2 [../../allConstraintsAnalysis_Final/codependen...\n",
"P1018 156 28 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2429 2228 236 [../../allConstraintsAnalysis_Final/codependen...\n",
"P3864 301 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"... ... ... ...\n",
"P3816 17 7 [../../allConstraintsAnalysis_Final/codependen...\n",
"P3823 7376 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P3834 2070 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P3842 9338 338 [../../allConstraintsAnalysis_Final/codependen...\n",
"P3858 3336 106 [../../allConstraintsAnalysis_Final/codependen...\n",
"\n",
"[468 rows x 3 columns]"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF2"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "fundamental-knowing",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF2['violation_ratio'] = codepConstDF2.apply(lambda p: p.incorrect / (p.correct + p.incorrect), axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "harmful-discipline",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2313 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P5448 \n",
" 0 \n",
" 23 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2309 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2308 \n",
" 0 \n",
" 17 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2916 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2307 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2306 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2303 \n",
" 0 \n",
" 39 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P7569 \n",
" 0 \n",
" 8 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P8264 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P2312 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P7903 \n",
" 0 \n",
" 7 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P5447 \n",
" 0 \n",
" 23 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P574 \n",
" 0 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
" P1111 \n",
" 0 \n",
" 46327 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2313 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P5448 0 23 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2309 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2308 0 17 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2916 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2307 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2306 0 3 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2303 0 39 [../../allConstraintsAnalysis_Final/codependen... \n",
"P7569 0 8 [../../allConstraintsAnalysis_Final/codependen... \n",
"P8264 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2312 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P7903 0 7 [../../allConstraintsAnalysis_Final/codependen... \n",
"P5447 0 23 [../../allConstraintsAnalysis_Final/codependen... \n",
"P574 0 4 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1111 0 46327 [../../allConstraintsAnalysis_Final/codependen... \n",
"\n",
" violation_ratio \n",
"P2313 1.0 \n",
"P5448 1.0 \n",
"P2309 1.0 \n",
"P2308 1.0 \n",
"P2916 1.0 \n",
"P2307 1.0 \n",
"P2306 1.0 \n",
"P2303 1.0 \n",
"P7569 1.0 \n",
"P8264 1.0 \n",
"P2312 1.0 \n",
"P7903 1.0 \n",
"P5447 1.0 \n",
"P574 1.0 \n",
"P1111 1.0 "
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF2.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "unlikely-chamber",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2214 \n",
" 2962988 \n",
" 711699 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.193676 \n",
" \n",
" \n",
" P433 \n",
" 31028893 \n",
" 435543 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.013842 \n",
" \n",
" \n",
" P275 \n",
" 5955 \n",
" 123578 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.954027 \n",
" \n",
" \n",
" P2860 \n",
" 174402886 \n",
" 114713 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.000657 \n",
" \n",
" \n",
" P1435 \n",
" 1893874 \n",
" 79479 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.040276 \n",
" \n",
" \n",
" P708 \n",
" 45253 \n",
" 54258 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.545246 \n",
" \n",
" \n",
" P197 \n",
" 117522 \n",
" 49904 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.298066 \n",
" \n",
" \n",
" P1598 \n",
" 36978 \n",
" 46481 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.556932 \n",
" \n",
" \n",
" P1111 \n",
" 0 \n",
" 46327 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.000000 \n",
" \n",
" \n",
" P2248 \n",
" 4020 \n",
" 41566 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.911815 \n",
" \n",
" \n",
" P2325 \n",
" 4071 \n",
" 40611 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.908889 \n",
" \n",
" \n",
" P856 \n",
" 1239292 \n",
" 38107 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.029832 \n",
" \n",
" \n",
" P2243 \n",
" 4025 \n",
" 36540 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.900777 \n",
" \n",
" \n",
" P2244 \n",
" 4027 \n",
" 36527 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.900700 \n",
" \n",
" \n",
" P413 \n",
" 357793 \n",
" 33607 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.085864 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2214 2962988 711699 [../../allConstraintsAnalysis_Final/codependen... \n",
"P433 31028893 435543 [../../allConstraintsAnalysis_Final/codependen... \n",
"P275 5955 123578 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2860 174402886 114713 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1435 1893874 79479 [../../allConstraintsAnalysis_Final/codependen... \n",
"P708 45253 54258 [../../allConstraintsAnalysis_Final/codependen... \n",
"P197 117522 49904 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1598 36978 46481 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1111 0 46327 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2248 4020 41566 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2325 4071 40611 [../../allConstraintsAnalysis_Final/codependen... \n",
"P856 1239292 38107 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2243 4025 36540 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2244 4027 36527 [../../allConstraintsAnalysis_Final/codependen... \n",
"P413 357793 33607 [../../allConstraintsAnalysis_Final/codependen... \n",
"\n",
" violation_ratio \n",
"P2214 0.193676 \n",
"P433 0.013842 \n",
"P275 0.954027 \n",
"P2860 0.000657 \n",
"P1435 0.040276 \n",
"P708 0.545246 \n",
"P197 0.298066 \n",
"P1598 0.556932 \n",
"P1111 1.000000 \n",
"P2248 0.911815 \n",
"P2325 0.908889 \n",
"P856 0.029832 \n",
"P2243 0.900777 \n",
"P2244 0.900700 \n",
"P413 0.085864 "
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF2.sort_values(by=['incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "violent-match",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"count 468.000000\n",
"mean 0.171527\n",
"std 0.285675\n",
"min 0.000000\n",
"25% 0.000690\n",
"50% 0.017889\n",
"75% 0.208292\n",
"max 1.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF2['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "educational-thickness",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 2 - Violation Ratios')"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"codepConstDF2['violation_ratio'].plot.hist(bins=100).set_title(\"Co-Dependency Constraint - Version 2 - Violation Ratios\")"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "latin-mitchell",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 2 - Violation Ratios <= 0.5')"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"codepConstDF2[codepConstDF2['violation_ratio'] <= 0.5].violation_ratio.plot.hist(bins=100).set_title(\"Co-Dependency Constraint - Version 2 - Violation Ratios <= 0.5\")"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "asian-forwarding",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"No. of properties whose violation ratio is greater than mean: 0/468\n"
]
}
],
"source": [
"print(f\"No. of properties whose violation ratio is greater than mean: {sum(codepConstDF2['violation_ratio'] >= 2.290915)}/{len(codepConstDF2)}\")"
]
},
{
"cell_type": "markdown",
"id": "destroyed-flash",
"metadata": {},
"source": [
"#### Version 3 - Mand"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "consecutive-plenty",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"codepConstDF3 = pd.DataFrame(codepConstViolations['Mand']).T"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "digital-mileage",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" \n",
" \n",
" \n",
" \n",
" P1081 \n",
" 12300 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P5982 \n",
" 1326 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P613 \n",
" 68854 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P1087 \n",
" 2587284 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P6280 \n",
" 721 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P517 \n",
" 240 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P521 \n",
" 1717 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P555 \n",
" 3876 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P5623 \n",
" 1472 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P564 \n",
" 3899 \n",
" 2 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
"
\n",
"
78 rows × 3 columns
\n",
"
"
],
"text/plain": [
" correct incorrect paths\n",
"P1081 12300 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P5982 1326 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P613 68854 3 [../../allConstraintsAnalysis_Final/codependen...\n",
"P1087 2587284 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P6280 721 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"... ... ... ...\n",
"P517 240 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P521 1717 1 [../../allConstraintsAnalysis_Final/codependen...\n",
"P555 3876 1 [../../allConstraintsAnalysis_Final/codependen...\n",
"P5623 1472 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P564 3899 2 [../../allConstraintsAnalysis_Final/codependen...\n",
"\n",
"[78 rows x 3 columns]"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "formed-battle",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF3['violation_ratio'] = codepConstDF3.apply(lambda p: p.incorrect / p.correct if p.correct != 0 else p.incorrect/100, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "numerous-construction",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P5051 \n",
" 1 \n",
" 63 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 63.000000 \n",
" \n",
" \n",
" P4341 \n",
" 7 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.142857 \n",
" \n",
" \n",
" P2095 \n",
" 38 \n",
" 3 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.078947 \n",
" \n",
" \n",
" P990 \n",
" 966 \n",
" 41 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.042443 \n",
" \n",
" \n",
" P3931 \n",
" 2250 \n",
" 64 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.028444 \n",
" \n",
" \n",
" P1731 \n",
" 363 \n",
" 9 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.024793 \n",
" \n",
" \n",
" P2009 \n",
" 1019 \n",
" 15 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.014720 \n",
" \n",
" \n",
" P246 \n",
" 169 \n",
" 2 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.011834 \n",
" \n",
" \n",
" P8264 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.010000 \n",
" \n",
" \n",
" P1635 \n",
" 890 \n",
" 7 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.007865 \n",
" \n",
" \n",
" P944 \n",
" 577 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.006932 \n",
" \n",
" \n",
" P1560 \n",
" 3235 \n",
" 20 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.006182 \n",
" \n",
" \n",
" P2679 \n",
" 887 \n",
" 5 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.005637 \n",
" \n",
" \n",
" P451 \n",
" 10502 \n",
" 36 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.003428 \n",
" \n",
" \n",
" P2365 \n",
" 1650 \n",
" 5 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.003030 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P5051 1 63 [../../allConstraintsAnalysis_Final/codependen... \n",
"P4341 7 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2095 38 3 [../../allConstraintsAnalysis_Final/codependen... \n",
"P990 966 41 [../../allConstraintsAnalysis_Final/codependen... \n",
"P3931 2250 64 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1731 363 9 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2009 1019 15 [../../allConstraintsAnalysis_Final/codependen... \n",
"P246 169 2 [../../allConstraintsAnalysis_Final/codependen... \n",
"P8264 0 1 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1635 890 7 [../../allConstraintsAnalysis_Final/codependen... \n",
"P944 577 4 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1560 3235 20 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2679 887 5 [../../allConstraintsAnalysis_Final/codependen... \n",
"P451 10502 36 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2365 1650 5 [../../allConstraintsAnalysis_Final/codependen... \n",
"\n",
" violation_ratio \n",
"P5051 63.000000 \n",
"P4341 0.142857 \n",
"P2095 0.078947 \n",
"P990 0.042443 \n",
"P3931 0.028444 \n",
"P1731 0.024793 \n",
"P2009 0.014720 \n",
"P246 0.011834 \n",
"P8264 0.010000 \n",
"P1635 0.007865 \n",
"P944 0.006932 \n",
"P1560 0.006182 \n",
"P2679 0.005637 \n",
"P451 0.003428 \n",
"P2365 0.003030 "
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "imposed-bibliography",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P7959 \n",
" 655743 \n",
" 376 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.000573 \n",
" \n",
" \n",
" P3931 \n",
" 2250 \n",
" 64 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.028444 \n",
" \n",
" \n",
" P5051 \n",
" 1 \n",
" 63 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 63.000000 \n",
" \n",
" \n",
" P915 \n",
" 28364 \n",
" 45 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.001587 \n",
" \n",
" \n",
" P990 \n",
" 966 \n",
" 41 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.042443 \n",
" \n",
" \n",
" P451 \n",
" 10502 \n",
" 36 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.003428 \n",
" \n",
" \n",
" P197 \n",
" 167392 \n",
" 34 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.000203 \n",
" \n",
" \n",
" P1560 \n",
" 3235 \n",
" 20 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.006182 \n",
" \n",
" \n",
" P2009 \n",
" 1019 \n",
" 15 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.014720 \n",
" \n",
" \n",
" P1731 \n",
" 363 \n",
" 9 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.024793 \n",
" \n",
" \n",
" P1635 \n",
" 890 \n",
" 7 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.007865 \n",
" \n",
" \n",
" P1196 \n",
" 88070 \n",
" 6 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.000068 \n",
" \n",
" \n",
" P2679 \n",
" 887 \n",
" 5 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.005637 \n",
" \n",
" \n",
" P2365 \n",
" 1650 \n",
" 5 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.003030 \n",
" \n",
" \n",
" P141 \n",
" 121709 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.000033 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P7959 655743 376 [../../allConstraintsAnalysis_Final/codependen... \n",
"P3931 2250 64 [../../allConstraintsAnalysis_Final/codependen... \n",
"P5051 1 63 [../../allConstraintsAnalysis_Final/codependen... \n",
"P915 28364 45 [../../allConstraintsAnalysis_Final/codependen... \n",
"P990 966 41 [../../allConstraintsAnalysis_Final/codependen... \n",
"P451 10502 36 [../../allConstraintsAnalysis_Final/codependen... \n",
"P197 167392 34 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1560 3235 20 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2009 1019 15 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1731 363 9 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1635 890 7 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1196 88070 6 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2679 887 5 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2365 1650 5 [../../allConstraintsAnalysis_Final/codependen... \n",
"P141 121709 4 [../../allConstraintsAnalysis_Final/codependen... \n",
"\n",
" violation_ratio \n",
"P7959 0.000573 \n",
"P3931 0.028444 \n",
"P5051 63.000000 \n",
"P915 0.001587 \n",
"P990 0.042443 \n",
"P451 0.003428 \n",
"P197 0.000203 \n",
"P1560 0.006182 \n",
"P2009 0.014720 \n",
"P1731 0.024793 \n",
"P1635 0.007865 \n",
"P1196 0.000068 \n",
"P2679 0.005637 \n",
"P2365 0.003030 \n",
"P141 0.000033 "
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3.sort_values(by=['incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "emotional-crown",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"count 78.000000\n",
"mean 0.812773\n",
"std 7.132789\n",
"min 0.000000\n",
"25% 0.000000\n",
"50% 0.000000\n",
"75% 0.000641\n",
"max 63.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "certain-freeze",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 3 - Violation Ratios')"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"codepConstDF3['violation_ratio'].plot.hist(bins=100).set_title(\"Co-Dependency Constraint - Version 3 - Violation Ratios\")"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "cooperative-ownership",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 3 - Violation Ratios <= 0.0005')"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"codepConstDF3[codepConstDF3['violation_ratio'] <= 0.0005].violation_ratio.plot.hist(bins=100).set_title(\"Co-Dependency Constraint - Version 3 - Violation Ratios <= 0.0005\")"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "studied-inclusion",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"No. of properties whose violation ratio is greater than mean: 1/78\n"
]
}
],
"source": [
"print(f\"No. of properties whose violation ratio is greater than mean: {sum(codepConstDF3['violation_ratio'] >= 0.922928)}/{len(codepConstDF3)}\")"
]
},
{
"cell_type": "markdown",
"id": "protective-brazil",
"metadata": {},
"source": [
"#### Version 4 - Normal"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "laughing-pressing",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"codepConstDF4 = pd.DataFrame(codepConstViolations['Normal']).T"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "loving-swift",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" \n",
" \n",
" \n",
" \n",
" P1540 \n",
" 236379 \n",
" 456 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P2660 \n",
" 10136 \n",
" 21 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P769 \n",
" 1850 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P5947 \n",
" 1 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P1018 \n",
" 156 \n",
" 28 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P4213 \n",
" 42542 \n",
" 13 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P4238 \n",
" 258 \n",
" 11 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P427 \n",
" 27232 \n",
" 26 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P4316 \n",
" 183 \n",
" 72 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
" P433 \n",
" 31028893 \n",
" 435543 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" \n",
" \n",
"
\n",
"
418 rows × 3 columns
\n",
"
"
],
"text/plain": [
" correct incorrect paths\n",
"P1540 236379 456 [../../allConstraintsAnalysis_Final/codependen...\n",
"P2660 10136 21 [../../allConstraintsAnalysis_Final/codependen...\n",
"P769 1850 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P5947 1 0 [../../allConstraintsAnalysis_Final/codependen...\n",
"P1018 156 28 [../../allConstraintsAnalysis_Final/codependen...\n",
"... ... ... ...\n",
"P4213 42542 13 [../../allConstraintsAnalysis_Final/codependen...\n",
"P4238 258 11 [../../allConstraintsAnalysis_Final/codependen...\n",
"P427 27232 26 [../../allConstraintsAnalysis_Final/codependen...\n",
"P4316 183 72 [../../allConstraintsAnalysis_Final/codependen...\n",
"P433 31028893 435543 [../../allConstraintsAnalysis_Final/codependen...\n",
"\n",
"[418 rows x 3 columns]"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF4"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "north-christian",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF4['violation_ratio'] = codepConstDF4.apply(lambda p: p.incorrect / p.correct if p.correct != 0 else p.incorrect/100, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "closing-causing",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P1111 \n",
" 0 \n",
" 46327 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 463.270000 \n",
" \n",
" \n",
" P1995 \n",
" 80 \n",
" 9985 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 124.812500 \n",
" \n",
" \n",
" P768 \n",
" 133 \n",
" 15143 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 113.857143 \n",
" \n",
" \n",
" P4501 \n",
" 419 \n",
" 22682 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 54.133652 \n",
" \n",
" \n",
" P2715 \n",
" 4 \n",
" 158 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 39.500000 \n",
" \n",
" \n",
" P275 \n",
" 5955 \n",
" 123578 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 20.751973 \n",
" \n",
" \n",
" P2376 \n",
" 1 \n",
" 19 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 19.000000 \n",
" \n",
" \n",
" P3912 \n",
" 297 \n",
" 3705 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 12.474747 \n",
" \n",
" \n",
" P2720 \n",
" 12 \n",
" 134 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 11.166667 \n",
" \n",
" \n",
" P2248 \n",
" 4020 \n",
" 41566 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 10.339801 \n",
" \n",
" \n",
" P2325 \n",
" 4071 \n",
" 40611 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 9.975682 \n",
" \n",
" \n",
" P2243 \n",
" 4025 \n",
" 36540 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 9.078261 \n",
" \n",
" \n",
" P2244 \n",
" 4027 \n",
" 36527 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 9.070524 \n",
" \n",
" \n",
" P3448 \n",
" 547 \n",
" 4302 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 7.864717 \n",
" \n",
" \n",
" P7707 \n",
" 65 \n",
" 445 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 6.846154 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P1111 0 46327 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1995 80 9985 [../../allConstraintsAnalysis_Final/codependen... \n",
"P768 133 15143 [../../allConstraintsAnalysis_Final/codependen... \n",
"P4501 419 22682 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2715 4 158 [../../allConstraintsAnalysis_Final/codependen... \n",
"P275 5955 123578 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2376 1 19 [../../allConstraintsAnalysis_Final/codependen... \n",
"P3912 297 3705 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2720 12 134 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2248 4020 41566 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2325 4071 40611 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2243 4025 36540 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2244 4027 36527 [../../allConstraintsAnalysis_Final/codependen... \n",
"P3448 547 4302 [../../allConstraintsAnalysis_Final/codependen... \n",
"P7707 65 445 [../../allConstraintsAnalysis_Final/codependen... \n",
"\n",
" violation_ratio \n",
"P1111 463.270000 \n",
"P1995 124.812500 \n",
"P768 113.857143 \n",
"P4501 54.133652 \n",
"P2715 39.500000 \n",
"P275 20.751973 \n",
"P2376 19.000000 \n",
"P3912 12.474747 \n",
"P2720 11.166667 \n",
"P2248 10.339801 \n",
"P2325 9.975682 \n",
"P2243 9.078261 \n",
"P2244 9.070524 \n",
"P3448 7.864717 \n",
"P7707 6.846154 "
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF4.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "brief-effect",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2214 \n",
" 2962988 \n",
" 711699 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.240196 \n",
" \n",
" \n",
" P433 \n",
" 31028893 \n",
" 435543 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.014037 \n",
" \n",
" \n",
" P275 \n",
" 5955 \n",
" 123578 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 20.751973 \n",
" \n",
" \n",
" P2860 \n",
" 174402886 \n",
" 114713 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.000658 \n",
" \n",
" \n",
" P1435 \n",
" 1893874 \n",
" 79479 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.041966 \n",
" \n",
" \n",
" P708 \n",
" 45253 \n",
" 54258 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.198992 \n",
" \n",
" \n",
" P197 \n",
" 117523 \n",
" 49903 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.424623 \n",
" \n",
" \n",
" P1598 \n",
" 36978 \n",
" 46481 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 1.256991 \n",
" \n",
" \n",
" P1111 \n",
" 0 \n",
" 46327 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 463.270000 \n",
" \n",
" \n",
" P2248 \n",
" 4020 \n",
" 41566 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 10.339801 \n",
" \n",
" \n",
" P2325 \n",
" 4071 \n",
" 40611 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 9.975682 \n",
" \n",
" \n",
" P856 \n",
" 1239292 \n",
" 38107 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.030749 \n",
" \n",
" \n",
" P2243 \n",
" 4025 \n",
" 36540 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 9.078261 \n",
" \n",
" \n",
" P2244 \n",
" 4027 \n",
" 36527 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 9.070524 \n",
" \n",
" \n",
" P413 \n",
" 357793 \n",
" 33607 \n",
" [../../allConstraintsAnalysis_Final/codependen... \n",
" 0.093929 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2214 2962988 711699 [../../allConstraintsAnalysis_Final/codependen... \n",
"P433 31028893 435543 [../../allConstraintsAnalysis_Final/codependen... \n",
"P275 5955 123578 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2860 174402886 114713 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1435 1893874 79479 [../../allConstraintsAnalysis_Final/codependen... \n",
"P708 45253 54258 [../../allConstraintsAnalysis_Final/codependen... \n",
"P197 117523 49903 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1598 36978 46481 [../../allConstraintsAnalysis_Final/codependen... \n",
"P1111 0 46327 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2248 4020 41566 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2325 4071 40611 [../../allConstraintsAnalysis_Final/codependen... \n",
"P856 1239292 38107 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2243 4025 36540 [../../allConstraintsAnalysis_Final/codependen... \n",
"P2244 4027 36527 [../../allConstraintsAnalysis_Final/codependen... \n",
"P413 357793 33607 [../../allConstraintsAnalysis_Final/codependen... \n",
"\n",
" violation_ratio \n",
"P2214 0.240196 \n",
"P433 0.014037 \n",
"P275 20.751973 \n",
"P2860 0.000658 \n",
"P1435 0.041966 \n",
"P708 1.198992 \n",
"P197 0.424623 \n",
"P1598 1.256991 \n",
"P1111 463.270000 \n",
"P2248 10.339801 \n",
"P2325 9.975682 \n",
"P856 0.030749 \n",
"P2243 9.078261 \n",
"P2244 9.070524 \n",
"P413 0.093929 "
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF4.sort_values(by=['incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "wireless-passenger",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"count 418.000000\n",
"mean 2.454376\n",
"std 24.333809\n",
"min 0.000000\n",
"25% 0.001419\n",
"50% 0.026024\n",
"75% 0.237647\n",
"max 463.270000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF4['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "civilian-arnold",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 4 - Violation Ratios')"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"codepConstDF4['violation_ratio'].plot.hist(bins=100).set_title(\"Co-Dependency Constraint - Version 4 - Violation Ratios\")"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "threaded-cooler",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 4 - Violation Ratios <= 0.5')"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"codepConstDF4[codepConstDF4['violation_ratio'] <= 0.5].violation_ratio.plot.hist(bins=100).set_title(\"Co-Dependency Constraint - Version 4 - Violation Ratios <= 0.5\")"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "olympic-charlotte",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"No. of properties whose violation ratio is greater than mean: 25/418\n"
]
}
],
"source": [
"print(f\"No. of properties whose violation ratio is greater than mean: {sum(codepConstDF4['violation_ratio'] >= 2.414703)}/{len(codepConstDF4)}\")"
]
},
{
"cell_type": "markdown",
"id": "published-affiliate",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "aggregate-conservative",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "30ee937f4ab94fba994a875748146d41",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/54 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 1588.000000\n",
"mean 33.859051\n",
"std 152.985712\n",
"min 1.297000\n",
"25% 2.227750\n",
"50% 4.343500\n",
"75% 12.581250\n",
"max 2828.460000\n",
"dtype: float64\n"
]
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"codepConstViolations = {}\n",
"\n",
"codepConstViolations = {}\n",
"codepConstPropList = set()\n",
"\n",
"def extractTimes(filename):\n",
" times = []\n",
" with open(filename) as f:\n",
" for line in f:\n",
" if \"real\" in line:\n",
" line = line.strip()\n",
" time1 = line.split(\"\\t\")[1]\n",
" mins, sec = time1.split(\"m\")\n",
" mins = int(mins)\n",
" sec = float(sec[:-1])\n",
" times.append(60 * mins + sec)\n",
" return times\n",
"\n",
"# codepConstViolationsSummary = {}\n",
"times = []\n",
"timesVersion = {\"MSN\": [], \"MN\": [], \"M\": [], \"N\": [], \"S\": []}\n",
"filePath = '/data/wd-correctness/propertiesSplit_Final/checkViolations/exec_logs/'\n",
"for filename in tqdm(os.listdir(filePath)):\n",
" if filename.startswith(\"timeLog_codepConst_\"):\n",
" ver = filename.split('_')[2]\n",
" tempTimes = extractTimes(filePath + filename)\n",
" times += tempTimes\n",
" timesVersion[ver] += tempTimes\n",
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "hearing-treasury",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 527.000000\n",
"mean 133.514751\n",
"std 219.717844\n",
"min 1.899000\n",
"25% 25.236500\n",
"50% 58.603000\n",
"75% 145.354000\n",
"max 2199.569000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(timesVersion['MSN']).describe())"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "animal-vocabulary",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 468.000000\n",
"mean 131.495897\n",
"std 232.398622\n",
"min 1.780000\n",
"25% 19.863500\n",
"50% 50.195000\n",
"75% 147.243250\n",
"max 2783.638000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(timesVersion['MN']).describe())"
]
},
{
"cell_type": "code",
"execution_count": 133,
"id": "gentle-accessory",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 78.000000\n",
"mean 158.441372\n",
"std 205.424068\n",
"min 2.758000\n",
"25% 22.989000\n",
"50% 72.119500\n",
"75% 207.367000\n",
"max 848.583000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(timesVersion['M']).describe())"
]
},
{
"cell_type": "code",
"execution_count": 134,
"id": "fresh-namibia",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 418.000000\n",
"mean 128.126914\n",
"std 222.603826\n",
"min 2.543000\n",
"25% 19.653000\n",
"50% 50.284500\n",
"75% 140.122000\n",
"max 2891.457000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(timesVersion['N']).describe())"
]
},
{
"cell_type": "markdown",
"id": "industrial-parcel",
"metadata": {},
"source": [
"## Symmetric Constraint (Q21510862)\n",
"\n",
"This constraint says, if node1 has a property with this constraint, then both `(node1)-[prop]->(node2)` and `(node2)-[prop]->(node1)` must be present with few exceptions"
]
},
{
"cell_type": "markdown",
"id": "silent-fundamentals",
"metadata": {},
"source": [
"### Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 107,
"id": "known-wednesday",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-05-13 23:11:42 query]: SQL Translation:\r\n",
"---------------------------------------------\r\n",
" SELECT *\r\n",
" FROM graph_1 AS graph_1_c1\r\n",
" WHERE graph_1_c1.\"label\"=?\r\n",
" AND graph_1_c1.\"node2\"=?\r\n",
" PARAS: ['P2302', 'Q21510862']\r\n",
"---------------------------------------------\r\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz \\\n",
" ../../gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz \\\n",
" --match \"p: (nodeProp1)-[nodePropEdge:P2302]->(:Q21510862)\" \\\n",
" -o ../../constraintsOP/symmetricConstraint/claims.constraints_list.tsv \\\n",
" --graph-cache ../../sqlite3_caches/temp1345.valuetype.sqlite3.db"
]
},
{
"cell_type": "code",
"execution_count": 108,
"id": "legal-diamond",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"qualiDF = pd.read_csv(\"../../gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz\",sep='\\t')\n",
"constDF = pd.read_csv(\"../../constraintsOP/symmetricConstraint/claims.constraints_list.tsv\",sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 109,
"id": "exceptional-morris",
"metadata": {},
"outputs": [],
"source": [
"constDF2 = constDF.set_index('id').join(qualiDF.set_index('node1'),rsuffix='_qualifier').drop(columns=['id', 'node2;wikidatatype_qualifier', 'rank', 'node2', 'label', 'node2;wikidatatype']).rename(columns={'label_qualifier':'label', 'node2_qualifier': 'node2'})\n",
"constDF2 = constDF2.reset_index()\n",
"constDF2 = constDF2.rename(columns={'index':'id'})\n",
"constDF2['label'] = constDF2.label.fillna(\"P2316\")\n",
"constDF2['node2'] = constDF2.node2.fillna(\"Normal\")"
]
},
{
"cell_type": "code",
"execution_count": 110,
"id": "burning-involvement",
"metadata": {},
"outputs": [],
"source": [
"constDF2.to_csv(\"../../constraintsOP/symmetricConstraint/claims.constraints_all.tsv\",sep=\"\\t\",index=False)"
]
},
{
"cell_type": "code",
"execution_count": 111,
"id": "naval-identification",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import math\n",
"dfItemRequires = pd.read_csv('../../constraintsOP/symmetricConstraint/claims.constraints_all.tsv',sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 112,
"id": "considered-madison",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.groupby(['id','node1','label']).node2.apply(lambda p: p.tolist()).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 113,
"id": "alone-cattle",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['P2316', 'P2303'], dtype=object)"
]
},
"execution_count": 113,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 114,
"id": "mighty-ordinary",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"P2316 42\n",
"P2303 3\n",
"Name: label, dtype: int64"
]
},
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 115,
"id": "sensitive-alliance",
"metadata": {},
"outputs": [],
"source": [
"#Reference: https://stackoverflow.com/a/17298454\n",
"# dfItemRequires.pivot_table('node2', ['node1', 'id'], 'label')\n",
"dfItemRequires = dfItemRequires.pivot(index=['node1','id'], columns='label', values='node2')"
]
},
{
"cell_type": "code",
"execution_count": 116,
"id": "tender-valley",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" label \n",
" P2303 \n",
" P2316 \n",
" \n",
" \n",
" node1 \n",
" id \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P1322 \n",
" P1322-P2302-Q21510862-85dea891-0 \n",
" NaN \n",
" [Normal] \n",
" \n",
" \n",
" P1327 \n",
" P1327-P2302-Q21510862-a3c3a094-0 \n",
" NaN \n",
" [Normal] \n",
" \n",
" \n",
" P1382 \n",
" P1382-P2302-Q21510862-f6bcfecf-0 \n",
" NaN \n",
" [Normal] \n",
" \n",
" \n",
" P1560 \n",
" P1560-P2302-Q21510862-fabecaeb-0 \n",
" NaN \n",
" [Q21502408] \n",
" \n",
" \n",
" P1639 \n",
" P1639-P2302-Q21510862-384edcd4-0 \n",
" NaN \n",
" [Q21502408] \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"label P2303 P2316\n",
"node1 id \n",
"P1322 P1322-P2302-Q21510862-85dea891-0 NaN [Normal]\n",
"P1327 P1327-P2302-Q21510862-a3c3a094-0 NaN [Normal]\n",
"P1382 P1382-P2302-Q21510862-f6bcfecf-0 NaN [Normal]\n",
"P1560 P1560-P2302-Q21510862-fabecaeb-0 NaN [Q21502408]\n",
"P1639 P1639-P2302-Q21510862-384edcd4-0 NaN [Q21502408]"
]
},
"execution_count": 116,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "code",
"execution_count": 117,
"id": "cellular-canal",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.droplevel(1)"
]
},
{
"cell_type": "code",
"execution_count": 118,
"id": "desperate-poster",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" label \n",
" P2303 \n",
" P2316 \n",
" \n",
" \n",
" node1 \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P1322 \n",
" NaN \n",
" [Normal] \n",
" \n",
" \n",
" P1327 \n",
" NaN \n",
" [Normal] \n",
" \n",
" \n",
" P1382 \n",
" NaN \n",
" [Normal] \n",
" \n",
" \n",
" P1560 \n",
" NaN \n",
" [Q21502408] \n",
" \n",
" \n",
" P1639 \n",
" NaN \n",
" [Q21502408] \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"label P2303 P2316\n",
"node1 \n",
"P1322 NaN [Normal]\n",
"P1327 NaN [Normal]\n",
"P1382 NaN [Normal]\n",
"P1560 NaN [Q21502408]\n",
"P1639 NaN [Q21502408]"
]
},
"execution_count": 118,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "markdown",
"id": "primary-netherlands",
"metadata": {},
"source": [
"### Query Generator"
]
},
{
"cell_type": "code",
"execution_count": 121,
"id": "pointed-haven",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "826d58b62c2b43d695826e16e943ec8e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 0\n",
"\n",
"folderName = 'symmetricConstraint'\n",
"shellFileSuffix = 'symmConst_Validator_'\n",
"graph_cache_prefix = 'symm_new_1_1_'\n",
"\n",
"for row in tqdm(dfItemRequires.iterrows()):\n",
"# try:\n",
" prop = row[0]\n",
" constraint = row[1]\n",
" mandatory = []\n",
" suggestion = []\n",
" normal = []\n",
" prop = str(prop)\n",
" \n",
" if type(constraint['P2316']) == list:\n",
" if constraint['P2316'][0] == 'Q21502408':\n",
" sfname = 'mandatory'\n",
" elif constraint['P2316'][0] == 'Q62026391':\n",
" sfname = 'suggestion'\n",
" elif constraint['P2316'][0] == 'Normal':\n",
" sfname = 'normal'\n",
" else:\n",
" sfname = 'normal'\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" command = \"{ time ( kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" ../../propertiesSplit_Final/claims.\"+ prop +\".copy2.tsv \\\n",
" --match 'tsv: (node1)-[nodeProp]->(node2), copy2: (node2)-[]->(node1)' \"\n",
" \n",
" os.system(\"cp ../../propertiesSplit_Final/claims.\"+ prop +\".tsv ../../propertiesSplit_Final/claims.\"+ prop +\".copy2.tsv\")\n",
" \n",
" if cnt % 60 == 0:\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" command\n",
" if type(constraint['P2303']) != list: # Exceptions not present\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\"+graph_cache_prefix+\"_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/\" + shellFileSuffix + str(fCnt) + \".txt;\\n\"\n",
"# print(command)\n",
" fOP.write(command)\n",
" else:\n",
" excptns = constraint['P2303']\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\"+graph_cache_prefix+\"_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect_wo_exceptions.tsv; \"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\" + prop + \".correct_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\"+graph_cache_prefix+\"_\" + str(fCnt) + \".sqlite3.db; \"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\" + prop + \".correct_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/\" + shellFileSuffix + str(fCnt) + \".txt;\\n\"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" \n",
" cnt += 1\n",
"# except:\n",
"# print(\"Something failed for prop:\",prop)"
]
},
{
"cell_type": "code",
"execution_count": 122,
"id": "polar-canada",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"38"
]
},
"execution_count": 122,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 123,
"id": "virtual-disney",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,3):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/symmConst_Validator_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "coral-cheese",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 143,
"id": "governmental-backup",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e84f13b9ec284bf2b0b14dbcaf12d6c7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7512d86896fd442fa5ab2229bea160fc",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/13 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bc22b74482594412b4b73e7e8ebd8f5b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/66 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e02a9efd8f3b4716a3087ca4303f4958",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/6 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"symmConstViolations = {}\n",
"\n",
"def countLines(fname):\n",
" cnt = -1\n",
" with open(fname, 'r') as f:\n",
" for line in f:\n",
" cnt += 1\n",
" return cnt \n",
"\n",
"symmConstViolations = {}\n",
"symmConstPropList = set()\n",
"\n",
"# codepConstViolationsSummary = {}\n",
"\n",
"\n",
"filePath = \"../../allConstraintsAnalysis_Final/symmetricConstraint/\"\n",
"for folder in tqdm(iter(['mandatory','normal','suggestion'])):\n",
" for filename in tqdm(os.listdir(filePath + folder)):\n",
" prop = filename.split(\".\")[1]\n",
" correctness = filename.split(\".\")[2]\n",
" if correctness not in ['correct','incorrect']:\n",
" continue\n",
" symmConstPropList.add(prop)\n",
" count1 = countLines(filePath+folder+'/'+filename)\n",
" if folder not in symmConstViolations:\n",
" symmConstViolations[folder] = {}\n",
" if prop not in symmConstViolations[folder]:\n",
" symmConstViolations[folder][prop] = {'correct': 0, 'incorrect': 0, 'paths': []}\n",
" symmConstViolations[folder][prop][correctness] = count1\n",
" symmConstViolations[folder][prop]['paths'].append(filePath+folder+'/'+filename)"
]
},
{
"cell_type": "code",
"execution_count": 144,
"id": "helpful-offset",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"38"
]
},
"execution_count": 144,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(symmConstPropList)"
]
},
{
"cell_type": "code",
"execution_count": 145,
"id": "entertaining-rescue",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "45a8ce1517a54fbb821a7c44438e6d25",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"symmConstViolationsSummary = {}\n",
"for folder in tqdm(iter(['mandatory','normal','suggestion'])):\n",
" symmConstViolationsSummary[folder] = {'correct': 0, 'incorrect': 0}\n",
" for prop in symmConstViolations[folder].keys():\n",
" symmConstViolationsSummary[folder]['correct'] += symmConstViolations[folder][prop]['correct']\n",
" symmConstViolationsSummary[folder]['incorrect'] += symmConstViolations[folder][prop]['incorrect']\n",
" symmConstViolationsSummary[folder]['total'] = symmConstViolationsSummary[folder]['correct'] + symmConstViolationsSummary[folder]['incorrect']\n",
" symmConstViolationsSummary[folder]['percIncorrect'] = symmConstViolationsSummary[folder]['incorrect'] / symmConstViolationsSummary[folder]['total'] * 100\n",
" symmConstViolationsSummary[folder]['propCount'] = len(symmConstViolations[folder].keys())"
]
},
{
"cell_type": "code",
"execution_count": 146,
"id": "copyrighted-marshall",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'mandatory': {'correct': 7432,\n",
" 'incorrect': 42,\n",
" 'total': 7474,\n",
" 'percIncorrect': 0.561948086700562,\n",
" 'propCount': 5},\n",
" 'normal': {'correct': 6230891,\n",
" 'incorrect': 78884,\n",
" 'total': 6309775,\n",
" 'percIncorrect': 1.2501872095280735,\n",
" 'propCount': 30},\n",
" 'suggestion': {'correct': 773722,\n",
" 'incorrect': 54226,\n",
" 'total': 827948,\n",
" 'percIncorrect': 6.549445134235484,\n",
" 'propCount': 3}}"
]
},
"execution_count": 146,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"symmConstViolationsSummary"
]
},
{
"cell_type": "code",
"execution_count": 147,
"id": "enhanced-ontario",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"7145197"
]
},
"execution_count": 147,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"noOfStmts = 0\n",
"for fold in symmConstViolationsSummary.keys():\n",
" noOfStmts += symmConstViolationsSummary[fold]['total']\n",
"noOfStmts"
]
},
{
"cell_type": "code",
"execution_count": 148,
"id": "representative-conjunction",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2152 \n",
" 75 \n",
" 1 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.013158 \n",
" \n",
" \n",
" P1639 \n",
" 2059 \n",
" 21 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.010096 \n",
" \n",
" \n",
" P1560 \n",
" 3235 \n",
" 20 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.006144 \n",
" \n",
" \n",
" P3364 \n",
" 1784 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.000000 \n",
" \n",
" \n",
" P6185 \n",
" 279 \n",
" 0 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.000000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2152 75 1 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P1639 2059 21 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P1560 3235 20 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P3364 1784 0 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P6185 279 0 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"\n",
" violation_ratio \n",
"P2152 0.013158 \n",
"P1639 0.010096 \n",
"P1560 0.006144 \n",
"P3364 0.000000 \n",
"P6185 0.000000 "
]
},
"execution_count": 148,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"symmConstDF1 = pd.DataFrame(symmConstViolations['mandatory']).T\n",
"symmConstDF1['violation_ratio'] = symmConstDF1.apply(lambda p: p.incorrect / (p.incorrect + p.correct), axis=1)\n",
"symmConstDF1.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 149,
"id": "gross-extraction",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2789 \n",
" 103536 \n",
" 22758 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.180199 \n",
" \n",
" \n",
" P1889 \n",
" 505837 \n",
" 28391 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.053144 \n",
" \n",
" \n",
" P197 \n",
" 164349 \n",
" 3077 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.018378 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2789 103536 22758 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P1889 505837 28391 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P197 164349 3077 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"\n",
" violation_ratio \n",
"P2789 0.180199 \n",
"P1889 0.053144 \n",
"P197 0.018378 "
]
},
"execution_count": 149,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"symmConstDF2 = pd.DataFrame(symmConstViolations['suggestion']).T\n",
"symmConstDF2['violation_ratio'] = symmConstDF2.apply(lambda p: p.incorrect / (p.incorrect + p.correct), axis=1)\n",
"symmConstDF2.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 150,
"id": "heavy-scout",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P5188 \n",
" 0 \n",
" 2 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 1.000000 \n",
" \n",
" \n",
" P1706 \n",
" 4 \n",
" 52 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.928571 \n",
" \n",
" \n",
" P521 \n",
" 418 \n",
" 1300 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.756694 \n",
" \n",
" \n",
" P2652 \n",
" 460 \n",
" 852 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.649390 \n",
" \n",
" \n",
" P8702 \n",
" 6 \n",
" 2 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.250000 \n",
" \n",
" \n",
" P1382 \n",
" 10622 \n",
" 2811 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.209261 \n",
" \n",
" \n",
" P2293 \n",
" 9980 \n",
" 2230 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.182637 \n",
" \n",
" \n",
" P3032 \n",
" 1674 \n",
" 345 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.170877 \n",
" \n",
" \n",
" P451 \n",
" 9520 \n",
" 1018 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.096603 \n",
" \n",
" \n",
" P1327 \n",
" 7734 \n",
" 758 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.089260 \n",
" \n",
" \n",
" P4915 \n",
" 328 \n",
" 28 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.078652 \n",
" \n",
" \n",
" P3403 \n",
" 2126 \n",
" 114 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.050893 \n",
" \n",
" \n",
" P47 \n",
" 548251 \n",
" 29281 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.050700 \n",
" \n",
" \n",
" P460 \n",
" 238967 \n",
" 11571 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.046185 \n",
" \n",
" \n",
" P530 \n",
" 6595 \n",
" 319 \n",
" [../../allConstraintsAnalysis_Final/symmetricC... \n",
" 0.046138 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P5188 0 2 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P1706 4 52 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P521 418 1300 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P2652 460 852 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P8702 6 2 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P1382 10622 2811 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P2293 9980 2230 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P3032 1674 345 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P451 9520 1018 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P1327 7734 758 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P4915 328 28 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P3403 2126 114 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P47 548251 29281 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P460 238967 11571 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"P530 6595 319 [../../allConstraintsAnalysis_Final/symmetricC... \n",
"\n",
" violation_ratio \n",
"P5188 1.000000 \n",
"P1706 0.928571 \n",
"P521 0.756694 \n",
"P2652 0.649390 \n",
"P8702 0.250000 \n",
"P1382 0.209261 \n",
"P2293 0.182637 \n",
"P3032 0.170877 \n",
"P451 0.096603 \n",
"P1327 0.089260 \n",
"P4915 0.078652 \n",
"P3403 0.050893 \n",
"P47 0.050700 \n",
"P460 0.046185 \n",
"P530 0.046138 "
]
},
"execution_count": 150,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"symmConstDF3 = pd.DataFrame(symmConstViolations['normal']).T\n",
"symmConstDF3['violation_ratio'] = symmConstDF3.apply(lambda p: p.incorrect / (p.incorrect + p.correct), axis=1)\n",
"symmConstDF3.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 151,
"id": "legitimate-aspect",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Symmetric Normal Constraint - Violation Ratios')"
]
},
"execution_count": 151,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"symmConstDF3.sort_values(by=['violation_ratio'],ascending=False)['violation_ratio'].plot.hist(bins=100).set_title(\"Symmetric Normal Constraint - Violation Ratios\")"
]
},
{
"cell_type": "code",
"execution_count": 152,
"id": "junior-marketing",
"metadata": {},
"outputs": [],
"source": [
"pd.concat([symmConstDF1, symmConstDF2, symmConstDF3]).to_csv('../../allConstraintsAnalysis_Final/symmConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "unlikely-sewing",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 135,
"id": "southern-reasoning",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a6d9bf7b68ec4aa6a5403175de15cd14",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/52 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"codepConstViolations = {}\n",
"\n",
"codepConstViolations = {}\n",
"codepConstPropList = set()\n",
"\n",
"def extractTimes(filename):\n",
" times = []\n",
" with open(filename) as f:\n",
" for line in f:\n",
" if \"real\" in line:\n",
" line = line.strip()\n",
" time1 = line.split(\"\\t\")[1]\n",
" mins, sec = time1.split(\"m\")\n",
" mins = int(mins)\n",
" sec = float(sec[:-1])\n",
" times.append(60 * mins + sec)\n",
" return times\n",
"\n",
"# codepConstViolationsSummary = {}\n",
"times = []\n",
"filePath = '/data/wd-correctness/propertiesSplit_Final/checkViolations/exec_logs/'\n",
"for filename in tqdm(os.listdir(filePath)):\n",
" if filename.startswith(\"symmConst_Validator_\"):\n",
" tempTimes = extractTimes(filePath + filename)\n",
" times += tempTimes"
]
},
{
"cell_type": "code",
"execution_count": 136,
"id": "classical-updating",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 38.000000\n",
"mean 118.440816\n",
"std 119.145724\n",
"min 9.715000\n",
"25% 40.780500\n",
"50% 68.670000\n",
"75% 135.589750\n",
"max 527.332000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 137,
"id": "fundamental-bottle",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Distribution of times (in s) taken for symmetric constraint checks')"
]
},
"execution_count": 137,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"sns.lineplot(data=pd.Series(times)).set_title(\"Distribution of times (in s) taken for symmetric constraint checks\")"
]
},
{
"cell_type": "markdown",
"id": "informed-animal",
"metadata": {},
"source": [
"## Inverse Constraint (Q21510855)\n",
"\n",
"This constraint says, if node1 has a property with this constraint, then node2 must have the specified property and the value must be node1."
]
},
{
"cell_type": "markdown",
"id": "dramatic-manchester",
"metadata": {},
"source": [
"### Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 124,
"id": "leading-server",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-05-13 23:13:26 query]: SQL Translation:\r\n",
"---------------------------------------------\r\n",
" SELECT *\r\n",
" FROM graph_1 AS graph_1_c1\r\n",
" WHERE graph_1_c1.\"label\"=?\r\n",
" AND graph_1_c1.\"node2\"=?\r\n",
" PARAS: ['P2302', 'Q21510855']\r\n",
"---------------------------------------------\r\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz \\\n",
" ../../gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz \\\n",
" --match \"p: (nodeProp1)-[nodePropEdge:P2302]->(:Q21510855)\" \\\n",
" -o ../../constraintsOP/inverseConstraint/claims.constraints_list.tsv \\\n",
" --graph-cache ../../sqlite3_caches/temp1345.valuetype.sqlite3.db"
]
},
{
"cell_type": "code",
"execution_count": 125,
"id": "received-colonial",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"qualiDF = pd.read_csv(\"../../gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz\",sep='\\t')\n",
"constDF = pd.read_csv(\"../../constraintsOP/inverseConstraint/claims.constraints_list.tsv\",sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 126,
"id": "overall-expense",
"metadata": {},
"outputs": [],
"source": [
"constDF2 = constDF.set_index('id').join(qualiDF.set_index('node1'),rsuffix='_qualifier').drop(columns=['id', 'node2;wikidatatype_qualifier', 'rank', 'node2', 'label', 'node2;wikidatatype']).rename(columns={'label_qualifier':'label', 'node2_qualifier': 'node2'})\n",
"constDF2 = constDF2.reset_index()\n",
"constDF2 = constDF2.rename(columns={'index':'id'})\n",
"constDF2['label'] = constDF2.label.fillna(\"P2316\")\n",
"constDF2['node2'] = constDF2.node2.fillna(\"Normal\")"
]
},
{
"cell_type": "code",
"execution_count": 127,
"id": "valid-throat",
"metadata": {},
"outputs": [],
"source": [
"constDF2.to_csv(\"../../constraintsOP/inverseConstraint/claims.constraints_all.tsv\",sep=\"\\t\",index=False)"
]
},
{
"cell_type": "code",
"execution_count": 128,
"id": "focused-pennsylvania",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import math\n",
"dfItemRequires = pd.read_csv('../../constraintsOP/inverseConstraint/claims.constraints_all.tsv',sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 129,
"id": "moved-rental",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.groupby(['id','node1','label']).node2.apply(lambda p: p.tolist()).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 130,
"id": "attached-rings",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['P2306', 'P2316', 'P4155', 'P2303'], dtype=object)"
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 131,
"id": "loving-mileage",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"P2306 110\n",
"P2316 10\n",
"P2303 2\n",
"P4155 1\n",
"Name: label, dtype: int64"
]
},
"execution_count": 131,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 132,
"id": "local-forty",
"metadata": {},
"outputs": [],
"source": [
"#Reference: https://stackoverflow.com/a/17298454\n",
"# dfItemRequires.pivot_table('node2', ['node1', 'id'], 'label')\n",
"dfItemRequires = dfItemRequires.pivot(index=['node1','id'], columns='label', values='node2')"
]
},
{
"cell_type": "code",
"execution_count": 133,
"id": "pressed-upset",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" label \n",
" P2303 \n",
" P2306 \n",
" P2316 \n",
" P4155 \n",
" \n",
" \n",
" node1 \n",
" id \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P1026 \n",
" P1026-P2302-Q21510855-adc83b86-0 \n",
" NaN \n",
" [P50] \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1029 \n",
" P1029-P2302-Q21510855-6b55e057-0 \n",
" NaN \n",
" [P5096] \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P115 \n",
" P115-P2302-Q21510855-f7aa0b78-0 \n",
" NaN \n",
" [P466] \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1151 \n",
" P1151-P2302-Q21510855-0d9aa9c6-0 \n",
" NaN \n",
" [P1204] \n",
" [Q21502408] \n",
" NaN \n",
" \n",
" \n",
" P1204 \n",
" P1204-P2302-Q21510855-e3d53bb6-0 \n",
" NaN \n",
" [P1151] \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"label P2303 P2306 P2316 P4155\n",
"node1 id \n",
"P1026 P1026-P2302-Q21510855-adc83b86-0 NaN [P50] NaN NaN\n",
"P1029 P1029-P2302-Q21510855-6b55e057-0 NaN [P5096] NaN NaN\n",
"P115 P115-P2302-Q21510855-f7aa0b78-0 NaN [P466] NaN NaN\n",
"P1151 P1151-P2302-Q21510855-0d9aa9c6-0 NaN [P1204] [Q21502408] NaN\n",
"P1204 P1204-P2302-Q21510855-e3d53bb6-0 NaN [P1151] NaN NaN"
]
},
"execution_count": 133,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "code",
"execution_count": 134,
"id": "extra-stomach",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.droplevel(1)"
]
},
{
"cell_type": "code",
"execution_count": 135,
"id": "seeing-marine",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" label \n",
" P2303 \n",
" P2306 \n",
" P2316 \n",
" P4155 \n",
" \n",
" \n",
" node1 \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P1026 \n",
" NaN \n",
" [P50] \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1029 \n",
" NaN \n",
" [P5096] \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P115 \n",
" NaN \n",
" [P466] \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1151 \n",
" NaN \n",
" [P1204] \n",
" [Q21502408] \n",
" NaN \n",
" \n",
" \n",
" P1204 \n",
" NaN \n",
" [P1151] \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"label P2303 P2306 P2316 P4155\n",
"node1 \n",
"P1026 NaN [P50] NaN NaN\n",
"P1029 NaN [P5096] NaN NaN\n",
"P115 NaN [P466] NaN NaN\n",
"P1151 NaN [P1204] [Q21502408] NaN\n",
"P1204 NaN [P1151] NaN NaN"
]
},
"execution_count": 135,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "markdown",
"id": "composite-cutting",
"metadata": {},
"source": [
"### Query Generator"
]
},
{
"cell_type": "code",
"execution_count": 136,
"id": "acoustic-belarus",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c0747553a34949f9bfcce47e0815de33",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 0\n",
"fOP = None\n",
"\n",
"folderName = 'inverseConstraint'\n",
"shellFileSuffix = 'invConst_Validator_'\n",
"graph_cache_file_prefix = \"inv_new_1_1_\"\n",
"\n",
"for prop, constraint in tqdm(dfItemRequires.iterrows()):\n",
"# try:\n",
" \n",
" if type(constraint['P2316']) == list:\n",
" if constraint['P2316'][0] == 'Q21502408':\n",
" subFolderName = \"mandatory\"\n",
" elif constraint['P2316'][0] == 'Q62026391':\n",
" subFolderName = \"suggestion\"\n",
" else:\n",
" subFolderName = \"normal\"\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" prop2 = constraint['P2306']\n",
"\n",
" if type(prop2) != list:\n",
" continue\n",
" prop2 = prop2[0]\n",
"\n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit_Final/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" if cnt % 60 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit_Final/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" \n",
" \n",
" command = \"{ time ( kgtk --debug query -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" ../../propertiesSplit_Final/claims.\"+ prop2 +\".tsv \\\n",
" --match '\"+ \\\n",
" f\"{prop}: (node1)-[nodeProp]->(node2), {prop2}: (node2)-[]->(node1)' \"\n",
"\n",
" if type(constraint['P2303']) != list: # Exceptions not present\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/\" + shellFileSuffix + str(fCnt) + \".txt;\\n\"\n",
"# print(command)\n",
" fOP.write(command)\n",
" else:\n",
" excptns = set(constraint['P2303'])\n",
" commandRest = \" --return 'distinct nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit_Final/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect_wo_exceptions.tsv; \"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug query -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --graph-cache ../../sqlite3_caches/\" + str(graph_cache_file_prefix) + str(fCnt) + \".sqlite3.db; \"\n",
"# print(command) \n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk --debug ifnotexists -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis_Final/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit_Final/checkViolations/exec_logs/\" + shellFileSuffix + str(fCnt) + \".txt; \\n\"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" \n",
" cnt += 1\n",
"# except:\n",
"# print(\"Something failed for prop:\",prop)\n",
"if fOP:\n",
" fOP.close()"
]
},
{
"cell_type": "code",
"execution_count": 137,
"id": "large-climb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"110"
]
},
"execution_count": 137,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 138,
"id": "involved-vietnamese",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,7):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit_Final/checkViolations/invConst_Validator_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "retired-audio",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 153,
"id": "specified-evanescence",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a2d2765887594918b68c97a3a28c3ea6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "61569933ccaa4a6e9c107b98db897706",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/12 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "769abe04e3824cab832b94b790817bb3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/206 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4de71088e5c44404973e041e82421290",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/8 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"invConstViolations = {}\n",
"\n",
"def countLines(fname):\n",
" cnt = -1\n",
" with open(fname, 'r') as f:\n",
" for line in f:\n",
" cnt += 1\n",
" return cnt\n",
"\n",
"invConstViolations = {}\n",
"invConstPropList = set()\n",
"\n",
"# codepConstViolationsSummary = {}\n",
"\n",
"\n",
"filePath = \"../../allConstraintsAnalysis_Final/inverseConstraint/\"\n",
"for folder in tqdm(iter(['mandatory','normal','suggestion'])):\n",
" for filename in tqdm(os.listdir(filePath + folder)):\n",
" prop = filename.split(\".\")[1]\n",
" correctness = filename.split(\".\")[2]\n",
" if correctness not in ['correct','incorrect']:\n",
" continue\n",
" invConstPropList.add(prop)\n",
" count1 = countLines(filePath+folder+'/'+filename)\n",
" if folder not in invConstViolations:\n",
" invConstViolations[folder] = {}\n",
" if prop not in invConstViolations[folder]:\n",
" invConstViolations[folder][prop] = {'correct': 0, 'incorrect': 0, 'paths': []}\n",
" invConstViolations[folder][prop][correctness] = count1\n",
" invConstViolations[folder][prop]['paths'].append(filePath+folder+'/'+filename)"
]
},
{
"cell_type": "code",
"execution_count": 154,
"id": "circular-africa",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"110"
]
},
"execution_count": 154,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(invConstPropList)"
]
},
{
"cell_type": "code",
"execution_count": 155,
"id": "recreational-world",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a1a9f87a27e548909c153fed869dc026",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"invConstViolationsSummary = {}\n",
"for folder in tqdm(iter(['mandatory','normal','suggestion'])):\n",
" invConstViolationsSummary[folder] = {'correct': 0, 'incorrect': 0}\n",
" for prop in invConstViolations[folder].keys():\n",
" invConstViolationsSummary[folder]['correct'] += invConstViolations[folder][prop]['correct']\n",
" invConstViolationsSummary[folder]['incorrect'] += invConstViolations[folder][prop]['incorrect']\n",
" invConstViolationsSummary[folder]['total'] = invConstViolationsSummary[folder]['correct'] + invConstViolationsSummary[folder]['incorrect']\n",
" invConstViolationsSummary[folder]['percIncorrect'] = invConstViolationsSummary[folder]['incorrect'] / invConstViolationsSummary[folder]['total'] * 100\n",
" invConstViolationsSummary[folder]['propCount'] = len(invConstViolations[folder].keys())"
]
},
{
"cell_type": "code",
"execution_count": 156,
"id": "headed-singer",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'mandatory': {'correct': 6564,\n",
" 'incorrect': 133,\n",
" 'total': 6697,\n",
" 'percIncorrect': 1.9859638644169029,\n",
" 'propCount': 6},\n",
" 'normal': {'correct': 7131934,\n",
" 'incorrect': 204841,\n",
" 'total': 7336775,\n",
" 'percIncorrect': 2.7919760385182864,\n",
" 'propCount': 100},\n",
" 'suggestion': {'correct': 2002102,\n",
" 'incorrect': 95351,\n",
" 'total': 2097453,\n",
" 'percIncorrect': 4.546037503581725,\n",
" 'propCount': 4}}"
]
},
"execution_count": 156,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstViolationsSummary"
]
},
{
"cell_type": "code",
"execution_count": 157,
"id": "russian-steering",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9440925"
]
},
"execution_count": 157,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"noOfStmts = 0\n",
"for fold in invConstViolationsSummary.keys():\n",
" noOfStmts += invConstViolationsSummary[fold]['total']\n",
"noOfStmts"
]
},
{
"cell_type": "code",
"execution_count": 158,
"id": "sustained-prediction",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2673 \n",
" 819 \n",
" 69 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.077703 \n",
" \n",
" \n",
" P4147 \n",
" 271 \n",
" 9 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.032143 \n",
" \n",
" \n",
" P4149 \n",
" 272 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.014493 \n",
" \n",
" \n",
" P2033 \n",
" 1836 \n",
" 26 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.013963 \n",
" \n",
" \n",
" P450 \n",
" 1754 \n",
" 21 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.011831 \n",
" \n",
" \n",
" P1151 \n",
" 1612 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.002475 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2673 819 69 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P4147 271 9 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P4149 272 4 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P2033 1836 26 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P450 1754 21 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P1151 1612 4 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"\n",
" violation_ratio \n",
"P2673 0.077703 \n",
"P4147 0.032143 \n",
"P4149 0.014493 \n",
"P2033 0.013963 \n",
"P450 0.011831 \n",
"P1151 0.002475 "
]
},
"execution_count": 158,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstDF1 = pd.DataFrame(invConstViolations['mandatory']).T\n",
"invConstDF1['violation_ratio'] = invConstDF1.apply(lambda p: p.incorrect / (p.correct + p.incorrect), axis=1)\n",
"invConstDF1.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 159,
"id": "valid-symposium",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P1434 \n",
" 3512 \n",
" 4745 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.574664 \n",
" \n",
" \n",
" P155 \n",
" 963205 \n",
" 49783 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.049145 \n",
" \n",
" \n",
" P156 \n",
" 963183 \n",
" 40682 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.040525 \n",
" \n",
" \n",
" P629 \n",
" 72202 \n",
" 141 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.001949 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P1434 3512 4745 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P155 963205 49783 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P156 963183 40682 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P629 72202 141 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"\n",
" violation_ratio \n",
"P1434 0.574664 \n",
"P155 0.049145 \n",
"P156 0.040525 \n",
"P629 0.001949 "
]
},
"execution_count": 159,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstDF2 = pd.DataFrame(invConstViolations['suggestion']).T\n",
"invConstDF2['violation_ratio'] = invConstDF2.apply(lambda p: p.incorrect / (p.correct + p.incorrect), axis=1)\n",
"invConstDF2.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 160,
"id": "resident-mustang",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P1605 \n",
" 12 \n",
" 189 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.940299 \n",
" \n",
" \n",
" P3448 \n",
" 583 \n",
" 4266 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.879769 \n",
" \n",
" \n",
" P926 \n",
" 1 \n",
" 6 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.857143 \n",
" \n",
" \n",
" P925 \n",
" 1 \n",
" 5 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.833333 \n",
" \n",
" \n",
" P1029 \n",
" 475 \n",
" 2263 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.826516 \n",
" \n",
" \n",
" P115 \n",
" 6712 \n",
" 24515 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.785058 \n",
" \n",
" \n",
" P8625 \n",
" 7 \n",
" 17 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.708333 \n",
" \n",
" \n",
" P5132 \n",
" 81 \n",
" 89 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.523529 \n",
" \n",
" \n",
" P425 \n",
" 2512 \n",
" 2024 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.446208 \n",
" \n",
" \n",
" P3816 \n",
" 14 \n",
" 10 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.416667 \n",
" \n",
" \n",
" P2512 \n",
" 210 \n",
" 149 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.415042 \n",
" \n",
" \n",
" P1677 \n",
" 6 \n",
" 4 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.400000 \n",
" \n",
" \n",
" P2578 \n",
" 989 \n",
" 604 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.379159 \n",
" \n",
" \n",
" P3261 \n",
" 232 \n",
" 125 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.350140 \n",
" \n",
" \n",
" P568 \n",
" 1049 \n",
" 450 \n",
" [../../allConstraintsAnalysis_Final/inverseCon... \n",
" 0.300200 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P1605 12 189 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P3448 583 4266 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P926 1 6 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P925 1 5 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P1029 475 2263 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P115 6712 24515 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P8625 7 17 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P5132 81 89 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P425 2512 2024 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P3816 14 10 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P2512 210 149 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P1677 6 4 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P2578 989 604 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P3261 232 125 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"P568 1049 450 [../../allConstraintsAnalysis_Final/inverseCon... \n",
"\n",
" violation_ratio \n",
"P1605 0.940299 \n",
"P3448 0.879769 \n",
"P926 0.857143 \n",
"P925 0.833333 \n",
"P1029 0.826516 \n",
"P115 0.785058 \n",
"P8625 0.708333 \n",
"P5132 0.523529 \n",
"P425 0.446208 \n",
"P3816 0.416667 \n",
"P2512 0.415042 \n",
"P1677 0.400000 \n",
"P2578 0.379159 \n",
"P3261 0.350140 \n",
"P568 0.300200 "
]
},
"execution_count": 160,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstDF3 = pd.DataFrame(invConstViolations['normal']).T\n",
"invConstDF3['violation_ratio'] = invConstDF3.apply(lambda p: p.incorrect / (p.correct + p.incorrect), axis=1)\n",
"invConstDF3.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 161,
"id": "entire-gauge",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Symmetric Normal Constraint - Violation Ratios')"
]
},
"execution_count": 161,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"invConstDF3.sort_values(by=['violation_ratio'],ascending=False)['violation_ratio'].plot.hist(bins=100).set_title(\"Symmetric Normal Constraint - Violation Ratios\")"
]
},
{
"cell_type": "code",
"execution_count": 162,
"id": "infectious-clothing",
"metadata": {},
"outputs": [],
"source": [
"pd.concat([invConstDF1, invConstDF2, invConstDF3]).to_csv('../../allConstraintsAnalysis_Final/invConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "working-stable",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 138,
"id": "saved-twelve",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cbac40ccbf5c44a9963ead4fa2f371ac",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/52 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import os\n",
"from tqdm.notebook import tqdm\n",
"\n",
"codepConstViolations = {}\n",
"\n",
"codepConstViolations = {}\n",
"codepConstPropList = set()\n",
"\n",
"def extractTimes(filename):\n",
" times = []\n",
" with open(filename) as f:\n",
" for line in f:\n",
" if \"real\" in line:\n",
" line = line.strip()\n",
" time1 = line.split(\"\\t\")[1]\n",
" mins, sec = time1.split(\"m\")\n",
" mins = int(mins)\n",
" sec = float(sec[:-1])\n",
" times.append(60 * mins + sec)\n",
" return times\n",
"\n",
"# codepConstViolationsSummary = {}\n",
"times = []\n",
"filePath = '/data/wd-correctness/propertiesSplit_Final/checkViolations/exec_logs/'\n",
"for filename in tqdm(os.listdir(filePath)):\n",
" if filename.startswith(\"invConst_Validator\"):\n",
" tempTimes = extractTimes(filePath + filename)\n",
" times += tempTimes"
]
},
{
"cell_type": "code",
"execution_count": 139,
"id": "caroline-observation",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 110.000000\n",
"mean 100.688809\n",
"std 111.183132\n",
"min 8.677000\n",
"25% 32.859750\n",
"50% 54.791000\n",
"75% 119.579750\n",
"max 646.215000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 140,
"id": "static-conclusion",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Distribution of times (in s) taken for symmetric constraint checks')"
]
},
"execution_count": 140,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAEICAYAAACTVrmbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABbM0lEQVR4nO2dd7xkZX3wv7+pt7e9d3svdARhaYpI0wgWMFHBSgyRGDWxxUSNeV+TqGlGo68tKCoYFBGDoKKCwCpFFxZpCwvbYHfvllv29jL9ef84zzlzZu70sndm7vP9fO7nzpw5c+aZOc85v+fXRSmFwWAwGAyVxDPfAzAYDAZD42GEi8FgMBgqjhEuBoPBYKg4RrgYDAaDoeIY4WIwGAyGimOEi8FgMBgqTkWEi4h8Q0T+oULHWi0iUyLi1c+3iMifV+LY+ni/EJFrKnW8Ij73MyIyLCJHCtz/kyLyrWqPq4Bx/IWI/Jd+nHJuKvgZj4jIyRU83loRUSLiq9Qxs3xOs4j8VETGReRH1fyseqZa86YWEZG3i8jdx+BzLhSR/ioct2L327zCRUReFJFZEZkUkTEReVhE3isiznuVUu9VSv1zgce6NNc+Sqn9Sqk2pVS8sK+Q8/M+LSL/k3b8y5RSN5Z77CLHsRr4KHCSUmpphtfnTBSl1OeUUhUTqqUgIgHgU8B/6DFV7Nyk8Xngn3KM409F5MEKf2YleBOwBFiklHrzfA9mPjjW13Q1EZHvishnyjmGUupmpdSrC/y8Wp3XFaFQzeX1Sql2YA3wr8DfATdUejDVXmnOI6uBo0qpwfkeSJFcATynlDpY5c+5E7hIROYI3hpnDbBTKRUr9o0NPNdTaKTv2Ujf5ZiglMr5B7wIXJq27WwgAZyin38X+Ix+3Av8DBgDRoAHsITY9/R7ZoEp4G+BtYACrgX2A791bfPp420B/gV4BJgA7gB69GsXAv2Zxgu8BogAUf15T7qO9+f6sQdrZb4PGARuAjr1a/Y4rtFjGwb+Psfv1KnfP6SP9yl9/Ev1d07ocXw37X2taa9PAcuBTwP/kzaWdwMHgFHgvcBZwFP6t/5K2nH/DNih9/0VsEZvF+CL+vtOAE/b5zHDd/o28CnX80zn5p+Bh4BJ4G6gN8uxMs4L1+v3ANdkeN+JQAiI699mTG9/LfC4/g4HgE/nGOef6Hlxij4nHwf2AEeBW0nOp4LPOfCPpM6vaylsPjlzvdDfCPgY8OO0fb8MfMl1Hj4DPKzH8lNgEXCz/n0eBda63quA9wG79Hn7Z2CDfv+E/k0Crv1fBzyhx/Uw8BK9vdRrugf4DnAIa37+JMd19R6seTwJPAuc4ZoXW/SYngHe4HrPd4GvAj/X79sKbMg1/4Hr9LmM2L+h637yd1jXWRjwkZw/9pje6PrsPwUeTPut36t/6zE9LiHLvM7w/TP+Vuh7H5ZFZBA4DLzb9b4glkVgPzAAfANodr1+hT6nE/q7vCbD/XGZ/t4fc323vfp7vwC8PafsKEW46O37gb/MIFz+RX8Rv/57BSCZjkVy0t2EdZNtJvMN7KCeAK3Aj0nedC8ki3DRjz9t7+t63f3j/RmwG1gPtAH/C3wvbWzf1OM6DWtynZjld7oJS/C16/fuBK7NNs6092b6Hs7YXWP5BtAEvBprYv4EWAyswJpgr3RNnN1YE9iHdcN7WL/2R8BjQBfJSb4sy7geBd6cR7jsAY7Tv9EW4F+zHCvrvHDdLL+Q5b1/iuuCdf1mp2LdfF+CdQFdmT5OLIG8G9ioX/sg8HtgJdYF+N/AD0o85845KmI+OXO90N8I6yKfBrr0fj59vs90nYfdWAKiE+uGtxNrYePTn/mdtBveHUAHcLL+jvfqcdvvv0bv+1L9WecAXizB+yIQLOOa/jnwQ6Bbf89XZvl934x17Z+lf4eNWNqiX3/fTwIB4GKsG97xrvvRUaxFsA9LyN6Sb/7juo+l3U+eAFbZ50yPaznW3LtKnxv7GH/KXOHyM/15q7EWn6/JtG+W3yDjb4U1/2NY5mQ/cDkwA3Tr17+IZRHowbon/RT4F/3a2cA48Cr9HVYAJ7jvj8A6rDl0nd7eiiWI7N94GXByrrGX49A/pAeeTlR/8BqlVFQp9YDSo8nBp5VS00qp2Syvf08ptV0pNQ38A/CWCjkH3451Q9urlJoCPgFcnab+/qNSalYp9STwJNYNJwU9lquBTyilJpVSLwL/CbyzAmN0889KqZBS6m6sCf0DpdSgssxWD2DdCMBaKf2LUmqHskw2nwNOF5E1WOenHTgB6+a+Qyl1OMvndWFdtLn4jlJqpz53twKnZ9kv37yY1J9XEEqpLUqpp5VSCaXUU8APgFem7fYhrFX/hUqp3Xrbe7G0kX6lVBhLQLyp2HOehULmU665nvE30ufnt1g3NbC08mGl1GOu935HKbVHKTUO/ALYo5T6tT7/PyI5N2z+XSk1oZR6BtgO3K3Hbb/f3v864L+VUluVUnFl+SvDwLl5fouM31NElgGXAe9VSo3q7/mbLMf4cz3OR/XvsFsptU9/dhvWQiailLoP6wb+Vtd7b1dKPaK//80k52Ux89/my0qpA/Z3UUr9SCl1SM+9H2JpJWfneP+/KqXGlFL7gfvJfo2kUMBvFQX+SW+/C0sDOl5EBOu8fVgpNaKUmsS6B1yt33ct8G2l1D36OxxUSj3nOu5Jepz/Vyl1vWt7AjhFRJqVUof13MlKOcJlBZbqns5/YK0q7haRvSLy8QKOdaCI1/dhSeregkaZm+X6eO5j+7CctDbu6K4ZrEmdTq8eU/qxVlRgjG4GXI9nMzy3x7YG+JIOwBjDOk8CrNAX4lew1PNBEbleRDqyfN4o1oWYi0J+H8g/L9qxzAYFISLniMj9IjIkIuNYQiN9TnwM+KpSyh0ssQa43fXb7MAyTRR7zjNRyHzKNddz/UY3Au/Qj9+BZZJyU+jcKHb/NcBH7d9L/2arsL5rLrJ9z1XAiFJqNM/77X33ZNi+HDiglEq4tqVfbxnPYZHz3yblu4jIu0TkCdfvcQq570elzqd8v9VRlervs4/dB7QAj7nG+Eu93T5upt/V5u1YGuNt9ga9sL8K6zo7LCI/F5ETcg2+JOEiImdhncg5kQ565f5RpdR64A3AR0TkEvvlLIfMp9mscj1ejSWxh7FW7y2ucXlJ/oCFHPcQ1sXjPnaM1AutEIb1mNKPVagjPN84i+UA8BdKqS7XX7NS6mEApdSXlVJnYq1QjsO6CWfiKf162eSZF2CZJ57M9vYM276PpfavUkp1YpmTJG2fVwOfEpE/cW07AFyW9ts0qcoELRQyn7Ke6zy/0U+Al4jIKVg+kJsrMN5COAB8Nu33alFK/cAedpb3Zdt+AOgRka4CP3tDhu2HgFXuiFWKuN5yzP+830Vr/98EPoAVJdiFpfmlz72ChpLn9WJ+KzfDWAuEk13nrFMpZQu1bL+rzaf1Mb7vthAppX6llHoVlnb9HNbvkJWihIuIdIjI64BbsGzNT2fY53UislGrZuNYq0J7hTGAZdctlneIyEki0oJlY7xNWWGNO4EmEXmtiPixfAtB1/sGgLVpk9DND4APi8g6EWnDUh1/qIqM/tFjuRX4rIi06wn4EeB/cr8zZZyLRKSzmM/NwTeAT9i5IyLSKSJv1o/P0qt+P5ZwDpE8P+ncxVxTU0nkmhci0gScieXUz8QAsFKHRtu0Y63qQiJyNvC2DO97BsuE9FUReYPe9g2s87RGf3afiFxR5tezKWs+5fqNlFIhrJXk94FHtInlWPBN4L16zoiItOrrzdZoi7qmtQnqF8DXRKRbRPwickGW3b8F/I2InKk/e6M+b1uxVul/q99/IfB6rPtSTvLM/0K+SyuWUBjSx3s3luZSCpnmtUORv5X7fQms8/ZFEVmsx7lCRP5I73ID8G4RuUREPPo1txYSxTLBtgI36X2WiMgVItKKZRadIvt9AyhcuPxURCaxJN7fA1/AcpRmYhPwa/3hvwO+ppS6X7/2L1gryTER+ZsCPxssE8B3sdTLJuCvAbR9+H1Yk/Ag1mRxm0DsxLajIvKHDMf9tj72b7GiH0LAXxUxLjd/pT9/L5ZG9319/Lxoe+cPgL36t8lncsh3vNuBfwNuEZEJrJXVZfrlDqyJN4plSjiKzmPJwE+BE8odjybXvHg9sEUpdSjLe+/DEhRHRGRYb3sf8E96Xv4fLOE+B2X5TV4HfFNELgO+hKXx3K3f+3ssZ3UlKHc+5fqNwDKNncpck1jVUEptw4rY+grWnNmN5Yi2KeWafifWDew5rGCBD2X57B8Bn8W6liaxtLcepVQEa85chrXC/hrwrjS/QTZyzf8bgJP0d/lJljE9i+VP/R2WcDgVK1qyFDLN63QK+q0y8HdY5+r3+h7wa+B4AKXUI1j37y9iLWJ+Q6rGjf6N/xjLpPttLPPuR7C0xhGsRedf5hqAHcVlMGRERK7DSv78UBU/YytWZN32an1GIyBWMu5zwFKl1MR8j8dgyIURLgZDHaBNu18AOpRSfzbf4zEY8mEyTg2GGkfbuQewzDivmefhGAwFYTQXg8FgMFQcU3LfYDAYDBWnJs1ivb29au3atfM9DIPBYKgbHnvssWGlVF/+PY8NNSlc1q5dy7Zt2+Z7GAaDwVA3iMi+/HsdO4xZzGAwGAwVxwgXg8FgMFQcI1wMBoPBUHGMcDEYDAZDxTHCxWAwGAwVxwgXg8FgMFQcI1wMBoPBUHGMcDEY6pw7njjIRCg638MwGFIwwsVgqGMGJ0J88JYn+MXT+drAGwzHFiNcDIY6JhS1mgFGYjmbAhoMxxwjXAyGOiYSt4RKNG6qmxtqCyNcDIY6JpawhEs8YYSLobYwwsVgqGOiMUuoxIxwMdQYRrgYDHWMbRaLxY3PxVBbGOFiMNQxUVu4GM3FUGMY4WIw1DGxuG0WM5qLobYwwsVgqGOM5mKoVYxwMRjqGNvnEjehyIYawwgXg6GOMZqLoVYpWriISJeI3CYiz4nIDhE5T0R6ROQeEdml/3frfUVEviwiu0XkKRE5o/JfwWBYuBifi6FWKUVz+RLwS6XUCcBpwA7g48C9SqlNwL36OcBlwCb9dx3w9bJHbDAYHByzmNFcDDVGUcJFRDqBC4AbAJRSEaXUGHAFcKPe7UbgSv34CuAmZfF7oEtEllVg3AaDgaRZzJR/MdQaxWou64Ah4Dsi8riIfEtEWoElSim7LOsRYIl+vAI44Hp/v95mMBgqgG0WM5qLodYoVrj4gDOAryulXgpMkzSBAaCUUkDRM11ErhORbSKybWhoqNi3GwwLkqTmYnwuhtqiWOHSD/Qrpbbq57dhCZsB29yl/w/q1w8Cq1zvX6m3zUEpdb1SarNSanNfX1+RwzIYFibG52KoVYoSLkqpI8ABETleb7oEeBa4E7hGb7sGuEM/vhN4l44aOxcYd5nPDAZDmZjClYZaxVfCe/4KuFlEAsBe4N1YQupWEbkW2Ae8Re97F3A5sBuY0fsaDIYKYYcgm8KVhlqjaOGilHoC2JzhpUsy7KuA9xc/rGNHPKG47Eu/5UOXHsflp5pANkN9ETFJlIYaZcFn6IeicXYOTLFrYGq+h2IwFI1jFjOhyIYaY8ELl3DMdogas4Kh/ogah76hRjHCJRYHIGouTkMd4vhczOLIUGMseOESipqVn6F+iZhoMUONsuCFi625GJu1oR5xqiKb+WuoMYxwiRqzgqF+MT4XQ61ihEvMhHIa6he7YGXULI4MNYYRLtosZjr5GeoRo7kYapUFL1xsh75Z+RnqEeNzMdQqC164OJqLWfkZ6hDTidJQqxjhEjU+F0P9YqoiG2oVI1xipvCfoX4xnSgNtYoRLsYsZqhjjEPfUKsY4WJCkQ11jO1zMZ0oDbXGghcuoajRXAz1i/G5GGqVBS9cbM3FrPwM9UjU1c/Fap9kMNQGRriYwpWGOsbtyDdz2FBLGOFiF640F6ahDnFr3GYOG2oJI1xiJsPZUL9E4wk8Yj02mouhlljwwsV26JtVn6EeicYVzX4vYBZIhtpiwQsX0+bYUK8kEop4QtEc0MLFzGFDDWGEizGLGeoUu9hqk625GO3bUEMULVxE5EUReVpEnhCRbXpbj4jcIyK79P9uvV1E5MsisltEnhKRMyr9BcolbMxihjrFjhRrNsLFUIOUqrlcpJQ6XSm1WT//OHCvUmoTcK9+DnAZsEn/XQd8vZzBVoOkWcxcmIb6Iqrnrm0WMz2JDLVEpcxiVwA36sc3Ale6tt+kLH4PdInIsgp9ZkUwSZSGeiXdLGZ6EhlqiVKEiwLuFpHHROQ6vW2JUuqwfnwEWKIfrwAOuN7br7fVDGFT/sVQp6SbxcwcNtQSvhLec75S6qCILAbuEZHn3C8qpZSIFD3LtaC6DmD16tUlDKs0TOFKQ71im8VatFnMaN+GWqJozUUpdVD/HwRuB84GBmxzl/4/qHc/CKxyvX2l3pbpuNcrpTYrpTb39fUVO6yScTL0zYVpqDNsYWI0F0MtUpRwEZFWEWm3HwOvBrYDdwLX6N2uAe7Qj+8E3qWjxs4Fxl3ms5rAdKI01Cu2WawpYKLFDLVHsWaxJcDtImK/9/tKqV+KyKPArSJyLbAPeIve/y7gcmA3MAO8uyKjriAmWsxQr6RrLiZXy1BLFCVclFJ7gdMybD8KXJJhuwLeX/Loqkw8oZx+GHbJci04DYaaZ45wMdFihhpiQWfoR7TW0howNmtD/WEvjJrN/DXUIAtauNjO/JagpcAZm7WhnrDNYE3GLGaoQRa4cDGai6F+mWsWM/PXUDssbOGiI8Vabc3FrPwMdYQtXOw8FxNOb6glFrZw0Wax1oBtFjMXp6F+iDhmMesyNpqLoZZY0MIl5GguxixmqD9sTaXJJFEaapAFLVwczUWbxaLm4jTUEUmzmC/lucFQCyxw4WI79K2L05QsN9QTEVO40lDDLHDhYocimyQ0Q/0Rc/JcjM/FUHssbOGifS5tJs/FUIdE03wuJlrMUEssaOESsjWXgAlFNtQfps2xoZZZ0MIlqbkYm7Wh/oiktTk2wsVQSyxs4RJLTaI0bWIN9UQskcDnEXwe6zI2iyNDLbHAhUuqWcxcnIZ6IhpX+L0efB6rkrcx6xpqiYUtXNKSKM3FaagnIrEEfq/g8QgeMdGOhtpiYQuXWAKvRwj6jM/FUH9E4wn8XusS9nk8xudiqCkWtHAJReMEfR58XsusYHwuhnoips1iAF6PmFBkQ02xoIVLOJagye91bNYmQ99QT0TjCfw+a+76vGI0F0NNscCFi6W5eG2HqLk4DXVEJMUsJsasa6gpFrhwSRD0eZwL1DhEDfVENJ7Ar8OQfV6Pk1RpMNQCC1u4RBMEfV5HczErP0M9EYurpFnMI8TN4shQQyxs4RKLE/SbPAFDfeI2i3k9xudiqC1KEi4i4hWRx0XkZ/r5OhHZKiK7ReSHIhLQ24P6+W79+toKjr1sQtGEjhYzZjFD/eEORfZ7PWZxZKgpStVcPgjscD3/N+CLSqmNwChwrd5+LTCqt39R71czWA79ZLSYWfkZ6gkrFNmau17j0DfUGEULFxFZCbwW+JZ+LsDFwG16lxuBK/XjK/Rz9OuX6P1rAisU2WN8Loa6JJoWLWY6URpqiVI0l/8C/hawZ/IiYEwpFdPP+4EV+vEK4ACAfn1c718TWNFiXifixkTbGOqJiCuJ0uc1mouhtihKuIjI64BBpdRjlR6IiFwnIttEZNvQ0FClD58RJ8/Fa2suZuVnqB8szcU2i5nyL4baoljN5eXAG0TkReAWLHPYl4AuEfHpfVYCB/Xjg8AqAP16J3A004GVUtcrpTYrpTb39fUVOazSCEUTqdFi5uI01BExt0PfIyYgxVBTFCVclFKfUEqtVEqtBa4G7lNKvR24H3iT3u0a4A79+E79HP36fUqpmrmDh6NpDv15NIsdGpvll9uPzNvnG+qP6JzaYjVzaRkMFctz+TvgIyKyG8uncoPefgOwSG//CPDxCn1eRbAz9Guh/MsPHtnP+25+zDhlDQWTUv7F1BYz1Bi+/LtkRim1BdiiH+8Fzs6wTwh4c6mfUU2UUpZw8XsRER3KOX839tlInISCkekISzqa5m0chvrB7XOxSu7H53lEBkOSBZuhH9EaQtCXDOWcz5WfPZ6hyfC8jcFQX7hL7pvyL4ZaY8EKl3Asg3CZR5u13RXz6HRk3sZgqC/mmMWMz8VQQyxY4RKKWiaEoN/qQjnfGc625jJsNBdDASiliMYTBFLMYka4GGqHBStcbE3B1lz8Xs+8hnJGtCY1PGWEiyE/8YRCKZy6ePO9ODIY0lm4wiXNLDbfoZz2eIxZzFAItpbiNouZSENDLbGAhYtlFmvSZrFacegbs5ihEOz5kowWM5qLobZYwMIlTXOZ59pMES3shoxZzFAAUT1/A47mbTpRGmqLBStcHIe+z9Jc/B7PvJoVHLPYlDGLGTKTSChieo7aWrbPY/sMTSiyobZYsMLF0Vz8teEQNQ59Qz7+753P8J6btgHJ+eLu52KixQy1xMIVLtEMDv0aEC5HpyMkzE3CkIF9IzM8f2QSwNGyA+5oR2MWM9QQC1e4xNLMYl6PY3KYD2wHbTyhGJ+Nzts4DLVLOBrn6HRE57ikmsXmW/M2GNJZwMLFupk3+WtHc2nWkWvGNGbIRDiWIBxLMBOJO5qLO1osanwuhhpiwQsXW3OZ71DOSCzB8i6rYKWJGDNkwp6zI9ORpHBxyhd5UApjUjXUDAtXuDjlX2qjNlM4lmB5VzNgIsYMmbHD1Y9ORxyzWMCVRAmm4Z2hdli4wmVO4cr5L/+yvNMSLsYsZshEUnMJO5qL3egu2ZPImMYMtcHCFS5acwnUQG0mpRSReILFHUG8HjHCxZARdy7UXLOY0VwMtcXCFS66C6WIdVH6S+jkF4snqETXZjtSrMnvpac1YMxihozYC6LRmQxmMS1c4iYc2VAjLGjhYtcVg+ILV4aicTZ/9tfc9XT5fe8jLhNdb1vQaC6GjLiLmyajxWyfi/XfRIwZaoUFK1xC0bjjb4HifS5T4RhjM1FePDpd9lgirjpRvW0BhozmYkjDbssNMOIyi/lcociAyXUx1AwLVriEYwknUgysi7SYC9O+0Gcj5fctt48V8Fqay1GjuRjSiLgSfEcyRIs5Dn1jFjPUCAtYuMSdHBewLs5iqsra9u/ZaPnCJV1zGZ4KV8SXY2gc7AUIZDaL2f+NQ99QKyxc4RJNpJnFitNc7JVkRYSLq07UorYgoaiVhW0w2Ni18CA1idLnTQ1FNpWRDbVC0cJFRJpE5BEReVJEnhGRf9Tb14nIVhHZLSI/FJGA3h7Uz3fr19dW+DuUhB0tZuPzFteD3L7YK2EWi7iqBfS2BQGT62JIxa6F1x70MTIdcVVFTo0WMz1dDLVCKZpLGLhYKXUacDrwGhE5F/g34ItKqY3AKHCt3v9aYFRv/6Leb94Jx+Ip0WJWJ8rCV32O5lJJn4s2i4ERLoZU7DmyrKuJqXDM0WwDadFixqFvqBWKFi7KYko/9es/BVwM3Ka33whcqR9foZ+jX79E7OSSeSSUZhbzeqSoHAFHc6mAWcxeldoOfYBhEzFmcGHPt6W6isPARAhILVwJzGvDO4PBTUk+FxHxisgTwCBwD7AHGFNKxfQu/cAK/XgFcABAvz4OLCpjzBVhbDZCe5Pfee4v0iwWiVfLoW/MYoa52AuQZR1WcdOBCWt+2L4W2/diNBdDrVCScFFKxZVSpwMrgbOBE8odiIhcJyLbRGTb0NBQuYfLSSye4NBYiFU9zc42b5FmMXslGaqgcAn6PPS0arPYpNFcDEncZjGwNJeAN1lhwmvKvxhqjLKixZRSY8D9wHlAl4j49EsrgYP68UFgFYB+vRM4muFY1yulNiulNvf19ZUzrLwcHg8RTyhWdbc423xF9nOxL/ZKRHW5o8UCPg+dzX6OThvNxZDEnm92cdMjEyHHJAbJpmEmz8VQK5QSLdYnIl36cTPwKmAHlpB5k97tGuAO/fhO/Rz9+n1qnpM4DozOALCqJylcvB4pqh9GpIJJlBFXEiXg5LoYDDZ2XpWtuQxPhZ2ileAuuW98LobawJd/lzksA24UES+WcLpVKfUzEXkWuEVEPgM8Dtyg978B+J6I7AZGgKsrMO6CSSQUw9NhFrc3Odv6R2YBUjQXv6s2U9DjJR+2DbyiZjG/LVyCxixmSMHWXBa3N+ERSKiktgKm/Iuh9ihauCilngJemmH7Xiz/S/r2EPDmkkZXAX6x/QgfvvUJHvq7i+lrt5zlB0Zn8EhyFQjuJLTCLk6n/EtFosVSNZf2Jh8Hx0JlH9fQONhzpNnvpbslwNHpCAGXWcxr8lwMNUbDZ+gfHp8lEkvw7OEJZ9uBkRmWdTY72goU3w/DLVzKtfK5o8UAWgI+ZiOxXG8xLDBsTTnoTwZ9uM1ifpPnYqgxGl642D6RnUcmnW0HRmdTIsWg+H4YtnBRKrXuUym4HfoALQGvKf9iSMGOTnRHFLoXR5XqRBmLJ5gpc2Fz66MH+OX28ltRGOqbxhcu2mz1/IBLuIzMpPhbALxF9sOIuARKuU79dLNYc8BbkUABQ+MQdpUIWqSrONgLIgB/haLFrn9gL5d/6YGyjnHDgy9w89Z9ZR3DUP8sGOGyUwuXUDTO4GQ4JVIMineI2mYK92eUSiSWSMlZaAl4mamAuc3QODhVHHweulsCzmMbb4WSKPcfnWH/yExZc282GmciZMy6C53GFy6RpHBJJBT9ozpSLItZrNCVX4rmUgHh4i5F0xLwEU+olB4ehoVNOJbA7xW8HmFRBrOYU/6lTLPYZDhGQlnlkUplNhpncjZa1jgM9U/jC5eoHTKc4MDoTDLHJc0slswTKM7nApUwi8VTVqHNuqCmMY1Vj3hC8eyhifw71ghWiwhrXtg+F7dZrFKhyNNhS+OYLsPvEorEmQgZ4bLQaXjhMhOJY1+Dzx+ZpH9kbgIlgNdjR9uU4HOphFksRXOxbiLGqV89fvbUIV77/x7ggJ4PtY7V3M6aIz26/lwgrU03lB+K7AiXcOnCZTYaZ2LWmMUWOg0vXELROJsWtwOWaezA6CwBn4c+fYHa+IsORXb5XMoUApF4qnBpNsKl6uwZnEIp2D00lX/nGsDdfyiTWSzpcynPLDYVjuv/pQmHaDxBTJt0K5FgbKhfSsnQrytmInF62wNMR5rZOTBFNJ5gZXczHpdJAYrvQR6OJZx6ZJVy6Nu0BKzTYsxi1eOA9r3Vj+aSIKjNpbZDP7W2WGUKV9oaS6kLG/e1MBGKpvRMKpdoPMHRqQhLO5vy72yYdxpec5mNxGn2ezl+SbvWXOaGIUPxPpdILEFns1Wyv9wVWnazmDEtVIt+7Xvbd7ROhEs0aRZzQpEzJQFXyCxWquYScgmlSpvGbt12gEv+c0uK1cBQuzS+cInGaQ74OG5pO3uGptg3PDMnUgySNutCzQrhWILOFku4VMIsFsxkFjNmhapxQNeX219PmoueI04ocsYkyvKEy1SZPhe35jJZYaf+wHiI6UicSRPmXBc0vnCJxGn2ezh+STvRuGIyHMusuRRZmykSS9ClNZdyfSPhaGbNxZjFqkM4Fmdg0qrdtr9ONBcrXN2aFwGfh/YmX0q0mIjg80hZPpdYPJFsJRGuhFmsskLAvs7KCTYwHDsWgM8lRkvAx3FL2p1t6ZFiUErhyjh97dZxyvW5hOMJOgPJrpgtfuu0GId+dTg0FkIp6G7xOwmDNdB5OyfhWJzWYPJy/dvXnMAJS9tT9vF6pCyz2LRLoJRqFptNMYtVVnOxr7PpEgWf4djS8JpLKJqgye9lfV+rI0Ay+1x0+YwifC7tTT5EKuRz8c41i5nildXBduKft2ERs9E4Q3XQOyeclmj7znPXcNbanpR9im3Vnc5kOCkMKmEWq3Suiy24ysnBMRw7Glq4xOIJIvEEzX4vTX4vaxdZQiWzz0Wc9xSCfbE3+8uvAxZx5TAAtAZNKHI1sas0vGxDL1AfEWNhl1ksG5bmUrpZzK0RTJc490IpPpfKCgFbcJWqVRmOLQ0tXOzJaPswjl/aTnvQ50R5uSnWIRrWEV4tAW/5ochpeS5N+iZS6gVuyM2B0Rn8XuHsddbKvx4ixsJpC5BMFNuqOx33TbtkzSWSFG7VM4sZ4VIPLAjh0qSFy19fsonPv+W0jPZ1X5GF/2wHa1MFNBertEfyVHg8ojWi/BfRr545wkdvfbKsz19o9I/OsryrmdU9LYjUR8RYOJpwOpVmw+eVssq/uG/apZqeqmkWszX5UoMNDMeWxhYuejK26ESuE5Z28EcnL824rx2KXEyGvmMWq7DmAoX3dHlg1xB3PHHQVFAuggMjM6zsbqbJ72VpR1NdRIwVYhbzeTxllX+xhYtHStcOQi5rQXqeS7l5WyFjFqsrGlu46MloO8hzUYzPJZFQROOKgM9j9V6psEMfCu/pMh2OO+U2DIXRPzrrBHWs7mmpD82lELOYt7xQZPumvagtWHJEli0AlnQ0peS57B2a4tRP3832g+Mlj8+EItcXDS1c7MlYiHApxudi38iDPm+FHPqlay7JQoPGVFAIs5E4w1NhVnZbQR2re1rYV+PCRSk1J1osE94yfS72XFrSESzdLKbnbF97MCXPZdfgFPGEKkuQJ6PFzFyvBxpauNilKJoLqG9UTA9yp3Ok1lzKCUVOJBSxhJojXJoDvoIy9O2bgFnNFcbBsdSq2GsWtTA0Ga7phNVoXKEUTm2xbPjKzXPRv8GS9qayQpH9XqGnJZDi0B+ctMK9p8qIIAsZh35d0dDCxV75txSjuRRgXrJrG9k+l3JChm0taI7mUqBD39ZYTOx/YdhlX2zNxRYydp+fWsTpQunNFy1WXp7LVDiG3yt0tQRK1oRno3Ga/F46mn0pochDWrhMliEYjFmsvihKuIjIKhG5X0SeFZFnROSDenuPiNwjIrv0/269XUTkyyKyW0SeEpEzqvElsuH4XArQXIqpKhuOujSXMh369rHSnbXGLFYd+tOaxa1Z1ArUdjiyrSkXEi0WK8fnEorRGvTRGvSWvFgJRa1CsR1N/pRosSFdbqdUzUWpZPVxs5CqD4rVXGLAR5VSJwHnAu8XkZOAjwP3KqU2Affq5wCXAZv033XA1ysy6gKZLcLnUkwoctLn4qGpTLNYOJ7sje6mUIe+Wc0Vh93Pp1f381mtNZdaduo7wqUAn0u5ochtQR+tQV8ZeS5xmgNeOpr9zETiRPW1MjhhaS6lC62k0DQLqfqgKOGilDqslPqDfjwJ7ABWAFcAN+rdbgSu1I+vAG5SFr8HukRkWSUGXgjFaS6Fd/JzaxstZTr07Y6WQW9pDv0pp/+GES6F0D86k9LPp7vFT3vQx/6j0/M8suyEo7YZNvc89ns8ZflcprRwaQv6iMZVSaXtZ7Xm0t5k1UGzTWN2iZ1Ss/bd1gETilwflOxzEZG1wEuBrcASpdRh/dIRYIl+vAI44Hpbv952TEhm6Oevz5ksXJnfrODWXOxQ5FLzTCKxLD6XgK8ggTETMWaxYjgwMstKV205EWFVjYcjF6O5lGMWm45YZjGnn1AJc2pW1/LraLKqYNjhyLbmUnJBTJdwMVp6fVCScBGRNuDHwIeUUhPu15R1ly36Tisi14nINhHZNjQ0VMqw5mCv/PNdlFCszyV53Ca/l4RK3gCKJZtDv5D8mXAs7mhaxg5dGP2jM6zqTq0tV+vhyMX5XMrRXOLa5+LTz4ufUyHdnK9Dl1iamI2RSCiGp+xosdKy9u3glqDPY2ru1QlFCxcR8WMJlpuVUv+rNw/Y5i79f1BvPwiscr19pd42B6XU9UqpzUqpzX19fcUOKyO2czG9pXEmPB7BI4V18nMLBNvkVqrfxdFc0s1ifi/RuHJs1plwryyN5pKfqXCM0ZloiuYCsKyriYHx0DyNKj+FmsXKDkUOx2gLemnTwqWUBYvVnM9LhzaLTYSijMxEHKFXchSarlnW2xY0ZrE6odhoMQFuAHYopb7geulO4Br9+BrgDtf2d+mosXOBcZf5rOrMRGIFOfNtCg3lTPG52OXxSxQu2ValLcH8PV0qUWhwIXFozApDXpGmubQ3+ZmOxMtyhleTws1i5YUiT4djtAaSZrFSBEHS52JrLlEnDFmk9FBk2/zb2xZgOhwz5Y7qgGI1l5cD7wQuFpEn9N/lwL8CrxKRXcCl+jnAXcBeYDfwTeB9lRn2XOIJxbmfu5ev3r/b2TYbSRTkzLcptHxGehKl9VkV1lwKOK5b8BizWH5s00xvayBlu73KrtXfMClc8jj0K1D+pVU79KG0BctsJJnnApYD306gXNndzFS4RLNYNJn5b8od1QdFdaJUSj0IZLMxXZJhfwW8v4RxFY3XI0xHYs4qCWA2Wpzm4vVIQdFikXiqz8X6rDKFS4byL5A7CmwhaC7PH5lkNhrn9FVdZR9rZDoCQE9bqnCxb6ZToZjjiK4lnKTdPD6XcjpRKqWcUGQ7AKaUORWKxmkOeJI+l1AUuwj5+t42nuofK2l89iLLDiGfDsfzCttSiMYTPLhrmItOWFzxYy80GipDv6vFz9hMxHk+q52LheIrME/AMYv5kz6XUjWXcBbhYh83l1nMLXjmo95SKBovqzlVIXzurh38w0+2V+RYjnBJ01za0sJma42kGbZ6/Vxmo3ESilTNpYQ5NRuN0+Tz0hawurROzEYdzWVdb2tZmf/gFi7VOVc/2tbPu7/7KM8emsi/syEnDSVculsCjM4k1e4ZndBVKL4C28Q6Dn2vyyxWquYSz3zjsFePuYSLfYEFvJ550Vze8t+/49M/faaqnzEyHXGEQrkcnbKO092SKlxs/0CpJptqU6hZzOf1lOw3srXgtqDX6YRa7Jyys+ibA1YQTVvQx0TIsia0B330tQeJxBMl58+A5XNxj7fSPLDLilTdOTBZleMvJIoyi9U6XS2BFM0lFI3TlXYjyYWluRTgc3E0F2/ZmkvS55J642guyCyWtEMf6wZKLwxP81T/eN56V+UyNhupWNOpkekInc1+p0ipjb1Sr1nNxVXLLhc+j+SMLsyFrVG0NZUeihyJJ1AKx1Rsl4AJRxP0dQRTzI/BtuJMWo5ZrN3SXKqRNBxPKB7ecxSAPUNTFT/+QqPBNBf/HM2lkKKVNoXarN2FBMvVXJxjZfG55HboWxdYX3vpJdJL5d4dAwAcrnII79hMlMlQrCKRXCMzERa1zl1spGeT1xrF5LmU+jvZWkprwEfQ58HrkaJv4CEdLmwvuDqa/UzMxhicDLG4PVhW/ky6z2WqCoupZw6NM64rORvhUj4NJlxSNRc7LLJQ/IWaxWIJRKzonEppLnPNYvl9LvZFurg9eMzNYr/WwmVgIlS1EN54Qjk3/HJKtduMTEXm+FsgKVxqNX/CKZRaQFXkUjWXpFnMh4jQGvAW7R9Jb87X0eRjImSFIve1NyU1lxJ+5xldyr9TBwpUY74/uHsYgNNXdbFnsHbLAdULDSVcOpv9TIRijpM5FC3O51Jo4b+w7hwp4hIuFY4Wc8xiOY47E47jEctBfSwd+uMzUR59cZTetgAxV/Z1pXH3AxmfLd80NjKdWbi4zTW1SDgWx+cRfHmESzmFKx3NRf8WrUFf0UIgvZZfe5PfCUVe3B5MCvESfmc7xLmcMOl8PLR7mBOWtnPO+h5eGJ6u2byneqGhhEt3i7WqsW9EMyVEixWy8nN3BSzboZ+jthiQs6eLnZdQThXbUtiyc5B4QnHVWVbxhWqZxsZcAqUSfpej0xEWtc0VLq06smmyQr6dSlNIF0oor/zLVAbhUqxZzNbeHZ9Ls4/D47PMROIsbg+WpbmEopaJu7VKwiUUjfPoi6Ocv7GXDX1tROIJpz2DoTQaS7joVenoTNSJXCnW51Ko5mJ3BQz6PIgku14WSyRumdh8aSVqCg1Fbg349I0gTuIYrbTu3THIotYArznZKnB9WGe+Vxq3iXOiTM0lkVCMzmTWXDweoS3gK6uRVTUJx+J5u1BCeaHIjkM/RXMp1yzmZ0z7QBd3BJ2Q75LMYnqh6FQPqLCm/uiLI0RiCV6+yRIuYPwu5dJQwsWODBubiRCO6ciVaoQia7MY4JjGyin/YpvY3Hg9QtDnyenLmQ7HaQ16aS3AhFYpovEEW54f5KITFjtlVI6F5lKuWWwiFCWeUPS0BjO+3tbkq12zWLQwzcXrsUKRSymNkjSLWXPJ8rkU6dBPM4vZiZQAfW3l+VzsDpdBnwefRyquuTy4exi/VzhnXQ8b+qwGcsbvUh4NJVxss9joTNS5KbcUaRYrpGS5tZJM/nTltDqOxBJzTGI2+Xq6TEeSzZ0AZo7Bynvbi6NMhGJceuISulv8BH0ejkxUR7iMz1TOLHZU58pkihYDa8Veq9FikXhhwsVfRGXvdCZd0WJASaZWpzmfP+nQt1mcFopcLLM68lNEqmIGfmj3MGes7qYl4KOrJUBvW8BoLmXSUMKlqzmpucykqeiFUHgociIlcqepTM0lW3Kc1dMldxJlS8DnrDaPRbTTr545QsDr4RWbehERlnU2OQUhK43bLFau5pItO9+mval4B/axwtJc8s9jbxHdVNOx5lKygnhb0Fd0eHvSLGZdG+5SOovbg1o4lK652NdyWwkmu1yMTkd45tAEL9/Y62xb39dmhEuZNJZwabUm85hLc2kuoFGYjb/APIGIy+cCloZRTsn9bKvSloCX2Wj2C3Ha7r9RQDZ/JRicDHHLo/u5/NSljra0rLOZI1U2i3nE6gtSDnZ2fjbh0tbkr3GfSyGai7VPKZqLXVfMpqWMUGS3Qx+sEOrOZj8iUrKGaJVy8rnGVrlz9WT/GErBWWt7nG0b+trYM2TMYuXQUMKlPejD5xFGZyJzVPRC8Ho8RAty6MdTBEKh/e4zEYmXZxZrDVYvgiadr2/ZQzSu+OClxznblnU2Vc/nMhOlvclHR7O/YppLpmgxsOZOvUeL2d1US6n3NpUmXNpKMD3N8blozaWvPej4FEs5LqRqLq0laFW52H5wHICTV3Q42zb0tVa09NBCpKGEi4jQpbP0ky2Oiy1cWUCb47SLvRyzWCQWz5oc15xPuKR1Dqxmlv7h8Vlu3rqfN52xknW9rc72ZV1NVUukHJ+N0tXi1/lL5QoXKxcnp1msRn0uuUynbnze0n0u0zqs3aY16CMcSxQlqJLWgmSeC1jCxaathPwZ+9jNWnsrVUBl46n+cdb3tqaY8TYstiLG9hrTWMk0lHCBZH2xdBW9EArt5Je+kmz2l665hHM69H15osVitAaS0WLV7Eb5lft2o5Tiry7ZmLJ9aWdz1RIpx2YidDUH6GgqX3M5Oh2hLejLepMu9aZ3LEjXlLPh02ax0nwuccd3B5TUMMy55nypZrHFbuFSom9rJhJzcr9KMdnl4umD45y6sjNl20YTjlw2jSdcmv3a52JN4GKbhRUcipwuXMrwuWQTLs0Bb1ZtJJ6w8nhSNJcq3RwPjMzww0cPcPVZq+e0CF7e2QRUJxx5zK25VMAslk1rAeumNxOpfguBUghHEwX5XOxcqVJKwGQyi0Fx2vBs1BKCdlBARxbNpRSfSyiacBaKpQQbZGNoMszh8RCnrkgVLsu7mgn6PMbvUgaNJ1xaApbPpQSzmJ0nkI90M4XleK+CQz+HRmRnT7cGkg79apWAuf3xg8SV4v0XbZzz2lItXI6MVz5ibHwmSmezn45mX0V8LrmEi23Cqab2VyqFmsVsn0tJmktkrlkMiluwhNJaXLQ3Wb1h3GbUUkxasXiCSDzhXMuVDEW2/S3pwsXrEdb1trJn0GgupdJQJffBynXZfjDq+CqKCUX2F5HnkhKKHPAyGyltxRuJJ5zM5XRyOfTtm2Br0EdLif03CuXRF0c4fkm7I0jcLOu0EikPjVVPc4knFBNl+kOOTkVYlmH8Nu122f1wlM6W2upGmT7fsmH7XArppprOVChduBQf3h6KprYV93k93P3hC1KCKEoxP6bXLLOES2UWAU/1jyMCJ6cJF7D8Ls9o4WMonobTXLpbA6nRYsWWfymkzXEsMSeJspxQ5OwO/ew+F9ss0Br04vd6CPg8VXHoxxOKx/ePceaa7oyvVyuRMpFQKT6XY2EWg9osux+OFWoWK93nkm4WKyW83c6id2OZl5LbSqmE4PhybM0l4CUSTzh1+crh6YNjbOhrS/nuNut7W9k/MlNypemFTsMJl64WP+FYglGdgFesz6WwUOS5Dv2ZSKykshv5MvQj8cwRO9PpGdUBb1Uahj1/ZJKpcCyrcKlWIuVUJEZCWeezo9k6p6UKcKWUJVyyhCEDZZUmqTaFln+x9ynWRBuLJwjHEs5cgqRZrJjfI5NwSac96GOqyGslvdqGU5GiAoupp/rH55jEbFZ1t5BQVC2PC2DH4Qk+eMvjJc/tWqbhhIvdwvbQWAi/V+Z0HcyFr0CfyxyHfsBLQiVbFhdD7mix7DXDbLOAbRKrVmXkx/aNALB5TU/WfaqRSGmXfrF8LpaZqtRw5KlwjEg8kbX0C1BWOfhqopTS0WL5F0m243xosrjIPXcXSpuSfC7RZLhwNlqDPpQqXiMCUjL0ofyFwMBEiMHJcFbhslLXzjswUr3qyPc9N8gdTxzinmcHqvYZ80XDCZcufSM6NDZbVBgy2OVfcguIeEIRS6iUi93WjkIl+F1yJcg55fx1xePvPPSCc9O1L3qnim2gsollNo/tG6WvPciqnuas+1QjkdKuptvVEnAaRBVjGvt/9+7iP+9+HnCXfslctBJc3ShrTHOJJRQJlb/FMcCSDsunNFCkiXIqYs+l5Jy2fS7FBInMRvL3TyqlMnK6iTvpYyxvtf90v+VPecnKLJpLjxUZeaCKpfftRdltj/VX7TPmi6KFi4h8W0QGRWS7a1uPiNwjIrv0/269XUTkyyKyW0SeEpEzKjn4TNiVkQ+Ph4qKFIPCSpZn6r9STk+XSI5Vqbsb5dYXRvjHnz7LnU8eBJI+lxan0GBlY/9ttu0bZfOa7jlVm91UI5FybNYSCF0tfqcA4ngRJWB+/vRhvv3gC0RiibxFKwHagpYAq7Us/UJbHAP0tgXwCAwWKVzSG4VB0txajOZSSOdXezFUjG8rvdpGpZKGnzo4jkfgpOUdGV9f1tmE1yMcGKlO7TzA8VU+sGuo6EVBrVOK5vJd4DVp2z4O3KuU2gTcq58DXAZs0n/XAV8vbZiF063rix0ZDxXlb4HCSu7bPe/TfS5QonDJUf7FrqU0E4nxwK4hAPYdtVZRmfpvVFpzGZgI0T86m9XfYmMnUh6tYCKlo7k0+0vSXA6NzTIdifPoiyOM5KkrBrVrFgtH7flWSIa+h962IAMTxZ2H9EZhgFNksljhktfnUormkhYtVqlulE/3j7FxcZuzQEvH5/WwrLOpqk3DBiZCrF1k+XZuf/xg1T5nPihauCilfguMpG2+ArhRP74RuNK1/SZl8XugS0SWlTjWgrB9LpF4oqiilWCXf8knXOZqLvYFVYqDMVe0WIvLLPZbLVz2a/vvjCtaDLRZrMImnW0vjgKweW12fwskEykPVdA0Zhet7Gwp3ucyHY45ocv3PzeYtyIyUFbF3mriaC4FmMXAMo0NTJamubgjpkREz6nCF0yhAjq/2hpiMXPV9s84eS4laFWZeObQBKdk8bfYrOxu5sBoFTWX8RBnr+vhzDXd/Pix/pKCgmqVSvlcliilDuvHR4Al+vEK4IBrv369rWp0uhoU5XMupmN3osx1giPOxe4Kr9QX5fBUcUXuYvEECTW3xbGNLTj6R2fZfnACSAoX+ybolMSoglls274RmvweTs5iNrCpRiLluI7262z2O5nehSZS2v4fr0e47/nBpFksR7RYORV7q0kxZjGAJR25NZejU+E5kUnpkYc2xVYfdheXzIY9p4syi6WVckrm4JQ+30PROIOTYdYtas2536rulqo59GPxBMNTYZZ2NPEnZ6xk1+AUT/U3Tl5NxR36yrozFy1+ReQ6EdkmItuGhoZK/vwmv9dZPWVTd7PhL6DwXyaz2BlrumgL+rjjieLU2kxakBvbLGZHkpy5ppv9IzMopZy2r94y+m/k47F9o5y2sitvxN1ynUh5sIKJlOOzUVoCXoI+r1OjqlCzmO0kfdWJS9g7NM0TB0Zp8nvyzoeOJn8NCpfCzWIAizuacvpc3vCVh/jyvbtSttnRZenCt02HDRdKIT6Xdq25lOLQd2foQ3mhyPYCZHlX9kAVsJz6g5NzBXIlGJoKk1CwpLOJ175kGUGfhx//oXEc+5USLgO2uUv/H9TbDwKrXPut1NvmoJS6Xim1WSm1ua+vr6zB2B0pi48Wy5+ElkkgtAR8XHH6cu56+nBRZUqc4IA8ZrH7nx+kq8XP5acuYyYSZ3gqwlQ4llZo0FfRPJeZSIxnDk2weW1ufwtYTvf2Jh8vDleuDtPYTNSJ/Av6vDT5PQVn6R/SGtTbzlkNWOGei3JEitlY2eM15tCPFmkWa2/i6HQkY4LhTCTGwbFZnk7LOt87PE1LwJtSYBKKC29PJFRK/a9sONFiRQROVCMU2c7Lyi9c7IVT5U1j9iJoaUcTnc1+Xn3yUn765KGarG9XCpUSLncC1+jH1wB3uLa/S0eNnQuMu8xnVcOOGCslWgxyF/7LZgN/69mrCUUTRWkvdl5MNpOHO1rs5Rt7WddrhUbuH5lhJr1EegWzlsGyR8cTipeuyi9cRIT1fW3sHa5cHaax2SidLcmVdGezP6XtcS7si/ac9T2s620lGlc5/S02bU01bBYrUHNZ0qFzXTIEVwxqc9netGKMLwxPs663dU5E4IquZnYXWFvLHmehZrFiQ5whWW056PPgKTLYIJ2D2o+yIo9wsQu1VsM0ZkeH2SHkH33Vcfzsr1+Br4jcvFqmlFDkHwC/A44XkX4RuRb4V+BVIrILuFQ/B7gL2AvsBr4JvK8io86DHTFWbLRYIYX/MoUiA5yyopNTVnTw/a37C3bK5dNc3BfqBZt6Wd1jC5dppsLxFDNPJbOWwcrMBzhhWXtB+2/oa51z0yqHcZfmApbJqlCH/uHxWXrbAgR9Xi483tKCCxEutdjq2DGLFexzyZ7rYm87ND6bUlZo79B0SnFJm/M2LKJ/dLagG2t6RFc2gj4vAa8nrxB/aPewc76tKLRktWURKbu+2MGxWUTIWC/PzSpbuFTBqe9oLnoMa3tb8wq7eqKUaLG3KqWWKaX8SqmVSqkblFJHlVKXKKU2KaUuVUqN6H2VUur9SqkNSqlTlVLbKv8V5mJrLsXUFYNCfS7ZV5JXn7Wa545M8mSBTrl8Phe38Dh/Ux8ru1sQgf1HZ5mJxMpOesvF7sEpWgPegif7hr42Do+HKhaxNjYbSQnO6CyiG+Xh8ZBzwV50/GIgd46LTVuw9hqGFWsWW6w1l0x+lwHtW1HK0lbAEl79ozOszyBcXrZhEQAP7xnO+7mFChewe7pkP5eDEyHe/q2t3PTwi9axM0Shldsw7NDYLIvbg1mvPRt7n/4qaC5HJsL4vUJPS/65WY80hv6Vhr3iLVa42D6XXA3DknkHc3+6K05fTrPfyy2P7C/o8yJ5wky9HiHg87Chz1rRNPm9LO1oYt/INNPhWEbNpVI3950Dk2xc0p4zedKNfXN6oUJ+l7EZqyKyTUcR3SgPj4Wcas1nr+uhs9nvZFvnor3JV3b15UoQiyf45fYjTs0vKMYsZmsumcxiSYFjmzAPjMyQULBeN8dys3FxG71tQX6352jez3VMVwVcc/mE+PZD1uLs+QFrjDOR+JxgjHLzug6Nz+b1twB4PMLKruaqZOkPTIRY3N7kaGSNRkMKFzvXpegkSrsHeY6y+46fJINAaG/y87qXLOPOJw8V5PuwTR65Vk9relq4/NRkatCqnhb2H51hOhLPWMXWFi4P7houq97XzoEpNi2ee8PJxvoKdu5TSmmfS6may6xTXr/J7+XuD1/AX164Ie/72pv8NeHQv/e5Qd77P4/xlft3Z4xOzEVPSwCfR7KaxWwTrG3CtP9nMouJCOdtWMTDe47mNfWGitFcgr6cYcTP6LD7XQOTzrGb0syCrWV2ozw0FipIuACs6G6mv0pmsXxmuXqmIYWLveIt2qHvze9zSZopMh/7vA2LmInEnXyUXCR9LtnH+fO/fgUfuvQ45/manhb2j8xozcVtFrOFS5zx2Sh/+p1HeMcNW0sqZzI6HWF4KsxxSwoXLmsWteARKtK5LxS1AhO6mpPmgo4mHxMFlH+xEyhtzQWs1XwhkYNtQR+haGLeS6zbPUS+ct9utu2zElkL9bl4PMLi9sy5LkcmwizramJ5Z5PTG97WNNdmEC5gmcYGJ8N5z2vxwiX7vLQ1l71D08TiiYz5M+UUalVKcXBstmCT76qe6uS6DEyEWNphhEtdYWsupRSuhNw+F1tzyaZtbNAr+L0FrODzRYvZn+N1qc2rddz9yHRkTrkOsOotPbx7mFhCsXtwig//8EkSRdb82qUjhDYtKcyZD9ZvvbK7paDvnQ93XTGbTm0Wy/dd7PyFXI3BsuGEuM6zaezZw5Os6GpmUVuA72+1TKyFmsVA57pkyNIfmAixpL1JR/YlNZfetkCKf8vNeestv8vv9uY2jSXDhfPfUtryBE48c2iCgM9DJJ6wIiMjMVr8qWaxtqDPSY4tluEpK1R7eYFzZFV3C6Mz0YoGeyilODIRcsyYjUhjCpfWEjUXl88lkVAczpBxnsvnArC+z1oBFrKCzxctlonViyzfQTiWSMlzcddb+s3OIdqbfHzqtSfy6x0DfCktaS4fO7U5ohizGFjfvRIRY+66YjYdzX6UIm9Sn33OShEupdS9qgY7Dk9wxppu/u1PXuJsK9QsBnaW/lzhMjgRYklnk3OelFK8MDzN+t7s53nNohaWdzbxuzxOfcfnUqjmkkWAj81E6B+d5ZITrECMnQNTzEYTc3w5L9uwiBeGp53Kxm4SCcWX793FWZ/9NfuPztU4Cs1xsbFzXSqpvUyGY8xE4iztzJ9/Va80pnApNc/Fm/S5/Oc9z/PK/9ji1KWyyae5tDf5WdweLMj3YNfi6msvfIKtcZWrSNFcXK2Of7NziPM39nLt+et405kr+dK9u5y+LIVQbKSYzfreNl4Yni5aU0rHFi5un4tdAiZfln5Scyk+pLO9BrpRjs9EOTg2y4nL2rnw+MW8/ZzVtAd9RQqXpjlmMaUUAxNhlrQHWd/bylQ4xtBkmL3DmcOQbSy/Sy+/3zuS87yml2jJhaW5ZPaXPHvI8rdccbpVJWr34CSzkZjTKMzmj89cSbPfy81b96VsnwhFue572/jCPTsZmgxz33Nz+6QUK1zsXJdK+l0GxlNzXBqRhhQup67o5GN/dDyv2FRcpr/t0N93dIZvPmCVa39M27xtCgkNtVaG+YXL7oFJ2oK+olbZq11RT5kc+k/2j3N4PMQFx/UhIvzTFScT9Hn4+VNHCv6MYiPFbDYsbmU2GudwmaXDx22zmNvn0lxYfbHDugTNkhJWhLVQdn/HEevmetIyq57bP19xCls+dmFRiXVLOpoYn42mlCyZDMeYjcZZ0tHkBF882T/O8FSYdX2562udt2ERI9MRntcabSaK8bm05/C52P6Ws9Z2s6KrmV2DUxl9Lh1Nft5w2nLueOKQE0U4Oh3hyq8+xJbnh/j0609iZXdzRnOenW1vNwPLx6oqNA2zS+0bn0ud4fN6eP9FG1NW9oVg+zb+41fP4xEr72Vb2oo/HEvgEXJe7Bv62tijzQ652DU4xcbFbUXdxLtb/LTr7+UOz2z2W1V9737GEiIXHNfn7HPu+kVseX5w7sFyjKtYkxjgmFfK9bskG4W5zWJ2fbHcWsWRiWQCZbGUYxbLV/C0UHYcThUuHo+wqK04QWmvhgdd2osdhry4I+iYbu/dYa3qc2kuYAkXgN/uzF7zL73nSi5acwROPHNogmWdTSxqC3LckjbLLBZJZEwrePu5q5mNxvnJ4wdJJBQfvvUJ+kdm+d615/CnL1/HeesXsfWFuRrXoTGr11M2P1M6Pa0BWgLeioYjpydQNiINKVxKxS7Q+MLwNNddsIGTl3fyhzTNJRJP5L1xre9rY3w2Oseklk4pN3ERcXI23EmUHo/Q4vcyEYqxcXFbiknrouP72Ds8zb6j+f0hYzMRhiaLixSz2aBvWuX6Xexy++kOfcivuRxy5bgUS3qXxLGZSEEmvqlwjNf9vwf55O3b8+6bj2cPTbCoNVCUqTQduwTMEZcGaZvJlnQ0sbyzmSa/h3ufsxYcmRIo3azoambzmm6+9eALWSO0ZqOFlX+BZIHMTP1Lth8c5+TlVhn8TUva2TM0xXQ4llFovWRlF6eu6OR/fr+Pr23ZzZbnh/g/rz/JEYbnbVjE2EyU546kalyHxqwcl0IXdSLCqu6WjP6bUkkv/dKIGOHiwtZc+tqD/MUF69m8ppsn+8edXAOwHPr5wkI3FODUt2/im0q4ia/RTv1MiWUArzwu1Rx4oc5S3/J8/mrTOweKjxSz6WsP0h70lZ3r8uLwNJ3N/pQbiuNzyWOyKid3wNYIJ0IxBidDvOLf7+c9N23LWUhQKcXHfvQkOw5P8Ivth8vuxrnjyAQnLe8o2iTpJlMJGPfNzOMR1i5qZWgyjEeSQSK5+MTlJzI0Geb63+7N+PpsnkAXN3/80pWcv7GXv73tKb73+6TPZCYSY+/wtNPiYePiNiKxRM5qy+84dzU7B6b4/N07ueL05bxdFysFODdLpNvBscISKN1sXtvNA7uGMwb5lMKRiRBdLf6iI1rrCSNcXNgr5Y/90fG0Bn1sXttNJJZweqmA7hyZx/5dSDiyXRBw0+Lib+L2zSDd7Gc/vyBNuKztbWVdb2tBprFdg6VFioFdwLL8iLEn+8d5ycrOlBus7dzP59A/ND5bcIhpOu1agE2FYnx9yx6mwjHufW6Qf7hje1aT1/W/3csvth/h7HU9jM1E2X6wsNI/mYjGE+wcmOLEZbn75+RjSXsm4WJpLnblY3uOruxuKciEeOaabl576jKu/+3ejJFoIS0AChGKzQEv37pmM5eeuJh/+Ml2rv/tHsAyCSqF08DrONcCJ5tG9PrTltPR5GPj4jY+98ZTUz5/eVczaxa1zKkwcGhslhVdxc2R975yAwml+Nr9e4p6XzaOjIcb2t8CRrikcMLSDu7/mwt5y2arS8AZur2v2zQWjibyai4rupoJ+jw5V/B2LsnGEm7itlPfHYpsPw/6PJyzbm7nyFce18fDe47m7Uuxa6C0SDGb9X1tZflcZiNxdg5McvqqrpTtbQEfIrmFy1Q4xmQoxtISzWJNfiunaNfgJDdv3c+bz1zJ+y7cwA8eOcBX7ts9Z//f7TnKv/3yOS4/dSlfe/sZwFy/RCGmSJu9Q9NEYglOLLBYaDY6mq3ossHJpM9lYCJEe9DnLEBs7Tqfv8XN373mBOIJxed/9XzKdqUU+45OF1Vuqcnv5evvOJPXvWQZn7vrOf71F885izi35mKTTXNpCfi44wPnc9t7z8voY7X8LkcdjTIUjXN0OuL0ICqUVT0tvHnzKn746AEn2qwcBho8xwWMcJmD+2Jb3N7E6p6WFKd+OEdbYhuPR1jX25rTLLZrYIpmf2k38deeuoyPvuo4jkvTeo5f0sFlpyzNqGpfdMJiwrEEv8+TDFdqpJjN+t5WDo2HSq7O/MyhceIJxUtWdqVs93iEzmZ/yg0zHbsT5vIiV6U2djdK20H8Vxdv4mN/dDx/fMYK/vOenTy8OzXX4/N3P8+K7mb+/U2n0dsW5JQVHTywK7nPfc8N8Mr/2JLTEe4m6czP3Xq3kO9hhSOnmsXsopaQLNdTjHBZvaiFa162htv+0M/NW/cRiyeIJxSf+sl2fvXMAG98aXFNZv1eD1+6+qW8/ZzVfOM3e/j83c/T0xpwoifbgj5HC82VVrCut9UpVpvOeRsWMRmKOSHOtmBYUWCkmJsPXLwRheKr989daBTCdDjm+PCONHh2PhjhkpfNa7p5bN+oYxYJx/I79MEyO+Rawe8anGTj4raSitZ1tQT4q0s2zXnvf77lNL541ekZ33POuh6a/B62PD9EKBrnOw+9wBfv2ZnisFZKFV1TLJ0N+r1fvnd3RvNJPp44MAbAaSvn3mDPXbeIe54dyFq37fB4+eGd7U0+EgrectYqVvW0ICL8yx+fSm9bgG8/9KKz3+7BSR7bN8o7z13jhIRfsKmPP+wfdUKZ//s3ln/irqcLa2G04/AEAa/HieYqh/REyoGJVF+U/RnFftYHLt7E5jXd/P3t27nsSw/wnpu2cfPW/bz3lRv41GtPLHqcXo/wmStP4a8v2cRkKMbJaf4m2/dXbBFaG7vCgL2oOjRWWAfKTKzoauYtm1dx67YD3P54P1+5bxd/f/vTzqIgFxOhKOf/231c+bWH2H7QCgFf0sCRYmCES17OWNPN8FTEqRUWjuV36INldtg/MpMSDOBmV5k38Wxk0zia/F5etqGXnz55iAv/Ywv/+NNn+dK9u/gvV/b+5+9+nuGpsFNqvRQuOK6PC47r4xu/2cPL/vU+3v2dR/jalt08vGe4oFaxT/aPs7yzicUZBMRVZ63i6HQkY2IcJHNcSrlx2LQFfQS8Hj5w0UZnW9Dn5aqzVnHfcwNOjsSPtvXj8whvfOlKZ78LjusjllA8vOco2w+Os/WFEVoCXn69YyDF0X9obJZfPH2Yx/aN0D8647z27OEJNi1py9tWuhCsdsdus1jY8cUAnLK8k7+//ESuOK04baOz2c+tf3Ee33jHmcQTivueG+STl5/Axy87oWRtV0T4yKuO41vv2szfpwko+xop1fG9uMOqSPA7R7gU1iQsG++/aCOC8OEfPsnn797JbY/188avPZS3SeCdTxxidCbKi8PTvOErD6JUY+e4ABSXCLIAsdv8bntxlDWLWokUYBYDy+yQULD/6MycyKuJUJQjEyE2lhApVg6vOmkJ9z03yJlruvnCW07j9scP8uV7d7Ghr5XpcJyv3r+Ht569umjzhpu2oI+b/uxsXhye5pZHD/CrZ45wv45SO2VFB3e+//wUjevg2CxLO5qcSL2n+sfmmMRsXrGplyUdQW7d1s9rTlk253X7xu82/xTLmzevwitzBdRbz17N17bs4Qdb9/PBSzfx4z/0c/EJi1NChs9Y3U1rwMsDu4aYCcdpCXj51GtP4pO3P83j+0fZvLYHpRTvu/kPjoYG1g37ZRsW8eSBMf7o5KUlj93NkvYm7hsfJBZP4PUIg5OhFIHt8QjvuWB9SccWEV5zylIuOXExB0dnsxa9LJZLT1oyZ5vt1C+22oab89Yv4rbHLFPekfEQIqWHAC/vaub297+MSCzBpiXtzERifODmx/ngLU/w2L5RrjprFScu7ZhjVfjhowc4YWk733/PufzTT5/hJ08c4vil5fnWah0jXPJw3OJ22oM+tu0b5U/OXEk4lnCyxXOxwVWCPl24lBMpVg5XbV7FWWu72dBnJW5uXtvDvpEZPvajp4grxUXH9/HPV5xcVhiszdreVj5+mbWiHZuJcOu2A3zurue4+9kjjmB49tAEr//Kg3zkVcfx/os2MjodYd/RGa4+a3XGY/q8Hv7kjJV84zd75oQcK6X41TNHOHVFZ0kJlDbXnr8u4/aV3S1ccsJibnl0Pycu62B4KsJVZ61K2Sfg83DehkX86pkBxmYivP2cNbz+tGV8+s5nuPvZATav7eGRF0Z44sAYH7xkE6ev7uLIeIg/7Bvlwd3DTIRinLkmf1vpQjhnfQ/ffugFtjw/xBlruonGlZP/Uin8Xk/FBEs2ztuwiOOWtJUU+GLzvos2smtgir+/fTteXTU6X5OwXNh5OGAtpm5+zzl89uc7+O7DL3LT7/bR2eznitOX8+nXn4zHI2w/OM7TB8f59OtPoqc1wH9d/VI+/YaTs/qJGgVjFsuDxyOcsaabnz11iC/9ehfjs9ECNZfsuS67dS5JKYmK5eDxCBsXJ531AZ+Hb7zjTFZ2N3Py8g6+8rYzqtK/u6slwLXnr2ftoha+tmUPSlnZ7J+961niCcW3HtjLTCTGk/1jAJy2KrtD+y2bV5FQ8OM/9Kds/8P+MZ47Mslbz84smCrB289dw/BUhH+4YzuL24Nz8okAXrGpj6HJMLGE4t0vX0t7k5+XbVzEr545glKK//7tXnpaA7z3lRu46PjFvPXs1fzHm0/j4Y9fzNZPXuJEKpaLrVXd8uj+uk7YW9XTwt0ffmXJibFgmcB++Bfn8tW3ncHSjqasmnGp+L0ePv2Gk/ndJy7mi1edxgXH9XHT7/bx9d9YYcu3bjtAwOfhSpdFoNEFCxjNpSD+4XUn8pmf7+CLv94JJEtz5KI16GNpR1PGcORdg5MEfR6nIN580tMa4BcfegVekaoIFhuvR/iLV27gE//7NA/tPkokHueh3Ue58vTl/OSJQ9zyyAGmwjFErNpw2Vjb28rZ63r40bYDvO/CDY6g/P7W/bQFfbzh9OVV+w6v3NTHqp5mDozM8pcXbsj4e9k5Rq8+aYlTZPTVJy3lk7c/zc+eOsx9zw3y4UuPm+OgtiO8KoXf6+HNZ1pa3qu0uanSmks9ISK89iXLuPzUpVSgSk9GlnU288aXruRKXXTzC/fs5CUrO7n98YNcdsrSBSFQ3BjNpQA2Lm7nu+8+m3s/+kr+4oL1Ba+ONyxu5WdPHubVX/wN77xhK9/fup9EQrFrcIoNfW0pfVrmk6DPW1XBYvPHZ6xgSUeQL9+3i8/d9Rzrelv59zedxjnrevjmA3t59MURNvS1OcmM2bhq8ypePDrD/TopdHwmys+eOsQVpy9PKeZZaTwe4Zrz1uL1CG8+c2XGfdYuauEzV57Cp157krPt0pMWIwIf//FTNPu9vOu8NVUbo5urzrK0vK9vsVbQi9vrT3OpNCJS9bbCIsLn3ngKq7qb+bPvPspkKDbHhLoQMMKlCDb0tfGJy0/k/E29Be3/kVcdz9Vnr2LtolYGJkJ88vanedu3fs/2gxMllX2pd4I+L39+/noeeWGE3YNTfPyyEwj4PLzvoo0cHg/xwK5hTivAZHH5qcvY0NfKX33/cf6wf5Qf/6GfcCzB286pnknM5s9evo4tf3Nhxp7zYN1Y3nHuGqf+G1g39Zeu6mI6Eueqs1bR3XpsVrBrFrXysg2LeFHXxCon0MFQHO1Nfr7ytjMQhDWLWjh3XekRmPWKMYtVkTPXdDsOWqUUP3z0AJ/9+Q4mw7GqhCHXA287ZzVf27Kb45a082ptrrlgUy+nrOhg+8GJnP4Wm+aAl5v//Fyuuv53XPPtR+ho8nPaqq4UR2u18HgkRXAUyutespzthyayBgxUi6vPXs3De47S3eIvK9DBUDynrOjkB9edQ7PfV3VtqRY5JpqLiLxGRJ4Xkd0i8vFj8Zm1hohw9dmr+dWHL+A9r1jHG8/IbFZpdFqDPu78wPlc/87Njr9ERPjgJcfhETinwBXe0s4mvv+ec+ls9nNwbDalYGEtcs3L1vLg311UkmAqh1eftISuFn9dOvMbgTPX9HDS8vJqxdUrUokeFDk/QMQL7AReBfQDjwJvVUo9m+09mzdvVtu2bavquAy1x/hMNKX7ZCEcGJnhjicO8uevWN/QFWbL4a6nrWrNrz+tesEOhvlHRB5TSm2e73HYHAuz2NnAbqXUXgARuQW4AsgqXAwLk2IFC1ihqh+4eFMVRtM4XH7q3IRTg6HaHAuz2ArggOt5v95mMBgMhgalZqLFROQ6EdkmItuGhgqrImswGAyG2uRYCJeDgDvIe6XeloJS6nql1Gal1Oa+vrmZzwaDwWCoH46FcHkU2CQi60QkAFwN3HkMPtdgMBgM80TVHfpKqZiIfAD4FeAFvq2Ueqban2swGAyG+eOYJFEqpe4C7joWn2UwGAyG+admHPoGg8FgaByMcDEYDAZDxal6hn4piMgQsK/Et/cCwxUcTq3RyN+vkb8bmO9X79T691ujlKqZUNuaFC7lICLbaqkEQqVp5O/XyN8NzPerdxr9+1UaYxYzGAwGQ8UxwsVgMBgMFacRhcv18z2AKtPI36+RvxuY71fvNPr3qygN53MxGAwGw/zTiJqLwWAwGOYZI1wMBoPBUHEaRrg0WitlEVklIveLyLMi8oyIfFBv7xGRe0Rkl/7fPd9jLQcR8YrI4yLyM/18nYhs1efxh7rYaV0iIl0icpuIPCciO0TkvEY6fyLyYT03t4vID0SkqZ7Pn4h8W0QGRWS7a1vG8yUWX9bf8ykROWP+Rl6bNIRw0a2UvwpcBpwEvFVETprfUZVNDPioUuok4Fzg/fo7fRy4Vym1CbhXP69nPgjscD3/N+CLSqmNwChw7byMqjJ8CfilUuoE4DSs79kQ509EVgB/DWxWSp2CVZT2aur7/H0XeE3atmzn6zJgk/67Dvj6MRpj3dAQwgVXK2WlVASwWynXLUqpw0qpP+jHk1g3phVY3+tGvduNwJXzMsAKICIrgdcC39LPBbgYuE3vUrffT0Q6gQuAGwCUUhGl1BgNdP6wCt82i4gPaAEOU8fnTyn1W2AkbXO283UFcJOy+D3QJSKmn7SLRhEuDd1KWUTWAi8FtgJLlFKH9UtHgCXzNa4K8F/A3wIJ/XwRMKaUiunn9Xwe1wFDwHe02e9bItJKg5w/pdRB4PPAfiyhMg48RuOcP5ts56uh7zmVoFGES8MiIm3Aj4EPKaUm3K8pK468LmPJReR1wKBS6rH5HkuV8AFnAF9XSr0UmCbNBFbn568ba/W+DlgOtDLXpNRQ1PP5mg8aRbgU1Eq53hARP5ZguVkp9b9684Ctfuv/g/M1vjJ5OfAGEXkRy4x5MZaPokubWaC+z2M/0K+U2qqf34YlbBrl/F0KvKCUGlJKRYH/xTqnjXL+bLKdr4a851SSRhEuDddKWfsfbgB2KKW+4HrpTuAa/fga4I5jPbZKoJT6hFJqpVJqLdb5uk8p9XbgfuBNerd6/n5HgAMicrzedAnwLA1y/rDMYeeKSIueq/b3a4jz5yLb+boTeJeOGjsXGHeZzww0UIa+iFyOZcO3Wyl/dn5HVB4icj7wAPA0SZ/EJ7H8LrcCq7HaErxFKZXuhKwrRORC4G+UUq8TkfVYmkwP8DjwDqVUeB6HVzIicjpWsEIA2Au8G2tB1xDnT0T+EbgKK7LxceDPsfwOdXn+ROQHwIVYpfUHgP8L/IQM50sL1K9gmQJngHcrpbbNw7BrloYRLgaDwWCoHRrFLGYwGAyGGsIIF4PBYDBUHCNcDAaDwVBxjHAxGAwGQ8UxwsVgMBgMFccIF4PBYDBUHCNcDAaDwVBx/j9sqQPP6iWFXwAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"sns.lineplot(data=pd.Series(times)).set_title(\"Distribution of times (in s) taken for symmetric constraint checks\")"
]
},
{
"cell_type": "markdown",
"id": "mature-suite",
"metadata": {},
"source": [
"# Combine Plots for constraints"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "behind-nurse",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import seaborn as sns\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"typeConstDF = pd.read_csv(\"../../allConstraintsAnalysis_Final/typeConstDFAnalysis.csv\")\n",
"typeConstDF = typeConstDF.set_index(typeConstDF.iloc[:, 0])\n",
"\n",
"valTypeConstDF = pd.read_csv(\"../../allConstraintsAnalysis_Final/valueTypeConstDFAnalysis.csv\")\n",
"valTypeConstDF = valTypeConstDF.set_index(valTypeConstDF.iloc[:, 0])\n",
"\n",
"codepConstDF1 = pd.read_csv(\"../../allConstraintsAnalysis_Final/codepConstDFAnalysis.csv\")\n",
"codepConstDF1 = codepConstDF1.set_index(codepConstDF1.iloc[:, 0])\n",
"\n",
"symmConstDF = pd.read_csv(\"../../allConstraintsAnalysis_Final/symmConstDFAnalysis.csv\")\n",
"symmConstDF = symmConstDF.set_index(symmConstDF.iloc[:, 0])\n",
"\n",
"invConstDF = pd.read_csv(\"../../allConstraintsAnalysis_Final/invConstDFAnalysis.csv\")\n",
"invConstDF = invConstDF.set_index(invConstDF.iloc[:, 0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ultimate-chorus",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1 = typeConstDF.add_suffix(\"_type_const\")['violation_ratio_type_const'].rename().sort_values()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dynamic-castle",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1 = valTypeConstDF.add_suffix(\"_valuetype_const\")['violation_ratio_valuetype_const'].sort_values()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "global-performer",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1 = codepConstDF1.add_suffix(\"_codep_const\")['violation_ratio_codep_const'].sort_values()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "enabling-instrumentation",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1 = symmConstDF.add_suffix(\"_symm_const\")['violation_ratio_symm_const'].sort_values()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "realistic-cannon",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1 = invConstDF.add_suffix(\"_inv_const\")['violation_ratio_inv_const'].sort_values()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "about-coalition",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1.index.names = ['property']\n",
"typeConstDF1 = typeConstDF1.reset_index().reset_index()\n",
"typeConstDF1['index'] = typeConstDF1['index'].apply(lambda p: (p+1) * 100/len(typeConstDF1))\n",
"typeConstDF1 = typeConstDF1.set_index('index')[0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "hidden-anaheim",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1.index.names = ['property']\n",
"valTypeConstDF1 = valTypeConstDF1.reset_index().reset_index()\n",
"valTypeConstDF1['index'] = valTypeConstDF1['index'].apply(lambda p: (p+1) * 100/len(valTypeConstDF1))\n",
"valTypeConstDF1 = valTypeConstDF1.set_index('index')['violation_ratio_valuetype_const']"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "toxic-straight",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1.index.names = ['property']\n",
"codepConstDF1_1 = codepConstDF1_1.reset_index().reset_index()\n",
"codepConstDF1_1['index'] = codepConstDF1_1['index'].apply(lambda p: (p+1) * 100/len(codepConstDF1_1))\n",
"codepConstDF1_1 = codepConstDF1_1.set_index('index')['violation_ratio_codep_const']"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "legal-socket",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1.index.names = ['property']\n",
"symmConstDF1_1 = symmConstDF1_1.reset_index().reset_index()\n",
"symmConstDF1_1['index'] = symmConstDF1_1['index'].apply(lambda p: (p+1) * 100/len(symmConstDF1_1))\n",
"symmConstDF1_1 = symmConstDF1_1.set_index('index')['violation_ratio_symm_const']"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dietary-attack",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1.index.names = ['property']\n",
"invConstDF1_1 = invConstDF1_1.reset_index().reset_index()\n",
"invConstDF1_1['index'] = invConstDF1_1['index'].apply(lambda p: (p+1) * 100/len(invConstDF1_1))\n",
"invConstDF1_1 = invConstDF1_1.set_index('index')['violation_ratio_inv_const']"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "familiar-packing",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF2 = [np.percentile(typeConstDF1,i)*100 for i in range(1, 101)]\n",
"valTypeConstDF2 = [np.percentile(valTypeConstDF1,i)*100 for i in range(1, 101)]\n",
"codepConstDF1_2 = [np.percentile(codepConstDF1_1,i)*100 for i in range(1, 101)]\n",
"symmConstDF1_2 = [np.percentile(symmConstDF1_1,i)*100 for i in range(1, 101)]\n",
"invConstDF1_2 = [np.percentile(invConstDF1_1,i)*100 for i in range(1, 101)]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "forward-tutorial",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = pd.DataFrame({'index':list(range(1, 101)), 'type': typeConstDF2, 'value type': valTypeConstDF2, 'irs': codepConstDF1_2, 'symmetric': symmConstDF1_2, 'inverse': invConstDF1_2})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "mobile-rings",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = constAnalysisDF.melt('index', var_name='constraint', value_name='VR')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "contrary-conviction",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "ruled-rough",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Text(0.5, 0, 'Proportion of properties (in %)'),\n",
" Text(0, 0.5, 'Violation Ratio (in %)')]"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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0y9+SmJ4In878W/Eh8cf8bUKqlvoFxeOJW8t7joHsbOPOeg5Po+fsryGbtFdCZKQ9SqSkAkhhOgJipqKuGHhDTgsDp476TlSI49u3uaCmhYGJkXRuPALAGJPPfiDAWU7GvD7jG7RXQmSkHW6u+66i6eeeqr9/f3338+jjz5Kc3Mz8+bNY9KkSYwdO5YPPvhgn3MXLVrEGWec0f7+5z//OS+//DIAq1atYvbs2UyePJmTTz55nwr+y5cv58MPP2TBggVMmDCBHTt2MGnSpPb927dvb38/cOBA7rjjDsaOHcu0adPIy8sDoKqqivPOO4+pU6cydepUvv766077uQghhBAATZ4mfrLwJ3gMD8+d+BzZMdlHfc2CGicDk6No+not4Yke7MMnHvSc4i21WKyKfkO6R53Q3l2H7NO7oHxD514zfSyc+uB+d1900UXccsst3HTTTQD861//4r///S/h4eG89957xMbGUl1dzfTp0znrrLMO6TFbr9fLL37xCz744ANSUlJ46623uPvuu3nxxRfbjzn22GM566yzOOOMMzj//PMBiIuLY+3atUyYMIGXXnppr+mb4uLi2LBhA6+++iq33HILH330ETfffDO33norxx13HIWFhZx88sls3rz5SH9SQgghxF601ty3/D5Kmkt48eQXj6gA7A81tHqpbfEwQjfi2lVN6hQFjoOPRSvaXEf6oDgc4d0jFeoeUfQiEydOpLKyktLSUqqqqkhISCA7Oxuv18uvf/1rlixZgsVioaSkhIqKCtIPUiMFYOvWrWzcuJETTzwRAL/fT79+/Q563nXXXcdLL73En//8Z9566y2+//779n1tUzldcskl3HrrrYA5s8CeXZ6NjY00Nzd32hg3IYQQfdtbW99i4a6F3DLpFialTTr4CYegoLoFgKFbVgAQM/bg3Z+tzR6qipqYdkZOp8TQGXp3QnaAlqxguuCCC3jnnXcoLy9vn5fy9ddfp6qqilWrVmG32xk4cCAul2uv82w2G4ZhtL9v26+1ZvTo0XzzzTeHFcd5553Hb3/7W+bOncvkyZNJSkpq37dny1zbumEYfPvtt4SHhx/eBxZCCCEOYnPNZh5e8TDHZR7H1WOuPvgJh6igxkzIElYsJTzViqP/wIOeU7K1HnT3KHfRRsaQBcFFF13Em2++yTvvvMMFF1wAQENDA6mpqdjtdr76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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 6))\n",
"ax = sns.lineplot(x='index', y='VR', hue='constraint', data=constAnalysisDF)\n",
"ax.set(xlabel=\"Proportion of properties (in %)\", ylabel = \"Violation Ratio (in %)\")"
]
},
{
"cell_type": "markdown",
"id": "amazing-growing",
"metadata": {},
"source": [
"## Scatterplot"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "federal-diversity",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import seaborn as sns\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"typeConstDF = pd.read_csv(\"../../allConstraintsAnalysis_Final/typeConstDFAnalysis.csv\")\n",
"typeConstDF = typeConstDF.set_index(typeConstDF.iloc[:, 0])\n",
"\n",
"valTypeConstDF = pd.read_csv(\"../../allConstraintsAnalysis_Final/valueTypeConstDFAnalysis.csv\")\n",
"valTypeConstDF = valTypeConstDF.set_index(valTypeConstDF.iloc[:, 0])\n",
"\n",
"codepConstDF1 = pd.read_csv(\"../../allConstraintsAnalysis_Final/codepConstDFAnalysis.csv\")\n",
"codepConstDF1 = codepConstDF1.set_index(codepConstDF1.iloc[:, 0])\n",
"\n",
"symmConstDF = pd.read_csv(\"../../allConstraintsAnalysis_Final/symmConstDFAnalysis.csv\")\n",
"symmConstDF = symmConstDF.set_index(symmConstDF.iloc[:, 0])\n",
"\n",
"invConstDF = pd.read_csv(\"../../allConstraintsAnalysis_Final/invConstDFAnalysis.csv\")\n",
"invConstDF = invConstDF.set_index(invConstDF.iloc[:, 0])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "polish-supplier",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" violation_ratio_inv_const \n",
" \n",
" \n",
" Unnamed: 0 \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P1605 \n",
" 0.940299 \n",
" \n",
" \n",
" P3448 \n",
" 0.879769 \n",
" \n",
" \n",
" P926 \n",
" 0.857143 \n",
" \n",
" \n",
" P925 \n",
" 0.833333 \n",
" \n",
" \n",
" P1029 \n",
" 0.826516 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" violation_ratio_inv_const\n",
"Unnamed: 0 \n",
"P1605 0.940299\n",
"P3448 0.879769\n",
"P926 0.857143\n",
"P925 0.833333\n",
"P1029 0.826516"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF1 = typeConstDF.add_suffix(\"_type_const\")[['violation_ratio_type_const']].sort_values(by=['violation_ratio_type_const'],ascending=False)\n",
"valTypeConstDF1 = valTypeConstDF.add_suffix(\"_valuetype_const\")[['violation_ratio_valuetype_const']].sort_values(by=['violation_ratio_valuetype_const'],ascending=False)\n",
"codepConstDF1_1 = codepConstDF1.add_suffix(\"_codep_const\")[['violation_ratio_codep_const']].sort_values(by=['violation_ratio_codep_const'],ascending=False)\n",
"symmConstDF1_1 = symmConstDF.add_suffix(\"_symm_const\")[['violation_ratio_symm_const']].sort_values(by=['violation_ratio_symm_const'],ascending=False)\n",
"invConstDF1_1 = invConstDF.add_suffix(\"_inv_const\")[['violation_ratio_inv_const']].sort_values(by=['violation_ratio_inv_const'],ascending=False)\n",
"invConstDF1_1.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "sexual-giant",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1456, 897, 527, 38, 110)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(typeConstDF1), len(valTypeConstDF1), len(codepConstDF1_1), len(symmConstDF), len(invConstDF1_1)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "photographic-signature",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1.index.names = ['property']\n",
"typeConstDF1 = typeConstDF1.reset_index()[['violation_ratio_type_const']]\n",
"valTypeConstDF1.index.names = ['property']\n",
"valTypeConstDF1 = valTypeConstDF1.reset_index()[['violation_ratio_valuetype_const']]\n",
"codepConstDF1_1.index.names = ['property']\n",
"codepConstDF1_1 = codepConstDF1_1.reset_index()[['violation_ratio_codep_const']]\n",
"symmConstDF1_1.index.names = ['property']\n",
"symmConstDF1_1 = symmConstDF1_1.reset_index()[['violation_ratio_symm_const']]\n",
"invConstDF1_1.index.names = ['property']\n",
"invConstDF1_1 = invConstDF1_1.reset_index()[['violation_ratio_inv_const']]\n",
"\n",
"import numpy as np\n",
"\n",
"typeConstDF2 = pd.DataFrame({'index': list(np.arange(100, 1, -0.05)), 'type': [np.percentile(typeConstDF1,i)*100 for i in np.arange(1, 100,0.05)]}).set_index('index')\n",
"valTypeConstDF2 = pd.DataFrame({'index': list(np.arange(100, 1, -0.1)), 'value type': [np.percentile(valTypeConstDF1,i)*100 for i in np.arange(1, 100, 0.1)]}).set_index('index')\n",
"codepConstDF1_2 = pd.DataFrame({'index': list(np.arange(100, 1, -0.5)), 'irs': [np.percentile(codepConstDF1_1,i)*100 for i in np.arange(1, 100, 0.5)]}).set_index('index')\n",
"symmConstDF1_2 = pd.DataFrame({'index': list(np.arange(100, 1, -5)), 'symmetric': [np.percentile(symmConstDF1_1,i)*100 for i in np.arange(1, 100,5)]}).set_index('index')\n",
"invConstDF1_2 = pd.DataFrame({'index': list(np.arange(100, 1, -1)), 'inverse': [np.percentile(invConstDF1_1,i)*100 for i in np.arange(1, 100,1)]}).set_index('index')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "unique-marijuana",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = typeConstDF2.join(valTypeConstDF2, how='outer').join(codepConstDF1_2, how='outer').join(symmConstDF1_2, how='outer').join(invConstDF1_2, how='outer')\n",
"constAnalysisDF = constAnalysisDF.reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "social-pipeline",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = constAnalysisDF.melt('index', var_name='constraint', value_name='VR')"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "institutional-imaging",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" index \n",
" constraint \n",
" VR \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1.05 \n",
" type \n",
" 100.0 \n",
" \n",
" \n",
" 1 \n",
" 1.10 \n",
" type \n",
" 100.0 \n",
" \n",
" \n",
" 2 \n",
" 1.15 \n",
" type \n",
" 100.0 \n",
" \n",
" \n",
" 3 \n",
" 1.20 \n",
" type \n",
" 100.0 \n",
" \n",
" \n",
" 4 \n",
" 1.25 \n",
" type \n",
" 100.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" index constraint VR\n",
"0 1.05 type 100.0\n",
"1 1.10 type 100.0\n",
"2 1.15 type 100.0\n",
"3 1.20 type 100.0\n",
"4 1.25 type 100.0"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"constAnalysisDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "straight-purpose",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Text(0.5, 0, 'Properties'),\n",
" Text(0, 0.5, 'Violation Ratio (in %)'),\n",
" [Text(-20.0, 0, ''),\n",
" Text(0.0, 0, ''),\n",
" Text(20.0, 0, ''),\n",
" Text(40.0, 0, ''),\n",
" Text(60.0, 0, ''),\n",
" Text(80.0, 0, ''),\n",
" Text(100.0, 0, ''),\n",
" Text(120.0, 0, '')]]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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Ua9tZNT38ccf/52lxK/k7/7u76ivr2fPnj1cffXVPPbYY7XGS1pr9uzZww9+8AMuvPDCUaOcn/nMZ/jc5z7H448/Puo1HThwgM985jNUKhXi8ThLliz5o16XEEKI40caGAkhhBCvkbq6Or71rW/x4Q9/mG3btnHFFVeQSqXwfb/W1Gj27Nl8+ctffsXnuPrqq3nmmWf4H//jf/AP//APOI5TC2GJRIKvfvWrY7r82rbNt771LT7xiU+wZs0aPv/5z/O//tf/IpvN4rouxWKx9tjftezM73Luuefy7//+7+zZs4ezzjqLpqamWqnwI4888nv3nzBhAt/97nf5+Mc/zvbt2/nIRz6CbdukUikKhUItmAKjlrapVCrcc8893H777SilyGQyeJ5HqVQCopLdL37xi69rN2AhhBCvDwmjQgghxGto4cKF3H333Xzve9/jN7/5DZ2dnZimyfz587nooou45ppriMVir7i/4zjcdNNN/Nd//Rd33303nZ2dNDY2cuqpp/KJT3yCadOmHXW/pqYmbr75Zu655x7uvPNONm3axNDQELZtM23aNBYuXMjZZ5/NW9/61j/qdTU2NvLDH/6Qb37zm6xZs4b+/v7a2qWv1sKFC7n33nu55ZZbePjhh9m1axe5XI5UKsXs2bNZtGgR559/PsuWLavt83d/93csXryYp59+mr1799LT00MQBEyaNImlS5dy3XXXMWfOnD/qNQkhhDi+lP5jOhEIIYQQ4jX12c9+ljvuuINPfOITfPKTnzzepyOEEEK87mTOqBBCCCGEEEKIY07CqBBCCCGEEEKIY07CqBBCCCGEEEKIY07CqBBCCCGEEEKIY04aGAkhhBBCCCGEOOZkZFQIIYQQQgghxDEnYVQIIYQQQgghxDEnYVQIIYQQQgghxDEnYVQIIYQQQgghxDEnYVQIIYQQQgghxDEnYVQIIYQQQgghxDH3/wNtlYiAMH946wAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(15, 10))\n",
"sns.set(font_scale=2)\n",
"ax = sns.scatterplot(x='index',y='VR',hue='constraint',data=constAnalysisDF)\n",
"ax.set(xlabel=\"Properties\", ylabel = \"Violation Ratio (in %)\",xticklabels=[])\n",
"# h,l = ax.get_legend_handles_labels()\n",
"# plt.legend(h[0:3],l[0:3],bbox_to_anchor=(1.05, 1), loc=0, borderaxespad=0., fontsize=13)\n",
"# plt.show(ax)"
]
},
{
"cell_type": "markdown",
"id": "stuck-criticism",
"metadata": {},
"source": [
"# Analysis on properties with constraints"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "driven-reference",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-04-03 09:14:12 query]: SQL Translation:\r\n",
"---------------------------------------------\r\n",
" SELECT *\r\n",
" FROM graph_1 AS graph_1_c1\r\n",
" WHERE graph_1_c1.\"label\"=?\r\n",
" PARAS: ['P2302']\r\n",
"---------------------------------------------\r\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz \\\n",
" ../../gdrive-kgtk-dump-2020-12-07/qualifiers.properties.tsv.gz \\\n",
" --match \"p: (nodeProp1)-[nodePropEdge:P2302]->()\" \\\n",
" -o ../../constraintsOP/claims.constraints_list.tsv \\\n",
" --graph-cache ../../sqlite3_caches/temp1345.valuetype.sqlite3.db"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "exciting-focus",
"metadata": {},
"outputs": [],
"source": [
"!kgtk unique -i ../../gdrive-kgtk-dump-2020-12-07/claims.properties.tsv.gz --column node1 -o ../../constraintsOP/claims.propList.tsv"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "flush-romania",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"node1\tlabel\tnode2\r\n",
"P10\tcount\t17\r\n",
"P1000\tcount\t10\r\n",
"P1001\tcount\t26\r\n",
"P1002\tcount\t9\r\n",
"P1003\tcount\t20\r\n",
"P1004\tcount\t33\r\n",
"P1005\tcount\t21\r\n",
"P1006\tcount\t26\r\n",
"P1007\tcount\t19\r\n"
]
}
],
"source": [
"!head ../../constraintsOP/claims.propList.tsv"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "chemical-harris",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import os\n",
"props = pd.read_csv(\"../../constraintsOP/claims.constraints_list.tsv\", sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "higher-underground",
"metadata": {},
"outputs": [],
"source": [
"props2 = props.groupby(['node1']).node2.apply(list)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "light-appreciation",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"8100"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(props2)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "yellow-helmet",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2336, 8100)"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt = 0\n",
"totalCnt = 0\n",
"for prop in props2.index:\n",
" totalCnt += 1\n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" else:\n",
" cnt += 1\n",
"cnt, totalCnt"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "detected-skiing",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"node1\n",
"P10 [Q21502404, Q21510851, Q21510852, Q52004125, Q...\n",
"P1000 [Q21510856, Q21510865, Q53869507]\n",
"P1001 [Q21502838, Q21503250, Q21510865, Q25796498]\n",
"P1002 [Q21503250, Q21510865]\n",
"P1003 [Q19474404, Q21502404, Q21502410, Q21510851, Q...\n",
" ... \n",
"P1563 [Q19474404, Q21502404, Q21502410, Q21503247, Q...\n",
"P1564 [Q19474404, Q21502404, Q21502410, Q21503247, Q...\n",
"P1565 [Q19474404, Q21502404, Q21502410, Q21503247, Q...\n",
"P1566 [Q19474404, Q21502404, Q21502410, Q21502838, Q...\n",
"P1567 [Q19474404, Q21502404, Q21502410, Q21502838, Q...\n",
"Name: node2, Length: 500, dtype: object"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"props2.head(500)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "processed-perfume",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import os\n",
"props2 = pd.read_csv(\"../../constraintsOP/claims.propList.tsv\", sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "increasing-graphics",
"metadata": {},
"outputs": [],
"source": [
"props2 = props2.groupby(['node1']).node2.apply(list)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "posted-ukraine",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"8193"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(props2)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "fifth-provision",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2415, 8193)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt = 0\n",
"totalCnt = 0\n",
"for prop in props2.index:\n",
" totalCnt += 1\n",
" if not(os.path.isfile(\"../../propertiesSplit_Final/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" else:\n",
" cnt += 1\n",
"cnt, totalCnt"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "married-heating",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"node1\n",
"P10 [Q21502404, Q21510851, Q21510852, Q52004125, Q...\n",
"P1000 [Q21510856, Q21510865, Q53869507]\n",
"P1001 [Q21502838, Q21503250, Q21510865, Q25796498]\n",
"P1002 [Q21503250, Q21510865]\n",
"P1003 [Q19474404, Q21502404, Q21502410, Q21510851, Q...\n",
" ... \n",
"P1563 [Q19474404, Q21502404, Q21502410, Q21503247, Q...\n",
"P1564 [Q19474404, Q21502404, Q21502410, Q21503247, Q...\n",
"P1565 [Q19474404, Q21502404, Q21502410, Q21503247, Q...\n",
"P1566 [Q19474404, Q21502404, Q21502410, Q21502838, Q...\n",
"P1567 [Q19474404, Q21502404, Q21502410, Q21502838, Q...\n",
"Name: node2, Length: 500, dtype: object"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"props2.head(500)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "magnetic-conditions",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "kgtkEnv",
"language": "python",
"name": "kgtkenv"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "318px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"oldHeight": 122,
"position": {
"height": "40px",
"left": "1170px",
"right": "20px",
"top": "120px",
"width": "250px"
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"varInspector_section_display": "none",
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 5
}