{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "juvenile-ability",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8f09d8d199d445fbb9e4ed86e3bb148e",
"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(\"../../propertiesSplitWRemoved3/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": "code",
"execution_count": 2,
"id": "knowing-bryan",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-03-12 19:33:50 sqlstore]: IMPORT graph directly into table graph_11 from /data/wd-correctness/propertiesSplit/claims.P996.tsv ...\n",
"[2021-03-12 19:33:51 sqlstore]: IMPORT graph directly into table graph_12 from /data/wd-correctness/wikidata-20210215/derived.isastar.tsv.gz ...\n",
"^C\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../propertiesSplit/claims.P996.tsv \\\n",
" ../../constraintsOP/typeConstraint/claims.type-constraints_all.tsv \\\n",
" ../../wikidata-20210215/derived.isastar.tsv.gz \\\n",
" --match \"m: (node1)-[nodeProp]->(node2), c: (rLabel)-[:P2308]->(parent), d: (node1)-[]->(par), c: (eLabel)-[:P2303]->(eNode)\" \\\n",
" --where 'nodeProp.label = rLabel and (par = parent or (rLabel = eLabel and node1 = eNode))' \\\n",
" --return 'nodeProp.id, node1, nodeProp.label, node2, max(parent) as `node1;ancestor`' \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.correct.tsv \\\n",
" --graph-cache ~/sqlite3_caches/mandConst001.sqlite3.db ; \\\n",
" kgtk --debug ifnotexists -i ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.all.tsv \\\n",
" --filter-on ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "abstract-retreat",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-03-12 22:33:26 query]: SQL Translation:\r\n",
"---------------------------------------------\r\n",
" SELECT graph_11_c1.\"id\", graph_11_c1.\"node1\", graph_11_c1.\"label\", graph_11_c1.\"node2\"\r\n",
" FROM graph_11 AS graph_11_c1, graph_14 AS graph_14_c2\r\n",
" WHERE graph_11_c1.\"node1\"=graph_14_c2.\"node1\"\r\n",
" AND (graph_14_c2.\"node2\" IN (?, ?, ?))\r\n",
" PARAS: ['Q1238720', 'Q3331189', 'Q47461344']\r\n",
"---------------------------------------------\r\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../propertiesSplit/claims.P996.tsv \\\n",
" ../../wikidata-20210215/derived.isastar.tsv.gz \\\n",
" --match \"m: (node1)-[nodeProp]->(node2), d: (node1)-[]->(par)\" \\\n",
" --where 'par in [\"Q1238720\",\"Q3331189\",\"Q47461344\"]' \\\n",
" --return 'nodeProp.id, node1, nodeProp.label, node2' \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.correct.tsv \\\n",
" --graph-cache ~/sqlite3_caches/mandConst001.sqlite3.db ; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit/claims.P996.tsv \\\n",
" --filter-on ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "strange-truck",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"81289 ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.correct.tsv\r\n"
]
}
],
"source": [
"!wc -l ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P996.correct.tsv"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "finnish-hampton",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-03-12 22:49:54 sqlstore]: IMPORT graph directly into table graph_15 from /data/wd-correctness/propertiesSplit/claims.P991.tsv ...\n",
"[2021-03-12 22:49:54 query]: SQL Translation:\n",
"---------------------------------------------\n",
" SELECT graph_15_c1.\"id\", graph_15_c1.\"node1\", graph_15_c1.\"label\", graph_15_c1.\"node2\"\n",
" FROM graph_15 AS graph_15_c1, graph_5 AS graph_5_c2\n",
" WHERE graph_15_c1.\"node1\"=graph_5_c2.\"node1\"\n",
" AND (graph_5_c2.\"node2\" IN (?))\n",
" PARAS: ['Q40231']\n",
"---------------------------------------------\n",
"[2021-03-12 22:49:55 sqlstore]: CREATE INDEX on table graph_15 column node1 ...\n",
"[2021-03-12 22:49:55 sqlstore]: ANALYZE INDEX on table graph_15 column node1 ...\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../propertiesSplit/claims.P991.tsv \\\n",
" ../../wikidata-20210215/derived.P31P279star.tsv.gz \\\n",
" --match \"m: (node1)-[nodeProp]->(node2), d: (node1)-[]->(par)\" \\\n",
" --where 'par in [\"Q40231\"]' \\\n",
" --return 'nodeProp.id, node1, nodeProp.label, node2' \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P991.correct.tsv \\\n",
" --graph-cache ~/sqlite3_caches/mandConst001.sqlite3.db ; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit/claims.P991.tsv \\\n",
" --filter-on ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P991.correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P991.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "elegant-reverse",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-03-12 23:54:56 sqlstore]: IMPORT graph directly into table graph_16 from /data/wd-correctness/propertiesSplit/claims.P965.tsv ...\n",
"[2021-03-12 23:54:56 query]: SQL Translation:\n",
"---------------------------------------------\n",
" SELECT graph_16_c1.\"id\", graph_5_c2.\"node1\", graph_16_c1.\"label\", graph_16_c1.\"node2\"\n",
" FROM graph_16 AS graph_16_c1, graph_5 AS graph_5_c2\n",
" WHERE graph_16_c1.\"node1\"=graph_5_c2.\"node1\"\n",
" AND (graph_5_c2.\"node2\" IN (?))\n",
" PARAS: ['Q6023295']\n",
"---------------------------------------------\n",
"[2021-03-12 23:54:56 sqlstore]: CREATE INDEX on table graph_16 column node1 ...\n",
"[2021-03-12 23:54:56 sqlstore]: ANALYZE INDEX on table graph_16 column node1 ...\n"
]
}
],
"source": [
"!kgtk --debug query -i ../../propertiesSplit/claims.P965.tsv \\\n",
" ../../wikidata-20210215/derived.P31P279star.tsv.gz \\\n",
" --match \"m: (node1)-[nodeProp]->(node2), d: (node1)-[]->(par)\" \\\n",
" --where 'par in [\"Q6023295\"]' \\\n",
" --return 'nodeProp.id, node1, nodeProp.label, node2' \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P965.correct.tsv \\\n",
" --graph-cache ~/sqlite3_caches/mandConst001.sqlite3.db ; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit/claims.P965.tsv \\\n",
" --filter-on ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P965.correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../constraintsOP/typeConstraint/claims.type-constraints.mandatory.instanceOf.P965.incorrect.tsv"
]
},
{
"cell_type": "markdown",
"id": "matched-strength",
"metadata": {},
"source": [
"# Generate Queries"
]
},
{
"cell_type": "markdown",
"id": "black-insured",
"metadata": {},
"source": [
"## Type Constraint"
]
},
{
"cell_type": "markdown",
"id": "interior-humor",
"metadata": {},
"source": [
"### Understand Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 1,
"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": 2,
"id": "assured-cleaners",
"metadata": {},
"outputs": [],
"source": [
"df1 = df.groupby(['node1','label']).node2.apply(lambda p: p.tolist()).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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": 4,
"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": 8,
"id": "bright-impossible",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "95b7843f9024492698ef1b367b6db289",
"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"
]
},
{
"ename": "NameError",
"evalue": "name 'fOP' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Something failed for prop:\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mprop\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 68\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mfOP\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 69\u001b[0m \u001b[0mfOP\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'fOP' is not defined"
]
}
],
"source": [
"from tqdm.notebook import tqdm\n",
"import os.path\n",
"import os\n",
"\n",
"cnt = 0\n",
"fCnt = 1\n",
"for prop in tqdm(df1.node1.unique()):\n",
" try:\n",
" if not(os.path.isfile(\"../../propertiesSplit/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_Final'\n",
" shellFileSuffix = 'typeConstraintValidator'\n",
" \n",
" if cnt % 120 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fOP = open(\"../../propertiesSplit/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" fCnt += 1\n",
" \n",
" fOP.write(\"{ time (kgtk --debug query -i ../../propertiesSplit/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/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct.tsv \\\n",
" --graph-cache ~/sqlite3_caches/const110_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect.tsv ) } 2>> ../../propertiesSplit/checkViolations/exec_logs/\" + shellFileSuffix + str(fCnt) + \".txt;\")\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": 9,
"id": "electrical-agreement",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1456"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "outside-stupid",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,14):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/typeConstraintValidator\"+str(i)+\".sh\")\n",
" "
]
},
{
"cell_type": "markdown",
"id": "competitive-canvas",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "casual-perth",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f14fb41a11474c79a4e03c391151de92",
"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": "1c8272e68ff941bb8d9453f8de872e8a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/330 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0406a7c498cb4dafa813ec4e6c8a499a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/22 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4f1f1b1ef6e24c6a92027e231ac71167",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/2560 [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/typeConstraint_Final/\"+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",
" 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": 34,
"id": "widespread-sector",
"metadata": {},
"outputs": [],
"source": [
"# countLines(\"../../allConstraintsAnalysis/typeConstraint/mandatory/claims.type-constraints.subclass.P534.incorrect.tsv\")"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "golden-affiliate",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1456 properties processed for type constraint for 510762035 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": 36,
"id": "needed-portfolio",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"typeConstDF = pd.DataFrame(violations).T"
]
},
{
"cell_type": "code",
"execution_count": 37,
"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": 38,
"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",
" P742 \n",
" 48903 \n",
" 89 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.001817 \n",
" \n",
" \n",
" P2663 \n",
" 554 \n",
" 7 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.012478 \n",
" \n",
" \n",
" P5105 \n",
" 1919 \n",
" 95 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.047170 \n",
" \n",
" \n",
" P6938 \n",
" 3 \n",
" 2 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.400000 \n",
" \n",
" \n",
" P3179 \n",
" 5052 \n",
" 13 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.002567 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P742 48903 89 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P2663 554 7 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P5105 1919 95 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P6938 3 2 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P3179 5052 13 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"\n",
" violation_ratio \n",
"P742 0.001817 \n",
"P2663 0.012478 \n",
"P5105 0.047170 \n",
"P6938 0.400000 \n",
"P3179 0.002567 "
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"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/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P5051 \n",
" 0 \n",
" 64 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P2303 \n",
" 0 \n",
" 39 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P1227 \n",
" 0 \n",
" 19 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P2308 \n",
" 0 \n",
" 17 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P6001 \n",
" 0 \n",
" 16 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P8738 \n",
" 0 \n",
" 14 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P538 \n",
" 0 \n",
" 10 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P8004 \n",
" 0 \n",
" 6 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P5589 \n",
" 0 \n",
" 4 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P6510 \n",
" 0 \n",
" 4 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P7174 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P6014 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P817 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
" P4882 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P8138 0 461 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P5051 0 64 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P2303 0 39 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P1227 0 19 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P2308 0 17 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P6001 0 16 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P8738 0 14 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P538 0 10 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P8004 0 6 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P5589 0 4 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P6510 0 4 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P7174 0 3 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P6014 0 3 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P817 0 3 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P4882 0 3 [../../allConstraintsAnalysis/typeConstraint_F... \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": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF.sort_values(by=['violation_ratio','incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "backed-corruption",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['../../allConstraintsAnalysis/typeConstraint_Final/normal/claims.type-constraints.instanceOf.P4945.correct.tsv',\n",
" '../../allConstraintsAnalysis/typeConstraint_Final/normal/claims.type-constraints.instanceOf.P4945.incorrect.tsv']"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(typeConstDF.loc['P4945'].paths)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "interracial-fraud",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"id\tnode1\tlabel\tnode2\trank\tnode2;wikidatatype\r\n",
"Q10369487-P5051-Q4845565-75168cbb-0\tQ10369487\tP5051\tQ4845565\tnormal\twikibase-item\r\n",
"Q12264664-P5051-Q1110918-cb778987-0\tQ12264664\tP5051\tQ1110918\tnormal\twikibase-item\r\n",
"Q12264664-P5051-Q3394058-ac8798ff-0\tQ12264664\tP5051\tQ3394058\tnormal\twikibase-item\r\n",
"Q12264664-P5051-Q801660-71c68e08-0\tQ12264664\tP5051\tQ801660\tnormal\twikibase-item\r\n",
"Q1457751-P5051-Q6029401-3c0f721e-0\tQ1457751\tP5051\tQ6029401\tnormal\twikibase-item\r\n",
"Q1457751-P5051-Q7643664-20983ead-0\tQ1457751\tP5051\tQ7643664\tnormal\twikibase-item\r\n",
"Q1631914-P5051-Q3555260-04b1b724-0\tQ1631914\tP5051\tQ3555260\tnormal\twikibase-item\r\n",
"Q2512768-P5051-Q493430-91955413-0\tQ2512768\tP5051\tQ493430\tnormal\twikibase-item\r\n",
"Q2865993-P5051-Q9606-9312fd91-0\tQ2865993\tP5051\tQ9606\tnormal\twikibase-item\r\n"
]
}
],
"source": [
"!head ../../allConstraintsAnalysis/typeConstraint_Final/normal/claims.type-constraints.instanceOf.P5051.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "clinical-lawsuit",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 1456.000000\n",
"mean 0.095964\n",
"std 0.221602\n",
"min 0.000000\n",
"25% 0.000594\n",
"50% 0.008160\n",
"75% 0.054471\n",
"max 1.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "wanted-domestic",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Type Constraint Violation Ratios')"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEICAYAAACwDehOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAdhUlEQVR4nO3deZwdZZ3v8c9XQthEAiRETMCgRJQRWWwVxtFBozOASvCKiMMSudGIonfcroPLKKgzg9crCHccNIoaFpXFhYwyOhDAZUaQBBBZJSKQhK0JJOyr3/tHPV0cmu706XTqnHT39/16nVdXPfVU1a/OOX1+53meqjqyTUREBMCzuh1ARESsP5IUIiKilqQQERG1JIWIiKglKURERC1JISIiakkKEQOQ9ElJ3+zg/q6RtHcb9faWtHwE+/mapH9c2/U7RdJrJN3Q7TjGoySFMUzSAy2PP0t6uGX+kA7FsK2kUyTdLul+SddLOlbSZg3u82JJ7x7JNmz/s+22tiHpGEmnr2H5zyR9boDy2ZLukDTB9l/YvngEIQ+033dJ+nVrme0jbX9+Xe6n7OsYSY+X99YqSf8taa9hrG9JO7bE+SvbO63rOGNoSQpjmO1n9z2AW4G3tJSd0fT+JW0F/AbYBNjL9ubAG4FJwAub3v8a4prQ4V0uAA6VpH7lhwFn2H6iw/E05czyXpsMXASc3eV4Ym3YzmMcPICbgTcAE4F7gF1alm0DPARMAfYGlgOfBO4u6x3SUncj4P9SJZk7ga8Bmwyyzy8AvweetYa4/hK4DFhd/v5ly7KLgc8D/wXcD/wnMLks2xg4HVgJrCrrTgX+CXgSeAR4APjXUt/AUcCNwJ9K2YnAMuA+YAnwmpZ9HwOcXqZnlPXnlOO+G/hUWbYP8BjweNnf7wY4xk3K8b22pWzLEuOura9Py3P8FeC28vgKsFFZtjewvGU7RwN/LM/PtcBbS/lLyvafLHGtKuXfAb7Qsv57gKXlPbEQeF7LMgNHludsFfBVQIO8jvXzVeZ3LutPKfOvpPqCsAq4HfhXYGJZ9stS98ES6zsGOM6XUL0fVgHXAPu3LNuvHPv9wArgY93+fxvNj7QUxhnbjwHfBw5tKX4nsMh2b5l/LtW3vWlUH4TzJfU15Y8DXgTsBuxY6nxmkN29Afih7T8PtLC0JH4KnARsDRwP/FTS1i3V/g44gipxTQQ+VsrnAFsA25V1jwQetv0p4FfAB1y1iD7Qsq0DgFdRfWBBlUh2A7YCvgucLWnjQY4F4K+AnYBZwGckvcT2z4B/pnxLtr1r/5VsPwycBRzeUnwQcL3t3w2wn08Be5bYdqX6QP30IDH9EXgN1XNxLHC6pG1tX0f1nPymxDWp/4qSXg/8S4llW+AWqvdGqzcDrwBeVur97SBxtG53YjnWlcC9pfhJ4MNU76u9qJ7D9wPYfm2ps2uJ9cx+29sQ+HeqLwXbAB8Ezmh5T54CvNdVS/SlwIVDxRiDS1IYnxYA72zpzjgMOK1fnX+0/ajtX1B9cB9U6s8DPmz7Htv3U30gHjzIfram+lY4mDcBN9o+zfYTtr8HXA+8paXOt23/oeWDdbdS/njZ/o62n7S9xPZ9Qxz3v5S4HwawfbrtlWXfX6b6hr6mfuxjbT9cPsh/R/WB3a4FwIEtSefwUjaQQ4DP2b6rJOpjqV6jZ7B9tu3bbP+5fJjeSJVE2nEI8C3bl9t+FPgEsJekGS11jrO9yvatVF1Cu61hewdJWgU8TNUCOdCla6y8PpeU5/pm4OvAX7cZ557As0ssj9m+EPgJ1ZcZqN4LO0t6ju17bV/e5nZjAEkK45DtS6m6i/aW9GKqb/wLW6rca/vBlvlbgOdRdS9tCiwpg4mrgJ+V8oGspPoGOpjnlW23uoWq9dHnjpbph6g+HKBKYj8Hvi/pNkn/p3yjXJNlrTOSPibpOkmry7FsQfVNdjCDxTIk27+m6nY6QNILqT64vztI9f7PS9/z/wySDpd0Zcvr8VLWfAyD7sf2A1SvWTvP/0DOKi2SqcDVwMtb4nyRpJ+UgfX7qL5MDCfOZf1anK3vk7dRdSHdIukXwxngjmdKUhi/FlB1IR0GnGP7kZZlW/Y7O2h7qr7tu6m+Bf6F7UnlsYWrwcWBXAC8VdJg77PbgOf3K9ueql94jWw/bvtY2ztTjUu8mae6Zwa79W9dLuk1wMepukS2LB9mq4H+g8HtaPdWw6eWGA8Ffm77zkHq9X9e+p7/p5H0fOAbwAeArcsxXM1TxzBUXE/bT3nNt6aN539NbN9N1aI8RlLfl4KTqVqBM20/h2rMqt3n+jZgu37vo/p9Yvsy27OpupZ+TNWijLWUpDB+nQ68leoD6tQBlh8raWL58HwzcHb5pvYN4ARJ2wBImiZpsH7m44HnAAvKB1hf/eMlvQw4D3iRpL+TNEHSO6j6+38yVPCSXidpF0kbUA0UPw70fZO8E3jBEJvYHHgC6AUmSPpMiXVt3AnMWEPy63Mq1TjLexi86wjge8CnJU2RNJlqzGagU143o/rg7wWQdARVS6E1rumlj3+w/RwhaTdJG1F9e7+0dO+MiO0bqFpyHy9Fm1O9Tg+U1un7+q2yptesr2X7cUkblus53kLVSpwo6RBJW9h+vOxjwDGsaE+SwjhlexlwOdWHyq/6Lb6DaoDwNuAM4Ejb15dl/0B1tsolpRvgAgbph7d9D9W3+MeBSyXdDyyi+ka+1PZKqoTzUapui48Dby7fNIfyXOAcqg+B64Bf8NS4yIlU/ff3SjppkPV/TtX19QeqrohH6Ne9NAx9p16ulDRof3b5sP1vqg/zhYPVozprazFwFdXZW5eXsv7buxb4MtVZPXcCu1CdqdXnQqozde6Q9Izn1PYFwD8CP6Aa+3khg48PrY0vAfPKF4iPUZ00cD/VF4sz+9U9hurLwypJB/WL8zGqJLAvVWv134DDW96ThwE3l/fjkVRjJbGWZOdHdsYrSd8CbrP96ZayvalOLZzerbgions6fRFPrCfKGSb/A9i9y6FExHok3UfjkKTPUw1Ifsn2n7odT0SsP9J9FBERtbQUIiKiNqrHFCZPnuwZM2Z0O4yIiFFlyZIld9se8KLTRpOCpA8D76Y67fH3VPew2Zbq/ipbU92E7DDbj5XzpE+lugpyJfCOoc6XnjFjBosXL27uACIixiBJ/e8kUGus+0jSNOB/AT22XwpsQHUO9BeBE2zvSHUu/Nyyylyq2yvsCJxQ6kVERAc1PaYwAdik3L9+U6oLZF5PddERVFd1HlCmZ/PUVZ7nALMGuP98REQ0qLGkYHsFT913/3aqq1iXUN3Xve9HRZbz1E2tplGuKC3LV1N1MT2NpHmSFkta3Nvb239xRESMQJPdR1tSffvfgeouh5tR/SDJiNieb7vHds+UKYPdnDMiItZGk91Hb6D6havecqOqHwKvBia1/BzidJ66I+MKqh9M6fu5xC2oBpwjIqJDmkwKtwJ7Stq0jA3MovrJvIuAA0udOcC5ZXphmacsv9C5si4ioqOaHFO4lGrA+HLK7/QC86nusvkRSUupxgxOKaucAmxdyj9C9duzERHRQaP6Nhc9PT3OdQoREcMjaYntnoGW5TYXERFRG9W3uRiJGUf/tJ6++bg3dTGSiIj1R1oKERFRS1KIiIhakkJERNSSFCIiopakEBERtSSFiIioJSlEREQtSSEiImpJChERUUtSiIiIWpJCRETUkhQiIqKWpBAREbUkhYiIqCUpRERELUkhIiJqjSUFSTtJurLlcZ+kD0naStL5km4sf7cs9SXpJElLJV0laY+mYouIiIE1lhRs32B7N9u7AS8HHgJ+BBwNLLI9E1hU5gH2BWaWxzzg5KZii4iIgXWq+2gW8EfbtwCzgQWlfAFwQJmeDZzqyiXAJEnbdii+iIigc0nhYOB7ZXqq7dvL9B3A1DI9DVjWss7yUvY0kuZJWixpcW9vb1PxRkSMS40nBUkTgf2Bs/svs23Aw9me7fm2e2z3TJkyZR1FGRER0JmWwr7A5bbvLPN39nULlb93lfIVwHYt600vZRER0SGdSArv5KmuI4CFwJwyPQc4t6X88HIW0p7A6pZupoiI6IAJTW5c0mbAG4H3thQfB5wlaS5wC3BQKT8P2A9YSnWm0hFNxhYREc/UaFKw/SCwdb+ylVRnI/Wva+CoJuOJiIg1yxXNERFRS1KIiIhakkJERNSSFCIiopakEBERtSSFiIioJSlEREQtSSEiImpJChERUUtSiIiIWpJCRETUkhQiIqKWpBAREbUkhYiIqCUpRERELUkhIiJqSQoREVFrNClImiTpHEnXS7pO0l6StpJ0vqQby98tS11JOknSUklXSdqjydgiIuKZmm4pnAj8zPaLgV2B64CjgUW2ZwKLyjzAvsDM8pgHnNxwbBER0U9jSUHSFsBrgVMAbD9mexUwG1hQqi0ADijTs4FTXbkEmCRp26bii4iIZ2qypbAD0At8W9IVkr4paTNgqu3bS507gKllehqwrGX95aXsaSTNk7RY0uLe3t4Gw4+IGH+aTAoTgD2Ak23vDjzIU11FANg24OFs1PZ82z22e6ZMmbLOgo2IiGaTwnJgue1Ly/w5VEnizr5uofL3rrJ8BbBdy/rTS1lERHRIY0nB9h3AMkk7laJZwLXAQmBOKZsDnFumFwKHl7OQ9gRWt3QzRUREB0xoePsfBM6QNBG4CTiCKhGdJWkucAtwUKl7HrAfsBR4qNSNiIgOajQp2L4S6Blg0awB6ho4qsl4IiJizXJFc0RE1JIUIiKilqQQERG1JIWIiKglKURERC1JISIiakkKERFRS1KIiIhakkJERNSSFCIiopakEBERtSSFiIioJSlEREQtSSEiImpJChERUUtSiIiIWpJCRETUkhQiIqLWaFKQdLOk30u6UtLiUraVpPMl3Vj+blnKJekkSUslXSVpjyZji4iIZ+pES+F1tnez3fdbzUcDi2zPBBaVeYB9gZnlMQ84uQOxRUREi250H80GFpTpBcABLeWnunIJMEnStl2ILyJi3Go6KRj4T0lLJM0rZVNt316m7wCmlulpwLKWdZeXsqeRNE/SYkmLe3t7m4o7ImJcmtDw9v/K9gpJ2wDnS7q+daFtS/JwNmh7PjAfoKenZ1jrRkTEmrXVUpC0y9ps3PaK8vcu4EfAK4E7+7qFyt+7SvUVwHYtq08vZRER0SHtdh/9m6TfSnq/pC3aWUHSZpI275sG/ga4GlgIzCnV5gDnlumFwOHlLKQ9gdUt3UwREdEBbXUf2X6NpJnA/wSWSPot8G3b569htanAjyT17ee7tn8m6TLgLElzgVuAg0r984D9gKXAQ8ARa3NAERGx9toeU7B9o6RPA4uBk4DdVX3if9L2DweofxOw6wDlK4FZA5QbOGoYsUdExDrW7pjCyySdAFwHvB54i+2XlOkTGowvIiI6qN2Wwv8DvknVKni4r9D2baX1EBERY0C7SeFNwMO2nwSQ9CxgY9sP2T6tsegiIqKj2j376AJgk5b5TUtZRESMIe0mhY1tP9A3U6Y3bSakiIjolnaTwoOtdy2V9HLg4TXUj4iIUajdMYUPAWdLug0Q8FzgHU0FFRER3dHuxWuXSXoxsFMpusH2482FFRER3TCcG+K9AphR1tlDErZPbSSqiIjoiraSgqTTgBcCVwJPlmIDSQoREWNIuy2FHmDnciuKiIgYo9o9++hqqsHliIgYw9ptKUwGri13R320r9D2/o1EFRERXdFuUjimySAiImL90O4pqb+Q9Hxgpu0LJG0KbNBsaBER0Wnt3jr7PcA5wNdL0TTgxw3FFBERXdLuQPNRwKuB+6D6wR1gm6aCioiI7mg3KTxq+7G+GUkTqK5TiIiIMaTdpPALSZ8ENpH0RuBs4N/bWVHSBpKukPSTMr+DpEslLZV0pqSJpXyjMr+0LJ+xFscTEREj0G5SOBroBX4PvBc4D2j3F9f+nupnPPt8ETjB9o7AvcDcUj4XuLeUn1DqRUREB7WVFGz/2fY3bL/d9oFlesjuI0nTqX617ZtlXlS/63xOqbIAOKBMzy7zlOWzSv2IiOiQdu999CcGGEOw/YIhVv0K8HFg8zK/NbDK9hNlfjnVmUyUv8vKdp+QtLrUv7tfLPOAeQDbb799O+FHRESbhnPvoz4bA28HtlrTCpLeDNxle4mkvdcqugHYng/MB+jp6clgd0TEOtTuxWsr+xV9RdIS4DNrWO3VwP6S9qNKJM8BTgQmSZpQWgvTgRWl/gpgO2B5ObtpC6D/fiMiokHtXry2R8ujR9KRDJFQbH/C9nTbM4CDgQttHwJcBBxYqs0Bzi3TC8s8ZfmFuStrRERntdt99OWW6SeAm4GD1nKf/wB8X9IXgCuAU0r5KcBpkpYC91AlkoiI6KB2u49eN5Kd2L4YuLhM3wS8coA6j1CNVURERJe0e/bRR9a03Pbx6yaciIjopuGcffQKqn5/gLcAvwVubCKoiIjojnaTwnRgD9v3A0g6Bvip7UObCiwiIjqv3dtcTAUea5l/rJRFRMQY0m5L4VTgt5J+VOYP4KlbUkRExBjR7tlH/yTpP4DXlKIjbF/RXFgREdEN7XYfAWwK3Gf7RKqrjndoKKaIiOiSdq9o/izVRWefKEUbAqc3FVRERHRHuy2FtwL7Aw8C2L6Np+58GhERY0S7SeGxch8iA0jarLmQIiKiW9pNCmdJ+jrVHU7fA1wAfKO5sCIiohuGPPuo/PrZmcCLgfuAnYDP2D6/4dgiIqLDhkwKti3pPNu7AEkEERFjWLvdR5dLekWjkURERNe1e0Xzq4BDJd1MdQaSqBoRL2sqsIiI6Lw1JgVJ29u+FfjbDsUTERFdNFRL4cdUd0e9RdIPbL+tAzFFRESXDDWmoJbpFwxnw5I2lvRbSb+TdI2kY0v5DpIulbRU0pmSJpbyjcr80rJ8xrCOJCIiRmyopOBBptvxKPB627sCuwH7SNoT+CJwgu0dgXuBuaX+XODeUn5CqRcRER00VFLYVdJ9ku4HXlam75N0v6T71rSiKw+U2Q3Lw8DrgXNK+QKq23ADzOap23GfA8wq10hERESHrHFMwfYGI9m4pA2AJcCOwFeBPwKrbD9RqiwHppXpacCyst8nJK0GtgbuHkkMERHRvuHcOnvYbD9pezeqn/N8JdVV0SMiaZ6kxZIW9/b2jnRzERHRotGk0Mf2KuAiYC+q+yf1tVCmAyvK9ApgO4CyfAtg5QDbmm+7x3bPlClTmg49ImJcaSwpSJoiaVKZ3gR4I3AdVXI4sFSbA5xbpheWecryC8udWSMiokPavaJ5bWwLLCjjCs8CzrL9E0nXAt+X9AXgCuCUUv8U4DRJS4F7gIMbjC0iIgbQWFKwfRWw+wDlN1GNL/QvfwR4e1PxRETE0DoyphAREaNDkkJERNSSFCIiopakEBERtSSFiIioJSlEREQtSSEiImpJChERUUtSiIiIWpJCRETUkhQiIqKWpBAREbUkhYiIqCUpRERELUkhIiJqSQoREVFLUoiIiFqSQkRE1BpLCpK2k3SRpGslXSPp70v5VpLOl3Rj+btlKZekkyQtlXSVpD2aii0iIgbWZEvhCeCjtncG9gSOkrQzcDSwyPZMYFGZB9gXmFke84CTG4wtIiIG0FhSsH277cvL9P3AdcA0YDawoFRbABxQpmcDp7pyCTBJ0rZNxRcREc/UkTEFSTOA3YFLgam2by+L7gCmlulpwLKW1ZaXsv7bmidpsaTFvb29zQUdETEONZ4UJD0b+AHwIdv3tS6zbcDD2Z7t+bZ7bPdMmTJlHUYaERGNJgVJG1IlhDNs/7AU39nXLVT+3lXKVwDbtaw+vZRFRESHNHn2kYBTgOtsH9+yaCEwp0zPAc5tKT+8nIW0J7C6pZspIiI6YEKD2341cBjwe0lXlrJPAscBZ0maC9wCHFSWnQfsBywFHgKOaDC2iIgYQGNJwfavAQ2yeNYA9Q0c1VQ8ERExtFzRHBERtSSFiIioJSlEREQtSSEiImpJChERUUtSiIiIWpJCRETUkhQiIqKWpBAREbUkhYiIqDV576NRY8bRP62nbz7uTV2MJCKiu9JSiIiIWpJCRETUkhQiIqKWpBAREbUkhYiIqCUpRERELUkhIiJqjSUFSd+SdJekq1vKtpJ0vqQby98tS7kknSRpqaSrJO3RVFwRETG4JlsK3wH26Vd2NLDI9kxgUZkH2BeYWR7zgJMbjCsiIgbRWFKw/Uvgnn7Fs4EFZXoBcEBL+amuXAJMkrRtU7FFRMTAOj2mMNX27WX6DmBqmZ4GLGupt7yUPYOkeZIWS1rc29vbXKQREeNQ1waabRvwWqw333aP7Z4pU6Y0EFlExPjV6aRwZ1+3UPl7VylfAWzXUm96KYuIiA7qdFJYCMwp03OAc1vKDy9nIe0JrG7pZoqIiA5p7NbZkr4H7A1MlrQc+CxwHHCWpLnALcBBpfp5wH7AUuAh4Iim4oqIiME1lhRsv3OQRbMGqGvgqKZiiYiI9uSK5oiIqCUpRERELT/H2U9+mjMixrO0FCIiopakEBERtSSFiIioJSlEREQtA81rkEHniBhv0lKIiIhakkJERNSSFCIiopYxhTa1ji9AxhgiYmxKUoiIGCU6cfJLuo8iIqKWlsJa6t+dNJB0MUXEaJOWQkRE1NJSaFAufouI0SZJoUOSICJiNFivkoKkfYATgQ2Ab9o+rsshNWJdjUcMlmiGWx4R0We9SQqSNgC+CrwRWA5cJmmh7Wu7G1l3tJM42qk/ku10InEMFt9oT1pj4bqWbr4XRuPzNVasN0kBeCWw1PZNAJK+D8wGxmVSaFo7yWJtWjTDTULtaCdxjKTVNNg2B4uhqQ+s4e5jfWsRDvd16r9suPsYyTE38Vy3Gm5sTfzfrC3Z7nYMAEg6ENjH9rvL/GHAq2x/oF+9ecC8MrsTcMNa7nIycPdarjta5ZjHhxzz+DCSY36+7SkDLVifWgptsT0fmD/S7UhabLtnHYQ0auSYx4cc8/jQ1DGvT9cprAC2a5mfXsoiIqJD1qekcBkwU9IOkiYCBwMLuxxTRMS4st50H9l+QtIHgJ9TnZL6LdvXNLjLEXdBjUI55vEhxzw+NHLM681Ac0REdN/61H0UERFdlqQQERG1MZ8UJO0j6QZJSyUdPcDyjSSdWZZfKmlGF8Jcp9o45o9IulbSVZIWSXp+N+Jcl4Y65pZ6b5NkSaP+9MV2jlnSQeW1vkbSdzsd47rWxnt7e0kXSbqivL/360ac64qkb0m6S9LVgyyXpJPK83GVpD1GvFPbY/ZBNWD9R+AFwETgd8DO/eq8H/hamT4YOLPbcXfgmF8HbFqm3zcejrnU2xz4JXAJ0NPtuDvwOs8ErgC2LPPbdDvuDhzzfOB9ZXpn4OZuxz3CY34tsAdw9SDL9wP+AxCwJ3DpSPc51lsK9a0zbD8G9N06o9VsYEGZPgeYJUkdjHFdG/KYbV9k+6EyewnVNSGjWTuvM8DngS8Cj3QyuIa0c8zvAb5q+14A23d1OMZ1rZ1jNvCcMr0FcFsH41vnbP8SuGcNVWYDp7pyCTBJ0rYj2edYTwrTgGUt88tL2YB1bD8BrAa27kh0zWjnmFvNpfqmMZoNecylWb2d7fXnJjMj087r/CLgRZL+S9Il5S7Eo1k7x3wMcKik5cB5wAc7E1rXDPf/fUjrzXUK0XmSDgV6gL/udixNkvQs4HjgXV0OpdMmUHUh7U3VGvylpF1sr+pmUA17J/Ad21+WtBdwmqSX2v5ztwMbLcZ6S6GdW2fUdSRNoGpyruxIdM1o63Yhkt4AfArY3/ajHYqtKUMd8+bAS4GLJd1M1fe6cJQPNrfzOi8HFtp+3PafgD9QJYnRqp1jngucBWD7N8DGVDeOG6vW+e2BxnpSaOfWGQuBOWX6QOBClxGcUWrIY5a0O/B1qoQw2vuZYYhjtr3a9mTbM2zPoBpH2d/24u6Eu060897+MVUrAUmTqbqTbupgjOtaO8d8KzALQNJLqJJCb0ej7KyFwOHlLKQ9gdW2bx/JBsd095EHuXWGpM8Bi20vBE6hamIupRrQObh7EY9cm8f8JeDZwNllTP1W2/t3LegRavOYx5Q2j/nnwN9IuhZ4EvjftkdtK7jNY/4o8A1JH6YadH7XaP6SJ+l7VIl9chkn+SywIYDtr1GNm+wHLAUeAo4Y8T5H8fMVERHr2FjvPoqIiGFIUoiIiFqSQkRE1JIUIiKilqQQERG1JIWIiKglKURERO3/A2M/pgKlKVyxAAAAAElFTkSuQmCC\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": 45,
"id": "sufficient-hollywood",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Type Constraint Violation Ratios (<=0.05)')"
]
},
"execution_count": 45,
"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": 46,
"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": 47,
"id": "special-consensus",
"metadata": {},
"outputs": [],
"source": [
"# typeConstDF.sort_values(by=['incorrect'],ascending=False).head(5).paths.values"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "excited-person",
"metadata": {},
"outputs": [],
"source": [
"# !cat ../../allConstraintsAnalysis/typeConstraint/normal/claims.type-constraints.instanceOf.P953.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 49,
"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": 50,
"id": "emotional-favorite",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'mandatory': {'instanceOf': {'correct': 44768778, 'incorrect': 35027},\n",
" 'subclass': {'correct': 1966, 'incorrect': 30},\n",
" 'instanceOfOrSubclass': {'correct': 221394, 'incorrect': 204},\n",
" 'propCount': 165,\n",
" 'correct': 44992138,\n",
" 'incorrect': 35261,\n",
" 'VR': 0.0007831009736982587},\n",
" 'suggestion': {'instanceOf': {'correct': 61486, 'incorrect': 18368},\n",
" 'subclass': {'correct': 0, 'incorrect': 0},\n",
" 'instanceOfOrSubclass': {'correct': 23314, 'incorrect': 2939},\n",
" 'propCount': 11,\n",
" 'correct': 84800,\n",
" 'incorrect': 21307,\n",
" 'VR': 0.200806732826298},\n",
" 'normal': {'instanceOf': {'correct': 398100301, 'incorrect': 797888},\n",
" 'subclass': {'correct': 96605, 'incorrect': 9442},\n",
" 'instanceOfOrSubclass': {'correct': 66358710, 'incorrect': 265583},\n",
" 'propCount': 1280,\n",
" 'correct': 464555616,\n",
" 'incorrect': 1072913,\n",
" 'VR': 0.0023042252207016293}}"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstViolations"
]
},
{
"cell_type": "code",
"execution_count": 51,
"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",
" 134805157 \n",
" 6527 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.000048 \n",
" 134811684 \n",
" \n",
" \n",
" P1476 \n",
" 39856876 \n",
" 47204 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.001183 \n",
" 39904080 \n",
" \n",
" \n",
" P577 \n",
" 38855314 \n",
" 33977 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.000874 \n",
" 38889291 \n",
" \n",
" \n",
" P1433 \n",
" 36723283 \n",
" 12050 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.000328 \n",
" 36735333 \n",
" \n",
" \n",
" P1215 \n",
" 33099195 \n",
" 24104 \n",
" [../../allConstraintsAnalysis/typeConstraint_F... \n",
" 0.000728 \n",
" 33123299 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2093 134805157 6527 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P1476 39856876 47204 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P577 38855314 33977 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P1433 36723283 12050 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"P1215 33099195 24104 [../../allConstraintsAnalysis/typeConstraint_F... \n",
"\n",
" violation_ratio total \n",
"P2093 0.000048 134811684 \n",
"P1476 0.001183 39904080 \n",
"P577 0.000874 38889291 \n",
"P1433 0.000328 36735333 \n",
"P1215 0.000728 33123299 "
]
},
"execution_count": 51,
"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": 52,
"id": "baking-garden",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF.to_csv('../../allConstraintsAnalysis/typeConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "bearing-kruger",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "assumed-toner",
"metadata": {},
"outputs": [],
"source": [
"# from tqdm.notebook import tqdm\n",
"# import os.path\n",
"\n",
"# cnt = 0\n",
"# fCnt = 1\n",
"# for prop in tqdm(df1.node1.unique()):\n",
"# try:\n",
"# if not(os.path.isfile(\"../../propertiesSplit/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",
"\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",
"# # print(prop, relation, type1, parents, exceptions)\n",
"\n",
"# if relation == \"Q21503252\":\n",
"# parentFile = \"P31P279star\"\n",
"# parentTitle = 'instanceOf'\n",
"# elif relation == \"Q21514624\":\n",
"# parentFile = \"P279star\"\n",
"# parentTitle = 'subclass'\n",
"# else:\n",
"# parentFile = \"isastar\"\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",
"# if cnt % 100 == 0:\n",
"# fOP = open(\"../../propertiesSplit/checkViolations/TimedTypeConstraintValidator\" + str(fCnt) + \".sh\",\"w\")\n",
"# fCnt += 1\n",
" \n",
"# fOP.write(\"{ time kgtk --debug query -i ../../propertiesSplit/claims.\"+ prop +\".tsv \\\n",
"# ../../wikidata-20210215/derived.\" + parentFile + \".tsv.gz \\\n",
"# --match 'm: (node1)-[nodeProp]->(node2), d: (node1)-[]->(par)' \\\n",
"# --where 'par in \" + str(parents).replace(\"'\",'\"') + \" \" + exceptionPart + \"' \\\n",
"# --return 'nodeProp.id, node1, nodeProp.label, node2' \\\n",
"# -o ../../allConstraintsAnalysis/TimedTypeConstraint/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct.tsv \\\n",
"# --graph-cache ~/sqlite3_caches/const2123_\" + str(fCnt) + \".sqlite3.db; } 2>> ../../propertiesSplit/checkViolations/exec_logs/TimedTypeConstraint_TimedTypeConstraintValidator\" + str(fCnt) + \".txt ; \\\n",
"# kgtk --debug ifnotexists -i ../../propertiesSplit/claims.\"+ prop +\".tsv \\\n",
"# --filter-on ../../allConstraintsAnalysis/TimedTypeConstraint/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct.tsv \\\n",
"# --filter-mode NONE \\\n",
"# --input-keys node1 label \\\n",
"# --filter-keys node1 label \\\n",
"# -o ../../allConstraintsAnalysis/TimedTypeConstraint/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect.tsv\\n\")\n",
"\n",
"# cnt += 1\n",
"# except:\n",
"# print(\"Something failed for prop:\",prop)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 93,
"id": "veterinary-fault",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "52944ea021934d23b3d4ab3fb1f091f7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/122 [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/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": 94,
"id": "infinite-assembly",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 1456.000000\n",
"mean 138.470137\n",
"std 216.121977\n",
"min 2.111000\n",
"25% 23.664500\n",
"50% 43.875000\n",
"75% 158.037250\n",
"max 2177.421000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 95,
"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": 95,
"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"
]
},
{
"cell_type": "markdown",
"id": "animated-companion",
"metadata": {},
"source": [
"### Understand Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 36,
"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": 37,
"id": "worthy-malawi",
"metadata": {},
"outputs": [],
"source": [
"dfValueType = dfValueType.groupby(['node1','label']).node2.apply(lambda p: p.tolist()).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"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": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfValueType.head()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "expired-stuff",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['P2308', 'P2309', 'P2303', 'P2316', 'P6607', 'P2304'], dtype=object)"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfValueType['label'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "imposed-newsletter",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" node1 \n",
" label \n",
" node2 \n",
" \n",
" \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [node1, label, node2]\n",
"Index: []"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfValueType[dfValueType['label'] == '2316']"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "answering-alabama",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" node1 \n",
" label \n",
" node2 \n",
" \n",
" \n",
" \n",
" \n",
" 330 \n",
" P1659 \n",
" P2308 \n",
" [Q18616576] \n",
" \n",
" \n",
" 331 \n",
" P1659 \n",
" P2309 \n",
" [Q21503252] \n",
" \n",
" \n",
" 332 \n",
" P1659 \n",
" P2316 \n",
" [Q21502408] \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" node1 label node2\n",
"330 P1659 P2308 [Q18616576]\n",
"331 P1659 P2309 [Q21503252]\n",
"332 P1659 P2316 [Q21502408]"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfValueType[dfValueType['node1'] == 'P1659']"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "danish-blackberry",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" node1 \n",
" label \n",
" node2 \n",
" \n",
" \n",
" \n",
" \n",
" 2031 \n",
" P991 \n",
" P2308 \n",
" [Q5, Q7210356] \n",
" \n",
" \n",
" 2032 \n",
" P991 \n",
" P2309 \n",
" [Q21503252] \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" node1 label node2\n",
"2031 P991 P2308 [Q5, Q7210356]\n",
"2032 P991 P2309 [Q21503252]"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfValueType[dfValueType.node1 == 'P991']"
]
},
{
"cell_type": "markdown",
"id": "digital-harvard",
"metadata": {},
"source": [
"### Query Generator"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "white-badge",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bb623e1d72164970a40f3bc2d9ab6346",
"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",
"for prop in tqdm(dfValueType.node1.unique()):\n",
" try:\n",
" \n",
" if not(os.path.isfile(\"../../propertiesSplit/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_Final4'\n",
" shellFileSuffix = 'valueTypeConstraintValidator_xverify3'\n",
" \n",
" if cnt % 120 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fOP = open(\"../../propertiesSplit/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" fCnt += 1\n",
" \n",
" fOP.write(\"{ time (kgtk --debug query -i ../../propertiesSplit/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/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct.tsv \\\n",
" --graph-cache ~/sqlite3_caches/const111_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + typeVal + \"/claims.type-constraints.\" + parentTitle + \".\"+ prop +\".incorrect.tsv ) } 2>> ../../propertiesSplit/checkViolations/exec_logs/\" + shellFileSuffix + str(fCnt) + \".txt;\\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": 3,
"id": "naughty-brown",
"metadata": {},
"outputs": [],
"source": [
"!zgrep -P \"Q98970042\\t\" ../../wikidata-20210215/derived.P279star.tsv.gz"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "qualified-cursor",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"897"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "simplified-cameroon",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,9):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/valueTypeConstraintValidator_xverify3\"+str(i)+\".sh\")\n",
" "
]
},
{
"cell_type": "markdown",
"id": "spectacular-warner",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "valid-defense",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c2c49c85190949669392e7e39bec677f",
"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": "285e1c2ed86c4e27be672d341374c5a8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/212 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f3d70806dba44c59962ff94a7167d20a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/10 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ecb4aff26e9d491593bacf478827d38d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/1572 [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/valuetypeConstraint_Final4/\"+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",
" 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": 22,
"id": "experienced-quick",
"metadata": {},
"outputs": [],
"source": [
"# countLines(\"../../allConstraintsAnalysis/typeConstraint/mandatory/claims.type-constraints.subclass.P534.incorrect.tsv\")"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "refined-speaking",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"897 properties processed for value type constraint for 181823950 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": 24,
"id": "designed-christian",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"valTypeConstDF = pd.DataFrame(violations).T"
]
},
{
"cell_type": "code",
"execution_count": 25,
"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": 26,
"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/valuetypeConstra... \n",
" 0.000000 \n",
" \n",
" \n",
" P3092 \n",
" 4620 \n",
" 1 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 0.000216 \n",
" \n",
" \n",
" P3096 \n",
" 11150 \n",
" 2 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 0.000179 \n",
" \n",
" \n",
" P3156 \n",
" 348 \n",
" 0 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 0.000000 \n",
" \n",
" \n",
" P87 \n",
" 4766 \n",
" 3 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 0.000629 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2302 42211 0 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P3092 4620 1 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P3096 11150 2 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P3156 348 0 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P87 4766 3 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"\n",
" violation_ratio \n",
"P2302 0.000000 \n",
"P3092 0.000216 \n",
"P3096 0.000179 \n",
"P3156 0.000000 \n",
"P87 0.000629 "
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valTypeConstDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"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/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P6104 \n",
" 0 \n",
" 9764 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P2545 \n",
" 0 \n",
" 1369 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P2668 \n",
" 0 \n",
" 168 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P7374 \n",
" 0 \n",
" 32 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P2839 \n",
" 0 \n",
" 14 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P3028 \n",
" 0 \n",
" 13 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P3027 \n",
" 0 \n",
" 12 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P2127 \n",
" 0 \n",
" 11 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P538 \n",
" 0 \n",
" 10 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P143 \n",
" 0 \n",
" 7 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P4425 \n",
" 0 \n",
" 6 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P6191 \n",
" 0 \n",
" 5 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P6533 \n",
" 0 \n",
" 5 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
" P6534 \n",
" 0 \n",
" 5 \n",
" [../../allConstraintsAnalysis/valuetypeConstra... \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P5008 0 331026 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P6104 0 9764 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P2545 0 1369 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P2668 0 168 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P7374 0 32 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P2839 0 14 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P3028 0 13 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P3027 0 12 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P2127 0 11 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P538 0 10 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P143 0 7 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P4425 0 6 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P6191 0 5 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P6533 0 5 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"P6534 0 5 [../../allConstraintsAnalysis/valuetypeConstra... \n",
"\n",
" violation_ratio \n",
"P5008 1.0 \n",
"P6104 1.0 \n",
"P2545 1.0 \n",
"P2668 1.0 \n",
"P7374 1.0 \n",
"P2839 1.0 \n",
"P3028 1.0 \n",
"P3027 1.0 \n",
"P2127 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 "
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valTypeConstDF.sort_values(by=['violation_ratio','incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "sized-melissa",
"metadata": {},
"outputs": [],
"source": [
"!cat ../../allConstraintsAnalysis/valuetypeConstraint_Final4/normal/claims.type-constraints.instanceOf.P5008.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "cutting-polyester",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 897.000000\n",
"mean 0.083622\n",
"std 0.205759\n",
"min 0.000000\n",
"25% 0.000451\n",
"50% 0.006186\n",
"75% 0.042042\n",
"max 1.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valTypeConstDF['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "alert-receiver",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Value Type Constraint Violation Ratios')"
]
},
"execution_count": 29,
"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": 30,
"id": "italian-motel",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Value Type Constraint Violation Ratios (<=0.04)')"
]
},
"execution_count": 30,
"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": 31,
"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": 32,
"id": "quiet-gardening",
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# valTypeConstDF.sort_values(by=['violation_ratio'],ascending=False).head().paths.values"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "documentary-pipeline",
"metadata": {},
"outputs": [],
"source": [
"# !head ../../allConstraintsAnalysis/typeConstraint/normal/claims.type-constraints.instanceOf.P7535.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 34,
"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": 35,
"id": "satellite-concern",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'mandatory': {'instanceOf': {'correct': 11391695, 'incorrect': 3339},\n",
" 'subclass': {'correct': 44764, 'incorrect': 1},\n",
" 'instanceOfOrSubclass': {'correct': 11638, 'incorrect': 35},\n",
" 'propCount': 106,\n",
" 'correct': 11448097,\n",
" 'incorrect': 3375,\n",
" 'VR': 0.00029472193618427394},\n",
" 'suggestion': {'instanceOf': {'correct': 46036, 'incorrect': 474},\n",
" 'subclass': {'correct': 118, 'incorrect': 18},\n",
" 'instanceOfOrSubclass': {'correct': 0, 'incorrect': 0},\n",
" 'propCount': 5,\n",
" 'correct': 46154,\n",
" 'incorrect': 492,\n",
" 'VR': 0.01054752819105604},\n",
" 'normal': {'instanceOf': {'correct': 88858176, 'incorrect': 689971},\n",
" 'subclass': {'correct': 4373665, 'incorrect': 6190},\n",
" 'instanceOfOrSubclass': {'correct': 76234047, 'incorrect': 163783},\n",
" 'propCount': 786,\n",
" 'correct': 169465888,\n",
" 'incorrect': 859944,\n",
" 'VR': 0.00504881725750208}}"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valueTypeConstViolations"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "purple-grill",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF.to_csv('../../allConstraintsAnalysis/valueTypeConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "traditional-shakespeare",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "spoken-symphony",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c60118b9694f4447b22fbe6ab5e113ff",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/313 [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/checkViolations/exec_logs/'\n",
"for filename in tqdm(os.listdir(filePath)):\n",
" if filename.startswith(\"valueTypeConstraintValidator_xverify3\"):\n",
" tempTimes = extractTimes(filePath + filename)\n",
" times += tempTimes"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "heavy-argentina",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 897.000000\n",
"mean 41.756467\n",
"std 133.639231\n",
"min 1.516000\n",
"25% 3.236000\n",
"50% 6.851000\n",
"75% 24.280000\n",
"max 1683.328000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 80,
"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": 80,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZoAAAEICAYAAABmqDIrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA+nklEQVR4nO2dd3gdxbm4389yN+52jLGNbYgphh8lOARSnUBCTeCmwr0hpHCdnnBTgRQIJSENCAmBQCCU0Am9Y2OqC5Zx73KVZFuSbUmWLaudM78/do6052hP3z3naPW9z6NHZ2dnZ76ZnZlvyjezYoxBURRFUYKiT7EFUBRFUcKNKhpFURQlUFTRKIqiKIGiikZRFEUJFFU0iqIoSqCoolEURVECxXdFIyK3icivfArrUBHZJyJl9vo1EbnEj7BteC+IyMV+hZdFvNeKyC4R2Zmh/ytE5J9By5WBHN8UkZvs77h342Mc74jIMT6GN0VEjIj09SvMJPEMEpFnRKRRRB4NMq4MZLlbRK4tpgyKv21hmniuEpF/BxCuEZH3+hFWVopGRLaIyAERaRKRBhGZJyLfEpHOcIwx3zLGXJNhWKen8mOM2WaMOcgYE8lGziTxdXsZxpizjDH35Bt2lnIcCvwYmG6MOdjj/kwRqXK7GWN+a4zxTcHmgoj0B34J/NHK5Nu7SeBPwNUp5PiqiLzlc5x+8HlgHDDaGPOFYgsTBCWc976TSfuUjkzbQhtfqDsHuYxoPm2MGQpMBq4Hfg7c6atUQNA90CJyKLDbGFNbbEGy5DxgrTGmOuB4ngY+LiLdlHCJMxlYb4zpyPbBEJf10KLvLEuMMRn/AVuA0xPcTgaiwLH2+m7gWvt7DPAs0ADsAd7EUW732WcOAPuAnwFTAAN8A9gGvOFy62vDew34HfAOsBd4Chhl780EqrzkBc4E2oB2G98yV3iX2N99cHrsW4Fa4F5guL0Xk+NiK9su4Bcp8mm4fb7OhvdLG/7pNs1RK8fdCc8NSbi/DzgEuAr4d4IsXwMqgXrgW8D7geU2r/+WEO7XgTXW70vAZOsuwI02vXuBFbH36JGmu4Bfuq693s01wNtAE/AyMCZJWJ7lwnX/FeBij+eOBlqAiM2bBut+DrDEpqESuCqFnJ+z5eJY+04uAzYCu4FH6CpPGb9z4DfEl69vkFl56izrHmGuAc51XffFKU/vs9ePAjuBRpy6cozL79101cGvAm8lhG2A99rfA3BGkduAGuA2YFAmeY9T5mqAMpe/z9JVv64CHgMetmXiXeB4l99DgP/YdG0GfpCiTg0C/mzzsxF4KyYn8BlglZXpNeDohDbgJzh1o9HKMtCP9inL9zATqMKZzagFdgBfs/dm4ZSdNhvfM0ny4BicurHH5vsVrnx+BKeMNdm8mJFJPgNlwBU4daAJWAxM8ignH8apWzPJot3ojCcTBZPYcHu4bwO+7ZG5v8MpuP3s30cA8QrL9SLvxWlwB+HdmFXjNBJDbObFGuCZJFE0rpfx74T7r9GlaL4OVACHAQcBjwP3Jch2h5XreKAVV4FOCPdeHCU41D67HvhGMjkTnvVKR6fsLlluAwYCn8JpAJ4E3gNMsAXgY9b/eTZdR+M0Vr8E5tl7Z+AUrBG28BwNjE8i1yLgCyka8NdwCusRNo9eA65PElbScmHv3wzckOTZr9K94ZwJ/D+cRuI4nEp4fqKcOMq5gq7K80NgATARp8H9B/Bgju+88x1lUZ46y7pHeL8G7nddnwOsSQh/qJX7JmBpkgbOK7/cDciNOKPIUTa8Z4DfZZH3q4GzXNdPAD925Uk7zrRiP5wGf7P93Qen7P0a6G/zaRNwRpK4b7FlagJO4/hBm/YjgP3AJ224P7P53t/VBryD09iOwlHg3/KjfcryPcwEOnCmhfsBZwPNwMhEv0nSPxRHOf0Yp94PBT7gyucWG2aZTdcCey9lPgM/xVEUR+K0AcfjTP9i0/tenI56JXBytu1Gp/ypbnokNi7zXe4LsL29hMy9GqfBfW+6sFwv8rA0jdn1rvvTcXoBZeSvaOYA33HdOxKnkvR1yTHRdf8d4AKPdJVZmaa73L4JvOYqcH4omgmu+7uBL7mu/wNcan+/gFVyroLXjDPV8wkcJXgKrhFFErk2AGemeTfuEc93gBeThJW0XNj71wF3Jbn3VRIaOw8/NwE3Jsj5E5xG0f0O1wCnua7H5/LOvcpXhuXpsBRpeC9OD3Owvb4f+HUSvyNseMM96mC3/KKrARGcRvpw171Tgc2Z5j3O1Pn99vcoW7bGu/JkQULZ24HToH8A2JYQ1uXAvzzi7YMzujje496vgEcS/FYDM01XG/Bl1/0/ALelK4dk0D5l+R5m2jT0dfmvBU5J9Jsk7AuBJSnK3mzX9XTggP2dMp+BdcB5ScI11u9WXCMWsmg3Yn9+WZ1NwBnOJfJHnN7FyyKySUQuyyCsyizub8XpHYzJSMrUHGLDc4fdF2eBN4bbSqwZp6eayBgrU2JYE3yQ0U2N6/cBj+uYbJOBv1jjjQac9yQ4iupV4G84vcVaEbldRIYlia8epxeVikzyB9KXi6E40xkZISIfEJG5IlInIo04U4mJZeKnwC3GGLehxWTgCVferMGZGsr2nXuRSXlKWtaNMRVWnk+LyGCc6aEHAESkTESuF5GNIrIXp1GE7OvBWGAwsNiVBy9a90z5t5VxCPBF4E1jzA7X/c40GmOiONNHh+Dk/SGxeG3cVxCfPzHG4PTiN3rci8tnG0cl8fUt2TvMq33K4T3sNvFreNmUp0l4pz9GYhoH2nWkdPmcLtxLcRT5yphDlu0G4IN5s4i8H+eldrNGMcY0GWN+bIw5DKei/EhETovdThJkMvcYk1y/D8XpJe7C6ZkNdslVRnyFSRfudpyX4g67g/gGPBN2WZkSw8p0ET2dnNlSCXzTGDPC9TfIGDMPwBhzszHmJJxe0BE4DbIXy+39vElTLsAZii9L9riH2wM40z+TjDHDcaZDJMHPp4BfisjnXG6VONM+7rwZaPwxeMikPKV71w/i9GTPA1Zb5QPw39btdJz1wCnWPTHN0L1euI0sduF0So5xpX+4MSZZ49dNXptX83HWZi7CWd9w01lfrXXqRJy8qcQZObnzfqgx5myPeHfhTA0d7nEvLp9FRGycad+hD+1TNu8hrThp7lfiTHtlS7p8rsQ7X2N8AThfRH4YJ2zm7QaQh6IRkWEici7wEM6UwQoPP+eKyHvty2/E6S1G7e0acsu4L4vIdNvLuxp4zDgmtutxtPg5ItIPZy1igOu5GmCK2xQ7gQeB/xORqSJyEPBb4GGTpRWRleUR4DoRGSoik4Ef4fT8MqEGGC0iw7OJNwW3AZfH9qaIyHAR+YL9/X47GuiH0yC10PV+Enke+JgfAqUqFyIyEDgJZ9HTixpgojW3jjEU2GOMaRGRk3EagERW4cw13yIin7Fut+G8p8k27rEicl6eyYvhR3l6CEdBfhs7mrEMxVkv2o2jRH6bIoxlwDEicoLN26tiN2zv/w7gRhF5D4CITBCRM5KE5ZX34Kxb/AxnnezxhHsnichnbe/6Uiv3ApxpyCYR+bk4e5DKRORY23GNw8p5F3CDiBxi/Z4qIgNw6to5InKaLcc/tnHMS5En2LTm2z5l8x7SkS6+Z4HxInKpiAywbcsHMgg3XT7/E7hGRKaJw3EiMtr1/HbgNOCHIvJtyLrdAHJTNM+ISBOOJvwFcAPOIqsX04DZOJYU84G/G2Pm2nu/w+lhNojIT7KI/z6c+cydOMPpHwAYYxpx1gX+idOb2Y8zTI8R20S3W0Te9Qj3Lhv2GzgLli3A97OQy833bfybcEZ6D9jw02KMWYvTSG2yeXNIjjLEwnsC+D3wkB3erwTOsreH4TQ09TjTD7ux+2Q8eAY4Kl95LKnKxadx1rO2J3n2VRylsVNEdlm37wBX23L5a5zGpxvGmGXAucAdInIW8BeckdDL9tkFOHPafpB3ebJTUPNxFr4fdt26F+d9VeOsOy1IEcZ6nA7ZbJx1tsSZh5/jTB8tsOVjNs56khdeeQ+OAcBk4AljTHPCM08BX8IpYxcBnzXGtNsO2bnACTj5swun7ibrYP0EZ9F6Ec707+9x1gfWAV8G/mrD+DTOFoy2JOG4ybd9yvg9ZMCdwHQb35OJN40xTTgGD5/Gafs2AB9PF2gG+XwDTn15GceC7E4c4xd3GNtwlM1l4myYz6bdALosLBQlLSIyC8fI4dIA41iIY7ywMq1npWQQkY04U7SzXW5X4Sy0f7logiklgW46UjLGGHN7AeLwa0ShFAi77mVwRjyK0g1VNIqi5IyIvIazIHyRXUtRlG7o1JmiKIoSKGmNAUTkLhGpFZGVLreHRWSp/dsiIkut+xRxDt2M3bvN9cxJIrJCRCpE5GZr6aEoiqKEnEymzu7G2Zxzb8zBGPOl2G8R+TOOaWCMjcaYEzzCuRX4X2AhjqnsmTi71lMyZswYM2XKlAzEVBRFUQAWL168yxiTzcbbQEmraIwxb4jIFK97dlTyRZwjCZIiIuOBYcaYBfb6XuB8MlA0U6ZMoby8PJ03RVEUxSIiW9P7Khz5ngzwEaDGGLPB5TZVRJaIyOsi8hHrNoH4PS1VpDiSRURmiUi5iJTX1dXlKaKiKIpSTPJVNBfibC6MsQM41BhzIs5u+AckzRk4XhhjbjfGzDDGzBg7tmRGf4qiKEoO5GzebI+U+CzOcSEAGGNacY5kwBiz2G7iOgJn5+xE1+MTyfzsL0VRFKUHk8+I5nScLy52TonZs6LK7O/DcI542GSP0tgrIqfYdZ2v4BxNoSiKooScTMybH8Q5B+hIEakSkW/YWxcQP20G8FFguTV3fgznA0OxzwfEziGrwDmWOq0hgKIoitLzKfkNmzNmzDBqdaYoipI5IrLYGDOj2HLE8OvDZ4qiKIriiSqaArCxbh/zN+4uthiKoihFQQ/VLACn/fl1ALZcf06RJVEURSk8OqJRFEVRAkUVjaIoihIoqmgURVGUQFFFoyiKogSKKhpFURQlUFTRKIqiKIGiikZRFEUJFFU0iqIoSqCoolEURVECRRWNoiiKEiiqaBRFUZRAUUWjKIqiBIoqGkVRFCVQVNEoiqIogaKKRlEURQkUVTSKoihKoKiiURRFUQJFFY2iKIoSKGkVjYjcJSK1IrLS5XaViFSLyFL7d7br3uUiUiEi60TkDJf7mdatQkQu8z8piqIoSimSyYjmbuBMD/cbjTEn2L/nAURkOnABcIx95u8iUiYiZcAtwFnAdOBC61dRFEUJOX3TeTDGvCEiUzIM7zzgIWNMK7BZRCqAk+29CmPMJgARecj6XZ29yIqiKEpPIp81mu+JyHI7tTbSuk0AKl1+qqxbMndPRGSWiJSLSHldXV0eIiqKoijFJldFcytwOHACsAP4s18CARhjbjfGzDDGzBg7dqyfQSuKoigFJu3UmRfGmJrYbxG5A3jWXlYDk1xeJ1o3UrgriqIoISanEY2IjHdd/hcQs0h7GrhARAaIyFRgGvAOsAiYJiJTRaQ/jsHA07mLrSiKovQU0o5oRORBYCYwRkSqgCuBmSJyAmCALcA3AYwxq0TkEZxF/g7gu8aYiA3ne8BLQBlwlzFmld+JUZR0bKzbx5TRQyjrI8UWRVF6DZlYnV3o4XxnCv/XAdd5uD8PPJ+VdL2EbbubeX19LRedOqXYooSaLbv2c9qfX+fbMw/n52ceVWxxFKXXkNMajeIvX/zHfHbubeFzJ01kcH99JUFR29QKQPmWPUWWRFF6F3oETQnQeKC92CIoiqIEhioaRVEUJVBU0SiKoiiBoopGURRFCRRVNIqiKEqgqKJRFEVRAkUVjaIoihIoqmgURVGUQFFFoyiKogSKKhpFURQlUFTRlBDGFFsCRVEU/1FFoyiKogSKKpoSQgc0iqKEEVU0iqIoSqCooikhjC7SKIoSQlTRKIqiKIGiiqaE0PGMoihhRBWNoiiKEiiqaEoIXaJRFCWMpFU0InKXiNSKyEqX2x9FZK2ILBeRJ0RkhHWfIiIHRGSp/bvN9cxJIrJCRCpE5GYRkUBSpCiKopQUmYxo7gbOTHB7BTjWGHMcsB643HVvozHmBPv3LZf7rcD/AtPsX2KYio5oFEUJIWkVjTHmDWBPgtvLxpgOe7kAmJgqDBEZDwwzxiwwjg3vvcD5OUmsKIqi9Cj8WKP5OvCC63qqiCwRkddF5CPWbQJQ5fJTZd08EZFZIlIuIuV1dXU+iNgzMDqkURQlhOSlaETkF0AHcL912gEcaow5EfgR8ICIDMs2XGPM7caYGcaYGWPHjs1HxB6FGgMoihJG+ub6oIh8FTgXOM1Oh2GMaQVa7e/FIrIROAKoJn56baJ1UxRFUUJOTiMaETkT+BnwGWNMs8t9rIiU2d+H4Sz6bzLG7AD2isgp1trsK8BTeUsfMnRAoyhKGEk7ohGRB4GZwBgRqQKuxLEyGwC8Yq2UF1gLs48CV4tIOxAFvmWMiRkSfAfHgm0QzpqOe11HURRFCSlpFY0x5kIP5zuT+P0P8J8k98qBY7OSrpehh2oqihJG9GQARVEUJVBU0ZQQOp5RFCWMqKJRFEVRAkUVTQmhSzSKooQRVTSKoihKoKiiKSH0CBpFUcKIKhpFURQlUFTRlBI6oFEUJYSoolEURVECRRVNCaEDGkVRwogqGkVRFCVQVNGUELqPRlGUMKKKRlEURQkUVTQlhO6jURQljKiiURRFUQJFFU0JoWs0iqKEEVU0JYTqGUVRwogqGkUpIT536zxmXDu72GIoiq+k/ZSzUjj0U87K4q31xRZBUXxHRzSKoihKoGSkaETkLhGpFZGVLrdRIvKKiGyw/0dadxGRm0WkQkSWi8j7XM9cbP1vEJGL/U9OaZNuxNJbBzTra5poPNBebDEURQmITEc0dwNnJrhdBswxxkwD5thrgLOAafZvFnArOIoJuBL4AHAycGVMOSm9m0/d+Aafv3VescVQFCUgMlI0xpg3gD0JzucB99jf9wDnu9zvNQ4LgBEiMh44A3jFGLPHGFMPvEJ35RVqeuuIJRM21O4rtgiKogREPms044wxO+zvncA4+3sCUOnyV2XdkrkriqIoIcYXYwDjLD741l8XkVkiUi4i5XV1dX4FW3TSZZCOeBRFCSP5KJoaOyWG/V9r3auBSS5/E61bMvduGGNuN8bMMMbMGDt2bE7Cbazbx7yKXTk9qyiKovhHPormaSBmOXYx8JTL/SvW+uwUoNFOsb0EfEpERlojgE9Zt0A47c+v89//XBhU8IGgh2oqihJGMtqwKSIPAjOBMSJShWM9dj3wiIh8A9gKfNF6fx44G6gAmoGvARhj9ojINcAi6+9qY0yigUGocWYYpdhiKIqiFJSMFI0x5sIkt07z8GuA7yYJ5y7groyl62VkskbT0NxG44F2Jo8eErxAiqIoPqAnAxQQPybGTr/hdT72x9d8CElRFKUwqKIpITJRRLv2tQUuh6Ioip+ooikgar5cXPTQUkUpDqpoSghtCBVFCSOqaAqImi8XF819RSkOqmhKCG0Ig0UHjIpSHFTRKIqiKIGiiqaApOtRa487WHTqUlGKgyqakqL3NYRqAJE9Le0Rava2FFsMRckYVTRKUSmongmJTpt132I+8Ns5xRZDUTJGFU0JoZ17JRPeWB+eT2covQNVNAVEFUl3dECjKOFHFU0J0RsbQl2jUfziiF++wI8eXlpsMRQPVNHkyP0Lt3Li1S9n9YxaPRUX1Wnhpq0jyuNLPL+lqBSZjD4ToHTnF0+sBJweuYg/35jpjQ1hL0yyovQ6dESjFJVCKlcdUSpKcVBFkyfZNJRpN2z2woawN6ZZUXobqmjyRJvJnkPYpibVkELpKaiiyZNsKns6n72x3eiNafYLzTulp6CKJk+0rvcc9F0pSnFQRZMn2a3RpPbcG3uovTHNfqFZp/QUclY0InKkiCx1/e0VkUtF5CoRqXa5n+165nIRqRCRdSJyhj9JKC66mN1zCNuaRtjSo4SXnPfRGGPWAScAiEgZUA08AXwNuNEY8ye3fxGZDlwAHAMcAswWkSOMMZFcZSgF/KzrvVFp9cY0+4XmnNJT8Gvq7DRgozFmawo/5wEPGWNajTGbgQrgZJ/i7xFow9Cdwu6jCRc6oFF6Cn4pmguAB13X3xOR5SJyl4iMtG4TgEqXnyrr1g0RmSUi5SJSXldX2ifV+jqi6YUNRy9Msm/oaFDpKeStaESkP/AZ4FHrdCtwOM602g7gz9mGaYy53RgzwxgzY+zYsfmKWDL0RkVSUoQs/7U8KT0FP0Y0ZwHvGmNqAIwxNcaYiDEmCtxB1/RYNTDJ9dxE69aj0V5lfuiCtqKEHz8UzYW4ps1EZLzr3n8BK+3vp4ELRGSAiEwFpgHv+BB/UcmqndQ2tRuF/R6NvgBFKQZ5nd4sIkOATwLfdDn/QUROwGlDtsTuGWNWicgjwGqgA/huT7c4A38byt7Yue+NafYLzTulp5CXojHG7AdGJ7hdlML/dcB1+cRZamR3BE2aDZva4w6UsDXMWl6UnoKeDJAnWtXzRDMwZ8KmOJXwooomT4pl3hyWRfRC9spDkmWdhCw5SohRRZMvPn6PJqtoQ9LKhCUdxSAsnQ0l/KiiyRM/e+RqwBYsmmeKUhxU0RQQfy3UwtFshiMVxUHzTukpqKLJE3+nw/z7iFpPoZAKMyzKOUbIkqOEGFU0eZLVdJePLYM2MkpoehtK6Am9ogm6F+ur8sjKbzhamcKeDBAuwlIGlPATekUTNLqAnx86MssdzTulpxB6RRN0ZSzePhr/4i0muo8md0KWHCXEhF/RBB6+VndFUZRUhF/RBD6kycJrWr9ZWJ2FRb8VNB1hyTSHsFnRKeEl9IomaIpV1UtxJLWyupG7396c1TOll4qeg+ad0lPI6/TmnkDgU2fZjGjSnd7cw9dozv3rWwB89UNTM36mkOkoxTzLh7ClRwkvoR/RhLUyhjRZShaU4qhWUbwIv6IJuDJmFX4ar8Xa/FlMCmp1VrCYCkToEpQ7YagPOxtbqKhtKrYYgRD+qbMeZN6cVbzFidZ3QtA+KCVAGMrRKb+bA8CW688psiT+E/oRTdD4uWGzp6/R5EJBTwYISZ7FCFlylBCjiiZPijZk11Yma8K2phE2xZkPmhWlTegVTU+aOgvDPHO29MY0+0XYFGc+aDkqbfJWNCKyRURWiMhSESm3bqNE5BUR2WD/j7TuIiI3i0iFiCwXkfflG386Sqky+qqUSihd+aDmzbkTtvTkg2ZFaePXiObjxpgTjDEz7PVlwBxjzDRgjr0GOAuYZv9mAbf6FH/R8Fd5FCdepWeiRaALrQ+lTVBTZ+cB99jf9wDnu9zvNQ4LgBEiMj4gGYACTJ1lc2yMnxs2M/dacEp1GqM0pcqdUs3nYhCWEX5Y8UPRGOBlEVksIrOs2zhjzA77eycwzv6eAFS6nq2ybnGIyCwRKReR8rq6uryFCyOl3Mj0Rus5pbhoOSpt/NhH82FjTLWIvAd4RUTWum8aY4yIZFUMjDG3A7cDzJgxI68iFPyHz/zzm93oqHQp1Q+4lbJyzoWQJUcJMXmPaIwx1fZ/LfAEcDJQE5sSs/9rrfdqYJLr8YnWrcdStEM1S7iRiWYhXCmnQ+k5aDkqbfJSNCIyRESGxn4DnwJWAk8DF1tvFwNP2d9PA1+x1menAI2uKbZACP5QzeCtAW59bSM/fXRZgtfSrVla6QuD5rPSU8h3RDMOeEtElgHvAM8ZY14Ergc+KSIbgNPtNcDzwCagArgD+E6e8afFqzK+sGIHrR0Rf8IPyK+b37+4lkcXV/kTWAEIyxRgqVPKnY1Co3lR2uS1RmOM2QQc7+G+GzjNw90A380nzqxJKH9vV+zi2/e/yyUfnsovz52ef/DFMm/2L1rfyW7dqpBrNAWLqiCELT35oHlR2oT+ZIBEGprbAdjeeMCnELNZj/CvNpRyxSpl2cKEZnMXmhelTegVTeCfCfD1CBr/wiompTp11pOmV8JmIRc0ml+lTfgVTeAbNrPw20uOoNF9NIVBG9cu8smJlvYIe1vafZNF6U74FU3Q4RdJeZRyG5ONeXMhxzSlnGeJZCJrD0pO4OTzbs+/5W2Ou+pl/4RRuhF+RdOTWpcsKOVUlbJsPYVM8jCkRTs38siLtTvD+VXLUiL0iiYRv6ec/AyvVK21sqVUp85KOMu6kdn77UEJUno1oVc0PWnqrCfEmxEhORy01CnpMlBgSnnNUukNiiah/AkSaPj5+I3dbo9EaeuI5ixTsSnVI2h6UlOk45nsUKVb2oRf0SRUx1KeOosx49rZHP+b1IuTpVyxSlg039mzv4375m/xPdxSfr+liGZXaRN6RRM02X1DJrXn2Lx844F2DrSnPiKnlKcKslk/6umnN1/68FJ+9dQq1u7c63vY6SiGMjLGsL6m9BbPS3nNUukNiiZJ+Xt+xU7mrqv1vtkDKOV6Vay9RcVgz/5WANo7Cj9SLkZn44kl1XzqxjeYu7a06k4PL0ahJ/SKJlUBvHfelvzDD2CNJqOwsvBbaHSNJn8y2kdThASt3u6M3Cpq9xU+8hT09A5L2Am/ogn8ZAAt4d3QLCkI2rh2EaZ6GMZpwNArmqDJbo0mXw/ueDPz/O62euZv3J30fv3+NlrSrAdlS3Yjs+IOaaJRwyX3lPN2xa48gy584xCmxlXpIoR6JvyKpidVxiAOo/zs3+dx4R0Lkt4/8ZpX+MJt8zOONxNKderMi+b2CLPX1DDr3vKcnvfbXD5GsfOlxxGi/MruCKeeQfgVTQkdqulrvD5GvKK60b/AKN1GMpUiLzWRMzIGKDWhi0iYsiIapsRY8vrwWU8g+JMBsum9pzNvzirmbDwXlNKVTMmXUny3zyzbzojB/Yothm/0pFmYTAm9ogmaMIxo/CYT5RuJGpZWNtC/rHCDai+xSnWaolStzkqR7z+4pNgi+EoY32svmDoL9q35aQzgq2FBEckkHbfMreBzt86jfOue4AVKgSnRk34yO4Km8KUgmBUpxY0qmh5I8C+tOKWilAtjJrLFdtLvbGwJWJouvMQq3RFNcdZonlm2nSb9CFhRKdUymQ+hVzRBU7wNm6VbGEtZtkRilbon1m2/RV63s4nvP7iEn/9nuc8hK9mgisaFiEwSkbkislpEVonID637VSJSLSJL7d/ZrmcuF5EKEVknImf4kYB0qNVZ4SnVKUAvuSIlmpHFkKq5rQOA6voDRYi9+JTKRsnSkMJf8jEG6AB+bIx5V0SGAotF5BV770ZjzJ/cnkVkOnABcAxwCDBbRI4wxvi7W7DA+GkpVioFPV+y20dT3DT7FX0+4XzpH/PpI8KDs07JKjy/807EWYGJhWqMoSNq6Ocy2DCdfn2NuiQwpjTSVarrhvmQ84jGGLPDGPOu/d0ErAEmpHjkPOAhY0yrMWYzUAGcnGv8GcsZyv5BiY9oii1AErzKgl/TFPmEs3DzHuZvSn56QzL8zufENvahRZVM+8ULVDc4I5yK2ibm2VMmSrn85UqpTFlV1jdz5k1vUNfUWmxRfMOXNRoRmQKcCCy0Tt8TkeUicpeIjLRuE4BK12NVJFFMIjJLRMpFpLyuri4v2RLLjt9lyc9eZU9co/nTS+s4/YbX49xK9VPOXvi1Oc73RqqI5s2xcJ9Zth2ALbv2A3D6DW+wZkfhP4eQCq/6l2ud9KMs7N6Xv3L419tbWLuziSeWVOUvUImQt6IRkYOA/wCXGmP2ArcChwMnADuAP2cbpjHmdmPMDGPMjLFjx+YlX+AbNrPxm6cw7grkRyPjh5L829yKbif5Zvc9msLhuY/Gti75Km6/d3NnJo/fU2fZxF0aeO+NyjGsPNP94sodnHTtbBbkMDr1kqPYnTA/yUvRiEg/HCVzvzHmcQBjTI0xJmKMiQJ30DU9Vg1Mcj0+0boVlMR3t6luH9c8uzrnRtfPwpAuLL8bs6COuiik8s2X9kh+E+KxxjnqQ2ZmWwb9zrugzm0LEi9jjkiO7yLf/Hxncz0AK/M90snE/QsF+VidCXAnsMYYc4PLfbzL238BK+3vp4ELRGSAiEwFpgHv5Bp/piRW3sTrS+4t5863NrPZTg9kHX4AB2EmI+rziCbXCpmOYiuPZCSK1dIe4RN/ft3Tb7b4kZXvv25O5++MjAHyj9I73AwCLoVFc/Cessx1GjPf6U/fPxNfovUoF/KxOvsQcBGwQkSWWrcrgAtF5AScerAF+CaAMWaViDwCrMaxWPtuISzOEt9VYmHKuyfqa2FIZ5Xm9pl/xEEtfmanfItXm/a1dvgWlh/TkLtc8/vFbGN6UgMX9RiQ5q5o8hTGJzqt/kI0pslZ0Rhj3sL7RIrnUzxzHXBdrnHmQipjAD9eYy7TRNGo4aFFlXz+pIn079snwU/yEP0e0QTVoHhV/kLLkElkkvxW1vi+RlOEkwFKxeoqG7xkznWknm/6/Z567IGvIym97mQA/xuE7J95cmk1Vzyxgtte39gtrEwriR/JCGqzYk/piWUq5bLKBm6ZW5HST6aNVDRquO31jb4c8+L3PppYecjIDKFEXrHn1FmOy26lkqZi7y0LgtArmkcXV8Zduwum0LVJLVdyaVT3HnAamT3727rd60ihaOJHNCU8dZaVeXPhKlW3aVRXXqcqBufd8jZ/fGldyrAzzcuXV9dw/Qtr+d0La1P6K7zNWde7KJWGrj0Spaq+ufM6EjVx5tV7W9o9lUquHah80+1XB6tz6qxE3oMfhF7R/OP1TUSjhkfLKx0LoyTvLtdXmt1xK2nWYEjdYLl1kC/Tfj7uQO4JlSJRRLdSz9/0PDN/++260IG21MuTxfhMQJ4GeL5z5dOr+PDv59LQ7HTI/jJ7PWf95U3W7tzLc8t3cNxVL7O0qqHbcz1pjea1dbU0NnuPbntAlcqYXvE9mofLK7n88RU0HmjnzQ3e34b3wzzVD1JNnQU1VeIHbrGzOoLGNwmyJ9u5/GjU0KeP99An0zR32C543yThZIPfU5TZ5EchrM5eX+ds1t7X2sGIwf15d1sDAHVNrby5wbm3wkvR9JA1mobmNr76r0WcethoHvjfD3S6x8QojRbJH0I/ogHYstsxXW7tiPL6eu+TBnIebmfjN41nY1LPL8eNaHwohX5OnUVyHB0UsteWqKizVTSppzUzi//Z5TsA6Jvmg28ZKZECGQOUSs86Jp8gXYY1HrLlPnWWq2S50dbhVPYNtfs8y1ap5Lsf9ApFExuapvrca0ekOPO6EL8jO2UlMUkv+MGDS7jh5dTrCIn4qWji1o+KJEO2ZNsgxRTT6u17ufKplXHvPpN0vLq2tnNEnXZEU4RsSfbJhGK9I5MgT0wOd9blY3XW0h6JM3Ev5hqNu/3pXKMJ0ZimVyia2P6EAX3LkvrJpDJV1O7jaXv+Uww/RzQAHSkmyhPNm6sbDtBoDQueXradm1+tYMa1r7BoS/evVnpVolSjp937Wply2XM8Wl6Z3JMLd+XOpmEq5IxlYlRxo7AMno9Ne33lrne4Z/5W6lz7XjKZrtntMv4oS6NoEkM76ZpXuD7BgMDvrIvlR2IDV8hPKTywcBtz1tTEuSWOXvr0kU4ZvbI9U6uzM256g2OvfKnruQK367F83bWvlZvmrO90T1SwYaBXKJoGO6Kp97DyirF1d3Pa40hOv+F1fpD4ffIcCkOyR4yB9gytzqIGPnT9q5x/y9txfnbta+Mvszd0e9arl5dKIWzZ7Vj7PPDOtk63uetqmXLZc54HB0YSlGCmRHK1RfWBbKfOuvmPW5dK/7xbtfQry24+f/f+Nk9zeD9JVh68lGhQo5wrnljBN+4pB7osQjvNrjunzrrw7EBlKNvW3c1x10GO3KJRQ2tHvAGIexTzj9c3dXsmRHqmdyiaFvuCd6U4WfX7Dy7hmmdXZx2237vg2zuSN7zup2NK0evoHO/j8LuHl23F+turzl6STR5xxjdGmYdbKEun9kiU3zwT/35zXaOJTXVGjOls9Lzy8kcPL2XKZc91XrtN6dOu0WS0ROO3MYB33N6dFF+jTkmsM3Kg3anHJu6ex9SZMZ4NezryTVIqY4Drnl/Dkb98MW7GItmaX6driIY0vULRtLY7L7fBw4zQXTReW5fZJwncjaqfZaG+uS1ueiWxt+ZuzFIpTS/cz85eXcMtcyvSTDF0XzhfvLUegEH9uk9B5moqXKgRTew7KvFx5zaiiZWZ9o7U04WPL0l+Zuytr21MuSaQiRIJakSTGGyy88Rqm1qY+ce5nZ8RCIr2iGFfawcrq509NNG4adru/qNRwzXPrebIX77IS6t2ZhxPvpanqd7ZvxdsBZy0xEhX9sOjZnqLorGjhKbW/HdjA7S7CoifR8H8+qlVfO7WeZ3u3cq963pnY0tWcbgbi0vuLeePL63LakSzv61r0dSzh5um8icjRxsMX8h27SGmTPvYkUlbJOLaXJf8Oa8pH+gql+lI1gD6nXXJ4vEadRoDzy7bwZbdzdw9b0tG4c9eXUPt3uzKrRO/YVNd16co2uM6Nd4jmvvmOw37N+9bnHE8hRhAtLkysz1Z4TeFk6dQ9BJF4wyhm1r8OUSxzdVA+G0M4KbbAaCuy9osv76X7RpNIu40e61luRvtTXX7Mm5QCrV/yWtSIy5PMhAjEomfOmtLM6KJ0WJH1Il7T1rak0/tuINrT9LzDewImkQzcE9Dkni3dAeUdkSiXHJvOf/zz4Up/Xk+GzVxU8SRaLSbJVq8bLnt8/n6PYs6N4cGhbseJRtRx4xO1OqshxGr6ImbNQ3EtUCpCqd7gT2xJ7JuZxNXPb0qp8P8KmqbkhaoxErk9nfnW5s7fze3pVeg3ms0yf0n6hJ3BWnzUDRPuKaJLnt8BR//02tx959aWs2THlNJdR5TgAfaIvz8seW+fK0wFdmv0ViFYa/dCjdVUPuTvJ8DqRSNO15Xefvnm90Xjf0iloZuU2dp1mjW1zRx7JUv8ciiSrYlLLDHiKU1tqctE2IKryMSjeskuvMj2dpjLgdcVtTu4/6F29J7TEKqOGNtyym/m9NpwJPM+Cg20i21kxryoZcomuy/RnDfgq1sdA3Xb5zdZX4YN6IxhiueWMHd87awantmHzyK6Y8l2+o5/YY3OhVhMn8xkjVm03/9kvcN97NZjmgSK0H8iKb7c394MX4Pz/6EI1Z++NBSLn14abfn3tnc3RT7meXbebi8kj9luS8oW3Jeo+mcOnMrmuRh7W/toLappVtH5kBbJOmoxO3ufhfXPremy0/moqfl7Ypd3S0qLelGw6vt+WM/+89yPvrHuZ71LXbkjoiwbXdz53pfJnRETdw0o3s90NMYoEinfLi/jFm5p5m5a2u7+YlEDUsrG4DkxgDNrRHrNzyaplcommRz4YnGAYIzBdDWEeVXT67ks3+f5/mcu+IbYNywAQA8tXQ7L6zYkVaeWCX1st7y8td5nUcF8pr+eLvC+zge8FA07rllm59BnW8W28zY0h6lfMsefvrostQL58akleXtjV1pXbSlngNtkbxPBmhP6HAkY/aaWk6+bg4vrIhfmG5pj2a0npVuLt8Pvv1v11pGQrieU2cut8R6VOMxbRob0fQR+Ogf58atRXZGmxBPp3lzggWZ+z10eDTGEWO6zZW+uHKHLydmZ0LEGD514xt87e5FKf0l2yQeGwG3ZbiG1xPoFYomGUsrGzot0sB5scde+RJXPLECoHMzZCKtcQ0MHDpqCOBMZ337/nfZ3nDA87lYPYpVlHSKw8+OmVePO9Hc101i4+a1RrPXpzWvRGKmv22RKBfesYBHF1fRnOQQSmMMUy9/Pq6n70XiPoWnl1XnMaJxrlsznDqLfUN+fsK35Nfs2MtPHl3m+UzcGk2SOZR85/AbD7TzhdvmsWXX/pQhZTsa3uFhqBJTNGUp5qcXbOo+ugWnvsSvbUQ75fVqjKNRE6dnNtXt41v/fpefPro8adzZsrOxJWn5iURNZ3pT1XEvJQldoz+vaeWeSq9WNNB1ZD90LWg+trgq5TPxFd90myrYmWQhPNYzjBXQdFZP3Y0BDJmcxRh7LO6IlCw7RzF7/1h0buUas/rx+syBm0//9S2mXPYcL65MP8pzE2uM2ju6evzJFE1Mrjvf2szPH/NuSLymcppaOhJOBkjfaCfuo3GPaNJNnUF3hfHjR5fFrW0ljTdJzzdZlCuqGj1Ph0hk9uoaFm2p5ybXtDB0XzvyHtEkX9P0HNHY9+d1KOlNs9cze3UNF96xwDO8jkg0rvz938PL2NeSvNcfNfGDsljZyWR9KJNR+sJNuznld3N4aJH3eo67XDXbvPRav0k2dRYb0Xgp7J5Kr1c0TS5rGa/F2Zb2SDdLlLaEEU3ixrDavd49kfNveZudjS2d3zZJ1/gnHuNvDPTtk/kry/VEZei+4O9O85NLqrnh5XWce/ObKcNYUe2sWWVq/toVd6RThlilTXasvtva6eHySmZcO5s9+9u46M6FnZZvR/3qxW7PNbdFulX01o4Ij5ZXJm1sIp3GAE6jMeu+xSyvctKY2Ga8urbrGJXYelXSKbA0JLc68/b/6b+9xRdum59dJK6wEvdoJRvRJIvfy/S+c0TjUjSxcG+avYFL7i2P89+WsCbTmrCO+aLdH+OVp5GoSTDUiPdTu7cl6eZsY5yO5n8nUXrQVa5XVnuvycYpmhTWeMk6ELE1mmy3MJQyvV7RuPEqtF/8x3xOuPqVBH/xazSJi/l1TckLyCOus8O8rLfcJFaQNzfUpX3GjbsHl2xEkIzESuBWpq+ureXmVyu6Lfj7RSw/3Y3Nsyu2e/rdn1CRd+1r5YGFW3lzwy7uentL0jj2t3V0y9+/zqngp48tT7rJ78LbF9LWEfXsySc2xl+/u6vhXGYXf7OZqjOmy5pw1fa9aXznhyG+w9UeiV/z8pLbmOTp2dHYQkt7hHNufpP5dqNsS+caTVfmtXZEkyr1G17pGmUlrtG48Vp/TVSCMcUZc7viiRVxVpuJ/OTRZczbuDvptFesLvVPON3hebs+6y5Xqcy+ky32x0Y035l5eNJnexqhVzT5fPZDhM4e67CBXZ/uSRzRJE7N/OqpVcy49hWmXPZct9FQsvUbLxIbwlSVw01MPvdmtZgcCxPWCWLU72+LGzUkHm2Tz8Jksrn3RGLxx/LTrcj+8OK6zlO4jTH89vk1rNvZ5FmR//Sy00iJJD+ktLk1fkQTNV1TFcnW5toiUab/+sVuZ2Q5z/trGPHq2hqm//olfvLosqTWYOlifGxxFVX1zXz0D3O58qmVbN29P67Bjsm8yMPyr961wF/f3N5NqUSjJmmnZ2djC1t3N7Nq+15+8aSz3vnwIqeD5a6PB9ojSTtAG+v2dSqhdjt15nUihZcMibJWN8R3/NbsaPKME+JHpsn23cWMCtwdzGjUUGNnMtzx3zxng6f1GSQf4cYev+jUKUnl7GkU/MNnInIm8BegDPinMeb6IOObPHqI53lgmSB0VeaB/co6F7/vdx00eenDSzwLzK59TsOeOBrK9JgbgF89tZJjJwzvvN6SZI9CIuVb63l40ba4o0FiDceXbveeEjjxGkfOddeeye59bfxtrnOu2bvbGjjiFy9kNZJKxYsrd3DmseM956zP/eubzP7Rxzp7qfsSrITq9rUwfHA/qhsOcPsbm7j9jU3c+j/vSxpXH4k/MdnN/rYOKvfEfya4orZ7A/TJG16Pu042r+63Se1b1iIw1XphrCGu3NPM8yt28L8fOSxuDeQnjy5j7NAB1DW1cs/8rdwzfysfeu9o/vXVk2lu6+hs5L1Gptv2NHe+h7/M2dBN+UZNcmvOuetqOe3o91ghnc90vLTKmUp0K7AD7RGeWeY9Um3riLLdKv6INQYYMqBvt+ntFg/ZE5V+db3TuVtX08RTS6upTtHZc89WNBxoY7jHp0VinRt3J6fe1aH8+2tdh58+uXQ7Ty7dzuD+8UqyPRJNagwQRqSQn+AVkTJgPfBJoApYBFxojElq/jRjxgxTXl6e7HZSYocZ/vcHDuWBPDZhxegjxfnUq1/84XPH8cX3T4o75DEZXz7lUP69IP88S8XIwf3iGp0Y8y77BI+UV3KTxwnUAHd/7f3sa+3gew949/L94OsfmsonjnoP62uauDqLg1bHHDQg6zPo8uFLMyZxzfnH8t0H3uWV1TVcdtZRnHnMwcz802sZPT9hxKCUjW4qhg7s69njP/+EQ3hyabzy+OoHp3iu051+9DhmJ3wSwIvPnzQxrYGOm/87/Yi4fW9nHDOuU9GlY1C/sk5l9sHDR/OD06bxyKJKVu/Yy2dOOIQHFm6jyiquiSMHMftHH6O5LcLOxhbOTrNmmciwgX1TWm5uuf6crMJzIyKLjTEzcg7AZwqtaE4FrjLGnGGvLwcwxvwu2TO5KpqavS18/8El3HzBifzmmVW8sNKZd//OzMO57fWN3ZTGNz48Ne3U1OfeN5FX19Z4NpAxDhs7hE113iOo6eOHdW5uW3ftmVz2nxU8saSaL82YxNqdjvuyqsw2febCwcMGJrWIy4fDxw5hoyvNqfLAi0I30MXmnOPGUyZCXVMrow7qz3PLs7PKK2V+cfbRXPd8alPzQiES/HlhMcXUv6yPb6N+gFd//DEOG3tQzs/3dkXzeeBMY8wl9voi4APGmO8l+JsFzAI49NBDT9q6dWvecdfubeGdLXs469jxrNreyLKqRk46dCSPLa7i40eNZfr4Yfz11Qp27WvlkBGDGDWkPyuqG6lramVA3z6MOWgAF506mfcdOpL2SJRX19Zy5Lih3D1vC4P6l3HchOHUNrXylVMn887mPTQeaKe+uY0po4ewcPMevjhjEu8ZOoB3t9UzbthAJo0a7Cnn8qoGdjS2MHHkIO56awsH2jsY3L8vwwb2Y8TgfgzuX8Yph43m8XerOee48bS0Rxg3bACTRg1m7tpa9rVGaDzQTkt7hJXVjUwbN5RxwwawsnovkWiUsj7CGccczPaGFpZVNvCpY8bR1hFl9ppaxg8fyNqdTYw5qD8nTBrB1DFDGDaoH0eOG8ora2o49fDRdEQMOxtbeLtiF2OHDuAj08Yw+qABGGN4adVOTpo8iiEDylha2cDSygamjB7CyupGLjz5UBZu3sP6miY279rPmIP6M6BvGWMO6s9Fp05h+KB+3Dt/C2t2NDGwXx8mjRxMv759OOrgoWzb3czqHXup2dvC4WMPYte+VvqIUFnfzPjhg/jM8Ydw6uGjWV/TRP3+NiaOGkz/sj786+3NnHb0e5g4cjCPLa5i3LCBRKJRdjS28OaGXZxy2Cgmjx5CXVPsw3h92N8aoW+Z0B6J0q+sD7v2tfKjTx5BRe0+BvUv4+BhA1lZvZd9re08triagf36cNLkkby0aifHTxrBuKEDqWlqYXPdfg4ZMYgvvX8SZX2EoQP78vCiSo6fNIKPH/meuHfe0h5h9Y699BGhpT3ClNFDqKxv5uBhA3m7YhcfPHwMzyzfzt4D7dZaLspRBw+jPRJl8679jBs2kOMmDmfh5j3saDhAv7I+RIxh2+5mTpo8km17mhk7dACTRg6mrI8wZcxgNtXtR0Q4+uChlG+t5+Spo6jZ28IhIwaxvqaJow4eysba/ZT1EUYM7kckajh09GBa26NMHTuE55fvYPLoIQy1a5fvbqvnxEkjOfLgoayvaeKBd7bR0h7hpMkjmbu2lv2tET45fRzNbR0cM2E4izbvYfHWet4zbCATRw5CcNZljps4gqaWDlZtb+Sog4dS3XCAMQcNoL65nfOOP4RJowZTVd/MssoGBg/oS0NzO1PHDObD08YyZ00Nwwf14+ml2+nftw+XfGQqK6v3sq6miUNHDeZLMybR0hFh3NCBPLa4imVVDRxojzBxxCAixlDX1ErN3lamjB5MRd0+BvUro6r+AMMH9WPs0AF88PAx1OxtYUNtE+OGDWRldSOTbfk+dNRgxg0byGdOOIR7529l1kcOY1D/PizZ1kBDczuHjR3C4WMPYvaams6PFp56+Gg+/N4xPLt8O31EOHr8sLip8nxQRZOBonGT64hGURSlt1JqiqbQVmfVwCTX9UTrpiiKooSUQiuaRcA0EZkqIv2BC4CnCyyDoiiKUkAKat5sjOkQke8BL+GYN99ljFlVSBkURVGUwlLwfTTGmOeB5wsdr6IoilIcQn8ygKIoilJcVNEoiqIogaKKRlEURQkUVTSKoihKoBR0w2YuiEgdkOvRAGOA5N8r7n1ofsSj+RGP5kc8PTk/JhtjxhZbiBglr2jyQUTKS2l3bLHR/IhH8yMezY94ND/8Q6fOFEVRlEBRRaMoiqIEStgVze3FFqDE0PyIR/MjHs2PeDQ/fCLUazSKoihK8Qn7iEZRFEUpMqpoFEVRlEAJpaIRkTNFZJ2IVIjIZcWWpxCIyCQRmSsiq0VklYj80LqPEpFXRGSD/T/SuouI3GzzaLmIvK+4KQgGESkTkSUi8qy9nioiC226H7afq0BEBtjrCnt/SlEFDwARGSEij4nIWhFZIyKn9ubyISL/Z+vKShF5UEQG9ubyESShUzQiUgbcApwFTAcuFJHpxZWqIHQAPzbGTAdOAb5r030ZMMcYMw2YY6/ByZ9p9m8WcGvhRS4IPwTcH7H/PXCjMea9QD3wDev+DaDeut9o/YWNvwAvGmOOAo7HyZdeWT5EZALwA2CGMeZYnM+WXEDvLh/BYYwJ1R9wKvCS6/py4PJiy1WEfHgK+CSwDhhv3cYD6+zvfwAXuvx3+gvLH84XXOcAnwCeBQRnp3ffxLKC842kU+3vvtafFDsNPubFcGBzYpp6a/kAJgCVwCj7vp8Fzuit5SPov9CNaOgqQDGqrFuvwQ7rTwQWAuOMMTvsrZ3AOPu7N+TTTcDPgKi9Hg00GGM67LU7zZ35Ye83Wv9hYSpQB/zLTiX+U0SG0EvLhzGmGvgTsA3YgfO+F9N7y0eghFHR9GpE5CDgP8Clxpi97nvG6Y71Cnt2ETkXqDXGLC62LCVCX+B9wK3GmBOB/XRNkwG9rnyMBM7DUcCHAEOAM4sqVIgJo6KpBia5ridat9AjIv1wlMz9xpjHrXONiIy398cDtdY97Pn0IeAzIrIFeAhn+uwvwAgRiX1Z1p3mzvyw94cDuwspcMBUAVXGmIX2+jEcxdNby8fpwGZjTJ0xph14HKfM9NbyEShhVDSLgGnWeqQ/zgLf00WWKXBERIA7gTXGmBtct54GLra/L8ZZu4m5f8VaF50CNLqmUHo8xpjLjTETjTFTcMrAq8aY/wHmAp+33hLzI5ZPn7f+Q9O7N8bsBCpF5EjrdBqwml5aPnCmzE4RkcG27sTyo1eWj8Ap9iJREH/A2cB6YCPwi2LLU6A0fxhn2mM5sNT+nY0zjzwH2ADMBkZZ/4JjnbcRWIFjfVP0dASUNzOBZ+3vw4B3gArgUWCAdR9oryvs/cOKLXcA+XACUG7LyJPAyN5cPoDfAGuBlcB9wIDeXD6C/NMjaBRFUZRACePUmaIoilJCqKJRFEVRAkUVjaIoihIoqmgURVGUQFFFoyiKogSKKhpFURQlUFTRKIqiKIHy/wEzQ9oWMbyGPAAAAABJRU5ErkJggg==\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": [
"## Item Requires Statement Constraint"
]
},
{
"cell_type": "markdown",
"id": "chubby-glass",
"metadata": {},
"source": [
"### Understand Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 37,
"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": 38,
"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": 39,
"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": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "infrared-canal",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"P2306 7182\n",
"P2305 2540\n",
"P2316 2523\n",
"P2303 422\n",
"P2304 14\n",
"P6607 14\n",
"P2916 5\n",
"P4680 2\n",
"P2308 1\n",
"P4155 1\n",
"P31 1\n",
"Name: label, dtype: int64"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 41,
"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": 42,
"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": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "conceptual-schedule",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.droplevel(1)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"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": 44,
"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": "code",
"execution_count": 45,
"id": "indian-journal",
"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",
" P5447 \n",
" NaN \n",
" NaN \n",
" [Q55426051] \n",
" [P5446] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [Q46466783] \n",
" NaN \n",
" \n",
" \n",
" P5448 \n",
" NaN \n",
" NaN \n",
" [Q55426051] \n",
" [P5446] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" [Q46466783] \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"label P2303 P2304 P2305 P2306 P2308 P2316 P2916 P31 P4155 \\\n",
"node1 \n",
"P5447 NaN NaN [Q55426051] [P5446] NaN NaN NaN NaN NaN \n",
"P5448 NaN NaN [Q55426051] [P5446] NaN NaN NaN NaN NaN \n",
"\n",
"label P4680 P6607 \n",
"node1 \n",
"P5447 [Q46466783] NaN \n",
"P5448 [Q46466783] NaN "
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires[dfItemRequires['P4680'].apply(lambda p: type(p) == list)]"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "discrete-template",
"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",
" 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",
" P1045 \n",
" NaN \n",
" NaN \n",
" [Q20808382, Q28218485, Q3044918] \n",
" [P39] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1045 \n",
" NaN \n",
" NaN \n",
" [Q82955] \n",
" [P106] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1045 \n",
" NaN \n",
" NaN \n",
" [Q5] \n",
" [P31] \n",
" NaN \n",
" [Q21502408] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P1045 \n",
" NaN \n",
" NaN \n",
" [Q142, Q71084] \n",
" [P27] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P980 \n",
" NaN \n",
" NaN \n",
" [Q34] \n",
" [P17] \n",
" NaN \n",
" [Q21502408] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P981 \n",
" NaN \n",
" NaN \n",
" [Q55] \n",
" [P17] \n",
" NaN \n",
" [Q21502408] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P981 \n",
" NaN \n",
" NaN \n",
" [Q1852859] \n",
" [P31] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P988 \n",
" NaN \n",
" NaN \n",
" [Q928] \n",
" [P17] \n",
" NaN \n",
" [Q21502408] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" P990 \n",
" [Q49678, Q853715] \n",
" NaN \n",
" [Q5] \n",
" [P31] \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
2540 rows × 11 columns
\n",
"
"
],
"text/plain": [
"label P2303 P2304 P2305 P2306 \\\n",
"node1 \n",
"P1010 NaN NaN [Q794] [P17] \n",
"P1045 NaN NaN [Q20808382, Q28218485, Q3044918] [P39] \n",
"P1045 NaN NaN [Q82955] [P106] \n",
"P1045 NaN NaN [Q5] [P31] \n",
"P1045 NaN NaN [Q142, Q71084] [P27] \n",
"... ... ... ... ... \n",
"P980 NaN NaN [Q34] [P17] \n",
"P981 NaN NaN [Q55] [P17] \n",
"P981 NaN NaN [Q1852859] [P31] \n",
"P988 NaN NaN [Q928] [P17] \n",
"P990 [Q49678, Q853715] NaN [Q5] [P31] \n",
"\n",
"label P2308 P2316 P2916 P31 P4155 P4680 P6607 \n",
"node1 \n",
"P1010 NaN [Q21502408] NaN NaN NaN NaN NaN \n",
"P1045 NaN NaN NaN NaN NaN NaN NaN \n",
"P1045 NaN NaN NaN NaN NaN NaN NaN \n",
"P1045 NaN [Q21502408] NaN NaN NaN NaN NaN \n",
"P1045 NaN NaN NaN NaN NaN NaN NaN \n",
"... ... ... ... ... ... ... ... \n",
"P980 NaN [Q21502408] NaN NaN NaN NaN NaN \n",
"P981 NaN [Q21502408] NaN NaN NaN NaN NaN \n",
"P981 NaN NaN NaN NaN NaN NaN NaN \n",
"P988 NaN [Q21502408] NaN NaN NaN NaN NaN \n",
"P990 NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
"[2540 rows x 11 columns]"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires[dfItemRequires['P2305'].apply(lambda p: type(p) == list)]"
]
},
{
"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": 86,
"id": "turkish-establishment",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "37c6488e55b04219bea1391f9dfa247e",
"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/claims.P345.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2604.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2355.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P3350.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1014.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2636.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1771.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2755.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8326.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P5128.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1627.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P954.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P498.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1297.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8680.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P715.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2606.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8303.tsv does not exist\n",
"File: ../../propertiesSplit/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",
"folderName = 'codependencyConstraint_Final'\n",
"subFolderName = \"Mand_Sugg_Normal\"\n",
"shellFileSuffix = 'codepConst_MSN_Validator_new2_'\n",
"graph_cache_file_prefix = \"codep_new3_001_\"\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/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit/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/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit/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 % 20 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit/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": 11,
"id": "peripheral-herald",
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'cnt' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcnt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'cnt' is not defined"
]
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "incorporated-logistics",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"27"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fCnt"
]
},
{
"cell_type": "code",
"execution_count": 123,
"id": "welcome-welding",
"metadata": {},
"outputs": [],
"source": [
"# from tqdm.notebook import tqdm\n",
"# import os.path\n",
"# import os\n",
"# folderName = 'codependencyConstraint'\n",
"# for prop in tqdm(dfItemRequires.index.unique()):\n",
"# for subFolderName in ['Mand_Sugg_Normal', 'Mand_Normal', 'Mand', 'Normal']:\n",
"# if os.path.isfile(\"../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv\") and \\\n",
"# os.path.isfile(\"../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv\"):\n",
"# os.system(\"kgtk cat -i ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
"# ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
"# -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_w_exceptions.tsv\")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "optimum-blowing",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,28):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/codepConst_MSN_Validator_new2_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "indoor-verse",
"metadata": {},
"source": [
"#### Version 2 - Mandatory + Normal"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "furnished-paradise",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "edc18c3904494784866a2d8be0d744f4",
"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/claims.P345.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2604.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2355.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1014.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2636.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1771.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2755.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8326.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1627.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P954.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P498.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1297.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8680.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P715.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2606.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8303.tsv does not exist\n",
"File: ../../propertiesSplit/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",
"folderName = 'codependencyConstraint_Final'\n",
"subFolderName = \"Mand_Normal\"\n",
"shellFileSuffix = 'codepConst_MN_Validator_new2_'\n",
"graph_cache_file_prefix = \"codep_new3_02_\"\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/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit/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/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit/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 % 20 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit/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": 14,
"id": "searching-individual",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"468"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "silver-clarity",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,25):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/codepConst_MN_Validator_new2_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "prescription-access",
"metadata": {},
"source": [
"#### Version 3 - Mandatory"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "married-porter",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2bff77e903334ba7aac27fa465eb5541",
"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/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_Final'\n",
"subFolderName = \"Mand\"\n",
"shellFileSuffix = 'codepConst_M_Validator_new2_'\n",
"graph_cache_file_prefix = \"codep_new3_03_\"\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/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit/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/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit/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 % 20 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit/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": 91,
"id": "according-blackberry",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"78"
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "extraordinary-drawing",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,5):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/codepConst_M_Validator_new2_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "subsequent-brown",
"metadata": {},
"source": [
"#### Version 4 - Normal"
]
},
{
"cell_type": "code",
"execution_count": 92,
"id": "operational-migration",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "23671bc603f64352967ca76b3f0a1aba",
"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/claims.P345.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2604.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2355.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1014.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2636.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1771.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2755.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8326.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P954.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P498.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P1297.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8680.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P715.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P2606.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P8303.tsv does not exist\n",
"File: ../../propertiesSplit/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",
"folderName = 'codependencyConstraint_Final'\n",
"subFolderName = \"Normal\"\n",
"shellFileSuffix = 'codepConst_N_Validator_new2_'\n",
"graph_cache_file_prefix = \"codep_new3_04_\"\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/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit/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/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit/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 % 20 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit/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": 93,
"id": "harmful-binary",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"418"
]
},
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "advance-married",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,23):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/codepConst_N_Validator_new2_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "ranging-journal",
"metadata": {},
"source": [
"#### Version 5 - Suggestion"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "missing-jordan",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bdc942cb17d9460fa2421475c3489d1a",
"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/claims.P1566.tsv does not exist\n",
"File: ../../propertiesSplit/claims.P3350.tsv does not exist\n",
"File: ../../propertiesSplit/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_Final'\n",
"subFolderName = \"Suggestion\"\n",
"shellFileSuffix = 'codepConst_S_Validator_new_3_'\n",
"graph_cache_file_prefix = \"codep_new4_05_\"\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/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" commandInit = \"{ time ( kgtk --debug query -i ../../propertiesSplit/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/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" commandOtherFiles += \"../../propertiesSplit/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 % 20 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit/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": 17,
"id": "soviet-forth",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"97"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "racial-stationery",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"for i in range(1,6):\n",
" os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/codepConst_S_Validator_new_3_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "structural-envelope",
"metadata": {},
"source": [
"### Merge all correct/incorrect outputs"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "joined-invention",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "57dcbdd4c8014c9288dbb92b331a05a6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# import os\n",
"# from tqdm.notebook import tqdm\n",
"\n",
"# for folder in tqdm(iter(['Mand_Sugg_Normal', 'Mand_Normal', 'Mand', 'Normal'])):\n",
"# folderPath = \"../../allConstraintsAnalysis/codependencyConstraint/\" + folder + \"/\"\n",
"# correct_files_list = \" \".join([folderPath + f for f in filter(lambda f: \".correct.\" in f, os.listdir(folderPath))])\n",
"# incorrect_files_list = \" \".join([folderPath + f for f in filter(lambda f: \".incorrect.\" in f, os.listdir(folderPath))])\n",
"# # print(files_list)\n",
"# os.system(\"{ kgtk cat -i \"+ correct_files_list + \" -o \"+folderPath+\"claims.all.correctSuperSet.tsv -v True; } 2> \"+folderPath+\"claims.all.correctSuperSet.log\")\n",
"# os.system(\"{ kgtk cat -i \"+ incorrect_files_list + \" -o \"+folderPath+\"claims.all.incorrectSuperSet.tsv -v True; } 2> \"+folderPath+\"claims.all.incorrectSuperSet.log\")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "stopped-bolivia",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "68395f72036a469fad8908d916303bcd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# import os\n",
"# from tqdm.notebook import tqdm\n",
"\n",
"# for folder in tqdm(iter(['Mand_Sugg_Normal', 'Mand_Normal', 'Mand', 'Normal'])):\n",
"# folderPath = \"../../allConstraintsAnalysis/codependencyConstraint_Final/\" + folder + \"/\"\n",
"# correct_files_list = \" \".join([folderPath + f for f in filter(lambda f: \".correct.\" in f, os.listdir(folderPath))])\n",
"# incorrect_files_list = \" \".join([folderPath + f for f in filter(lambda f: \".incorrect.\" in f, os.listdir(folderPath))])\n",
"# # print(files_list)\n",
"# os.system(\"{ kgtk cat -i \"+ correct_files_list + \" -o \"+folderPath+\"claims.all.correctSuperSet.tsv; } 2> \"+folderPath+\"claims.all.correctSuperSet.log\")\n",
"# os.system(\"{ kgtk cat -i \"+ incorrect_files_list + \" -o \"+folderPath+\"claims.all.incorrectSuperSet.tsv; } 2> \"+folderPath+\"claims.all.incorrectSuperSet.log\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "criminal-central",
"metadata": {},
"outputs": [],
"source": [
"# for folder in tqdm(iter(['Mand_Sugg_Normal', 'Mand_Normal', 'Mand', 'Normal'])):\n",
"# folderPath = \"../../allConstraintsAnalysis/codependencyConstraint/\" + folder + \"/\"\n",
"# folderPathNew = \"../../allConstraintsAnalysis/codependencyConstraint_Final/\" + folder + \"/\"\n",
"# os.system(f\"screen -dm kgtk ifnotexists -i {folderPathNew}claims.all.correctSuperSet.tsv --filter-on {folderPath}claims.all.correctSuperSet.tsv -o {folderPathNew}claims.all.correctSuperSet.diff.tsv\")\n",
"# os.system(f\"screen -dm kgtk ifnotexists -i {folderPathNew}claims.all.incorrectSuperSet.tsv --filter-on {folderPath}claims.all.incorrectSuperSet.tsv -o {folderPathNew}claims.all.incorrectSuperSet.diff.tsv\")\n",
" "
]
},
{
"cell_type": "markdown",
"id": "homeless-pleasure",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "welcome-dependence",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4bb32dc855d74908a5712f7386539c70",
"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": "5093ebb08fb3417f8437078912c62872",
"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": "79c17475c0334b9b8a888b51afdaa78e",
"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": "ebd724a1414c4683945c5159881e0822",
"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": "734e0f4da0d14f928be0c2b83c2fbdb8",
"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": "0060bed739174876945772afa230df0a",
"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/codependencyConstraint_Final/\"+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": 2,
"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": 3,
"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": 4,
"id": "physical-soviet",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'Mand_Sugg_Normal': {'correct': 298173993,\n",
" 'incorrect': 4433743,\n",
" 'propCount': 527,\n",
" 'total': 302607736,\n",
" 'percIncorrect': 1.4651783389965947},\n",
" 'Mand_Normal': {'correct': 273602683,\n",
" 'incorrect': 2229992,\n",
" 'propCount': 468,\n",
" 'total': 275832675,\n",
" 'percIncorrect': 0.8084582437523038},\n",
" 'Mand': {'correct': 3984740,\n",
" 'incorrect': 717,\n",
" 'propCount': 78,\n",
" 'total': 3985457,\n",
" 'percIncorrect': 0.01799040862816987},\n",
" 'Normal': {'correct': 272710532,\n",
" 'incorrect': 2229328,\n",
" 'propCount': 418,\n",
" 'total': 274939860,\n",
" 'percIncorrect': 0.8108420510580022},\n",
" 'Suggestion': {'correct': 25729758,\n",
" 'incorrect': 2224050,\n",
" 'propCount': 97,\n",
" 'total': 27953808,\n",
" 'percIncorrect': 7.95616110692325}}"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstViolationsSummary"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "permanent-triumph",
"metadata": {},
"outputs": [],
"source": [
"mandatoryPropCount = 0\n",
"suggestionPropCount = 0\n",
"normalPropCount = 0\n",
"for prop in tqdm(dfItemRequires.index.unique()):\n",
" if not(os.path.isfile(\"../../propertiesSplit/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/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit/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": null,
"id": "boring-tooth",
"metadata": {},
"outputs": [],
"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": 5,
"id": "beautiful-xerox",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"codepConstDF1 = pd.DataFrame(codepConstViolations['Mand_Sugg_Normal']).T"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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/codependencyCons... \n",
" \n",
" \n",
" P119 \n",
" 176018 \n",
" 2477 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1629 \n",
" 7531 \n",
" 88 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1464 \n",
" 35000 \n",
" 831 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1345 \n",
" 113 \n",
" 48 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P19 \n",
" 2637114 \n",
" 24855 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P2873 \n",
" 642 \n",
" 8 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P2875 \n",
" 3547 \n",
" 16 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P2876 \n",
" 51 \n",
" 14 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P2900 \n",
" 21844 \n",
" 813 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
"
\n",
"
527 rows × 3 columns
\n",
"
"
],
"text/plain": [
" correct incorrect paths\n",
"P1018 156 28 [../../allConstraintsAnalysis/codependencyCons...\n",
"P119 176018 2477 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1629 7531 88 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1464 35000 831 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1345 113 48 [../../allConstraintsAnalysis/codependencyCons...\n",
"... ... ... ...\n",
"P19 2637114 24855 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2873 642 8 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2875 3547 16 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2876 51 14 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2900 21844 813 [../../allConstraintsAnalysis/codependencyCons...\n",
"\n",
"[527 rows x 3 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF1"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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": 8,
"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/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2302 \n",
" 0 \n",
" 42211 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P3063 \n",
" 0 \n",
" 549 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2303 \n",
" 0 \n",
" 39 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P5447 \n",
" 0 \n",
" 23 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P5448 \n",
" 0 \n",
" 23 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2308 \n",
" 0 \n",
" 17 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P7569 \n",
" 0 \n",
" 8 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P7903 \n",
" 0 \n",
" 7 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P574 \n",
" 0 \n",
" 4 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2306 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2916 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2433 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P8264 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2307 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P1111 0 46327 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2302 0 42211 [../../allConstraintsAnalysis/codependencyCons... \n",
"P3063 0 549 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2303 0 39 [../../allConstraintsAnalysis/codependencyCons... \n",
"P5447 0 23 [../../allConstraintsAnalysis/codependencyCons... \n",
"P5448 0 23 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2308 0 17 [../../allConstraintsAnalysis/codependencyCons... \n",
"P7569 0 8 [../../allConstraintsAnalysis/codependencyCons... \n",
"P7903 0 7 [../../allConstraintsAnalysis/codependencyCons... \n",
"P574 0 4 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2306 0 3 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2916 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2433 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P8264 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2307 0 1 [../../allConstraintsAnalysis/codependencyCons... \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",
"P2433 1.0 \n",
"P8264 1.0 \n",
"P2307 1.0 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF1.sort_values(by=['violation_ratio', 'incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "armed-constitution",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['../../allConstraintsAnalysis/codependencyConstraint_Final/Mand_Sugg_Normal/claims.P2302.correct.tsv',\n",
" '../../allConstraintsAnalysis/codependencyConstraint_Final/Mand_Sugg_Normal/claims.P2302.incorrect.tsv']"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(codepConstDF1.loc['P2302']['paths'])"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "continued-desire",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"id\tnode1\tlabel\tnode2\trank\tnode2;wikidatatype\r\n",
"P10-P2302-Q21502404-d012aef4-0\tP10\tP2302\tQ21502404\tnormal\twikibase-item\r\n",
"P10-P2302-Q21510851-5224fe0b-0\tP10\tP2302\tQ21510851\tnormal\twikibase-item\r\n",
"P10-P2302-Q21510852-dde2f0ce-0\tP10\tP2302\tQ21510852\tnormal\twikibase-item\r\n",
"P10-P2302-Q52004125-d0288d06-0\tP10\tP2302\tQ52004125\tnormal\twikibase-item\r\n",
"P10-P2302-Q53869507-974ce3b1-0\tP10\tP2302\tQ53869507\tnormal\twikibase-item\r\n",
"P1000-P2302-Q21510856-b2772a67-0\tP1000\tP2302\tQ21510856\tnormal\twikibase-item\r\n",
"P1000-P2302-Q21510865-1f5093e9-0\tP1000\tP2302\tQ21510865\tnormal\twikibase-item\r\n",
"P1000-P2302-Q53869507-36dbee67-0\tP1000\tP2302\tQ53869507\tnormal\twikibase-item\r\n",
"P1001-P2302-Q21502838-3cc7ade2-0\tP1001\tP2302\tQ21502838\tnormal\twikibase-item\r\n"
]
}
],
"source": [
"!head ../../allConstraintsAnalysis/codependencyConstraint_Final/Mand_Sugg_Normal/claims.P2302.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 11,
"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/codependencyCons... \n",
" 0.193676 \n",
" \n",
" \n",
" P734 \n",
" 2001246 \n",
" 704728 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.260434 \n",
" \n",
" \n",
" P433 \n",
" 31028893 \n",
" 435483 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.013841 \n",
" \n",
" \n",
" P195 \n",
" 1132062 \n",
" 384602 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.253584 \n",
" \n",
" \n",
" P569 \n",
" 4646728 \n",
" 241105 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.049328 \n",
" \n",
" \n",
" P131 \n",
" 10056935 \n",
" 198870 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.019391 \n",
" \n",
" \n",
" P275 \n",
" 5955 \n",
" 123578 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.954027 \n",
" \n",
" \n",
" P2860 \n",
" 174402886 \n",
" 114713 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.000657 \n",
" \n",
" \n",
" P570 \n",
" 2332611 \n",
" 94455 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.038917 \n",
" \n",
" \n",
" P2017 \n",
" 84792 \n",
" 90131 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.515261 \n",
" \n",
" \n",
" P1435 \n",
" 1893874 \n",
" 79479 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.040276 \n",
" \n",
" \n",
" P1922 \n",
" 30451 \n",
" 63440 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.675677 \n",
" \n",
" \n",
" P708 \n",
" 45253 \n",
" 54258 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.545246 \n",
" \n",
" \n",
" P197 \n",
" 117522 \n",
" 49904 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.298066 \n",
" \n",
" \n",
" P1598 \n",
" 36544 \n",
" 46915 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.562132 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2214 2962988 711699 [../../allConstraintsAnalysis/codependencyCons... \n",
"P734 2001246 704728 [../../allConstraintsAnalysis/codependencyCons... \n",
"P433 31028893 435483 [../../allConstraintsAnalysis/codependencyCons... \n",
"P195 1132062 384602 [../../allConstraintsAnalysis/codependencyCons... \n",
"P569 4646728 241105 [../../allConstraintsAnalysis/codependencyCons... \n",
"P131 10056935 198870 [../../allConstraintsAnalysis/codependencyCons... \n",
"P275 5955 123578 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2860 174402886 114713 [../../allConstraintsAnalysis/codependencyCons... \n",
"P570 2332611 94455 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2017 84792 90131 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1435 1893874 79479 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1922 30451 63440 [../../allConstraintsAnalysis/codependencyCons... \n",
"P708 45253 54258 [../../allConstraintsAnalysis/codependencyCons... \n",
"P197 117522 49904 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1598 36544 46915 [../../allConstraintsAnalysis/codependencyCons... \n",
"\n",
" violation_ratio \n",
"P2214 0.193676 \n",
"P734 0.260434 \n",
"P433 0.013841 \n",
"P195 0.253584 \n",
"P569 0.049328 \n",
"P131 0.019391 \n",
"P275 0.954027 \n",
"P2860 0.000657 \n",
"P570 0.038917 \n",
"P2017 0.515261 \n",
"P1435 0.040276 \n",
"P1922 0.675677 \n",
"P708 0.545246 \n",
"P197 0.298066 \n",
"P1598 0.562132 "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF1.sort_values(by=['incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "developed-zimbabwe",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"count 527.000000\n",
"mean 0.206083\n",
"std 0.305674\n",
"min 0.000000\n",
"25% 0.000929\n",
"50% 0.032847\n",
"75% 0.298101\n",
"max 1.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF1['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "unknown-johnston",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 1 - Violation Ratios')"
]
},
"execution_count": 13,
"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": 14,
"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": 14,
"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": 15,
"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": 16,
"id": "variable-desert",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1.to_csv('../../allConstraintsAnalysis/codepConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "greater-genetics",
"metadata": {},
"source": [
"#### Version 2 - Mand Normal"
]
},
{
"cell_type": "code",
"execution_count": 179,
"id": "constant-chance",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"codepConstDF2 = pd.DataFrame(codepConstViolations['Mand_Normal']).T"
]
},
{
"cell_type": "code",
"execution_count": 180,
"id": "included-adjustment",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" \n",
" \n",
" \n",
" \n",
" P1196 \n",
" 85037 \n",
" 3039 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1383 \n",
" 31726 \n",
" 41 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1018 \n",
" 156 \n",
" 28 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1538 \n",
" 194334 \n",
" 152 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1685 \n",
" 4321 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P2962 \n",
" 26803 \n",
" 2 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P183 \n",
" 19026 \n",
" 140 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1999 \n",
" 2403 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P2009 \n",
" 1019 \n",
" 15 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1376 \n",
" 79449 \n",
" 106 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
"
\n",
"
468 rows × 3 columns
\n",
"
"
],
"text/plain": [
" correct incorrect paths\n",
"P1196 85037 3039 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1383 31726 41 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1018 156 28 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1538 194334 152 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1685 4321 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"... ... ... ...\n",
"P2962 26803 2 [../../allConstraintsAnalysis/codependencyCons...\n",
"P183 19026 140 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1999 2403 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2009 1019 15 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1376 79449 106 [../../allConstraintsAnalysis/codependencyCons...\n",
"\n",
"[468 rows x 3 columns]"
]
},
"execution_count": 180,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF2"
]
},
{
"cell_type": "code",
"execution_count": 181,
"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": 182,
"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",
" P2307 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P1111 \n",
" 0 \n",
" 46327 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P7569 \n",
" 0 \n",
" 8 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2916 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2309 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P7903 \n",
" 0 \n",
" 7 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P5447 \n",
" 0 \n",
" 23 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2311 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2433 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2313 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P5448 \n",
" 0 \n",
" 23 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2308 \n",
" 0 \n",
" 17 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2303 \n",
" 0 \n",
" 39 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2306 \n",
" 0 \n",
" 3 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
" P2312 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2307 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1111 0 46327 [../../allConstraintsAnalysis/codependencyCons... \n",
"P7569 0 8 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2916 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2309 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P7903 0 7 [../../allConstraintsAnalysis/codependencyCons... \n",
"P5447 0 23 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2311 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2433 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2313 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P5448 0 23 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2308 0 17 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2303 0 39 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2306 0 3 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2312 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"\n",
" violation_ratio \n",
"P2307 1.0 \n",
"P1111 1.0 \n",
"P7569 1.0 \n",
"P2916 1.0 \n",
"P2309 1.0 \n",
"P7903 1.0 \n",
"P5447 1.0 \n",
"P2311 1.0 \n",
"P2433 1.0 \n",
"P2313 1.0 \n",
"P5448 1.0 \n",
"P2308 1.0 \n",
"P2303 1.0 \n",
"P2306 1.0 \n",
"P2312 1.0 "
]
},
"execution_count": 182,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF2.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 183,
"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/codependencyCons... \n",
" 0.193676 \n",
" \n",
" \n",
" P433 \n",
" 31028893 \n",
" 435483 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.013841 \n",
" \n",
" \n",
" P275 \n",
" 5955 \n",
" 123578 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.954027 \n",
" \n",
" \n",
" P2860 \n",
" 174402886 \n",
" 114713 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.000657 \n",
" \n",
" \n",
" P1435 \n",
" 1893874 \n",
" 79479 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.040276 \n",
" \n",
" \n",
" P708 \n",
" 45253 \n",
" 54258 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.545246 \n",
" \n",
" \n",
" P197 \n",
" 117522 \n",
" 49904 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.298066 \n",
" \n",
" \n",
" P1598 \n",
" 36978 \n",
" 46481 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.556932 \n",
" \n",
" \n",
" P1111 \n",
" 0 \n",
" 46327 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.000000 \n",
" \n",
" \n",
" P2248 \n",
" 4020 \n",
" 41566 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.911815 \n",
" \n",
" \n",
" P2325 \n",
" 4071 \n",
" 40611 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.908889 \n",
" \n",
" \n",
" P856 \n",
" 1239292 \n",
" 38026 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.029770 \n",
" \n",
" \n",
" P2243 \n",
" 4025 \n",
" 36540 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.900777 \n",
" \n",
" \n",
" P2244 \n",
" 4027 \n",
" 36527 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.900700 \n",
" \n",
" \n",
" P413 \n",
" 357793 \n",
" 33607 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.085864 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2214 2962988 711699 [../../allConstraintsAnalysis/codependencyCons... \n",
"P433 31028893 435483 [../../allConstraintsAnalysis/codependencyCons... \n",
"P275 5955 123578 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2860 174402886 114713 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1435 1893874 79479 [../../allConstraintsAnalysis/codependencyCons... \n",
"P708 45253 54258 [../../allConstraintsAnalysis/codependencyCons... \n",
"P197 117522 49904 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1598 36978 46481 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1111 0 46327 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2248 4020 41566 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2325 4071 40611 [../../allConstraintsAnalysis/codependencyCons... \n",
"P856 1239292 38026 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2243 4025 36540 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2244 4027 36527 [../../allConstraintsAnalysis/codependencyCons... \n",
"P413 357793 33607 [../../allConstraintsAnalysis/codependencyCons... \n",
"\n",
" violation_ratio \n",
"P2214 0.193676 \n",
"P433 0.013841 \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.029770 \n",
"P2243 0.900777 \n",
"P2244 0.900700 \n",
"P413 0.085864 "
]
},
"execution_count": 183,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF2.sort_values(by=['incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 184,
"id": "violent-match",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"count 468.000000\n",
"mean 0.169189\n",
"std 0.285155\n",
"min 0.000000\n",
"25% 0.000663\n",
"50% 0.016656\n",
"75% 0.193986\n",
"max 1.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 184,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF2['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 185,
"id": "educational-thickness",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 2 - Violation Ratios')"
]
},
"execution_count": 185,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEICAYAAACwDehOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAfc0lEQVR4nO3deZwcVb338c8XEpB9MSM3QsIABhRQAUfEBUEBWVSCV0VQVpGAwnPlgUdFrld5uV2uiqhXFoMgi4KACHIFVEQQFxYDRgibBggmIZCRfbsg8Hv+OGcqlU73TM3SXZmZ7/v16tdUndp+p7q6fn1O1XQpIjAzMwNYoe4AzMxs+eGkYGZmBScFMzMrOCmYmVnBScHMzApOCmZmVnBSGMUkdUsKSRPqjmW0k/QRSb+qO46RNlbqJek4Sd+vOO88STsPcTvbS7p7KMt2mqTbJe040usdE0lB0oclzZL0lKRFkq6U9LYhrussSc9LejK/5kj6T0lrjXTcY5GkNSV9S9Lf8/txTx6f1MZtniXpy8NZR0T8KCLeVXF7B0n6/VC3JWmffOJSQ/kESYslvWeo6240mHoNhqTtJF0l6RFJvZIukjR5iOsacH9ExFcj4mMjE/1S2whJr+obj4jfRcRmbdhO3xe4p/JrnqRjB7H8Msd4RGwREdeOdKyjPilIOhr4FvBVYD1gKnAKMH0Yq/1aRKwBdAEHA9sBf5C02vCiHdskrQRcDWwB7AasCbwZeBjYtsa4lreW1KXA2sAODeW7AQH8ouqKlNTxOV4HmAl0AxsCTwI/GOK6LmWE9scosHZErA58APgPSbvUHdAyImLUvoC1gKeAD/Yzz8qkpPFAfn0LWLmf+c8CvtxQtgawCDiyVPZR4E7gUeCXwIalaQH8G3Av8A/g68AKg1j2cOBvwGPAyYDytBWBb+R13gsckeefUNofZ+RYFwJfBlbM0w4Cfp+XfxS4D9i9tN11SR/qB/L0S3P5HOC9pfkm5u1v3WTffQx4CFi9n/37GuDaXLfbgT0b9v3JwOWkk8yNwCZ5moCTgMXAE8BtwJbADOCfwPP5WPifPP884DPArcBzwATgWOCevO47gPeVtn0Q8PuB3occ//8CL+btPTbEY3cmcGZD2YXASXl4O+CPedt/AXYszXct8BXgD8CzwKty/Pfmut0HfKRFvd4C/Al4PP99S8N6v5TX+yTwK2BSxfpsAzw5jM/yQPvjeOCHpWl75uPnsRz3a0rT5gE75+FtgevzfIuA7wIr5WnX5ff56fxefgjYEVgw3OO1Sf26KX1Wc9lNwKdK4xcBD+b35jpgi1ze3zHeV8+W5zlgEvDzXIdHgN9ROh8tE+tQ38Tl4UX6JvFCeUc3meeLwA3AK0jf/P8IfKmf+c+iISnk8nOAC/LwdGBuPmAmAJ8D/liaN4BrSCfaqcBfgY8NYtmfk745TQV6gd3ytMOBu4Aped3XsHRSuAT4HrBaru9NwGF52kH5wDqUlFw+ng+evoRzOXAB6RvgRGCHXP7pvnqX4r+txb77MXB2P/t2Yq77ccBKwDtJH6bNSvu+r1UxAfgR8OM8bVfg5rxf+k7Ok1u9Z6QPzOy8r1bJZR8EXklqIX+IdDKYXNo/jUmh1fuw1LxDPHbfSkpufbGtRTrBbwWsn/fDHjnWXfJ4V573WuDvpBbZhLzsE6X9OJklJ5Qi1nzMPArsn5fbN4+/vLTee4BNgVXy+AkV63MUcEM79kceP56cFHJ8T+f9MpF0jM5lycl+HktOlm8gJdgJpBPzncBRDe/zq0rjO5KTAsM4XpvUr5ulP6vbAc+w9BeTj5K+gPad4Gf3d15qqGfL8xzwn8BpuT4Tge3Jn/umsQ7nwK77BXwEeHCAee4B9iiN7wrM62f+ZXZ+Lj8BuCoPXwkcUpq2Qn6DNywdaLuVpn8CuHoQy76tNP1C4Ng8/Bvg8NK0d/UdaKSus+fIH6o8fV/gmjx8EDC3NG3VvOy/kE4iLwHrNKn3K/MHYc08/hPg0y323VX0cxLJB+ODLN1qOh84vrTvv1+atgdwVx5+Jym5bkfDt5x+PjAfHeDYmA1ML+2fxqTQ6n1Yat5hHL9/Az6chw8F/pKHPwOc2zDvL4ED8/C1wBdL01YjfQt8f/n9b4yVlAxuaph+PXBQab2fazhuf1GhHq8jfQPdvh37I48fz5Kk8B/AhQ2foYXk1hSlk2WTbRwFXNLwPrdKCkM+Xptstztv6zFSsgtSq73pyZn0ZSSAtQY4xvuSQsvzHClh/Kxcz/5eo/2awsPApAH6jF8J3F8avz+X9d3R0Hfh57QBtrU+6cCH1If6bUmPSXoslyvP02d+s21WXPbB0vAzwOqlujSut8+GpG8Bi0rr/h7pm8My642IZ/Lg6qRv049ExKONlY6IB0jdCe+XtDawO+kbUTMPkxJMK68E5kfESw11GLDuEfEbUtP/ZGCxpJmS1uxnW7D0vkLSAZJml/bPlqSmdSut3od+5TtY+o6r2/uZ9RzggDy8fx6H9F5+sC/OHOvbWHrfFnWLiKdJLZ/DSe//5ZJe3WR7jZ8FqLj/W8kXaa8EPhkRv2sxz3D3R6Ol6pGPp/kN9ejb9qaSfi7pQUlPkK49Vr3pYcjHaz8m5XmOISWgiTnOFSWdkG/MeIJ0wu+bv2qsTc9zpO7rucCvJN070AXu0Z4Urid9O96rn3keIH3I+kzNZUS6o2H1/Dq81QokrQ7sTOqLg3QAHhYRa5deq0TEH0uLTWm2zYrLtrKoyXr7zCfti0ml9a4ZEVtUWO98YN180m/mbGA/UvfL9RGxsMV8vwZ27eeC/APAlIYLo1NJ3/IGFBHfiYg3AJuTuhA+1Tep1SJ9A5I2BE4HjiR1l6xNul6i5ov2H8oAcf6udFz1t//PBXaS9GZSC6gv2c4ntRTKx8hqEXFCqxgi4pcRsQspcdxFqmujxs8CDGL/N8r79NekbopzW803Avuj0VL1yHctTaF5PU4l7Y9pEbEmqSuo6ns+rOO1lYh4MSK+Sbo29Ylc/GFS1+zOpK6z7lzeF2u/xxz9n+eejIhjImJj0rWYoyXt1GpFozopRMTjwOeBkyXtJWlVSRMl7S7pa3m284HPSerKt0V+HvhhlfVLWlnSG0h3RzzKkrsrTgM+K2mLPN9akj7YsPinJK0jaQrwSVJ/fdVlW7kQ+DdJG0hah3ThtG9fLCJdGDwx3xa6gqRNJO0w0ErzslcCp+SYJ0p6e2mWS0kXEj9J629vkD7U84GLJb06x/Dy3CLbg3Qh7hng03kbOwLvJV2L6JekN0p6k6SJpP7k/yV1eUG6uL3xAKtYjfTB6s3rO5jUUhiKh4AN8t1WQxYR80gX/88ndU32fev8IfBeSbvmb5Avk7SjpA2arUfSepKm52T8HOli5EtNZr0C2FTpFu4Jkj5ESrA/H2zsktYndWd+NyIGamVX0s/+aHQh8G5JO+Xj4RhSvZt9sVqDdK3iqdx6+njD9P6OnSEfrxWdkNf9shznc6TW9qqkFk3VOKGf85yk90h6VU6ej5Nukmh2fACjPCkARMSJwNGkC7a9pJPSkaQTGaQ7cGaR7kK5Dbgll/Xn05KeJL1B55AucL4lN9OJiEuA/wJ+nJt6c0jdKmU/y8vNJl3EPWMQy7ZyOqlv+S+5Hj9tmH4A6YLYHaQk9hP6784p2590Ifou0h0+R/VNiIhngYuBjZpsk9J8z5G+6dxFur7wBOli9yTgxoh4nvSh2p10B9MpwAERcVeF+NYk1f9RUtP4YVKzGNK+3Tx3tVzaIrY7gBNJrcuHgNeSusWG4jekO1EelPSPIa6jz9mkb3hFso2I+aRvjcex5Jj+FK0/ryuQPgMPkLojd2DZkx8R8TDwHtJJ9GHSBdr3RMRQ6vAx0knq+FLX0FNDWE+jZfZHo4i4m9Ry/W/ScfRe0h1yzzeZ/f+RvoU/STp+LmiYfjxwdj529m7YznCO1youJx3Ph5Lqez+pFXIH6aJx2UDHeH/nuWmkFt1TpOP/lIi4plVQfXee2AiSFKTm6ty6Yxkpkj4PbBoR+9Udi5m1z/L2Tz22HJK0LnAIqTVhZmPYqO8+svaSdCip++LKiLiu7njMrL3cfWRmZgW3FMzMrDCqrylMmjQpuru76w7DzGxUufnmm/8REV3Npo3qpNDd3c2sWbPqDsPMbFSR1Pif7QV3H5mZWcFJwczMCk4KZmZWcFIwM7OCk4KZmRWcFMzMrOCkYGZmBScFMzMrOCmYmVlhVP9H83B1H3t5MTzvhHfXGImZ2fLBLQUzMys4KZiZWcFJwczMCk4KZmZWcFIwM7NC25KCpCmSrpF0h6TbJX0yl68r6SpJf8t/18nlkvQdSXMl3Sppm3bFZmZmzbWzpfACcExEbA5sBxwhaXPgWODqiJgGXJ3HAXYHpuXXDODUNsZmZmZNtC0pRMSiiLglDz8J3AmsD0wHzs6znQ3slYenA+dEcgOwtqTJ7YrPzMyW1ZFrCpK6ga2BG4H1ImJRnvQgsF4eXh+YX1psQS4zM7MOaXtSkLQ6cDFwVEQ8UZ4WEQHEINc3Q9IsSbN6e3tHMFIzM2trUpA0kZQQfhQRP83FD/V1C+W/i3P5QmBKafENctlSImJmRPRERE9XV1f7gjczG4faefeRgDOAOyPim6VJlwEH5uEDgZ+Vyg/IdyFtBzxe6mYyM7MOaOcP4r0V2B+4TdLsXHYccAJwoaRDgPuBvfO0K4A9gLnAM8DBbYzNzMyaaFtSiIjfA2oxeacm8wdwRLviMTOzgfk/ms3MrOCkYGZmBScFMzMrOCmYmVnBScHMzApOCmZmVnBSMDOzgpOCmZkVnBTMzKzgpGBmZgUnBTMzKzgpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFdr5OM4zJS2WNKdUdoGk2fk1r++JbJK6JT1bmnZau+IyM7PW2vk4zrOA7wLn9BVExIf6hiWdCDxemv+eiNiqjfGYmdkA2vk4zuskdTebJkmkZzO/s13bNzOzwavrmsL2wEMR8bdS2UaS/izpt5K2b7WgpBmSZkma1dvb2/5IzczGkbqSwr7A+aXxRcDUiNgaOBo4T9KazRaMiJkR0RMRPV1dXR0I1cxs/Oh4UpA0AfhX4IK+soh4LiIezsM3A/cAm3Y6NjOz8a6OlsLOwF0RsaCvQFKXpBXz8MbANODeGmIzMxvX2nlL6vnA9cBmkhZIOiRP2oelu44A3g7cmm9R/QlweEQ80q7YzMysuXbefbRvi/KDmpRdDFzcrljMzKwa/0ezmZkVnBTMzKzgpGBmZgUnBTMzKzgpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFZwUzMys4KRgZmYFJwUzMys4KZiZWcFJwczMCk4KZmZWcFIwM7NCO5+8dqakxZLmlMqOl7RQ0uz82qM07bOS5kq6W9Ku7YrLzMxaa2dL4SxgtyblJ0XEVvl1BYCkzUmP6dwiL3NK3zObzcysc9qWFCLiOqDqc5anAz+OiOci4j5gLrBtu2IzM7Pm6rimcKSkW3P30jq5bH1gfmmeBblsGZJmSJolaVZvb2+7YzUzG1c6nRROBTYBtgIWAScOdgURMTMieiKip6ura4TDMzMb3zqaFCLioYh4MSJeAk5nSRfRQmBKadYNcpmZmXVQR5OCpMml0fcBfXcmXQbsI2llSRsB04CbOhmbmZnBhHatWNL5wI7AJEkLgC8AO0raCghgHnAYQETcLulC4A7gBeCIiHixXbGZmVlzbUsKEbFvk+Iz+pn/K8BX2hWPmZkNzP/RbGZmBScFMzMrOCmYmVnBScHMzApOCmZmVnBSMDOzgpOCmZkVnBTMzKzgpGBmZgUnBTMzK1RKCpJe2+5AzMysflVbCqdIuknSJySt1daIzMysNpWSQkRsD3yE9MyDmyWdJ2mXtkZmZmYdV/maQkT8Dfgc8BlgB+A7ku6S9K/tCs7MzDqr6jWF10k6CbgTeCfw3oh4TR4+qY3xmZlZB1VtKfw3cAvw+og4IiJuAYiIB0ith2VIOlPSYklzSmVfz62LWyVdImntXN4t6VlJs/PrtGHVyszMhqRqUng3cF5EPAsgaQVJqwJExLktljkL2K2h7Cpgy4h4HfBX4LOlafdExFb5dXjVCpiZ2cipmhR+DaxSGl81l7UUEdcBjzSU/SoiXsijNwAbVNy+mZl1QNWk8LKIeKpvJA+vOsxtfxS4sjS+kaQ/S/qtpO2HuW4zMxuCqknhaUnb9I1IegPw7FA3KunfgReAH+WiRcDUiNgaOBo4T9KaLZadIWmWpFm9vb1DDcHMzJqYUHG+o4CLJD0ACPgX4END2aCkg4D3ADtFRABExHPAc3n4Zkn3AJsCsxqXj4iZwEyAnp6eGEoMZmbWXKWkEBF/kvRqYLNcdHdE/HOwG5O0G/BpYIeIeKZU3gU8EhEvStoYmAbcO9j1m5nZ8FRtKQC8EejOy2wjiYg4p9XMks4HdgQmSVoAfIF0t9HKwFWSAG7Idxq9HfiipH8CLwGHR8QjTVdsZmZtUykpSDoX2ASYDbyYiwNomRQiYt8mxWe0mPdi4OIqsZiZWftUbSn0AJv3XQMwM7OxqerdR3NIF5fNzGwMq9pSmATcIekm8l1CABGxZ1uiMjOzWlRNCse3MwgzM1s+VL0l9beSNgSmRcSv8+8erdje0MzMrNOq/nT2ocBPgO/lovWBS9sUk5mZ1aTqheYjgLcCT0DxwJ1XtCsoMzOrR9Wk8FxEPN83ImkC6f8UzMxsDKmaFH4r6Thglfxs5ouA/2lfWGZmVoeqSeFYoBe4DTgMuIIWT1wzM7PRq+rdRy8Bp+eXmZmNUVV/++g+mlxDiIiNRzwiMzOrzWB++6jPy4APAuuOfDhmZlanStcUIuLh0mthRHwLeHd7QzMzs06r2n20TWl0BVLLYTDPYjAzs1Gg6on9xNLwC8A8YO8Rj8bMzGpV9e6jdwxl5ZLOJD2PeXFEbJnL1gUuID3FbR6wd0Q8qvQotm8DewDPAAdFxC1D2a6ZmQ1N1e6jo/ubHhHfbDHpLOC7LP2EtmOBqyPiBEnH5vHPALuTns08DXgTcGr+a2ZmHVL1n9d6gI+TfghvfeBwYBtgjfxqKiKuAxqftTwdODsPnw3sVSo/J5IbgLUlTa4Yn5mZjYCq1xQ2ALaJiCcBJB0PXB4R+w1hm+tFxKI8/CCwXh5eH5hfmm9BLltUKkPSDGAGwNSpU4eweTMza6VqS2E94PnS+PMsOZkPWX7m86B+WC8iZkZET0T0dHV1DTcEMzMrqdpSOAe4SdIleXwvlnQBDdZDkiZHxKLcPbQ4ly8EppTm2yCXmZlZh1T957WvAAcDj+bXwRHx1SFu8zLgwDx8IPCzUvkBSrYDHi91M5mZWQcM5h/QVgWeiIgfSOqStFFE3NffApLOB3YEJklaAHwBOAG4UNIhwP0s+X+HK0i3o84l3ZJ68KBqYmZmw1b1ltQvkO5A2gz4ATAR+CHpaWwtRcS+LSbt1GTeID3hzczMalL1QvP7gD2BpwEi4gH6uRXVzMxGp6pJ4fnynUKSVmtfSGZmVpeqSeFCSd8j/UPZocCv8QN3zMzGnAGvKeTfJLoAeDXwBOm6wucj4qo2x2ZmZh02YFKIiJB0RUS8FnAiMDMbw6p2H90i6Y1tjcTMzGpX9f8U3gTsJ2ke6Q4kkRoRr2tXYGZm1nn9JgVJUyPi78CuHYrHzMxqNFBL4VLSr6PeL+niiHh/B2IyM7OaDHRNQaXhjdsZiJmZ1W+gpBAths3MbAwaqPvo9ZKeILUYVsnDsORC85ptjc7MzDqq36QQESt2KhAzM6tf1f9TMDOzccBJwczMCk4KZmZWGMyT10aEpM1IP7DXZ2Pg88DawKFAby4/LiKu6Gx0ZmbjW8eTQkTcDWwFIGlFYCFwCenxmydFxDc6HZOZmSV1dx/tBNwTEffXHIeZmVF/UtgHOL80fqSkWyWdKWmdZgtImiFplqRZvb29zWYxM7Mhqi0pSFqJ9Nzni3LRqcAmpK6lRcCJzZaLiJkR0RMRPV1dXZ0I1cxs3KizpbA7cEtEPAQQEQ9FxIsR8RLpUZ/b1hibmdm4VGdS2JdS15GkyaVp7wPmdDwiM7NxruN3HwFIWg3YBTisVPw1SVuRfnhvXsM0MzPrgFqSQkQ8Dby8oWz/OmIxM7Ml6r77yMzMliNOCmZmVnBSMDOzgpOCmZkVnBTMzKzgpGBmZgUnBTMzKzgpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFZwUzMys4KRgZmYFJwUzMyvU8jwFAEnzgCeBF4EXIqJH0rrABUA36UE7e0fEo3XFaGY23tTdUnhHRGwVET15/Fjg6oiYBlydx83MrEPqTgqNpgNn5+Gzgb3qC8XMbPypMykE8CtJN0uakcvWi4hFefhBYL3GhSTNkDRL0qze3t5OxWpmNi7Udk0BeFtELJT0CuAqSXeVJ0ZESIrGhSJiJjAToKenZ5npZmY2dLW1FCJiYf67GLgE2BZ4SNJkgPx3cV3xmZmNR7UkBUmrSVqjbxh4FzAHuAw4MM92IPCzOuIzMxuv6uo+Wg+4RFJfDOdFxC8k/Qm4UNIhwP3A3jXFZ2Y2LtWSFCLiXuD1TcofBnbqfERmZgbL3y2pZmZWIycFMzMrOCmYmVnBScHMzApOCmZmVnBSMDOzgpOCmZkVnBTMzKzgpGBmZgUnBTMzKzgpmJlZoc7nKSxXuo+9vBied8K7a4zEzKw+bimYmVnBScHMzApOCmZmVnBSMDOzQseTgqQpkq6RdIek2yV9MpcfL2mhpNn5tUenYzMzG+/quPvoBeCYiLglP6f5ZklX5WknRcQ3aojJzMyoISlExCJgUR5+UtKdwPqdjsPMzJZV6zUFSd3A1sCNuehISbdKOlPSOi2WmSFplqRZvb29nQrVzGxcqC0pSFoduBg4KiKeAE4FNgG2IrUkTmy2XETMjIieiOjp6urqVLhmZuNCLUlB0kRSQvhRRPwUICIeiogXI+Il4HRg2zpiMzMbz+q4+0jAGcCdEfHNUvnk0mzvA+Z0OjYzs/GujruP3grsD9wmaXYuOw7YV9JWQADzgMNqiM3MbFyr4+6j3wNqMumKTsdiZmZL86+kmpmNEp34NWf/zIWZmRWcFMzMrODuoyb8wB0zG6/cUjAzs4JbCgNwq8HMxhO3FMzMrOCkYGZmBXcfDYK7ksxsrHNLwczMCk4KZmZWcPdRh7jrycxGAyeFGgw2QTihmFmnOCm0UflkXmUen/DNrG5OCkPU6oTf7hP7aEoioylWM0ucFEZYldZBu7c72C6pqsssb6rUuc7ENB6T4nis81iz3CUFSbsB3wZWBL4fESfUHFItBtv1NJLb83UOs2rGwperRstVUpC0InAysAuwAPiTpMsi4o56I+uMdrQyhnvyHuy38cGuZ6S64YbTauh0ghtsHE7ASyzv+6Id8XW692G5SgrAtsDciLgXQNKPgenAuEgKI6XVQVT14Bru8kNdfyeNZB2rJLnBGqn4hpN0+tvWcJJ2FYPdp8PtPh3MdqvWfThfhOr8jCgiatt4I0kfAHaLiI/l8f2BN0XEkaV5ZgAz8uhmwN3D2OQk4B/DWH60GW/1Bdd5vHCdB2fDiOhqNmF5aykMKCJmAjNHYl2SZkVEz0isazQYb/UF13m8cJ1HzvL2MxcLgSml8Q1ymZmZdcDylhT+BEyTtJGklYB9gMtqjsnMbNxYrrqPIuIFSUcCvyTdknpmRNzexk2OSDfUKDLe6guu83jhOo+Q5epCs5mZ1Wt56z4yM7MaOSmYmVlhzCcFSbtJulvSXEnHNpm+sqQL8vQbJXXXEOaIqlDnoyXdIelWSVdL2rCOOEfSQHUuzfd+SSFp1N++WKXOkvbO7/Xtks7rdIwjrcKxPVXSNZL+nI/vPeqIc6RIOlPSYklzWkyXpO/k/XGrpG2GvdGIGLMv0sXqe4CNgZWAvwCbN8zzCeC0PLwPcEHdcXegzu8AVs3DHx8Pdc7zrQFcB9wA9NQddwfe52nAn4F18vgr6o67A3WeCXw8D28OzKs77mHW+e3ANsCcFtP3AK4EBGwH3DjcbY71lkLxsxkR8TzQ97MZZdOBs/PwT4CdJKmDMY60AescEddExDN59AbS/4OMZlXeZ4AvAf8F/G8ng2uTKnU+FDg5Ih4FiIjFHY5xpFWpcwBr5uG1gAc6GN+Ii4jrgEf6mWU6cE4kNwBrS5o8nG2O9aSwPjC/NL4glzWdJyJeAB4HXt6R6NqjSp3LDiF90xjNBqxzblZPiYj6f3hpZFR5nzcFNpX0B0k35F8gHs2q1Pl4YD9JC4ArgP/TmdBqM9jP+4CWq/9TsM6StB/QA+xQdyztJGkF4JvAQTWH0mkTSF1IO5Jag9dJem1EPFZnUG22L3BWRJwo6c3AuZK2jIiX6g5stBjrLYUqP5tRzCNpAqnJ+XBHomuPSj8VImln4N+BPSPiuQ7F1i4D1XkNYEvgWknzSH2vl43yi81V3ucFwGUR8c+IuA/4KylJjFZV6nwIcCFARFwPvIz0w3Fj1Yj/NNBYTwpVfjbjMuDAPPwB4DeRr+CMUgPWWdLWwPdICWG09zPDAHWOiMcjYlJEdEdEN+k6yp4RMauecEdElWP7UlIrAUmTSN1J93YwxpFWpc5/B3YCkPQaUlLo7WiUnXUZcEC+C2k74PGIWDScFY7p7qNo8bMZkr4IzIqIy4AzSE3MuaQLOvvUF/HwVazz14HVgYvyNfW/R8SetQU9TBXrPKZUrPMvgXdJugN4EfhURIzaVnDFOh8DnC7p/5IuOh80mr/kSTqflNgn5eskXwAmAkTEaaTrJnsAc4FngIOHvc1RvL/MzGyEjfXuIzMzGwQnBTMzKzgpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFf4/GJgKxl4OTJ0AAAAASUVORK5CYII=\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": 186,
"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": 186,
"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": 187,
"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": 188,
"id": "consecutive-plenty",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"codepConstDF3 = pd.DataFrame(codepConstViolations['Mand']).T"
]
},
{
"cell_type": "code",
"execution_count": 189,
"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/codependencyCons... \n",
" \n",
" \n",
" P2021 \n",
" 2303 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P3744 \n",
" 311 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P5982 \n",
" 1326 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P3815 \n",
" 580 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P1879 \n",
" 1695 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P3648 \n",
" 7 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P197 \n",
" 167392 \n",
" 34 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1990 \n",
" 7619 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P2009 \n",
" 1019 \n",
" 15 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
"
\n",
"
78 rows × 3 columns
\n",
"
"
],
"text/plain": [
" correct incorrect paths\n",
"P1081 12300 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2021 2303 1 [../../allConstraintsAnalysis/codependencyCons...\n",
"P3744 311 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"P5982 1326 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"P3815 580 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"... ... ... ...\n",
"P1879 1695 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"P3648 7 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"P197 167392 34 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1990 7619 1 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2009 1019 15 [../../allConstraintsAnalysis/codependencyCons...\n",
"\n",
"[78 rows x 3 columns]"
]
},
"execution_count": 189,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3"
]
},
{
"cell_type": "code",
"execution_count": 190,
"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": 191,
"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/codependencyCons... \n",
" 63.000000 \n",
" \n",
" \n",
" P4341 \n",
" 7 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.142857 \n",
" \n",
" \n",
" P2095 \n",
" 38 \n",
" 3 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.078947 \n",
" \n",
" \n",
" P3931 \n",
" 2250 \n",
" 64 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.028444 \n",
" \n",
" \n",
" P1731 \n",
" 363 \n",
" 9 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.024793 \n",
" \n",
" \n",
" P2009 \n",
" 1019 \n",
" 15 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.014720 \n",
" \n",
" \n",
" P246 \n",
" 169 \n",
" 2 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.011834 \n",
" \n",
" \n",
" P8264 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.010000 \n",
" \n",
" \n",
" P944 \n",
" 577 \n",
" 4 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.006932 \n",
" \n",
" \n",
" P1560 \n",
" 3235 \n",
" 20 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.006182 \n",
" \n",
" \n",
" P2679 \n",
" 887 \n",
" 5 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.005637 \n",
" \n",
" \n",
" P451 \n",
" 10502 \n",
" 36 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.003428 \n",
" \n",
" \n",
" P2365 \n",
" 1650 \n",
" 5 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.003030 \n",
" \n",
" \n",
" P915 \n",
" 28364 \n",
" 45 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.001587 \n",
" \n",
" \n",
" P1635 \n",
" 890 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.001124 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P5051 1 63 [../../allConstraintsAnalysis/codependencyCons... \n",
"P4341 7 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2095 38 3 [../../allConstraintsAnalysis/codependencyCons... \n",
"P3931 2250 64 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1731 363 9 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2009 1019 15 [../../allConstraintsAnalysis/codependencyCons... \n",
"P246 169 2 [../../allConstraintsAnalysis/codependencyCons... \n",
"P8264 0 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"P944 577 4 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1560 3235 20 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2679 887 5 [../../allConstraintsAnalysis/codependencyCons... \n",
"P451 10502 36 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2365 1650 5 [../../allConstraintsAnalysis/codependencyCons... \n",
"P915 28364 45 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1635 890 1 [../../allConstraintsAnalysis/codependencyCons... \n",
"\n",
" violation_ratio \n",
"P5051 63.000000 \n",
"P4341 0.142857 \n",
"P2095 0.078947 \n",
"P3931 0.028444 \n",
"P1731 0.024793 \n",
"P2009 0.014720 \n",
"P246 0.011834 \n",
"P8264 0.010000 \n",
"P944 0.006932 \n",
"P1560 0.006182 \n",
"P2679 0.005637 \n",
"P451 0.003428 \n",
"P2365 0.003030 \n",
"P915 0.001587 \n",
"P1635 0.001124 "
]
},
"execution_count": 191,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 192,
"id": "identified-marble",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"correct 1980\n",
"incorrect 1\n",
"paths [../../allConstraintsAnalysis/codependencyCons...\n",
"violation_ratio 0.000505\n",
"Name: P1713, dtype: object"
]
},
"execution_count": 192,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3.loc['P1713']"
]
},
{
"cell_type": "code",
"execution_count": 193,
"id": "established-mounting",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"id\tnode1\tlabel\tnode2\trank\tnode2;wikidatatype\r\n",
"Q4681882-P1713-d878eb-9fff460e-0\tQ4681882\tP1713\t\"https://heightnetworth.com/adele-givens-net-worth-2020/\"\tnormal\turl\r\n"
]
}
],
"source": [
"!head ../../allConstraintsAnalysis/codependencyConstraint_Final/Mand/claims.P1713.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "naval-functionality",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"id\tnode1\tlabel\tnode2\trank\tnode2;wikidatatype\r\n",
"Q1000195-P1713-e792ce-9b50511b-0\tQ1000195\tP1713\t\"http://webarchiv.bundestag.de/archive/2007/0206/mdb/mdb13/bio/T/thiesdi0.html\"\tnormal\turl\r\n",
"Q100218-P1713-3e741f-4bb9633d-0\tQ100218\tP1713\t\"http://webarchiv.bundestag.de/archive/2013/1212/bundestag/abgeordnete17/biografien/B/bunge_martina.html\"\tnormal\turl\r\n",
"Q100250-P1713-33d6e4-326e7a64-0\tQ100250\tP1713\t\"http://webarchiv.bundestag.de/archive/2010/0427/bundestag/abgeordnete/bio/B/bauerwo0.html\"\tnormal\turl\r\n",
"Q100357-P1713-f75a30-72e42938-0\tQ100357\tP1713\t\"http://webarchiv.bundestag.de/archive/2007/0206/mdb/mdb14/bio/J/juengsa0.html\"\tnormal\turl\r\n",
"Q100615-P1713-cd17a0-c89f234d-0\tQ100615\tP1713\t\"http://webarchiv.bundestag.de/archive/2013/1212/bundestag/abgeordnete17/biografien/P/ploetz_yvonne.html\"\tnormal\turl\r\n",
"Q100617-P1713-2396a5-62789180-0\tQ100617\tP1713\t\"http://webarchiv.bundestag.de/archive/2013/1212/bundestag/abgeordnete17/biografien/S/schwanitz_rolf.html\"\tnormal\turl\r\n",
"Q100717883-P1713-bd827f-36a0ade3-0\tQ100717883\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/W/524570-524570\"\tnormal\turl\r\n",
"Q100797-P1713-c9a2d4-f898748f-0\tQ100797\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/P/pronold_florian/522720\"\tnormal\turl\r\n",
"Q100960-P1713-7a9695-4d24386e-0\tQ100960\tP1713\t\"http://webarchiv.bundestag.de/archive/2007/0206/mdb/mdb14/bio/G/geigemi0.html\"\tnormal\turl\r\n",
"Q100986-P1713-09ed67-8a983157-0\tQ100986\tP1713\t\"http://www.bundestag.de/bundestag/abgeordnete18/biografien/B/becker_dirk/258158\"\tnormal\turl\r\n",
"Q100986-P1713-0c450a-871bc22b-0\tQ100986\tP1713\t\"http://www.bundestag.de/bundestag/abgeordnete18/biografien/B/becker_dirk.html\"\tnormal\turl\r\n",
"Q101192-P1713-712026-5576cf80-0\tQ101192\tP1713\t\"http://www.bundestag.de/bundestag/abgeordnete18/biografien/B/bartels_hans_peter.html\"\tnormal\turl\r\n",
"Q101192-P1713-c1d1cb-90bf9b39-0\tQ101192\tP1713\t\"http://www.bundestag.de/bundestag/abgeordnete18/biografien/B/bartels_hans_peter/258234\"\tnormal\turl\r\n",
"Q101206-P1713-f2dc25-f3b5f511-0\tQ101206\tP1713\t\"http://webarchiv.bundestag.de/archive/2013/1212/bundestag/abgeordnete17/biografien/S/schreiner_ottmar.html\"\tnormal\turl\r\n",
"Q101296-P1713-5850b9-d4983cc9-0\tQ101296\tP1713\t\"http://webarchiv.bundestag.de/archive/2013/1212/bundestag/abgeordnete17/biografien/M/merkel_petra.html\"\tnormal\turl\r\n",
"Q101481413-P1713-e36b80-6e010c1d-0\tQ101481413\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/D/518958-518958\"\tnormal\turl\r\n",
"Q101504-P1713-2b19ec-bab3dc39-0\tQ101504\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/W/willsch_klaus_peter/524612\"\tnormal\turl\r\n",
"Q101533533-P1713-bf5149-3cb91260-0\tQ101533533\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/N/522272-522272\"\tnormal\turl\r\n",
"Q101617-P1713-d046b6-7e1394d5-0\tQ101617\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/B/bluhm_heidrun/518490\"\tnormal\turl\r\n",
"Q101632-P1713-0a7355-6fa52c85-0\tQ101632\tP1713\t\"http://webarchiv.bundestag.de/archive/2010/0427/bundestag/abgeordnete/bio/A/albacpe0.html\"\tnormal\turl\r\n",
"Q1016467-P1713-ff16af-475eaf2e-0\tQ1016467\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/L/lischka_burkhard/521668\"\tnormal\turl\r\n",
"Q1016541-P1713-c620a6-bf28fbf5-0\tQ1016541\tP1713\t\"http://webarchiv.bundestag.de/archive/2013/1212/bundestag/abgeordnete17/biografien/M/mueller_soenksen_burkhardt.html\"\tnormal\turl\r\n",
"Q101662-P1713-9e254f-1d37dd01-0\tQ101662\tP1713\t\"http://webarchiv.bundestag.de/archive/2013/1212/bundestag/abgeordnete17/biografien/H/hagemann_klaus.html\"\tnormal\turl\r\n",
"Q101701-P1713-d2d742-b14a2f67-0\tQ101701\tP1713\t\"http://webarchiv.bundestag.de/archive/2007/0206/mdb/mdb15/bio/G/goennta0.html\"\tnormal\turl\r\n",
"Q101703-P1713-86bfef-179d0c06-0\tQ101703\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/G/grotelueschen_astrid/519912\"\tnormal\turl\r\n",
"Q1019016-P1713-707a97-4f43e3ab-0\tQ1019016\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/B/bas_baerbel/518186\"\tnormal\turl\r\n",
"Q1019023-P1713-4b05d8-54e704ae-0\tQ1019023\tP1713\t\"http://webarchiv.bundestag.de/archive/2007/0206/mdb/mdb14/bio/G/grygiba0.html\"\tnormal\turl\r\n",
"Q1019029-P1713-6f6eed-942d192f-0\tQ1019029\tP1713\t\"https://www.bundestag.de/abgeordnete/biografien/K/kofler_baerbel/521198\"\tnormal\turl\r\n",
"Q1019050-P1713-3d5c18-83064a52-0\tQ1019050\tP1713\t\"http://webarchiv.bundestag.de/archive/2007/0206/mdb/mdb14/bio/S/sothmba0.html\"\tnormal\turl\r\n",
"Q101967-P1713-b19158-a5b76799-0\tQ101967\tP1713\t\"http://webarchiv.bundestag.de/archive/2010/0427/bundestag/abgeordnete/bio/B/bruenmo0.html\"\tnormal\turl\r\n",
"Q101987-P1713-e8184f-e2226a1f-0\tQ101987\tP1713\t\"http://webarchiv.bundestag.de/archive/2007/0206/mdb/mdb15/bio/L/lucygch0.html\"\tnormal\turl\r\n",
"Q4681882-P1713-d878eb-9fff460e-0\tQ4681882\tP1713\t\"https://heightnetworth.com/adele-givens-net-worth-2020/\"\tnormal\turl\r\n"
]
}
],
"source": [
"!cat ../../allConstraintsAnalysis/codependencyConstraint/Mand/claims.P1713.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 78,
"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/codependencyCons... \n",
" 0.000573 \n",
" \n",
" \n",
" P3931 \n",
" 2250 \n",
" 64 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.028444 \n",
" \n",
" \n",
" P5051 \n",
" 1 \n",
" 63 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 63.000000 \n",
" \n",
" \n",
" P915 \n",
" 28364 \n",
" 45 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.001587 \n",
" \n",
" \n",
" P451 \n",
" 10502 \n",
" 36 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.003428 \n",
" \n",
" \n",
" P197 \n",
" 167392 \n",
" 34 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.000203 \n",
" \n",
" \n",
" P1560 \n",
" 3235 \n",
" 20 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.006182 \n",
" \n",
" \n",
" P2009 \n",
" 1019 \n",
" 15 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.014720 \n",
" \n",
" \n",
" P1731 \n",
" 363 \n",
" 9 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.024793 \n",
" \n",
" \n",
" P1196 \n",
" 88070 \n",
" 6 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.000068 \n",
" \n",
" \n",
" P2365 \n",
" 1650 \n",
" 5 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.003030 \n",
" \n",
" \n",
" P2679 \n",
" 887 \n",
" 5 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.005637 \n",
" \n",
" \n",
" P944 \n",
" 577 \n",
" 4 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.006932 \n",
" \n",
" \n",
" P141 \n",
" 121709 \n",
" 4 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.000033 \n",
" \n",
" \n",
" P1809 \n",
" 4006 \n",
" 3 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.000749 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P7959 655743 376 [../../allConstraintsAnalysis/codependencyCons... \n",
"P3931 2250 64 [../../allConstraintsAnalysis/codependencyCons... \n",
"P5051 1 63 [../../allConstraintsAnalysis/codependencyCons... \n",
"P915 28364 45 [../../allConstraintsAnalysis/codependencyCons... \n",
"P451 10502 36 [../../allConstraintsAnalysis/codependencyCons... \n",
"P197 167392 34 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1560 3235 20 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2009 1019 15 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1731 363 9 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1196 88070 6 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2365 1650 5 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2679 887 5 [../../allConstraintsAnalysis/codependencyCons... \n",
"P944 577 4 [../../allConstraintsAnalysis/codependencyCons... \n",
"P141 121709 4 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1809 4006 3 [../../allConstraintsAnalysis/codependencyCons... \n",
"\n",
" violation_ratio \n",
"P7959 0.000573 \n",
"P3931 0.028444 \n",
"P5051 63.000000 \n",
"P915 0.001587 \n",
"P451 0.003428 \n",
"P197 0.000203 \n",
"P1560 0.006182 \n",
"P2009 0.014720 \n",
"P1731 0.024793 \n",
"P1196 0.000068 \n",
"P2365 0.003030 \n",
"P2679 0.005637 \n",
"P944 0.006932 \n",
"P141 0.000033 \n",
"P1809 0.000749 "
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3.sort_values(by=['incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "emotional-crown",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"count 78.000000\n",
"mean 0.812130\n",
"std 7.132861\n",
"min 0.000000\n",
"25% 0.000000\n",
"50% 0.000000\n",
"75% 0.000558\n",
"max 63.000000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF3['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "certain-freeze",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 3 - Violation Ratios')"
]
},
"execution_count": 80,
"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": 81,
"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": 81,
"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": 82,
"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": 83,
"id": "laughing-pressing",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"codepConstDF4 = pd.DataFrame(codepConstViolations['Normal']).T"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "loving-swift",
"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/codependencyCons... \n",
" \n",
" \n",
" P1540 \n",
" 236379 \n",
" 456 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1283 \n",
" 1383 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1896 \n",
" 4779 \n",
" 322 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P171 \n",
" 2856794 \n",
" 2307 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P2916 \n",
" 0 \n",
" 1 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1873 \n",
" 394 \n",
" 61 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P2923 \n",
" 2687 \n",
" 2738 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P1879 \n",
" 1695 \n",
" 0 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
" P2929 \n",
" 5511 \n",
" 81 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" \n",
" \n",
"
\n",
"
418 rows × 3 columns
\n",
"
"
],
"text/plain": [
" correct incorrect paths\n",
"P1018 156 28 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1540 236379 456 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1283 1383 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1896 4779 322 [../../allConstraintsAnalysis/codependencyCons...\n",
"P171 2856794 2307 [../../allConstraintsAnalysis/codependencyCons...\n",
"... ... ... ...\n",
"P2916 0 1 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1873 394 61 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2923 2687 2738 [../../allConstraintsAnalysis/codependencyCons...\n",
"P1879 1695 0 [../../allConstraintsAnalysis/codependencyCons...\n",
"P2929 5511 81 [../../allConstraintsAnalysis/codependencyCons...\n",
"\n",
"[418 rows x 3 columns]"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF4"
]
},
{
"cell_type": "code",
"execution_count": 85,
"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": 86,
"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/codependencyCons... \n",
" 463.270000 \n",
" \n",
" \n",
" P1995 \n",
" 80 \n",
" 9985 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 124.812500 \n",
" \n",
" \n",
" P768 \n",
" 133 \n",
" 15143 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 113.857143 \n",
" \n",
" \n",
" P4501 \n",
" 419 \n",
" 22682 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 54.133652 \n",
" \n",
" \n",
" P2715 \n",
" 4 \n",
" 158 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 39.500000 \n",
" \n",
" \n",
" P275 \n",
" 5955 \n",
" 123578 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 20.751973 \n",
" \n",
" \n",
" P2376 \n",
" 1 \n",
" 19 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 19.000000 \n",
" \n",
" \n",
" P3912 \n",
" 297 \n",
" 3705 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 12.474747 \n",
" \n",
" \n",
" P2720 \n",
" 12 \n",
" 134 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 11.166667 \n",
" \n",
" \n",
" P2248 \n",
" 4020 \n",
" 41566 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 10.339801 \n",
" \n",
" \n",
" P2325 \n",
" 4071 \n",
" 40611 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 9.975682 \n",
" \n",
" \n",
" P2243 \n",
" 4025 \n",
" 36540 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 9.078261 \n",
" \n",
" \n",
" P2244 \n",
" 4027 \n",
" 36527 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 9.070524 \n",
" \n",
" \n",
" P3448 \n",
" 547 \n",
" 4302 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 7.864717 \n",
" \n",
" \n",
" P7707 \n",
" 65 \n",
" 445 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 6.846154 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P1111 0 46327 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1995 80 9985 [../../allConstraintsAnalysis/codependencyCons... \n",
"P768 133 15143 [../../allConstraintsAnalysis/codependencyCons... \n",
"P4501 419 22682 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2715 4 158 [../../allConstraintsAnalysis/codependencyCons... \n",
"P275 5955 123578 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2376 1 19 [../../allConstraintsAnalysis/codependencyCons... \n",
"P3912 297 3705 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2720 12 134 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2248 4020 41566 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2325 4071 40611 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2243 4025 36540 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2244 4027 36527 [../../allConstraintsAnalysis/codependencyCons... \n",
"P3448 547 4302 [../../allConstraintsAnalysis/codependencyCons... \n",
"P7707 65 445 [../../allConstraintsAnalysis/codependencyCons... \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": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF4.sort_values(by=['violation_ratio'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "weighted-input",
"metadata": {},
"outputs": [],
"source": [
"# list(codepConstDF4.sort_values(by=['violation_ratio'],ascending=False).head(5).paths)"
]
},
{
"cell_type": "code",
"execution_count": 88,
"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/codependencyCons... \n",
" 0.240196 \n",
" \n",
" \n",
" P433 \n",
" 31028893 \n",
" 435483 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.014035 \n",
" \n",
" \n",
" P275 \n",
" 5955 \n",
" 123578 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 20.751973 \n",
" \n",
" \n",
" P2860 \n",
" 174402886 \n",
" 114713 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.000658 \n",
" \n",
" \n",
" P1435 \n",
" 1893874 \n",
" 79479 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.041966 \n",
" \n",
" \n",
" P708 \n",
" 45253 \n",
" 54258 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.198992 \n",
" \n",
" \n",
" P197 \n",
" 117523 \n",
" 49903 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.424623 \n",
" \n",
" \n",
" P1598 \n",
" 36978 \n",
" 46481 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 1.256991 \n",
" \n",
" \n",
" P1111 \n",
" 0 \n",
" 46327 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 463.270000 \n",
" \n",
" \n",
" P2248 \n",
" 4020 \n",
" 41566 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 10.339801 \n",
" \n",
" \n",
" P2325 \n",
" 4071 \n",
" 40611 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 9.975682 \n",
" \n",
" \n",
" P856 \n",
" 1239292 \n",
" 38026 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.030684 \n",
" \n",
" \n",
" P2243 \n",
" 4025 \n",
" 36540 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 9.078261 \n",
" \n",
" \n",
" P2244 \n",
" 4027 \n",
" 36527 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 9.070524 \n",
" \n",
" \n",
" P413 \n",
" 357793 \n",
" 33607 \n",
" [../../allConstraintsAnalysis/codependencyCons... \n",
" 0.093929 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2214 2962988 711699 [../../allConstraintsAnalysis/codependencyCons... \n",
"P433 31028893 435483 [../../allConstraintsAnalysis/codependencyCons... \n",
"P275 5955 123578 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2860 174402886 114713 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1435 1893874 79479 [../../allConstraintsAnalysis/codependencyCons... \n",
"P708 45253 54258 [../../allConstraintsAnalysis/codependencyCons... \n",
"P197 117523 49903 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1598 36978 46481 [../../allConstraintsAnalysis/codependencyCons... \n",
"P1111 0 46327 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2248 4020 41566 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2325 4071 40611 [../../allConstraintsAnalysis/codependencyCons... \n",
"P856 1239292 38026 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2243 4025 36540 [../../allConstraintsAnalysis/codependencyCons... \n",
"P2244 4027 36527 [../../allConstraintsAnalysis/codependencyCons... \n",
"P413 357793 33607 [../../allConstraintsAnalysis/codependencyCons... \n",
"\n",
" violation_ratio \n",
"P2214 0.240196 \n",
"P433 0.014035 \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.030684 \n",
"P2243 9.078261 \n",
"P2244 9.070524 \n",
"P413 0.093929 "
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF4.sort_values(by=['incorrect'],ascending=False).head(15)"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "wireless-passenger",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"count 418.000000\n",
"mean 2.448558\n",
"std 24.334208\n",
"min 0.000000\n",
"25% 0.001391\n",
"50% 0.022781\n",
"75% 0.220654\n",
"max 463.270000\n",
"Name: violation_ratio, dtype: float64"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codepConstDF4['violation_ratio'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "civilian-arnold",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Co-Dependency Constraint - Version 4 - Violation Ratios')"
]
},
"execution_count": 90,
"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": 91,
"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": 91,
"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": 92,
"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": "code",
"execution_count": null,
"id": "needed-multimedia",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "published-affiliate",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "aggregate-conservative",
"metadata": {},
"outputs": [],
"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/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": null,
"id": "hearing-treasury",
"metadata": {},
"outputs": [],
"source": [
"print(pd.Series(timesVersion['MSN']).describe())"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "animal-vocabulary",
"metadata": {},
"outputs": [],
"source": [
"print(pd.Series(timesVersion['MN']).describe())"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "gentle-accessory",
"metadata": {},
"outputs": [],
"source": [
"print(pd.Series(timesVersion['M']).describe())"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fresh-namibia",
"metadata": {},
"outputs": [],
"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": 1,
"id": "known-wednesday",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-04-01 11:07:06 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": 2,
"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": 3,
"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": 4,
"id": "burning-involvement",
"metadata": {},
"outputs": [],
"source": [
"constDF2.to_csv(\"../../constraintsOP/symmetricConstraint/claims.constraints_all.tsv\",sep=\"\\t\",index=False)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"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": 6,
"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": 7,
"id": "alone-cattle",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['P2316', 'P2303'], dtype=object)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "mighty-ordinary",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"P2316 42\n",
"P2303 3\n",
"Name: label, dtype: int64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"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": 10,
"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": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "cellular-canal",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.droplevel(1)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"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": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "markdown",
"id": "primary-netherlands",
"metadata": {},
"source": [
"### Query Generator"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "pointed-haven",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "354610f2497449c79eb9bec3e2c76294",
"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_03'\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/claims.\"+ prop +\".tsv\")):\n",
" continue\n",
" \n",
" command = \"{ time ( kgtk --debug query -i ../../propertiesSplit/claims.\"+ prop +\".tsv \\\n",
" ../../propertiesSplit/claims.\"+ prop +\".copy2.tsv \\\n",
" --match 'tsv: (node1)-[nodeProp]->(node2), copy2: (node2)-[]->(node1)' \"\n",
" \n",
" os.system(\"cp ../../propertiesSplit/claims.\"+ prop +\".tsv ../../propertiesSplit/claims.\"+ prop +\".copy2.tsv\")\n",
" \n",
" if cnt % 20 == 0:\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" command\n",
" if type(constraint['P2303']) != list: # Exceptions not present\n",
" commandRest = \" --return 'nodeProp.id, node1 as `node1`, nodeProp.label as `label`, node2 as `node2`' \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --graph-cache ~/sqlite3_caches/\"+graph_cache_prefix+\"_\" + str(fCnt) + \".sqlite3.db; \\\n",
" kgtk --debug ifnotexists -i ../../propertiesSplit/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + sfname + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + sfname + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\" + prop + \".correct_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + sfname + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit/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": 15,
"id": "polar-canada",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"38"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "virtual-disney",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,3):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/symmConst_Validator_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "coral-cheese",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "governmental-backup",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d19bfcb280e649a996395694bd18bb6c",
"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": "7f12ce1ceba5485d96a83c3fe719d485",
"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": "d19bfcb280e649a996395694bd18bb6c",
"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": "7f12ce1ceba5485d96a83c3fe719d485",
"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": "521ab2dfb1864a2b84466a46e9bf4218",
"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": "521ab2dfb1864a2b84466a46e9bf4218",
"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": "06a7d4ea954c4c10bbd3cf486beda734",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/6 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "06a7d4ea954c4c10bbd3cf486beda734",
"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/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": 3,
"id": "helpful-offset",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"38"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"38"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(symmConstPropList)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "entertaining-rescue",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "358d3569b52b43218580a11f83b86046",
"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": "358d3569b52b43218580a11f83b86046",
"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": 5,
"id": "copyrighted-marshall",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'mandatory': {'correct': 7439,\n",
" 'incorrect': 34,\n",
" 'total': 7473,\n",
" 'percIncorrect': 0.454971229760471,\n",
" 'propCount': 5},\n",
" 'normal': {'correct': 6241838,\n",
" 'incorrect': 47970,\n",
" 'total': 6289808,\n",
" 'percIncorrect': 0.7626623896945661,\n",
" 'propCount': 30},\n",
" 'suggestion': {'correct': 782869,\n",
" 'incorrect': 31595,\n",
" 'total': 814464,\n",
" 'percIncorrect': 3.879238370265598,\n",
" 'propCount': 3}}"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"{'mandatory': {'correct': 7439,\n",
" 'incorrect': 34,\n",
" 'total': 7473,\n",
" 'percIncorrect': 0.454971229760471,\n",
" 'propCount': 5},\n",
" 'normal': {'correct': 6241838,\n",
" 'incorrect': 47970,\n",
" 'total': 6289808,\n",
" 'percIncorrect': 0.7626623896945661,\n",
" 'propCount': 30},\n",
" 'suggestion': {'correct': 782869,\n",
" 'incorrect': 31595,\n",
" 'total': 814464,\n",
" 'percIncorrect': 3.879238370265598,\n",
" 'propCount': 3}}"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"symmConstViolationsSummary"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "enhanced-ontario",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"7111745"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"7111745"
]
},
"execution_count": 6,
"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": 7,
"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/symmetricConstra... \n",
" 0.013158 \n",
" \n",
" \n",
" P1639 \n",
" 2059 \n",
" 20 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.009620 \n",
" \n",
" \n",
" P1560 \n",
" 3239 \n",
" 13 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.003998 \n",
" \n",
" \n",
" P6185 \n",
" 280 \n",
" 0 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.000000 \n",
" \n",
" \n",
" P3364 \n",
" 1786 \n",
" 0 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.000000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2152 75 1 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1639 2059 20 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1560 3239 13 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P6185 280 0 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P3364 1786 0 [../../allConstraintsAnalysis/symmetricConstra... \n",
"\n",
" violation_ratio \n",
"P2152 0.013158 \n",
"P1639 0.009620 \n",
"P1560 0.003998 \n",
"P6185 0.000000 \n",
"P3364 0.000000 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"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/symmetricConstra... \n",
" 0.013158 \n",
" \n",
" \n",
" P1639 \n",
" 2059 \n",
" 20 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.009620 \n",
" \n",
" \n",
" P1560 \n",
" 3239 \n",
" 13 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.003998 \n",
" \n",
" \n",
" P6185 \n",
" 280 \n",
" 0 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.000000 \n",
" \n",
" \n",
" P3364 \n",
" 1786 \n",
" 0 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.000000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2152 75 1 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1639 2059 20 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1560 3239 13 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P6185 280 0 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P3364 1786 0 [../../allConstraintsAnalysis/symmetricConstra... \n",
"\n",
" violation_ratio \n",
"P2152 0.013158 \n",
"P1639 0.009620 \n",
"P1560 0.003998 \n",
"P6185 0.000000 \n",
"P3364 0.000000 "
]
},
"execution_count": 7,
"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": 8,
"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",
" 103892 \n",
" 6058 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.055098 \n",
" \n",
" \n",
" P1889 \n",
" 505954 \n",
" 23764 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.044862 \n",
" \n",
" \n",
" P197 \n",
" 173023 \n",
" 1773 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.010143 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2789 103892 6058 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1889 505954 23764 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P197 173023 1773 [../../allConstraintsAnalysis/symmetricConstra... \n",
"\n",
" violation_ratio \n",
"P2789 0.055098 \n",
"P1889 0.044862 \n",
"P197 0.010143 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" \n",
" \n",
" \n",
" \n",
" P2789 \n",
" 103892 \n",
" 6058 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.055098 \n",
" \n",
" \n",
" P1889 \n",
" 505954 \n",
" 23764 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.044862 \n",
" \n",
" \n",
" P197 \n",
" 173023 \n",
" 1773 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.010143 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2789 103892 6058 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1889 505954 23764 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P197 173023 1773 [../../allConstraintsAnalysis/symmetricConstra... \n",
"\n",
" violation_ratio \n",
"P2789 0.055098 \n",
"P1889 0.044862 \n",
"P197 0.010143 "
]
},
"execution_count": 8,
"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": 9,
"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/symmetricConstra... \n",
" 1.000000 \n",
" \n",
" \n",
" P1706 \n",
" 4 \n",
" 49 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.924528 \n",
" \n",
" \n",
" P2652 \n",
" 460 \n",
" 777 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.628133 \n",
" \n",
" \n",
" P521 \n",
" 418 \n",
" 144 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.256228 \n",
" \n",
" \n",
" P2293 \n",
" 9984 \n",
" 1919 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.161220 \n",
" \n",
" \n",
" P3032 \n",
" 1674 \n",
" 320 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.160481 \n",
" \n",
" \n",
" P1382 \n",
" 10807 \n",
" 1587 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.128046 \n",
" \n",
" \n",
" P1327 \n",
" 7754 \n",
" 638 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.076025 \n",
" \n",
" \n",
" P451 \n",
" 9549 \n",
" 749 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.072733 \n",
" \n",
" \n",
" P3403 \n",
" 2130 \n",
" 110 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.049107 \n",
" \n",
" \n",
" P460 \n",
" 238980 \n",
" 8022 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.032477 \n",
" \n",
" \n",
" P514 \n",
" 30 \n",
" 1 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.032258 \n",
" \n",
" \n",
" P530 \n",
" 6595 \n",
" 213 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.031287 \n",
" \n",
" \n",
" P461 \n",
" 15535 \n",
" 474 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.029608 \n",
" \n",
" \n",
" P47 \n",
" 548251 \n",
" 13705 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.024388 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P5188 0 2 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1706 4 49 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P2652 460 777 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P521 418 144 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P2293 9984 1919 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P3032 1674 320 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1382 10807 1587 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1327 7754 638 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P451 9549 749 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P3403 2130 110 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P460 238980 8022 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P514 30 1 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P530 6595 213 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P461 15535 474 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P47 548251 13705 [../../allConstraintsAnalysis/symmetricConstra... \n",
"\n",
" violation_ratio \n",
"P5188 1.000000 \n",
"P1706 0.924528 \n",
"P2652 0.628133 \n",
"P521 0.256228 \n",
"P2293 0.161220 \n",
"P3032 0.160481 \n",
"P1382 0.128046 \n",
"P1327 0.076025 \n",
"P451 0.072733 \n",
"P3403 0.049107 \n",
"P460 0.032477 \n",
"P514 0.032258 \n",
"P530 0.031287 \n",
"P461 0.029608 \n",
"P47 0.024388 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"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/symmetricConstra... \n",
" 1.000000 \n",
" \n",
" \n",
" P1706 \n",
" 4 \n",
" 49 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.924528 \n",
" \n",
" \n",
" P2652 \n",
" 460 \n",
" 777 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.628133 \n",
" \n",
" \n",
" P521 \n",
" 418 \n",
" 144 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.256228 \n",
" \n",
" \n",
" P2293 \n",
" 9984 \n",
" 1919 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.161220 \n",
" \n",
" \n",
" P3032 \n",
" 1674 \n",
" 320 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.160481 \n",
" \n",
" \n",
" P1382 \n",
" 10807 \n",
" 1587 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.128046 \n",
" \n",
" \n",
" P1327 \n",
" 7754 \n",
" 638 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.076025 \n",
" \n",
" \n",
" P451 \n",
" 9549 \n",
" 749 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.072733 \n",
" \n",
" \n",
" P3403 \n",
" 2130 \n",
" 110 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.049107 \n",
" \n",
" \n",
" P460 \n",
" 238980 \n",
" 8022 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.032477 \n",
" \n",
" \n",
" P514 \n",
" 30 \n",
" 1 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.032258 \n",
" \n",
" \n",
" P530 \n",
" 6595 \n",
" 213 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.031287 \n",
" \n",
" \n",
" P461 \n",
" 15535 \n",
" 474 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.029608 \n",
" \n",
" \n",
" P47 \n",
" 548251 \n",
" 13705 \n",
" [../../allConstraintsAnalysis/symmetricConstra... \n",
" 0.024388 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P5188 0 2 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1706 4 49 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P2652 460 777 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P521 418 144 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P2293 9984 1919 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P3032 1674 320 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1382 10807 1587 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P1327 7754 638 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P451 9549 749 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P3403 2130 110 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P460 238980 8022 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P514 30 1 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P530 6595 213 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P461 15535 474 [../../allConstraintsAnalysis/symmetricConstra... \n",
"P47 548251 13705 [../../allConstraintsAnalysis/symmetricConstra... \n",
"\n",
" violation_ratio \n",
"P5188 1.000000 \n",
"P1706 0.924528 \n",
"P2652 0.628133 \n",
"P521 0.256228 \n",
"P2293 0.161220 \n",
"P3032 0.160481 \n",
"P1382 0.128046 \n",
"P1327 0.076025 \n",
"P451 0.072733 \n",
"P3403 0.049107 \n",
"P460 0.032477 \n",
"P514 0.032258 \n",
"P530 0.031287 \n",
"P461 0.029608 \n",
"P47 0.024388 "
]
},
"execution_count": 9,
"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": 10,
"id": "sexual-blowing",
"metadata": {},
"outputs": [],
"source": [
"# !head ../../allConstraintsAnalysis/symmetricConstraint/normal/claims.P3032.incorrect.tsv\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "legitimate-aspect",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Symmetric Normal Constraint - Violation Ratios')"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Symmetric Normal Constraint - Violation Ratios')"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"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": 12,
"id": "premium-yahoo",
"metadata": {},
"outputs": [],
"source": [
"pd.concat([symmConstDF1, symmConstDF2, symmConstDF3]).to_csv('../../allConstraintsAnalysis/symmConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "unlikely-sewing",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "southern-reasoning",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "01675fcd83284c8ab2aa683f43fef458",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/108 [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/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": 12,
"id": "classical-updating",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 38.000000\n",
"mean 15.315868\n",
"std 61.526228\n",
"min 2.069000\n",
"25% 2.617750\n",
"50% 3.003000\n",
"75% 5.889250\n",
"max 383.135000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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": 13,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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bhoLV28udYhF19KW7Hc7Wnfn4vtms2pTC9d+4lAG19UAsPcug/n3Dx/IX19/m5uefqPEUZYfd6epre+txZRcZId6feUmPnXTdAbWJrjj80dx7ScO46wjxvM/T87new/PLfkOri2Z4sLbX+C1lZv42acO54AxQwA4Zu9R3DX1aFrakpxx/d95aemGksZZTH+Ys4IpV/yRj143jcVrmkodTrfakynak6mcx//VM2/y6MsrufjE/Th43LCthp09ZTwnHLgrP370FeYs6z+fZTFsaU/hHm5AWYgGlcVkR1u4ejOf+MV0qquM279wFONHNJCoMn70z+/mvPfswS3TFnHJ/bNJlijBuDv//uAc/vzaan5w2kH847satxr+7nFDufeCo6mrSXD2jc8wbcHbJYmzWFrakvzbAy9xwa9eYOzwBhau3syHrvkrv5u9oveJdyB3594ZS5jywyc45sonue/5pb3+CJm7fCPf/908/mnfRj537B7bDDczrvzngxk5cABfvnMm72ypnJPPvWnuw4PCoPOci45cZIdYvKaJT9w4nVTKueMLR7LHqIEdw8yM73xof778vn24Z8ZSvnzXTFrbc/+FWizX/XkBdz67hC8dtxdnT5mQdZw9Gwdx3xePYcywOj5783P8YU557Yhz9drKTZxy7dPcPn0x5793Tx688Fge+fI/sPeug7jwjhf49gMvlcUvz1ff2sSZP/873/r1bPYYNZDRw+r5xr0v8s/XTWPm4nVZp2lqbeeiO19gWH0N/3XGIVR1c2ff4QNrufrjk3hjzTtc/vDc7fk2dirpB4UVmlzqqisvueg6lxJZtr6ZT/ziGVrak9z5haPYe5fB24xjZnz9A+9i0IAEP3zkFZpbk/zsk4dlPTRvS6aYvXQD099Yw0tLNzCkrobRw+oYM7SeMcPqO7rzae3y0IvL+fEfXuWUQ8bwzQ/u2+O4uw2t457zj+ZztzzHl25/gR+c9m7OnjKe+PC4vLg7C1a/Q22iivEj6guaR77Lu+PZxVz+8FwG11Vz6+emdByhjR/RwD3nH81PHnuN6/+8gOcXrePaTxzKPrtu+3ltb+9saeenT7zOTU+/wZC6an78sYM5/fBxADwwcxlX/uEVPvqzaXzssHFcfOK+7DKkrmPaf3/wZd54+x1u//yRjBzU87UaR+81ki8dtxf/+9QC3vuuRj508Ojt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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 both `(node1)-[prop]->(node2)` and `(node2)-[prop]->(node1)` must be present with few exceptions"
]
},
{
"cell_type": "markdown",
"id": "dramatic-manchester",
"metadata": {},
"source": [
"### Constraints File"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "leading-server",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-04-11 11:02:04 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": 2,
"id": "offshore-sudan",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"id\tnode1\tlabel\tnode2\trank\tnode2;wikidatatype\r\n",
"P1026-P2302-Q21510855-adc83b86-0\tP1026\tP2302\tQ21510855\tnormal\twikibase-item\r\n",
"P1029-P2302-Q21510855-6b55e057-0\tP1029\tP2302\tQ21510855\tnormal\twikibase-item\r\n",
"P115-P2302-Q21510855-f7aa0b78-0\tP115\tP2302\tQ21510855\tnormal\twikibase-item\r\n",
"P1151-P2302-Q21510855-0d9aa9c6-0\tP1151\tP2302\tQ21510855\tnormal\twikibase-item\r\n",
"P1204-P2302-Q21510855-e3d53bb6-0\tP1204\tP2302\tQ21510855\tnormal\twikibase-item\r\n",
"P1283-P2302-Q21510855-0e7699bb-0\tP1283\tP2302\tQ21510855\tnormal\twikibase-item\r\n",
"P1308-P2302-Q21510855-2aba96b7-0\tP1308\tP2302\tQ21510855\tnormal\twikibase-item\r\n",
"P1365-P2302-Q21510855-c809b758-0\tP1365\tP2302\tQ21510855\tnormal\twikibase-item\r\n",
"P1366-P2302-Q21510855-eee12ef8-0\tP1366\tP2302\tQ21510855\tnormal\twikibase-item\r\n"
]
}
],
"source": [
"!head ../../constraintsOP/inverseConstraint/claims.constraints_list.tsv"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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": 4,
"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": 5,
"id": "valid-throat",
"metadata": {},
"outputs": [],
"source": [
"constDF2.to_csv(\"../../constraintsOP/inverseConstraint/claims.constraints_all.tsv\",sep=\"\\t\",index=False)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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": 7,
"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": 8,
"id": "attached-rings",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['P2306', 'P2316', 'P4155', 'P2303'], dtype=object)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"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": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires['label'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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": 11,
"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": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "extra-stomach",
"metadata": {},
"outputs": [],
"source": [
"dfItemRequires = dfItemRequires.droplevel(1)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfItemRequires.head()"
]
},
{
"cell_type": "markdown",
"id": "composite-cutting",
"metadata": {},
"source": [
"### Query Generator"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "acoustic-belarus",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0d0055aba376447a853b9ca80241247a",
"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_Final'\n",
"shellFileSuffix = 'invConst_Validator_new3_'\n",
"graph_cache_file_prefix = \"inv_2_\"\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/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/claims.\"+ prop2 +\".tsv\")):\n",
" print(f\"File: ../../propertiesSplit/claims.{prop2}.tsv does not exist\")\n",
" continue\n",
" \n",
" if cnt % 20 == 0:\n",
" if fOP:\n",
" fOP.close()\n",
" fCnt += 1\n",
" fOP = open(\"../../propertiesSplit/checkViolations/\" + shellFileSuffix + str(fCnt) + \".sh\",\"w\")\n",
" \n",
" \n",
" command = \"{ time ( kgtk --debug query -i ../../propertiesSplit/claims.\"+ prop +\".tsv \\\n",
" ../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".\"\n",
" \n",
" command += commandRest + commandOPFile + \"incorrect.tsv ) } 2>> ../../propertiesSplit/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/\" + 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/claims.\"+ prop +\".tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \"\n",
" \n",
" commandOPFile = \"-o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --match '(node1)-[]->()' --where 'node1 in \" + str(list(excptns)).replace(\"'\",'\"') + \"' \\\n",
" -o ../../allConstraintsAnalysis/\" + 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/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_wo_exceptions.tsv \\\n",
" --filter-on ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\" + prop + \".incorrect_w_exceptions.tsv \\\n",
" --filter-mode NONE \\\n",
" --input-keys node1 label \\\n",
" --filter-keys node1 label \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect.tsv; \"\n",
"# print(command)\n",
" fOP.write(command)\n",
" \n",
" command = \" kgtk cat -i ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct_wo_exceptions.tsv \\\n",
" ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".incorrect_w_exceptions.tsv \\\n",
" -o ../../allConstraintsAnalysis/\" + folderName + \"/\" + subFolderName + \"/claims.\"+ prop +\".correct.tsv ) } 2>> ../../propertiesSplit/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": 49,
"id": "large-climb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"110"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cnt"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "involved-vietnamese",
"metadata": {},
"outputs": [],
"source": [
"# import os\n",
"# for i in range(1,7):\n",
"# os.system(\"screen -dm sh ../../propertiesSplit/checkViolations/invConst_Validator_new3_\"+str(i)+\".sh\")"
]
},
{
"cell_type": "markdown",
"id": "retired-audio",
"metadata": {},
"source": [
"### Analyze Violations"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "specified-evanescence",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a91df974ff5549c186e5dbb8175b77f0",
"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": "5ad67f2455284261bcb87f9ffdc2914c",
"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": "5baaaa6a624b4ee8a64166819f8295be",
"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": "52a06eee748841e1aa97571873863561",
"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/inverseConstraint_Final/\"\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": 2,
"id": "circular-africa",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"110"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(invConstPropList)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "recreational-world",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "685d279e7a4a4010ba43de2a54dba1da",
"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": 4,
"id": "headed-singer",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'mandatory': {'correct': 6564,\n",
" 'incorrect': 127,\n",
" 'total': 6691,\n",
" 'percIncorrect': 1.8980720370647137,\n",
" 'propCount': 6},\n",
" 'normal': {'correct': 7131934,\n",
" 'incorrect': 179444,\n",
" 'total': 7311378,\n",
" 'percIncorrect': 2.4543116222413888,\n",
" 'propCount': 100},\n",
" 'suggestion': {'correct': 2002102,\n",
" 'incorrect': 93735,\n",
" 'total': 2095837,\n",
" 'percIncorrect': 4.4724375034890596,\n",
" 'propCount': 4}}"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstViolationsSummary"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "russian-steering",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9413906"
]
},
"execution_count": 5,
"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": 6,
"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",
" 68 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.076663 \n",
" \n",
" \n",
" P4147 \n",
" 271 \n",
" 9 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.032143 \n",
" \n",
" \n",
" P4149 \n",
" 272 \n",
" 4 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.014493 \n",
" \n",
" \n",
" P2033 \n",
" 1836 \n",
" 26 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.013963 \n",
" \n",
" \n",
" P450 \n",
" 1754 \n",
" 16 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.009040 \n",
" \n",
" \n",
" P1151 \n",
" 1612 \n",
" 4 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.002475 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P2673 819 68 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P4147 271 9 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P4149 272 4 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P2033 1836 26 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P450 1754 16 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P1151 1612 4 [../../allConstraintsAnalysis/inverseConstrain... \n",
"\n",
" violation_ratio \n",
"P2673 0.076663 \n",
"P4147 0.032143 \n",
"P4149 0.014493 \n",
"P2033 0.013963 \n",
"P450 0.009040 \n",
"P1151 0.002475 "
]
},
"execution_count": 6,
"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": 7,
"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",
" 4723 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.573528 \n",
" \n",
" \n",
" P155 \n",
" 963205 \n",
" 48956 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.048368 \n",
" \n",
" \n",
" P156 \n",
" 963183 \n",
" 39925 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.039801 \n",
" \n",
" \n",
" P629 \n",
" 72202 \n",
" 131 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.001811 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P1434 3512 4723 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P155 963205 48956 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P156 963183 39925 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P629 72202 131 [../../allConstraintsAnalysis/inverseConstrain... \n",
"\n",
" violation_ratio \n",
"P1434 0.573528 \n",
"P155 0.048368 \n",
"P156 0.039801 \n",
"P629 0.001811 "
]
},
"execution_count": 7,
"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": 8,
"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",
" 188 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.940000 \n",
" \n",
" \n",
" P3448 \n",
" 583 \n",
" 4249 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.879346 \n",
" \n",
" \n",
" P926 \n",
" 1 \n",
" 5 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.833333 \n",
" \n",
" \n",
" P925 \n",
" 1 \n",
" 5 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.833333 \n",
" \n",
" \n",
" P1029 \n",
" 475 \n",
" 2037 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.810908 \n",
" \n",
" \n",
" P115 \n",
" 6712 \n",
" 24290 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.783498 \n",
" \n",
" \n",
" P8625 \n",
" 7 \n",
" 17 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.708333 \n",
" \n",
" \n",
" P5132 \n",
" 81 \n",
" 89 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.523529 \n",
" \n",
" \n",
" P425 \n",
" 2512 \n",
" 1956 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.437780 \n",
" \n",
" \n",
" P3816 \n",
" 14 \n",
" 10 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.416667 \n",
" \n",
" \n",
" P1677 \n",
" 6 \n",
" 4 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.400000 \n",
" \n",
" \n",
" P2512 \n",
" 210 \n",
" 140 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.400000 \n",
" \n",
" \n",
" P2578 \n",
" 989 \n",
" 527 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.347625 \n",
" \n",
" \n",
" P3261 \n",
" 232 \n",
" 122 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.344633 \n",
" \n",
" \n",
" P568 \n",
" 1049 \n",
" 445 \n",
" [../../allConstraintsAnalysis/inverseConstrain... \n",
" 0.297858 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" correct incorrect paths \\\n",
"P1605 12 188 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P3448 583 4249 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P926 1 5 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P925 1 5 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P1029 475 2037 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P115 6712 24290 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P8625 7 17 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P5132 81 89 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P425 2512 1956 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P3816 14 10 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P1677 6 4 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P2512 210 140 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P2578 989 527 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P3261 232 122 [../../allConstraintsAnalysis/inverseConstrain... \n",
"P568 1049 445 [../../allConstraintsAnalysis/inverseConstrain... \n",
"\n",
" violation_ratio \n",
"P1605 0.940000 \n",
"P3448 0.879346 \n",
"P926 0.833333 \n",
"P925 0.833333 \n",
"P1029 0.810908 \n",
"P115 0.783498 \n",
"P8625 0.708333 \n",
"P5132 0.523529 \n",
"P425 0.437780 \n",
"P3816 0.416667 \n",
"P1677 0.400000 \n",
"P2512 0.400000 \n",
"P2578 0.347625 \n",
"P3261 0.344633 \n",
"P568 0.297858 "
]
},
"execution_count": 8,
"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": 9,
"id": "dietary-venue",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"id\tnode1\tlabel\tnode2\trank\tnode2;wikidatatype\r\n",
"Q1133903-P925-Q18707-eae3a579-0\tQ1133903\tP925\tQ18707\tnormal\twikibase-item\r\n",
"Q1570272-P925-Q7135001-5dbdce8c-0\tQ1570272\tP925\tQ7135001\tnormal\twikibase-item\r\n",
"Q301613-P925-Q7135001-528c29b2-0\tQ301613\tP925\tQ7135001\tnormal\twikibase-item\r\n",
"Q452595-P925-Q864951-c5b34e11-0\tQ452595\tP925\tQ864951\tnormal\twikibase-item\r\n",
"Q5064084-P925-Q4117017-76545a06-0\tQ5064084\tP925\tQ4117017\tnormal\twikibase-item\r\n"
]
}
],
"source": [
"!head ../../allConstraintsAnalysis/inverseConstraint/normal/claims.P925.incorrect.tsv"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "entire-gauge",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Symmetric Normal Constraint - Violation Ratios')"
]
},
"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": [
"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": 11,
"id": "located-water",
"metadata": {},
"outputs": [],
"source": [
"pd.concat([invConstDF1, invConstDF2, invConstDF3]).to_csv('../../allConstraintsAnalysis/invConstDFAnalysis.csv')"
]
},
{
"cell_type": "markdown",
"id": "working-stable",
"metadata": {},
"source": [
"### Find out time required"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "saved-twelve",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2e8a241c831b4968ae22d06c22c6e85e",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/122 [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/checkViolations/exec_logs/'\n",
"for filename in tqdm(os.listdir(filePath)):\n",
" if filename.startswith(\"invConst_Validator_new3\"):\n",
" tempTimes = extractTimes(filePath + filename)\n",
" times += tempTimes"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "caroline-observation",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 110.000000\n",
"mean 7.526318\n",
"std 11.686634\n",
"min 1.519000\n",
"25% 2.624000\n",
"50% 3.298500\n",
"75% 6.463250\n",
"max 80.846000\n",
"dtype: float64\n"
]
}
],
"source": [
"print(pd.Series(times).describe())"
]
},
{
"cell_type": "code",
"execution_count": 57,
"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": 57,
"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": "ongoing-merit",
"metadata": {},
"source": [
"# Combine Plots for constraints"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "fundamental-contrary",
"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/typeConstDFAnalysis.csv\")\n",
"typeConstDF = typeConstDF.set_index(typeConstDF.iloc[:, 0])\n",
"\n",
"valTypeConstDF = pd.read_csv(\"../../allConstraintsAnalysis/valueTypeConstDFAnalysis.csv\")\n",
"valTypeConstDF = valTypeConstDF.set_index(valTypeConstDF.iloc[:, 0])\n",
"\n",
"codepConstDF1 = pd.read_csv(\"../../allConstraintsAnalysis/codepConstDFAnalysis.csv\")\n",
"codepConstDF1 = codepConstDF1.set_index(codepConstDF1.iloc[:, 0])\n",
"\n",
"symmConstDF = pd.read_csv(\"../../allConstraintsAnalysis/symmConstDFAnalysis.csv\")\n",
"symmConstDF = symmConstDF.set_index(symmConstDF.iloc[:, 0])\n",
"\n",
"invConstDF = pd.read_csv(\"../../allConstraintsAnalysis/invConstDFAnalysis.csv\")\n",
"invConstDF = invConstDF.set_index(invConstDF.iloc[:, 0])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "bigger-standing",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1 = typeConstDF.add_suffix(\"_type_const\")['violation_ratio_type_const'].rename().sort_values()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "human-artist",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1 = valTypeConstDF.add_suffix(\"_valuetype_const\")['violation_ratio_valuetype_const'].sort_values()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "gothic-decision",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1 = codepConstDF1.add_suffix(\"_codep_const\")['violation_ratio_codep_const'].sort_values()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "alleged-immunology",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1 = symmConstDF.add_suffix(\"_symm_const\")['violation_ratio_symm_const'].sort_values()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "vulnerable-estonia",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1 = invConstDF.add_suffix(\"_inv_const\")['violation_ratio_inv_const'].sort_values()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "individual-pocket",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Unnamed: 0\n",
"P1605 0.940000\n",
"P3448 0.879346\n",
"P925 0.833333\n",
"P926 0.833333\n",
"P1029 0.810908\n",
"Name: violation_ratio_inv_const, dtype: float64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstDF1_1.head()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "facial-announcement",
"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": 21,
"id": "impressive-fantasy",
"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": 22,
"id": "preceding-yahoo",
"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": 23,
"id": "attached-civilization",
"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": 24,
"id": "supposed-fitting",
"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": 29,
"id": "lonely-emphasis",
"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": 30,
"id": "stopped-guarantee",
"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": 31,
"id": "synthetic-modification",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = constAnalysisDF.melt('index', var_name='constraint', value_name='VR')"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "collective-adolescent",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" index \n",
" constraint \n",
" VR \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" type \n",
" 0.0 \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" type \n",
" 0.0 \n",
" \n",
" \n",
" 2 \n",
" 3 \n",
" type \n",
" 0.0 \n",
" \n",
" \n",
" 3 \n",
" 4 \n",
" type \n",
" 0.0 \n",
" \n",
" \n",
" 4 \n",
" 5 \n",
" type \n",
" 0.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" index constraint VR\n",
"0 1 type 0.0\n",
"1 2 type 0.0\n",
"2 3 type 0.0\n",
"3 4 type 0.0\n",
"4 5 type 0.0"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"constAnalysisDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "angry-saying",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Text(0.5, 0, 'Proportion of properties (in %)'),\n",
" Text(0, 0.5, 'Violation Ratio (in %)')]"
]
},
"execution_count": 16,
"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++yTvvvMMFF1wAQENDA6mpqdjtdr766qsOp1QaMGAAubm5uN1u6uvr+eILc3Di8OHDqaqqak/IvF4vmzZt2uf8mJgYmpqa2t+Hh4dz8skn89Of/nSv7kqAt956q/11xowZAJx00kn89a9/bT9m7dq1R/FTEEIIIUzNnmZuX3w7CeEJ/PG4P2JRnZd+FFQ7SXXWwpZcYrOdEJd10HOKNtfiCLeSOiCm0+I4WpKQBcHo0aNpamoiMzOzvWvx0ksvZeXKlYwdO5ZXX32VESNG7HNednY2F154IWPGjOHCCy9k4kRzUKLD4eCdd97hzjvvZPz48UyYMIHly5fvc/7FF1/MI488wsSJE9mxY0f7fS0WCyf9oEBeXV0d48aN4/HHH+exxx4D4IknnmDlypWMGzeOUaNG8eyzz3bqz0UIIUTfo7Xmt9/8ltLmUh6e9fARVeI/kIKaFuY3mH/zYtLrDykhK95SS+bwBCzW7pMG9e4uyxDasGHvhwmSk5P32+XY3Nzcvv7www/z8MMP73PMhAkTWLJkyQHvOXPmzH3KXixbtoyrr74aq9W61/YFCxbw0EMP7RNjW8uZEEII0Rne3vY2nxV8xs2TbmZy2uROv35BTQvnuquwREVij/YfNCFrqGqlsdrF+Hn9Oz2WoyEJWS927rnnsmPHDr788stQhyKEEKIPanA38PCKhzk241iuGXNNUO5RUN1CVlMljoxklMqDuAOX0SjeUgtA9sjObak7WpKQ9WLvvfdeh9sLCgq6NhAhhBB90uLixbj9bn4+4eedOm6sTYPTS53TS2JNKWFjAlUL4g+ckBVtriU6IYz4tMhOj+dodJ/OUyGEEEL0KgsLFpIelc6Y5DFBuX5BTQuRXhdh9bU4EqxgsUPU/steGIameGsdWSMSDqkOaFeShEwIIYQQna7Z08zXpV9z4oATg5b8FNS0kNVcCUBYjAfiMsGy/9SmLK8ed4uvW5W7aCMJmRBCCCE63eLixXgNLycNOOngBx+h/OoWsgMJmSOi8aDjxzYtKSEs0kbOhJSgxXSkJCETQgghRKdbuGshqRGpjEsZF7R7FFS3MNJTCzYbDlV+wCcsWxrc7FhTxYjp/bA7rPs9LlQkIQuCY489NtQhCCGEECHj9DpZVrKM+QPmB2Uwf5uCGieDXdU4+mejWsoOmJBt/roMw68ZPSsjaPEcDUnIgqCjoq0+ny8EkQghhBBdb0nJEtx+NycOODGo9ymoaaFffQVh2Rmgjf0mZIah2bS0hKwRCSSkH3zi8VCQhCwI2ibjXrRoEccffzxnnXUWo0aNoqWlhdNPP53x48czZswYKcIqhBCiV1pYsJCk8CQmpk4M2j3qnR6aml3E1JTjSI83N+4nIdu1oZrmOjdjZmcGLZ6j1avrkD30/UNsqd3SqdcckTiCO6fdecjHr169mo0bN5KTk8O7775LRkYGH3/8MWDObymEEEL0Jq2+VpaWLOWswWdhtQRvrFZBjZP0lhoshh9HchjUsN9B/RuXlBAV5yBnXHLQ4jla0kIWZNOmTSMnJweAsWPHsnDhQu68806WLl1KXFxciKMTQgghOtfXJV/T6msNfndldQv9mwIlL+L85sbYfVvAGqqcFG6qZdTxmd1q7sof6tUtZIfTkhUsUVG7+6qHDRvG6tWr+eSTT/jNb37DvHnzuPfee0MYnRBCCNG5Pt/1OQlhCUGZt3JPe5e8aIaIRAiL3ue4jUtKURbF6OO652D+Nr06IetuSktLSUxM5LLLLiM+Pp7nn38+1CEJIYQQncbtd7O4aDGn5pyKzRLcFGNXTQtj3DXYUlOxujsueeHz+Nm8vJRBE5KJig8LajxHSxKyLrRhwwYWLFiAxWLBbrfzzDPPhDokIYQQotMsL1mO0+cMajHYNvk1Ts5oqcIxeBA05ELSkH2OyVtdibvFx5hZ3XcwfxtJyIKgubkZgDlz5jBnzpz27SeffDInn3xyiKISQgghgmvhroXEOmKZ2m9q0O9VUNVMSl0ZYXOnQ/1/YdAJ+xyzcXEJ8WmRZA5PCHo8R0sSMiGEEEIcNa/fy6KiRcwbMA+7xR7Ue9W1eLDU1+Jwt+LISoPClvYuS6015Tsb2fpdORX5jRx34dBuN5F4RyQhE0IIIcRRW1GxgiZvE/P6zwv6vQpqWujfVAFAWGokFEKNfwDb3t/B9hUVNNW4sNotDJuWxshj+wU9ns4gCZkQQgghjtrS4qWEWcM4pt8xQb9XQU0LWYGSF44EC+tbTmXp61EoSyHZIxM45swccsan4IjoOWlOz4lUCCGEEN3W0pKlTE2fSoQtIuj3yq920r+5ChUVRUuzk2+arqT/8GjmXTuByFhH0O8fDN23QpoQQggheoRdjbvY1biL4zOP75r71bQwxFWNY9AgvlqSgEX5OOGqcT02GQNJyIQQQghxlJYWLwXg+KyuScgKqs0uy9LMWZTWJHBcv4+ITgjvknsHiyRkfcD7779Pbm7ufvc/++yzvPrqq10YkRBCiN5kSfEScuJyyI7peC7JzqS1pqysBrtXsckzgv6xeYwYUBH0+wZbSBIypdStSqlNSqmNSql/KqXClVI5SqnvlFJ5Sqm3lFI9t92xmzlQQubz+fjJT37CFVdc0cVRCSGE6A2cXicrK1YyK3NWl9yv3uklrrqMLcN/jLIo5sQ/j4rft0p/T9PlCZlSKhP4JTBFaz0GsAIXAw8Bj2mthwB1wLVdHVtnaWlp4fTTT2f8+PGMGTOGt956i3POOad9/8KFCzn33HMBiI6OZsGCBYwePZr58+fz/fffM2fOHAYNGsSHH34IwMsvv8w555zDiSeeyMCBA3nyySf585//zMSJE5k+fTq1tbUA7Nixg1NOOYXJkydz/PHHs2XLFpYvX86HH37IggULmDBhAjt27GDOnDnccsstTJkyhccff5z777+fRx99FIC8vDzmz5/P+PHjmTRpEjt27OjaH54QQoge5duyb/Ea3i7rrsyvaWGCW1GXMIJps+OI8WyF+P5dcu9gCtVTljYgQinlBSKBMmAu8OPA/leA+4Gjmluo/I9/xL15y9FcYh9hI0eQ/utfH/CYzz77jIyMDD7++GMAGhoauO+++6iqqiIlJYWXXnqJa665BjCTt7lz5/LII49w7rnn8pvf/IaFCxeSm5vLlVdeyVlnnQXAxo0bWbNmDS6XiyFDhvDQQw+xZs0abr31Vl599VVuueUWbrjhBp599lmGDh3Kd999x89+9jO+/PJLzjrrLM444wzOP//89hg9Hg8rV64E4P7772/ffumll3LXXXdx7rnn4nK5MAyjM398QgghepmlJUuJskcxKXVSl9xvR0E9/R0DSajfyriZs2ETEBf8rtJg6/IWMq11CfAoUIiZiDUAq4B6rbUvcFgx0P0nntqPsWPHsnDhQu68806WLl1KXFwcl19+Oa+99hr19fV88803nHrqqQA4HA5OOeWU9vNmz56N3W5n7NixFBQUtF/zhBNOICYmhpSUFOLi4jjzzDPbzykoKKC5uZnly5dzwQUXMGHCBG688UbKysr2G+NFF120z7ampiZKSkraW+/Cw8OJjIzsrB+LEEKIXkZrzdLipczoNwO7NbjV+duUfVOJBcWYliVYWgNjxzqYWLyn6fIWMqVUAnA2kAPUA28DpxzG+TcANwD073/gJsqDtWQFy7Bhw1i9ejWffPIJv/nNb5g3bx7XXXcdZ555JuHh4VxwwQXYbOaP3m63t0/pYLFYCAsLa1/3+Xzt12zbvr/jDMMgPj6etWvXHlKMUVFRnfFRhRBC9GHb6rZR4azgpqybuuR+ht/AKHKS0LCVhP5J0FBk7oiXFrIjMR/I11pXaa29wL+BmUC8UqotQcwCSjo6WWv9nNZ6itZ6SkpKStdEfJhKS0uJjIzksssuY8GCBaxevZqMjAwyMjJ44IEHuPrqqzv9nrGxseTk5PD2228D5v+1rFu3DoCYmBiampoOeo2YmBiysrJ4//33AXC73Tidzk6PVQghRO+wtMQsd3Fc5nFdcr+SbfXYfZrs0m8IG5QDDcWAgtge26nWLhQJWSEwXSkVqcymoXlALvAV0DbI6UrggxDE1ik2bNjAtGnTmDBhAr/97W/5zW9+A5jjs7Kzsxk5cmRQ7vv666/zwgsvMH78eEaPHs0HH5g/wosvvphHHnmEiRMnHnSQ/j/+8Q+eeOIJxo0bx7HHHkt5eXlQYhVCCNHzLS1eysjEkaREdk0DyabvyvBikFyzEcegwVBfBDH9oIu6S4NJaa27/qZK/Ra4CPABa4DrMMeMvQkkBrZdprV2H+g6U6ZM0W0D09ts3rw5aAnP0fr5z3/OxIkTufbaHvsAKdC9f8ZCCCG6RoO7gVlvzeL6sdfz84k/D/r9/H6Dv9++lLLmSi5edi8D33qTiDV3g98D134e9Pt3BqXUKq31lI72heQpS631fcB9P9i8E5gWgnC6xOTJk4mKiuJPf/pTqEMRQgghjtry0uUY2uiychclW+rwu/zolnwAHIMGwaIiyJzcJfcPNplcvIusWrUq1CEIIYQQnWZJ8RISwhIYkzSmS+6Xt6oSvxWymrZiTUnGGhUFDSUw6pwuuX+wydRJQgghhDgsfsPP1yVfMzNzJlaLNfj38xnsXFtFSSQMbq0kbNBgaK4Aw9srnrAESciEEEIIcZg21Wyizl3HrKyumS6peEsdbqePlYablNoyHINydpe86AVFYUESMiGEEEIcpm9Kv0GhmN5vepfcL29VBdYwC/W+euytLWYLWX2huVMSMiGEEEL0Rd+WfcuIxBEkhCcE/V5md2U1KiuSjOZKgEALWbF5QC+o0g+SkAXFscceG+oQhBBCiKBo9bWyrmodx/Q7pkvuV7S5Fk+rj9IYC8M9NQCEDRpkdlmGx0F4bJfEEWySkAXB8uXLg3p9v98f1OsLIYQQ+7OmYg1ew9t13ZUrKwmLtLHa7WSsvx4VGYktPd0sCht34CkUexJJyIIgOjoagEWLFjFnzhzOP/98RowYwaWXXorWms8++4wLLrig/fhFixZxxhlnAPD5558zY8YMJk2axAUXXEBzczMAAwcO5M4772TSpEm8/fbbPPHEE4waNYpx48Zx8cUXA9DS0sI111zDtGnTmDhxYnulfiGEEKKzfFv2LTaLjYmpE4N+L5/XT/66KgaMS2ZrZQsDWqoIy8kx54BuKO413ZXQy+uQLf3XNqqLmjv1msnZ0Rx/4bBDPn7NmjVs2rSJjIwMZs6cyddff838+fO54YYbaGlpISoqirfeeouLL76Y6upqHnjgAf73v/8RFRXFQw89xJ///GfuvfdeAJKSkli9ejUAGRkZ5OfnExYWRn19PQB/+MMfmDt3Li+++CL19fVMmzaN+fPny0TiQgghOs23Zd8yIWUCkfbIoN+rKLcWj8tP+KAYPFsMEmtKcRwb6CptKIKBM4MeQ1eRFrIgmzZtGllZWVgsFiZMmEBBQQE2m41TTjmF//znP/h8Pj7++GPOPvtsvv32W3Jzc5k5cyYTJkzglVdeYdeuXe3Xuuiii9rXx40bx6WXXsprr72GzWbm1Z9//jkPPvggEyZMYM6cObhcLgoLC7v8MwshhOid6l31bKnd0mXjx3auqyYs0kZZuCbc58ZeXWmOH3M1gLux1zxhCb28hexwWrKCJSwsrH3darXi8/kAc8LvJ598ksTERKZMmUJMTAxaa0488UT++c9/dnitPVu6Pv74Y5YsWcJ//vMf/vCHP7Bhwwa01rz77rsMHz48uB9KCCFEn/R9+fdodJeNH6staSZ1QAyry5sY7DIH9DtyBpnjx6BXdVlKC1mIzJ49m9WrV/P3v/+9fQzY9OnT+frrr8nLywPMMWHbtm3b51zDMCgqKuKEE07goYceoqGhgebmZk4++WT++te/0jZh/Jo1a7ruAwkhhOj1vi37lih7FKOTRwf9Xlpr6iucxKdGklvayDRLIwBhgwftLgobL4P6xVGyWq2cccYZfPrpp+0D+lNSUnj55Ze55JJLGDduHDNmzGDLli37nOv3+7nssssYO3YsEydO5Je//CXx8fHcc889eL1exo0bx+jRo7nnnnu6+mMJIYToxb4r+44paVOwW+xBv5ez0YPH5ScuNZLcskZG+erAasXev3+vq0EGvbzLMlTanoycM2cOc+bMad/+5JNP7nXck08+uc+2uXPnsmLFin2uWVBQ0L5ut9tZtmzZPsdERETwt7/97SgiF0IIITpW2lxKYVMhl4y4pEvuV1/hBMATaaHZ7SOrqRJHVhYWh8Os0m91QFRql8TSFaSFTAghhBAH9V3ZdwBdNqC/LSErMcyx13FVJTgGDzZ3tpW8sPSeNKb3fBIhhBBCBM03Zd+QFJ7EkPghXXK/ugonVruFrY1OHBiokiLCBuWYOxuKelV3JUhCJoQQQoiD0Frzfdn3HNPvGLMoaxdoqHASnxrBprImjon0gNdrPmEJva5KP/TShKztKUPR+eRnK4QQfU9efR41rpouK3cBZgtZfFokuaUNTFENQOAJS58bmsshvvfUIINemJCFh4dTU1MjiUMQaK2pqakhPDw81KEIIYToQt+WfQvQZQmZ32fQWO3CHh9GdbOnfVJxR04ONJaYB/WyLste95RlVlYWxcXFVFVVhTqUXik8PJysrN71SyCEEOLAviv7jv4x/ekX3a9L7tdY3Yo2NI12s3GlX0Ml1uRkrHFxkL/OPKgXVemHXpiQ2e12cnJyQh2GEEII0St4DS8ryldw+qDTu+yebU9YFnu9AESXF2EbtMf4Meh1LWS9rstSCCGEEJ1nU/UmnD5nl48fA9jidDEwMQLfrgIcez5hCZKQCSGEEKLv+NfWf+GwOLqs/hiYLWQRMXa21DQzIVpjNDQQNihQg6yxxCwIaws78EV6GEnIhBBCCNGhzTWb+WjnR1w26jLiwuK67L71FU7iUiMpqHEyTtcD4Gjrsmwsg5j0Loulq0hCJoQQQoh9aK3506o/ERcWx3Vjr+vSe9dXOLHE2vEbmkGt1QC7i8I2lUNsRpfG0xUkIRNCCCHEPpaXLue7su+4cdyNxDhiuuy+rhYvrU1enGFmAdrU2jJUZCS29ECrWFMpxHTN055dqdc9ZSmEEEKIo+M3/Pxp1Z/Iis7iouEXdem96yvNAf1V+LEoiKwoRg8ciLJYzKKwzhppIRNCCCFE7/efnf9he912bp58M3arvUvv3VbyYqfbw8CkKHz5+bvHjzWVma+9sIVMEjIhhBBCtHP5XPx1zV8ZmzyWkwec3OX3ry93oiyK3KYWRsTb8JaWmlMmgTmgHyBWEjIhhBBC9GKvbX6NSmclt02+rcsmEt9TfYWTmKRw8mtbmaCaAHZPKi4tZEIIIYTo7WpdtTy/4XnmZM9hSvqUkMRQX+nEkeDAb2iGuMwnLNuLwkpCJoQQQoje7oUNL+Dyubh10q0hub82NPWVrbgjrAD0qy8HiwXHwIHmAY2lYAuHiISQxBdMkpAJIYQQglpXLf/a+i9OH3Q6g+IHhSSGploXfq9BrcXAoiCqsgR7VhYWhyNwQJnZOhaCrtRgO6yETCkVpZSyBisYIYQQQoTGP3L/gdvv7vIisHtqe8KyyOtlYFIU/qIiHAMG7D6gsaxXlryAgyRkSimLUurHSqmPlVKVwBagTCmVq5R6RCk1pGvCFEIIIUSwNLgb+OeWf3LywJPJicsJWRxtNchyW5wMTY3CU1SEIzt79wFNvXPaJDh4C9lXwGDg/wHpWutsrXUqcBzwLfCQUuqyIMcohBBCiCB6Y/MbtHhbQto6BmbJC3u4lW31rYyOAaOpCXv/QEKm9e4uy17oYJX652utvT/cqLWuBd4F3lVKdW3FOCGEEEJ0mmZPM69tfo0Tsk9geOLwkMZSV+EkIjEMv7OZ4f5GABz9+5s7W+vA5+q1XZYHTMh+mIwppcKBy4AI4A2tdU1HCZsQQggheoY3t75Jo6eRG8fdGOpQqK9wYiSHgRP6u2oBdndZ9uKSF3D4T1k+DniAOuD9To9GCCGEEF3G6XXy6qZXmZk5k9HJo0Mai9ftp7nOTYNNY7UoEhqqALC3JWTtVfp7ZwvZwQb1/1MpNXiPTYnA25jdlb2vCIgQQgjRh7y7/V3q3HXdonWsococ0F9q+BiQFIlRXIwtNRVLeLh5QFOp+dpLB/UfbAzZ3cADSqky4PfAo8B7QDhwf3BDE0IIIUSwuP1uXtr4ElPTpzIxdWKow6Gu3EzItre6GJodg2dN4e4B/QBN5eZrX+yy1Frv1Fr/GDMJews4Bjhdaz1Ha/1OVwQohBBCiM73/vb3qWqt4oZxN4Q6FGB3DbLcplaGpcXgLSzCkd1/9wGNpRCZBLawEEUYXAfrskxQSt0EjAIuwBw79l+l1JldEZwQQgghguO9vPcYmTiSY9KPCXUogJmQhcU6cGvNsHg7vspKHP1/WIOsd44fg4MP6n8fqAc08A+t9T+AM4GJSqn/BDc0IYQQQgRDeUs5m2o2cdLAk1DdZBqiunInxJgjqYb4GgCw/7CFLLZ3dlfCwROyJOAdzIH8mQBa61at9e+A7tHGKYQQQojDsqhoEQBzs+eGNI42ht+gtrSFlggLVosirbkaoIMWst6bkB1sUP+9wGeAH7hrzx1a67JgBSWEEEKI4Pmq6CsGxA4I6TRJe6qvaMXvMyhV5hOWuqQA2KPkhd8LLVV9NyHTWv8b+HcXxSKEEEKIIGvyNPF9+fdcPvLybtNdWV3SBMBWl5th/WPx5hdiiYnBGh9vHtD2hGUf7rIUQgghRC+yrGQZPsPHCf1PCHUo7WqKm7FYFRubnAxNi8ZTaE4q3p4wtlfp77uD+oUQQgjRi3xZ+CWJ4YmMSx4X6lDaVRc1E5kcjg8YmhaDp6gQe/8fDOgHaSETQgghRM/n8XtYWrKUE7JPwGqxhjqcdtXFzRhxdgCGJoXjLSndPYcl9IkWsoMN6gdAKZUCXA8M3PMcrfU1wQlLCCGEEJ1tRfkKWrwtnJDdfbornY0enI0ePAMisFoU2b4miny+H1TpLwOrAyITQxdokB1SQgZ8ACwF/of5xOVRUUrFA88DYzBrnF0DbMWcDWAgUABcqLWuO9p7CSGEEML0ZeGXRNgiOKZf9ygGC1BdbA7oLzK8DEiKRJWWAPygSn+ZOYdlN3kIIRgONSGL1Frf2Yn3fRz4TGt9vlLKAUQCvwa+0Fo/qJS6C7PMRmfeUwghhOizDG2wqGgRMzNmEm4LD3U47aqLmwHIdbYyNCMGT+EOoKMaZL23uxIOfQzZR0qp0zrjhkqpOGAW8AKA1tqjta4HzgZeCRz2CnBOZ9xPCCGEELCpehOVrZXM7d89isG2qSluJio+jO0N5hyWnqJClN2OLS1t90G9vEo/HHpCdjNmUtaqlGpUSjUppRqP8J45QBXwklJqjVLqeaVUFJC2R7HZciCto5OVUjcopVYqpVZWVVUdYQhCCCFE3/JV0VdYlZVZWbNCHcpeqoubiUgJx29ohqRG4y0swp6VhbIGHjrQWlrI2mitY7TWFq11hNY6NvA+9gjvaQMmAc9orScCLew7C4DGHFvWUSzPaa2naK2npKSkHGEIQgghRN/yZeGXTE6bTFxYXKhDaefz+qkrd+KJDcxhmRqNp6ho7wH97kbwOvt2C5lSakTgdVJHyxHesxgo1lp/F3j/DmaCVqGU6he4Xz+g8givL4QQQog97GrcxY6GHd2uu7KuzIk2NLV2jVIwKDkKb2HhvgP6oVdPmwQHH9R/G+Yk4n/qYJ8GDvub1VqXK6WKlFLDtdZbgXlAbmC5Engw8PrB4V5bCCGEEPv6qvArgG5V7gJ2P2FZ4POSnRCJvakBw+n8wYD+QFHYvpyQaa1vCLx29jf4C+D1wBOWO4GrMVvr/qWUuhbYBVzYyfcUQggh+hyv38sHOz5gROIIMqK71zis6qJmbA4Lm5ucDE2NxlNYCOwxqTjsbiHr5V2WB0zIlFLHaa2XHWB/LNBfa73xcG6qtV4LTOlg17zDuY4QQgghDuy5Dc+RV5/HX074S6hD2Ud1cTOJmdHsrK5i9vBUvEXbAXDsOW2StJABcJ5S6mHgM2AV5tOR4cAQ4ARgAHB7UCMUQgghxBHZVLOJv6//O2cOOpN5/btXm4fWmpqSZlJHJ+CpM8wB/d8WgVLYs7J2H9hUDhEJYI8IXbBd4GBdlrcqpRKB84ALgH5AK7AZ+NuBWs+EEEIIETpuv5u7l95NUngSd07rfnXWm+vcuJ0+XFFmeYshqdF4iwqxpaVhCQvbfWBjWa9vHYNDqNSvta4F/h5YhBBCCNEDPLX2KXY07OCZ+c90q1IXbaqLzAH9VVazytWQ1GhqCov2nlQczC7LPpCQHWphWCGEEEL0EGsr1/Lyxpc5b+h5HJd5XKjD6VB1cTMo2Onx0C8unJhw+741yMBsIevlA/pBEjIhhBCiV3F6ndy97G76RfVjwdQFoQ5nv2qKm4lLjmBbbQtDUqMxWlrwV1fvXYPM74OWyl5fpR8kIRNCCCF6lSfWPEFhUyG/n/l7ouxRoQ5nv6qKm0nKiiavstkc0F9cDPxgUvHmCtCGtJC1UUrZlVK/VEq9E1h+oZSyBzs4IYQQQhy6osYi/rnln1w0/CKm9ZsW6nD2y+Py0VjViiM5jFav30zI2muQ7Vnyotx8lRayds8Ak4GnA8ukwDYhhBBCdBMvbHwBm7Jx47gbQx3KAdWUtADQEmGmIUNTY/AWFgHsp0p/epfGFwoHfcoyYKrWevwe779USq0LRkBCCCGEOHxlzWV8sOMDzh96PimRKaEO54BqAlMmVVgMAIamRuMqKsQSF4c1bo8nQtur9EsLWRu/Umpw2xul1CDAH5yQhBBCCHG4Xtz4IgDXjLkmxJEcXFVxM2GRNvKaWkmKcpAQ5cC7v5IXFjtEJocm0C50qC1kC4CvlFI7AYVZof/qoEUlhBBCiENW5azi39v/zdmDz6ZfdPcfAF9T3ExyVjSfVJkD+gE8JcWEjxq194ENJWZ3paX3P4N4SJ9Qa/0FMBT4JebE4MO11l8FMzAhhBBCHJqXN72MT/u4dsy1oQ7loPx+g5ofPGGpDQNvaRmOPadM0hp2LYd+4/d/sV7kgAmZUmpu4PVHwOmYc1gOAU4PbBNCCCFECNW6anl729uclnMa2bHZBz8hxGpLWvB5DSLSI2l0+RiaGo2vqgq8XuyZmbsPrNoCjcUw9MTQBduFDtZlORv4Ejizg30a+HenRySEEEKIQ/Za7mu4fC6uH3t9qEM5JBX5DQA0RQaesEyLwVu8C2DvhGz75+brEEnI0FrfF1j9ndY6f899SqmcoEUlhBBCiINqcDfwxpY3OHHAiQyKHxTqcA5JRX4jETF2drndQGBS8dwS4IcJ2UJIGwNxmR1dptc51FFy73aw7Z3ODEQIIYQQh+eNLW/Q4m3hhnE3hDqUQ1ZR0EhaThx5Vc3EhNtIjQnDWxJIyDIC5S1cjVD4DQyZH8JIu9YBW8iUUiOA0UDcD8aMxQLhwQxMCCGEEPtX3FTMP3L/wZzsOQxPHB7qcA6J2+mlrtzJsGnp5BWXMSQ1GqUUnpISrCnJWMIDqcXORWD4YOhJIY23Kx1sDNlw4Awgnr3HkTUBPaOzWgghhOhlGtwN/PR/P0WhuH3y7aEO55BVFpgFYdNyYslbvZ25I1IB8JaU4Mj4wfixsDjI7r7TP3W2g40h+wD4QCk1Q2v9TRfFJIQQQoj9cPvd/PLLX1LSXMLfT/o7A+MGhjqkQ1ae3wAKHCnhVDd7GJoaA4C3pJSIMWPMg7Q2x48NPgGsfWfa7EMtDLtGKXUTZvdle1el1rr7lwMWQggheglDG/xm2W9YXbmaR2Y9wuS0yaEO6bBUFDSSkBZJYbMLMAf0a78fb1kZsSefbB5UvgGay/tMuYs2hzqo/x9AOnAysBjIwuy2FEIIIUQX+cvqv/BZwWfcNvk2Tsk5JdThHBatNRX5jWZ3ZWUzYCZkvsrKvWuQ5S00X/vQgH449IRsiNb6HqBFa/0KZpHYY4IXlhBCCCH29OaWN3lp40tcNPwirhp9VajDOWyN1S5czV7ScuLYXtFMhN1KZnzE7ics2xKy7QvN6vwx6SGMtusdakLmDbzWK6XGAHFAanBCEkIIIcSe3t32Lv/3/f8xO2s2d027C6VUqEM6bBUFZkHYtJxYtlc2MTg1CotF7U7IsjKhtQ6KvutTT1e2OdQxZM8ppRKA3wAfAtHAPUGLSgghhBBorXl+w/M8seYJZmbM5OFZD2OzHOqf7u6lIr8Rm8NCUkYUeZXNHJOTCIBnzxpk2z8GbfSZ6vx7OqRvVWv9fGB1CTAIQCnVP1hBCSGEEH2doQ0eXvEwr29+ndMHnc7vj/099h781GFFfiMp/WOocXopa3AxOiMOMEte2FJSsISFmd2VEQmQNSXE0Xa9g3ZZKqVmKKXOV0qlBt6PU0q9AXwd9OiEEEKIPsjr93LXkrt4ffPrXD7qcv543B97dDLm9xpUFTWRlhPH+uJ6AMZltSVkpeb4McMwB/QPngcWawijDY0DJmRKqUeAF4HzgI+VUg8AnwPfAUODH54QQgjRt7j9bn7+5c/5tOBTbp18KwumLMCiDnXId/dUXdyM4dOkDYxlfXEDFgVjMgMJWXGxmZCVrYWWqj45fgwO3mV5OjBRa+0KjCErAsZorQuCHpkQQgjRB3204yOWly7nvhn3cf6w80MdTqfYc0D/+vUFDEmNJirMhvb58JaXE3vaaZD3P0DBkHmhDTZEDpZyu7TWLgCtdR2wXZIxIYQQIng+yf+EgbEDOW/oeaEOpdNU5DcSGecgKt7B+uIGxmXFA5g1yHw+8wnLvC8gYyJEJYc22BA5WAvZIKXUh3u8z9nzvdb6rOCEJYQQQvQ9FS0VrChfwU/H/7RHlrbYn4r8RtIGxlLa4KKmxcP4rN0D+gHs/dJh21qYcm0IowytgyVkZ//g/Z+CFYgQQgjR1/234L9oNKfmnBrqUDqNq9lLQ1Uro47LYH2x2XXZ1kLWVvLCEe4EnwsyJ4UqzJA72OTii7sqECGEEKKv+yT/E0YljepRE4YfTHl+YPzYwFj+u7Mcu1Uxol/bpOJmQmbzFZkHZ0wMSYzdQc9+bEMIIYToJQoaCthUs4nTck4LdSidqqKgEaUgZUAM64saGNkvljCbWdbCW1yCLTUVS9V6CI+HxEGhDTaEJCETQgghuoFP8z9FoThlYM+aNPxgKvMbScyIwuawsrGkob3+GJgtZPbMTChZY7aO9aJxc4dLEjIhhBAixLTWfJL/CVPTp5IWlRbqcDqNNjQVBeaA/p3VLTS5fe3jxyCQkGWkQ2Vunx4/Boc4dZJSahiwABiw5zla67lBiksIIYToM3JrcyloLOCq0VeFOpROVZhbi9vpI2tkYnuF/vGBhKy9BlnsJNB+yJCE7FC8DTwL/B3wBy8cIYQQou/5dOen2Cw25g+YH+pQOtWGRcVExjoYNCGF1z/ZTKTDypDUaAB8FRXg92MPb4FWpIXsEI/zaa2fCWokQgghRB/kN/x8mv8px2UeR1xY3MFP6CEaqpzs2lTD1NMGYrVZWFdcz5iMOKwWc5xYe8kLKiE6HWIzQhluyB3qGLL/KKV+ppTqp5RKbFuCGpkQQgjRB6yuXE1layWn55we6lA61cbFJViUYvTxmXj9BrmljT8Y0F8KgN2T1+dbx+DQW8iuDLwu2GObBvru86lCCCFEJ/h458dE2CKYnT071KF0Gq/Hz+blZQyamEJUfBgbSxpw+wzGZcfvPqa4GJTC5tkJGT8OXbDdxCElZFrrnGAHIoQQQvQ1Xr+XhbsWMq//PCJsEaEOp9NsX1GB2+lj7JwsgN0V+jP3LnlhS4rHYi2BzL5bELbNoT5laQd+CswKbFoE/E1r7Q1SXEIIIUSv90XhFzR6GntVMVitNRsWFZOUGUW/IWYCtr64nrgIOwOSItuP85aUYI93mG/6+BOWcOhjyJ4BJgNPB5bJgW1CCCGEOALVrdX83/f/x7CEYUzPmB7qcDpN+Y4GqouaGTsnq32C9HXFZkHYPSdM95aUYI/0QkIORMqw9EMdQzZVaz1+j/dfKqXWBSMgIYQQorfTWnPP1/fQ4m3hhZNewG6xhzqkTrNhcQmOCBvDpqUD0Orxs62iibkjdg871z4f3ooKYtP8kDkjVKF2K4faQuZXSg1ue6OUGoTUIxNCCCGOyBtb3mBZyTJun3I7QxKGhDqcTtPS4GbH6kpGzuiHPcycrzK3rBG/ofeu0F9u1iBz2OqluzLgUFvIFgBfKaV2AgqzYv/VQYtKCCGE6KW21W3jzyv/zKysWVw8/OJQh9OpcpeVYvg1Y2Zntm/7YYV+CDxhCdijfFLyIuBQn7L8Qik1FBge2LRVa+0OXlhCCCFE7+P2u7lzyZ1EO6L53bG/22tMVU/n9xpsWlJC/1GJxKftHry/vriB1Jgw0uPC27d5A0Vh7dEa+o3f51p90QETMqXUXK31l0qpH/1g1xClFFrrfwcxNiGEEKJXeWzVY+TV5/H0vKdJikgKdTidRhuaL17JpaXBw7wr+++1b11x/V7dlRBIyBTYBwwBR1QXRtp9HayFbDbwJXBmB/s0IAmZEEIIcQj+W/BfXt/8Oj8e8WOOzzo+1OF0Gq01y97ezvaVlcw4dzDZo3Y/Mdno8rKzqoVzJ2TudY63pARbpEZlT+7qcLutAyZkWuv7Aqu/01rn77lPKSXFYoUQQoiDMLTBc+uf46m1TzEueRy3Tr411CF1qlWf7WL9V8WMn5fNxJP2bh3bECgIO36PCv0A3l07sUd6pCDsHg71Kct3O9j2ztHcWCllVUqtUUp9FHifo5T6TimVp5R6SynlOJrrCyGEEKHm9Dq5fdHtPLX2Kc4YdAYvnPwC4bbwg5/YQ+QuK+W7D3YybFoaM88bss+YuHWBAf17zmEJ4Ckuwh7plycs93CwMWQjgNFA3A/GkcUCR/sv6mZgc+BaAA8Bj2mt31RKPQtcixSfFUII0UMVNRbxy69+yc6Gnfxqyq+4YtQVvWoQ/861VSx6fQv9RyUy94qRKMu+n219UQMDkyKJj9zdxqK9Xnw19TjSgbQxXRhx93awMWTDgTOAePYeR9YEXH+kN1VKZQGnA38AblPmv9C5QNvsoq8A9yMJmRBCiB5oRfkKbvnqFgCemf8Mx2YcG9qAjoLH5SNvVSXNdW6cDW5aGjw4G9xUlzSTMiCWk28Yg9XWcYfbuuJ6pg7cuwq/t7wcNNgz0sEmnWFtDjaG7APgA6XUDK31N514378AdwAxgfdJQL3W2hd4XwxkdnAeSqkbgBsA+vfv39EhQgghRMgUNRVx81c3kxyRzFNznyI7NjvUIR2V9V8W892HOwEIj7YTFecgMi6MkcdmcMxZOTjCO04lKhtdlDW49h0/VrgLAPvgkUGNu6c51MKwa5RSN2F2X7Z3VWqtrzncGyqlzgAqtdarlFJzDvd8rfVzwHMAU6ZM0Yd7vhBCCBEsLp+L2xbdBsBT854iO6ZnJ2MAeasrSR8Uxzm3T8RqPdSh5+b8lQDjfzB+zLtpOQD2cXM6Lcbe4FB/sv8A0oGTgcVAFma35ZGYCZyllCoA3sTsqnwciFdKtSWIWUDJEV5fCCGE6HJaa37/7e/ZUruFB49/sFckY/UVTmqKmxkyOfWwkjEwK/RbLYrRGT9IyLasAqWxTz69M0Pt8Q71pztEa30P0KK1fgVz/NcxR3JDrfX/01pnaa0HAhcDX2qtLwW+As4PHHYl8MGRXF8IIYQIhbe3vc2HOz7kJ+N/wqysWaEOp1PsWFMJwKCJKYd97tqieoalxRDhsO613btrB7ZoKyr28K/Zmx1qQuYNvNYrpcYAcUBqJ8dyJ+YA/zzMMWUvdPL1hRBCiKDYULWBB79/kJmZM/nJuJ+EOpxOs2N1FWk5scQkHl5hBa01G0oa9umuxN2Ep7IOR1rvmaWgsxzqGLLnlFIJwD3Ah0A0cO/R3lxrvQhYFFjfCUw72msKIYQQXanOVcdti28jJSKFB497EKvFevCTeoCGqlaqCps49rwhh31uYa2Teqd3nwH97FqOt8VC1LjBnRNkL3Kok4s/H1hdDAwKXjhCCCFEz1HprOTWr26ltrWWV097lfjw+FCH1GnauisHH2F3JexbEFZv+xJfqxX70HFHHV9vc7DCsLcdaL/W+s+dG44QQgjRM6woX8GCxQtw+pw8NOshRieNDnVInWrH6ipSB8QQmxxx2OeuL24g3G5hWFrMXtu9678CrbBnD+isMHuNg7WQxRxkvxBCCNGnaK15NfdVHlv1GNkx2fz9pL8zNGFoqMPqVI01rVQWNDLj3CPrWlxXVM/ojDjsez6Z2VSBtzAfSMaeldU5gfYiBysM+9uuCkQIIYTo7po9zdy7/F4W7lrI/P7z+f3M3xPtiA51WJ1u55oq4MiervT5DTaWNvDjaT9oBctfgrfFTDvsmR3Wfu/TDmkMWWCqo79i1hADWArcrLUuDlZgQgghRHdiaIPrP7+ezbWbuX3y7Vw5+speNTflnnasriI5O5r41MjDPndbRTMur8H47B88YblzER5PFFit2NPTOinS3uNQy168hPl0ZUZg+U9gmxBCCNEnLCtZxsaajdw34z6uGnNVr03GmuvclO9sYPDEI6tutb64HoDxWfG7N2oNOxfhJR17WhrKdqhFHvqOQ03IUrTWL2mtfYHlZUAqugkhhOgzXt70MulR6Zwx+IxQhxJUO9cGnq6cdGR/5tcVNxAXYWdA0h6tazU7oLEYb2u4dFfux6EmZDVKqcuUUtbAchlQE8zAhBBCiO5iU/UmVpSv4LKRl2G32EMdTlDtWF1FYkYUCelRR3T+uqJ6xmXF7d2CmL8IAG+9WxKy/TjUhOwa4EKgHCjDnOLo6mAFJYQQQnQnr2x6hWh7NOcNPS/UoQRVS4Ob0rx6Bk86su5Kl9fP1oqmvbsrAXYuQkdn46uqkYRsPw61MOwu4KwgxyKEEEJ0OyXNJXy+63OuGHVFr3yiso3fb7Dqs12gj7y7clNpA35D710Q1vCbT1imzAf9jZS82I+DFYa9Q2v9sFLqr4D+4X6t9S+DFpkQQgjRDbyW+xoKxY9H/jjUoQRNaV49i9/YSm1pC8OPSSex35F2VzYAMGHPKZPK1oKrAW/4cOAb7JkZRx1vb3SwFrLcwOvKYAcihBBCdDcN7gbe3f4up+acSnpUeqjD6XSuZi/L38tj89dlRCeGcdrPxpEzLvmIr7euuJ702HBSY/eYjHznIgA82uwGdUiXZYcOlpCdqpSq01q/0iXRCCGEEN3I29veptXXypWjrwx1KJ2uMLeGhS/m4nb6mHhif6aekYM97OgmRl9f3NBB/bHFkDYGb3UDWK3Y0qQGWUcONqh/G/CoUqpAKfWwUmpiVwQlhBBChJrH7+GNzW8wo98MhicOD3U4ncowNIvf2EpEtJ2L7p7KsecNOepkrK7FQ351C+P2HNDvbYXCbyFnNt6SUuzp6VKDbD8OmJBprR/XWs8AZmOWuXhRKbVFKXWfUmpYl0QohBBChMAn+Z9Q1VrFVaOvCnUona5gfTWN1S6OOXsQSZmd86DCs0t2AHDC8D2e0Cz8FvxuGDQHb0mJPGF5AIdU9kJrvUtr/ZDWeiJwCXAOsDmYgQkhhBChYmiDVza9wtCEoczImBHqcDrdui+KiEkKJ2d859R4L6hu4cVl+Zw/OYtRGbG7d+QvBosNBhwrCdlBHFJCppSyKaXOVEq9DnwKbAV+FNTIhBBCiBD59/Z/k1efx3Vjrut1UyRVFTZRur2ecSdkYbF0zmf7wyebcVgt3HHyD7p2dy6GzCkYyoGvslISsgM4YEKmlDpRKfUiUAxcD3wMDNZaX6y1/qArAhRCCCG6Ur2rnr+s/guT0yZzas6poQ6n0637sgh7mJWRMzun/MTXedUszK3gZycM2fvpytZ6s+TFoNn4SktBa+xZkpDtz8FG1v0/4A3gdq11XRfEI4QQQoTUX1b/hWZPM3cfc3evax1raXCzfUUFo2dlEhZx9IPrfX6D3/0nl+zECK49LmfvnQXLQBuQMxtPSQkgJS8O5IDfhtZ6blcFIoQQQoTa+qr1/Hv7v7l81OUMTRga6nA63cbFJRiGZtyczqmW/88VRWytaOKZSycRbv/BU5r5i8EeCVlT8X7/PoB0WR7Aoc5lKYQQQvRqfsPPH777A8kRyfx0/E9DHU6n83n9bFxSwsCxycSnRR719RqcXv78+VaOyUnklDEdFM3duRj6zwCbA29JKdhs2FKPbI7MvkASMiGEEAJ4d/u75NbksmDqgl45Z+W27ytwNXsZP7dzWsce/2I79a1e7j1z1L5du41lUL0VBs0GMJ+wlBpkByQJmRBCiD6v1lXL46sfZ1r6NE4ZeEqow+l0WmvWf1lEUmY0mcMTjvp6u2paePWbAi6ems3ojLh9D8hfYr4OmgMgJS8OgSRkQggh+rzHVz+O0+vk18f8utcN5Aco2VpHTUkL4+dldcrn+2RDOT5D84u5+xlnl78YIhIhbSwgCdmhkLZDIYQQfdaO+h38dc1f+aLwC64efTWD4weHOqROV1XYxLK384iIsTN0aufMI7loayUj+8WSER+x706tzfFjOceDxYLh8QRqkHVOmY3eShIyIYQQfU5JcwlPr32aj3Z+RIQtgp9N+BnXjrk21GF1Kmejh+8+3Enu16WER9k54bIR2H74JOQRaHJ5WbWrjutnDer4gNqd0FgMObcBZusYgCOrc8au9VaSkAkhhOgz3H43j616jLe2voUFC5ePvJxrx15LQvjRj6vqLvw+g/VfFbPy43x8HoPxc7OZevpAwiLtnXL9r/Nq8Bma2cP2M+3SzkXma/v4sVJASl4cjCRkQggh+ozHVz/O65tf57yh5/GT8T8hPaqDcg09WFOti4+fWkdNSQsDxiQx8/whJKRHdeo9Fm+rJCbMxuQB+0li8xdDbBYkmi1obS1kkpAdmCRkQggh+oQ1lWt4Lfc1Lhp+Eb+Z/ptQh9Ppqoub+Oiv6/B6DE772ThyxiV3+j201izaWsXMIcnYrR08F2gYkL8Uhp8KgYcHvCUlUoPsEMhTlkIIIXo9l8/FPV/fQ0Z0BrdNvi3U4XS6oi21/PvR1aAUP/rVpKAkYwDbKpopa3AxZ/h+uisrNkBrLeTMbt/kLSnB3q8fynr049d6M2khE0II0es9ueZJdjXu4vmTnifSfvRV6ruTrd+V8+Wrm4lPi+TMX4wnOiH84CcdocXbKgGYvb+EbOdi8zVnVvsmKXlxaCQhE0II0autrVzLq7mvcuGwCzmm3zGhDqfTeFw+1n1RxPf/ySdzWDyn/mRspw3c359FW6sYnhZDv7gOyl2AOX4seTjE9mvf5C0pIWrW8UGNqzeQhEwIIUSv1dZVmR6Vzm1Ten5Xpdaasrx6Ni8vI291FT63n6FTUpl35Sis9uCOQmp2+1hRUMs1M3M6PsDngV3LYeJluzfV1eGrqsKRnR3U2HoDSciEEEL0Wk+vfZqCxgKeO/E5ouyd+7RhV/L7Ddb9r4jcZaU0VLViD7MydEoqI2f0I31wXJfMLrA8rxqvX++/u3LHl+B1wuB57ZsaP/4EgOgTTgh6fD2dJGRCCCF6Ha01/9n5H17JfYXzh53PjIwZoQ7piHk9fv773EZ2bawhY2g8U04fyOCJqdjDunaQ/KJtVUQ5rEwZkNjxAatfhahUGLI7IWt47z3CRo0kfPjwLoqy55KETAghRK+yvW47f/juD6yqWMW45HHcPvn2UId0xFwtXj5+ah0V+Y3MuXQ4o48PzeB4rTWLt1Zx7JBkHLYOukabKmDbZ3Dsz8FqjmNzbduGa9Mm0n796y6OtmeShEwIIUSv0Oxp5ul1T/PG5jeIdkRz74x7+dGQH2G19MxyC811Lj58Yh0NVU5Ovn4MgyeFro7XjqpmSupb+dkJ+5nrc90boP0w8Yr2TQ3vfwB2O7FnntFFUfZskpAJIYTo8VaUr+COJXdQ01rDecPO4+aJNxMfHh/qsI5YXXkLHz6xFrfTx5m/mEDW8NBO7bRoaxUAc4Z3kBRqbXZXDpgJyUPMTT4fDR9+SPTsWdgSes+0VMEkCZkQQogeLa8uj19++UtSIlP469y/MiZ5TKhDOio1Jc28/9galIJzb5tESv+YUIfEoq1VDE2NJjO+g3IXu742JxSfdUf7puZly/BXVxN/7rldGGXPJgmZEEKIHqu6tZqbvriJcFs4z534XI+fm7Kl3s1HT67DYlWce9sk4tNCX8TW6fHxfX4tVx47oOMDVv8DwmJh1Nntmxre/wBrYiLRs2Z1fI7Yh0ydJIQQokdy+Vzc/OXN1LpqeXLukz0+GfO4fHz89HpcTh9n3DS+WyRjAF/n1eDxG8we1kF3ZWs95L4PYy8Ahxmvv76e5i++IPaM01H24Baq7U0kIRNCCNHjGNrg7mV3s6F6Aw8e/yCjk0eHOqSjYvgNPn9hE9VFTZx83ehu0U3Z5uXl+aTEhDE1p4OxYBveBp8LJl3evqnhk0/QXq90Vx4mSciEEEL0OE+ueZLPd33ObZNvY96AeQc/oRvTWrPsX9vZtaGGWZcMZ+DY4EwMfiTWFNbxdV4NNxw/iDBbB0+rrn4V0sdCvwntmxree5+wESMIHzmy6wLtBSQhE0II0aO8s+0d/r7h75w39DyuHH1lqMM5auu+KGLD4hImntifMbO61yTcT321g/hIOz8+pv++O0vXQvl6mHQlBGYKcOfl4dqwgfhzz+nSOHsDGdQvhBCix3hp40v8edWfmZk5k7un390lUwYFS2N1K+u+KGL9omIGT0phxrn7qfEVIlvKG/nf5gpunT+MqLAO0oU1/wBrGIw9v31Tw/vvg81G7BlSe+xwSUImhBCi2zO0wWOrHuPlTS9zysBT+ONxf8Ru6ZkDxit3NbJmYSE7VlWilGLEjH7MvngYytK9ksunv9pBlMPa8dOVHiesf9t8sjLCHFumfT4aPviQ6FmzsCUldXG0PZ8kZEIIIbo1r+Hl/uX38+GOD7lkxCXcNe0uLKrnjbipr3Dy1WtbKN1ejyPcyoT5/Rk3N4vohPBQh7aPguoWPlpfyvWzBhEf6dj3gDX/AHcDTNpdmb/p88/xVVUR/yMZzH8kJCETQgjRbbX6WvnV4l+xpHgJP5/wc24Yd0OP7ab89v0dVBc1MfP8IYyamYEjovv+CX528Q5sVgvXHpez705XAyx6EAYeDwOPA0AbBtXPPINjyGCi587t4mh7h+77r0EIIUSf1uRp4qYvbmJd1TrumX4PFw6/MNQhHTG300v+hmrGzMpkwvwOBsh3I2UNrby7uphLpvUnNaaD1rtlj0FrLZz0+/bB/E0L/4d7ex4Zjz6KsvS81svuQBIyIYQQ3U6Du4GfLPwJW2q38PCshzl54MmhDumo7FhTheHTDJvW/YvXPrdkJ1rDDbMG7buzoRi+fQbGXQQZE4FA69jTT+MYOJDYU0/p4mh7jy5PY5VS2Uqpr5RSuUqpTUqpmwPbE5VSC5VS2wOvMhupEEL0QbWuWq77/Dq21m3lsRMe6/HJGMC278uJS40gdUD3KfjakZpmN//8vpBzJmaSldDBTAFfPmBOJj73N+2bmr/6CvfWrST/9Ccoawe1ysQhCUW7og+4XWs9CpgO3KSUGgXcBXyhtR4KfBF4L4QQog+pbq3m2v9eS35DPn+d+1fmZM8JdUhHrbnORcm2eoZNS+/W498MQ/PAx5tx+wx+OqeDEhxl62HdmzD9JxBvdrtqral+6mns/fsTe/rpXRxx79LlCZnWukxrvTqw3gRsBjKBs4FXAoe9ApzT1bEJIYQInfKWcq7+7GpKmkt4et7TzMycGeqQOsW2FRWgYdi0tFCHsl9am8nYe2tKuGXeMAanRP/wAFh4j1ni4rjb2jc3L16MKzeX5BtvRNlkFNTRCOlPTyk1EJgIfAekaa3LArvKge77L1cIIUSnqmmt4dr/XkuNq4a/nfg3JqZODHVInWbb9xWk5cQSn9o9JgvvyF+/zOPFr/O5euZAfjlvyL4H5H0BOxfBKQ9CRDwQaB17+hnsmZnEnXVml8bbG4XsUQilVDTwLnCL1rpxz31aaw3o/Zx3g1JqpVJqZVVVVRdEKoQQIpicXic3fXETlc5Knp3/bK9KxmpKm6kpbu7WrWOvLC/gzwu3cd6kLO45fdS+3aqG32wdS8iBKde2b25Z9jWu9etJuuEGlL1nFuntTkKSkCml7JjJ2Ota638HNlcopfoF9vcDKjs6V2v9nNZ6itZ6SkpKStcELIQQIii8hpfbF9/O5trNPDL7ESakTgh1SJ1q2/cVKItiyOTumZC9v6aE+z7cxImj0njovLFYOpotYOmfoTIX5t8HNrNIrNk69jS2fv2Ik3krO0UonrJUwAvAZq31n/fY9SHQNkvslcAHXR2bEEKIrqO15nff/I5lJcu4Z/o9vWIA/560odn2fTnZIxOIjO2g2n2I/S+3gtvfXsexg5P46yUTsVk7SAm+ew6+egDGXgijzmnf3LJsGa1r1pB0/XVYHN3vs/VEoWghmwlcDsxVSq0NLKcBDwInKqW2A/MD74UQQvRST659kvfz3uen43/K+cPOP/gJPUzZjgaaa93dsvbY13nV/OyN1YzJiOW5K6YQbu+gXMWa1+DTBTDiDDjnmfYisIbbTfkDD+AYMID483vf9xYqXT6oX2u9DNjfc7/zujIWIYQQofGvrf/iufXP8aOhP+Kn438a6nCCYtv35dgcFnLGJ4c6lL2sLKjluldWMig5ileumUZ0WAepwKb34MNfwOC5cP6LYN19TO2LL+LdVUj2C89L61gnkmdUhRBCdBlDGzy99mn+tv5vHJ95PPdMv6db1+Y6Un6fQd6qSnLGp+AI7z5/ajeWNHD1SyvoFxfOP649puOJw7f9F969DrKPgYteB1tY+y5PcTHVz/6NmFNOIXpm7yhL0l10n38lQggherVGTyO/XvprFhcv5pwh5/Cb6b/BZumdf4Z2bazB7fR1q6crt1U0cfkL3xEbYee1644hJSZs34N2LYe3Loe0MfDjt8Cxd6mOij/8EaxW0u66s4ui7jt652+CEEKIbmVH/Q5u/upmSppKuPuYu7lo+EW9smWsuriZTUtK2Pp9ORExdrJHJYY6JAAKqlu49PnvsFstvHH9MWTER+x7kKsB3r0e4rLg8vcgPG6v3U1ffkXzV1+RumAB9vTuNy6up5OETAghRFB9sesLfr3s14Tbwnn+5OeZnDY51CF1Ko/Lx841VWxaWkL5zkasNgtDpqQy8cT+WDt6crGLbS5r5KqXvsfnN/jXjTMYkBTV8YGf/T9oKoNrF0Lk3omk0dpKxR/+QNjQISRecXkXRN33SEImhBAiKNx+N4+teozXN7/OmKQxPHbCY6RH9eyWlYYqJ5W7mqgtbaGmpJna0hYaqltBQ3xaJMddMJTh09MJj+oehVKX51Vz4z9WERVm4583TGdo2n4mN9/yCax9HWYtgKx9E+bq557DW1JC/1dfkSKwQSIJmRBCiE6XV5fHHUvvYHvddi4deSm3Tr6VMGsHY5a6Oa01lbuayF9bxc511dSVtQCgLIr41AiSs2MYPj2djCHxZAyL71bdsB+uK+X2f61lYJL5NOWe3ZTaMGhdvRr39u1oZyN6yZ/APgS9NQm95Wnw+dF+P/h9aK+PujfeIPasM4maNi2En6h3k4RMCCFEp9Fa89bWt3h05aNE2aN4at5TzMqaFeqwDpu71ceKj/PJW1lJS70bZVFkDI1nzKwMMobGk5AWhdUe+u7I/Xl+6U4e+Hgz0wYm8vcrphAXaUdrjWvjJho/+YTGTz/FV16+xxlWwAnLnti9yWZDWa0oqxVHTg5pCxZ09cfoUyQhE0II0SkKGgr406o/sahoETMzZ/LAzAdIjuheNbgORdHmWr58dTMt9W4Gjktm0DmDGDg2udt0Qx7M/326mb8t3slpY9P584UTCLNAzcsvU/fPf+LdVQh2O9HHHUfsr35FZEwF6rPbUHPuQh3/SzMJs1jAau1WrX19gSRkQgghjpjWmjWVa3h508ssKlqE3WLnjql3cOnIS7Go7tuC1BGv28/yf+excXEJ8WmR/OiOyaTnxB38xG7kvTXF/G3xTi49pj+/O3sM/pJidt31/2hdtYrIKVNIvv56YubPxxofD41l8PR0GDwF5v9qr+KvouvJT18IIcRh8xk+vir6ipc3vcz6qvXEhcVxw7gbuHjExT2yVaw0r54vXtlMY1Ur4+dmM/2cQdgcHUwn1I3lVTbx639v5JicRO4/cxRN7/3brBtmsZDx0IPEnnXW7lavpnL458Xgc8M5z0oy1g3INyCEEOKQ1bvqeXf7u7y19S3KWsrIjsnm7mPu5uwhZxNh66C2VTfmavayfWUFW78rpyK/kZikcM65dSKZwxNCHdphc3p8/Oz11UQ6rPzl5AGU33wzzV98QeS0aWT83x+xZ2buPrh8A7xxMbTWwgUvQfKQ0AUu2klCJoQQ4qA212zmn1v+ySf5n+D2u5mWPo07p97JnOw5WC09pyXJ7zPYtbGGrd+WU7ChGsOvScqM4tgfDWH0rIxuNc3R4bjn/U1sr2zmzTE+mi69EKOxkdQ77yTxyivMMWFttv0X3rkGwmLhms+g3/jQBS320jP/5QkhhOgyz6x7hqfXPk2ELYKzBp/FJSMuYWjC0FCHdci01lTkN7L1u3K2r6zA3eIjItbB2BOyGDE9neSs/dTm6iH+tbKIT77L42+1i4l9byG2ESPIePFFwocP2/vA7/4Gn921e1qk2IzQBCw6JAmZEEKI/fqm9BueWfsMpw48lbun301cWPce5O73GTgbPTgbPLQ0uKkpaWbrd+U0VLZitVsYND6ZYcek039UIpZuUEX/aG0tb+KNF/7D86vfJLGxmqTrryP5F7/A4thj0nCf26zCv/IFGHEG/Og5cOynWr8IGUnIhBBCdKi6tZr/t/T/kROXw/3H3k+kPfLgJ4WAs9HD9x/ls2NVJa4W7z77M4fFM+nkAQyelEpYRO/5s1dU08xHt9zHH9Z9hq1fP7KfepXIKVP2Pqg2H96+CsrWwsybYd79YOn5iWhv1Hv+ZQohhOg0hjb49dJf0+xt5u8n/b1bJmM+r591XxSx6rNd+D0GQ6amEp8aSWSsg6i4MCLjHMQkhhMR4zj4xXqYVQU1fP3L/8dp25biPfE0Rvzfb7FGR+990Ob/wPs3gQIu/ieMOC0ksYpDIwmZEEKIfby48UW+KfuG+2bc1+3Gi2mtyVtZyTfv7aCp1sXAcckc+6PBJKT3jW64t1cUsvO3f+CsvKVYLr6Msff9eu8irj4P/O8++PZpyJgEF7wMCQNCFq84NJKQCSGE2MuayjU8ueZJThl4CucNPS/U4eylvtLJV//YQun2epKzo5l75USyemCZiiPhNzQPfboZ37N/5YK8JURecin97/1BMtZQAm9fCcUr4JifwIm/B1vvayHsjSQhE0II0a7B3cAdS+4gIzqD+2bc122mzzEMzfovi/jug51YbBZOuGwEI47th8XSPeILtnqnh9v+tY7Mf7/Kj7cvIvaii8i49+69v5/8pfDO1eBthQtegdHnhCxecfgkIRNCiD6uvKWc5aXL+brka74p+4ZWXyuvnfYa0Y7og5/cBWpLW/jyH5upyG9k4Lhk5vx4OFHxYaEOq8ssz6vmtn+tY/7Kj/jxtv8Rf8H5pN937+5kTGuze/LzeyBpMFz1MaQMD23Q4rBJQiaEEH2Q1/Dyeu7rfLDjA/Lq8wBIjUhlfv/5nDX4LEYnjQ5xhOBq8bLuiyJWf74LR5iNE68dxdApad2m1S7Y3D4/f/p8G88t2cnVFd9zYe5nxJ1zDum//e3uYq+eFvjg57Dp32ZJi3OegfDY0AYujogkZEII0cdsqt7EvcvvZVvdNianTeb2ybczM3MmQ+KHdItkp7XJw9ovitiwqBivy8/QKakcd+EwImP7zliovMomfvnPteSWNfL/IkuY9e3bRM+fR78/PLA7GctfAp8sgOptMP9+mHkLdIPvTxwZSciEEKKPcHqdPLX2KV7b/BrJ4ck8fsLjzO0/N9RhtWtpcLN2YSEbl5Tg8xoMnpjKlNMGkpzVPbpOu4LPb/DCsnz+vHAbUWE2Xp1kJfX3TxI+cSKZjz6KslqhdqfZPbnlI4jrD5e9C4O7z/cojowkZEII0ct5/V6WlCzhkRWPUNJcwoXDLuSWybcQ4wj9lEHa0BRtqSV3aSn566rRWjN0WhqTTxlIYr++Ucaizfrieu56dwO5ZY3MH5nG78Y6aLrhWmwD+pP99FNY8MDCP8K3z4DFDnPvgRk3gb1nTeouOiYJmRBC9EJev5dvyr7h84LP+bLoS5o8TQyMHcjLp7zM5LTJoQ6Plno3m5eXkft1KU01LsKj7Iydm8WYWZnEp3a/IrTB1OL28afPt/Hy8nySo8N49rJJzI33s+uSH2OJiqL/3/+OteJb+PAX0FIJ438M8+6F2H6hDl10IknIhBCil/Abfr4r/45Pdn7SnoRF26M5IfsEThp4EjMzZmK32kMWX2NNKzvXVLFzbRVlOxpAQ9aIBGacO5hB41Ow2vvWlD51LR4+WFvC35fmU1LfymXT+3PHKSOIbG1m16WXYbjdDHz5eeyrHjHnoUwbAz9+EzJDn1CLzicJmRBC9GBaa3Jrcvlo50d8VvAZ1a3VRNujmdt/LicNOIkZGTNwWLt+MLzWmuY6c3LvqsIm8tdVU1XYBEBSVjTTzshh2LQ04lL6VmuY39As2V7FOyuLWZhbgcdvMDYzjscvnsCUgYn4GxrYdc21eEtK6P/QXYR9eY05aH/Gz81WMVvfKffR10hCJoQQPVCls5L/7PgP7+e9T0FjAXaLnVlZszgt5zRmZc0i3BZ+RNfVhqa12Yuz0UNrk6f91e30oQ2N1hrDoH3dPGn3+T6fQV1ZC7WlLbidvvbtaTmxZkvYxJQ+1yUJ0Oz28cryAl79poCKRjcJkXZ+fEx/LpiSxeiMOAD8zc0UXnc9nrw8sm6aT+T3P4eoFLjiAxg0J7QfQASdJGRCCNFDeP1eFhcv5r2891hWsgxDG0xKncRVo69i/oD5xIXFHdb1DENTX+6kqqiJqkJzqS5qwuPyd3i8siiUBSxKmeuK9jILbdUWlEURnxrJkClpJGVEkZQZTWJGFOFRoesqDSWnx8er3+zib4t3UOf0cvzQZO4/czRzR6YSZrO2H2e0tFB0/Q24cjeRdbKd6PIXYORZcObjEJkYwk8guookZEII0c15DS//2vovnlv/HLWuWlIjUrl2zLWcPeRsBsQe2qTR2tDUVzqp3NVE1a4mKgsbqSpswucxALDaLSRnRTNsWjoJ/SKJjA0jMtZORIyDiBgHYZG2blGjrKdo9fh57dtdPLt4BzUtHmYNS+HW+UOZ2H/feTeN1laKrv4xrRu2kXlsLTGDBsC812HE6VJXrA+RhEwIIbqxpcVLeWTlI+TXFzA7ej5njjibUXFj0H7w7TTY7q3A5/Xj8xh4PX78XgOfx7+727HR7HZ0Nnow/Gbfos1uITk7hlEzM0jpH0NK/xgS0iOxWPvWoPpgyKts4vXvCnl3VTGNLh/HD03mlvnDmDxgdyKmPR78jY34Gxrw71hJ9WMP4yxoIWOuhdjr/gzjLwaL9QB3Eb2RJGRCCNEN7ajfwaPf/pmizbWMaZ7H6fVj8bVAHn7yWHfAcy02RXiUnchYB5GxDhL7RRER6yA+LZLUAbEk9pPkqzN5fAb/3VTO69/tYmtuAcOayrg1vInJYa0krnfhX9rAzoYG/A31GPUNGE7nPtfod+2JxN3yCNiPbOyf6PkkIRNCiBBytXipLWvB1eSltdlDfX0T3+evpry0lhGNZzHGsGMPtzJgTBL9RyURGevAardgs1uw2izmusOCzW41Xx1WLBbp5go2v6H5dmcNXy5Zj++/nzC0bDu3NpYR62pqP8aalIQ7Ph5rXBz29HTChw/HGunAWr8RS9X3WMPAOuEMHCfdhGPYmBB+GtEdSEImhBBdxDA01UVNVOQ3mktBI/UV+7aWYIknIyaWUcf1Y8SkLDKGxGO1SYtWqPkNzapddXy2Kp+qTxcyfds3/KhqOxY03pwhJB07j4hRIwkbMcJMvuL2eMjC44Tvn4Nlf4bYRph9Kcz5NcRlhu4DiW5FEjIhhOgCTbUuPntuI5UFjQBExDpIz4llxIx0GmOqeK3gZTa1rGN4xlDumnEHI5NGhjhiAeD1G3y7s4ZPN5SxY8n3TN3yNaeVrCXK68KbkkbCjTeSfP6PcGRnd3wBvxfWvAaLH4KmMhh6kjkReNroLv0covuThEwIIYKsMLeGhS/k4vcbzLl0ONmjEolJDKfCWcETq5/gP3n/ISUihd/Mv4vTc06XpxlDzOMz+Dqvmo/Wl7Fi1Vam5X3PSUUrubyxAsMRRvRJJ5J8wXlETpuGsuyn5dIwIPc9+PIBczLw7Olw/osw4Niu/TCix5CETAghgkQbmpWfFvD9R/kk9ovi1BvHEp8WidPr5Jl1z/DSxpcwtMG1Y67l+nHXE2XvW5Npdyc+v8HyHTX8b/lmCpevIrMin6n1hVxTtR2LYRA2cSIJP7qJ2FNPxRodvZ+LeGDX17D1E9j6KTQUQepouOQtGHaylLAQByQJmRBCdDKtNS31Hha9voVdG2sYdkwac348AqtD8eGOD3l89eNUOis5acBJ3Dr5VrJiskIdcp9ieDx4i0so3ryDvPXbqNqWj6+4kIHVRVzSWgeAVgrH4MHEnn0dceeeQ1hOTscXczXA9oVmErb9f+BuAFsEDJ4LJ/4WRp0jJSzEIZGETAghDoHhN2ht9prTCLX4cLf6cDt9eFp9uJ1eWho8NNe6aAosPo+BxaqYfckwBkyP4+2db/Hm1jfJb8hndNJoHpn1CJPSJoX6Y/U62ufDV1uLv6YGX3UNvspKvCXFuIuKaczfhbekBEddTfvx/YF+FhvOhGRsE8eTOGMyMRPGEz5qFJao/bRYNpaZCdiWjyF/CRheiEyGUWfC8NPNaY4cfW96KHF0JCETQog9GH6DqsJmirfWUrq9geY6F61NHlqbvXvN2fhDETF2YhLDSegXRf/RScQkhkNmCx/Uv8KH73yI0+dkbPJYHjr+IU7JOQWLkqcmD5e/oQFPYSGewkJ8ZWVmwlVTg7+m2lyvrsZfVwd67y/KUIrqiHjKIxIoj8mhMWsqMQMHMGDMEMZOGcnwEQOxWPdoxdIa6gpg5ypoKIbmSmiugJZKaCo3J/sGSBwE038CI86ArKnSEiaOiiRkQog+S2uNs8FDbXkLNcXNlGyrp3RbXftcjokZUcSlRNBvcBwRsQ4iA9MIhUfbCYuwERZpwxFhA4dBcXMROxt2sqNhB/n1+exo2MG277Zht9g5NedULh5+MWNTxob4E/ccvpoaWr79Fue33+LashVPYSFGQ8Nex6jwcGzJyeiERJrjU6lKyaFQh7PV66BERVIXFkNLTBzpg/ozdmAy47LiODsrngFJkbsfnNDaTLZq8qB4JRR9D8UrzOSrjT0SotMgOhWSh8G4i8wkLGW4jAsTnUYSMiFEn+Bs9FBT3Ex1STO1Jc3UljupL2/ZayLt2JQIhkxNI2t4ApnDEoiMdbTvM7TBzvqdbKheQWFTIaUVpZQ2m0tVaxU60HymUGREZzAobhCn5pzKj4b+iMRwmRz6YAynE+fKlbR88y0t33yDe8sWACwxMUSMHUPsqadgy+5PY0IahRGJ5PojWVPtYWNpI+WNLsDMjYamRjMhO54zshMYnx3H8LQYbApoLIHaPNiVD2t2mk8+1uabi7dldyCJg8zxX9lTzVavxMEQtp9B/EJ0IqX1Adrgu7kpU6bolStXhjoMIUSI+f0GTdUuGmtaaW0yx3m1BirfN9e6qC5pobXR0358ZKyDhH5RJKZHktAvivj0SBL7RREVFwaAz/BR2lzKzoadbKjewPqq9Wys3kiztxkAm7KRFpVGZnQm/aL6kRGdQf/Y/gyOG8zAuIFE2CJC8nPoSbTPR+uGDbR88w3O5d/gXLcOvF6U3U7EpEmET59O+ZCxrLCnsqmihW0VTeyoasblNSdDVwpykqMYmxnHuIxoJib6GBHVRKSzBOoLoW6X+Vq/y+x+9O/+/rE6IGGgmXy1LznQbwJEJYfixyH6CKXUKq31lA73SUImhOgJtNa4WrzUV7TSUOmkrsJJfbmTuvIWGqpa2yfObmOxKMJj7ETHh5GYGU1yZjRJmVEkZUUTEe1ov2ZxUzG5tblsqd1CfkM+BQ0FFDYV4jW8AFiVlWEJwxiXMo5xKeMYmzyW/jH9sfaC8ULa70d7PGifD+317l48XrTPC23bfT6012e+tm33+dA+f2C8lgbDQGttjrPTun27NgzwG/iqqvCWleEtK8VXWoa3rAzt8YBSOEaMxDthMpVDx7E6tj/flTpZU1SHy2tgwWBsTAtTEloYHdXE4LA6MqghwV+FraXCHNPVXAnav/eHi0iA+P4QP8BMthIHQUKOuR6bKeO9REhIQiaE6FG0oaktb6FiZyPlOxuoKW2hodKJ2+lrP8ZiUcSlRhCfFklCehQJ6ZHEJkcQGRsY4xVpQylFo6eR6tZqalprqGmtobq1mrKWMrbUbmFzzWaavObcgzZlIzs2m4GxA8mJy2l/HZYwjEh793piTmuN0dSEt7wcX0UF/vp6/HX1+Bsa2hej1Yl2udEuF4bLhXa7MPZ873Khvd6uC1opdFIyrsQUGmKSqAiLIzcui6XRA8j32ojATZJqYpAqY3Z8FZMjysjxFxDbtAPld+99rfB4iM2AmH6BJd1cYjMCSVh/CI/rMAwhQulACZmMIRNCdAtup5fcZWUUb62lIr+xPfkKj7KTlBXN0Clp7QlYfGokMcnhWK17P6motaawqZAvS1exsnwlqypWUdpSus+9HBYHwxKGcWrOqYxMGsmopFEMiR+Cw+rY59iuoLUGnw/D7Ua7zaTJ39KCr6ISb3kZvrJyvBXl5mt5Ob7ycgxnB3NgApbYWKyxsViiolDhYVjCwrEmJmAJC0dFhJuv4eFYwsNQYeEohwPlsKPsbYsDZbMF1gOvNhvYbChbYJvVGnhvAxTKomj1GVQ1e6hs8lDe6KKswUVZo5vSRjclDS4qvR4GWcsZYillqCpmlGM70y1fcBtNRNsbsBl7JF1OwJJmTi80ci4kDYH4bIjNMud+DIvpku9FiK4kCZkQIqRczV7WfVnE+i+L8Lj8JGZEMXhyKuk5cfQbHEdcakSHUwm5fC621eSTV5/Hjvod7KjfwaaaTVS1VgGQGJ7I5LTJXDziYlIjU0lyJJBENAk6gmjDjvIFuutaPeh8J17PSjxeL4bHA4FXs/vOg3Z70B53IGHyoN1uDLfLbIFqW3d7zNYnT+DV7QKvz0y2/P7dXXqGse96YP9+KYUtORlbejphgwcTddxM7Gnp2PulY0tPx5qQgDU+HmtsrJksdSKf36CmxUNlo5uKRhcVTS4qG91UNrkobwgkXg0uGlp3t7bF0cwEaz7HReziXOtOhkRsJ86+u/aXtoWjkodC7FCITILIRLOOV2SiObYrdTREJXXq5xCiu5OETAjR5bTWOBs9rPtfERuWlOBz+xk8MYXJpw4kOTuaJm8Tda46ClzbqCuqo7K5nJqqQhrLduGsKMVXXY2vvp5wjybco4nyWJiuozhdR5Fk9CfGZ8fu8mE412I4l6NbW9EeDz6gKrAcEYsF5XBgCQtDhYejwsKwhDlQDvO9JSoKa2Jie8uUstvMsUoWhVIWsFpBgbJYzWtZFCgLWC1YwsMD1wnDEhaGJTISW1oa9rQ0bKmpKLu9874AArMJePxUN7kprW+lpL6VsgYXpfWtlDe2JV1ualrc7WW9FAbxNJNiaWRQuJMRES2cEtZEZnI9qaqeeKOWWFc54c2F5gk+IH4YZJwIaaMgZQQkD0PF95cxXEL8gCRkQgi01mhDY/gDi2EOztZaB8Znm9v9PgO/z8Dwmes+rxGoVB+oWN/qw+Py4XX5aW110+py4Wr14HZ78bkM/B6N4QHtsaC0QqNxJu+gKeNrSioKWf54M46GVuKaDRKaIa5Zk9ACo1rAtr8GJKsVS1QUlugorFFRWCKjsMRFYcmIwhIdjSUyEktkhJkwRQTWw8LNbjqHA4vDYXbLORzm8sP1sDDzmLCwQBdd96K1xunxU9PsoarZTU2zm5oWD3VODw2tXhpbvTQElsZWH40uc1ujy4ff0ETgop+qJV3V0o9aBoc3MNPRTJK1lYQIJzGRTqKMZiJ8DYS561A6MI7PAFoCiy3cHMMVnQ5pkyH9asicDBkTZCyXEIeo+/3XRYg+pC0RantQTRNIhDAHtvs8Bj6PH5/XfPV7DQwjkDwZGm2YleV9HgOvx4/X7cfn8eN1+fG4/HhcZqLkafXhcZn7/D4Dv9fA5zPw+zSGz9jnCcWjoQw3ynBjMdxY/G6sgSXM78buc2HzunH4XNh8raRUryOyde/2Kq3AFxeFkRCLyk7ElpxMZFomMf2ycaSkYk1OxpacgjUh3hwnZbd32KXZXfgNjcdn4PEZuH1+XF4Dl89Pq8dPqzewePw42957fOZ6YJu5BLa5ffi8TpS7GeVtweptQXmdWA0X4XgIw0sYXsKVhwg8RFs8DLV5ibN7ibV6iVdOYmkmJqyZKHsTEb4GHP4fjEUzAOLAHm8mU+FxEJ4FEfEQlWoWR41KCbymmolYeJwUSBXiKElCJnotbWgz6fAa7S082mhr7TECyc4eCY/XTHh8XgMj0PrjDyQrba1D7ev+wHpg2+59be/Ndb9f4/fukQAFrt2WVAXrIWeFxqZ82JUPGz7seLBpLxH4UIYPtBf8HrThQRle8HtRft/uda8Pm9uD1etDaW0uGCjDh8XwYdHmK9qLQSs+5ULbvVjsGkuEwxxIHhaGLSwCe1Qk9vBIHOGROMKjCAuPwhaegnI4sMbPxBqfYI6BSojHlmCud0VLlNaaVq+fZrePZpePFvfeCZI7kDS5vH7cPiOw+HF7zfW2BKttn9Pjo9Xtxe1uxe924fO0or0urNqDAx8OvDjwEaa8hO2RPIUpLxG4icJFtHIRjZMU5SJWuYizOIlTrUTjJBonkdqJlR80FR70R2UFFQXWCDNxikiAiEGB1wSz7lZslvmEYlym+dSiXeqoCdHVulVCppQ6BXgcsALPa60fDHFI4ghprc1uLf+e3Vt+MwHas7Un0D1mJkvmelsLTlv3mN+n2ydwdjt9gcWLz2sEWpYCiRbmPduSK8PXidmOAqvVgsWqzMVmwbrnq9WC1RbYZ7Vgc1iwWK1YbRasdgu2wKvVbsGizIRJYaC0uaCN3QO//T78Pg8+rwvD0wLuFrSrCVzN0NKEampENTZhbWzC1tiMxefDaniw+tsWN4Yd/GFW/FaFzwJeq8arNF7lx4sfQ4FhMVuj/BbwWRV+i7nut4LfYcOXGI4RFQExUVhiY7DFxuGITyE8PonIhFRiktKJS0gjIzqTpIikg87NqLXG69d4/QZefyChMTS+wHuvX+Nzazwlje1JT3vC493duuTxevB4PHi9Hrw+P16vD4/Pi9fnx/B6sPqd2LxOrH4ndn8rVn8ryvBi8XtQhgeL4TNb8XxuHG1JUSBBsisfdvzY8BOBn5jAugUDmzKwYmBXBmHKRwQewpSn/XyH9mJnjzISCjjMhza1LRztiEaFxaDCoiEsCcJjISw28BoDjujdr44oc7FHgi3MTKRsYWANMye3tkeB1S6tV0L0AN0mIVNKWYGngBOBYmCFUupDrXVuaCPreu3dWMbeY3i0Nlt99myNaWuJaWv92bs7a4/1H5xrjgMKnG+Y12gfQ7TnWCL/7v1+3+5WJb/Xj9cTaPkJtCy1jSlqS7Q6k82uCAuz4AhThIUpouxgCwv086Ex/9xoLGisNnPstNUCNpvCorT590gZKGX+nVTKwIofhQ+r9mHRXiyGF+Vzo/welNcFXhfK60K7nRheN4bLhd/lxvC4A0UyzYKZ+Hzg8wfW/Si/30yufH6U30D5/Fj8BspnmK9H2Czms0BzONRHQ32Uoj4O6jPM9bpoqI9W1EdBXTS4HBBusRGlwolU4USpcCKUg2giiFbhxGhzW7QOI0LbsGkrDsOKXSusWqECrYiG4UfvsVDjRVUV4zHyqTV81Bk+dhk+0H6z9Uz7UIYftB8LfpT2o7SBRRsobSY3VvyB5MaPDbPwpzWwODCIxI8dHzZlvrYlSPbAdovqpH9bNjCw4LeGYVjD0BaHWcHdagOrHWWxoax2LFYHymrDYrGirDZQVjPpsYXvToBs4XssYXu87rFuDQObw3y1B461OnZfxxGNsjmQ1EmIvqnbJGTANCBPa70TQCn1JnA2ELKE7N1HHqZu49E8eq12v5oZgTnbnbKilRWNFa1su98HFlSIv5bAH0/2+IOK9qO0D4s2u7iU9u61rrQPu/biMLzt3VnK8GE1/GYXl+HD6vdg83mx+r3YfV5sPg9Wvx+b0dZSFPjjHTheaR8Ww4vF8Lf95IL7sQNLG58FfFbw2MBrA6/VfO+1mfv8VvBZ9mhZsoM/jL1amnyWthao3e+1RaEs2kwYLQY2pbErjd2qcSiDMBV4tWhsDgO73Y/DbhBu1USiSdQaR2AJ0xq71tg0WAywNmosjWYTc7D/sPuw4ldmimUoK4ayYSgr2mpFKwuGspkpssUKyoJWNrTFhrbYzSfslBVlaXsK0YpSgVerHYvNHngNQ9nsYHPgtztQNgdWuwOL1b47OVIWc7FYwWLbo+Uo0ly3R5hJkNUeSIAC67ZwLFY7B27XE0KIrtGdErJMoGiP98XAMT88SCl1A3ADQP/+/YMakNVuQ2nXYZyxv6RBB1pFzNHaCn8gwTFbaHav795uJkMac4TtHucTSJa0D9WeMJnHo3XgGgYKIzB1Sdu6YSY12kx0fnjv9utiHPUfcg1oC+3dYoZF4beB22EmJYZFmdutgW6zwDGGMrdpiwILZkZhCSSqVoVWQCChaVsCzV1gUehA85dGmZsx95mvbX92Le29N4bVAhYL2qIwrOartlkwbGZ5AmWxolDYlQU7FmxYsGE115UVK1asFithWLGoPbYpGzZlwaosWC12lLJgUVasyopFKZSyYrFaUcpixqrMmJTFZsZrsZglEpTFjCGwmAmMFWWx4FMKv1K4LGbqZQn8DJSyYrEolFJYrLa9FmuglcditWK1WrFYLIHFitVidrGaPye1O8FpS3baFqsdAgmVTalu9R8QIYToyXrcf0+11s8Bz4E5dVIw73XOLbcF8/JCCCGEEADdqrW+BMje431WYJsQQgghRK/WnRKyFcBQpVSOUsoBXAx8GOKYhBBCCCGCrtt0WWqtfUqpnwP/xRyT/KLWelOIwxJCCCGECLpuk5ABaK0/AT4JdRxCCCGEEF2pO3VZCiGEEEL0SZKQCSGEEEKEmCRkQgghhBAhJgmZEEIIIUSISUImhBBCCBFikpAJIYQQQoSYJGRCCCGEECEmCZkQQgghRIhJQiaEEEIIEWJKax3qGI6YUqoK2NWJl0wGqjvxeqLzyHfTPcn30n3Jd9M9yffSfXXFdzNAa53S0Y4enZB1NqXUSq31lFDHIfYl3033JN9L9yXfTfck30v3FervRroshRBCCCFCTBIyIYQQQogQk4Rsb8+FOgCxX/LddE/yvXRf8t10T/K9dF8h/W5kDJkQQgghRIhJC5kQQgghRIhJQhaglDpFKbVVKZWnlLor1PH0VUqpbKXUV0qpXKXUJqXUzYHtiUqphUqp7YHXhFDH2hcppaxKqTVKqY8C73OUUt8Ffm/eUko5Qh1jX6SUildKvaOU2qKU2qyUmiG/M92DUurWwH/LNiql/qmUCpffm66nlHpRKVWplNq4x7YOf0eU6YnA97NeKTWpK2KUhAzzjwzwFHAqMAq4RCk1KrRR9Vk+4Hat9ShgOnBT4Lu4C/hCaz0U+CLwXnS9m4HNe7x/CHhMaz0EqAOuDUlU4nHgM631CGA85nckvzMhppTKBH4JTNFajwGswMXI700ovAyc8oNt+/sdORUYGlhuAJ7pigAlITNNA/K01ju11h7gTeDsEMfUJ2mty7TWqwPrTZh/WDIxv49XAoe9ApwTkgD7MKVUFnA68HzgvQLmAu8EDpHvJQSUUnHALOAFAK21R2tdj/zOdBc2IEIpZQMigTLk96bLaa2XALU/2Ly/35GzgVe16VsgXinVL9gxSkJmygSK9nhfHNgmQkgpNRCYCHwHpGmtywK7yoG0UMXVh/0FuAMwAu+TgHqttS/wXn5vQiMHqAJeCnQnP6+UikJ+Z0JOa10CPAoUYiZiDcAq5Pemu9jf70hIcgJJyES3pJSKBt4FbtFaN+65T5uPBsvjwV1IKXUGUKm1XhXqWMQ+bMAk4Bmt9USghR90T8rvTGgExiSdjZk0ZwBR7NttJrqB7vA7IgmZqQTI3uN9VmCbCAGllB0zGXtda/3vwOaKtibjwGtlqOLro2YCZyml/n979x/rVV3Hcfz5giRByx/TtblGzB9JhobOH8ygUGwtR2XNvFumQGsrpyama8talFvNsEmbrrl+WGrEil9KcylO4YaUAgoB4a+VGMxZ1tBCyRy++uPz+crp9r3cC5fLl7yvx8a+5/s5n/P5fM45nHvf93M+53w2U27pn0sZt3R4vRUDuW46ZSuw1fYj9fsCSoCWa6bzzgOesf2C7deARZRrKdfNgaG3a6QjMUECsmI1cEJ98mUEZdDlkg63aUiq45J+DDxu+6bGqiXAtLo8Dbh7f7dtKLP9FdvvtD2Gcn08aPtiYBlwYc2W89IBtp8Htkg6sSZNATaRa+ZA8GdggqRR9Wdb69zkujkw9HaNLAEurU9bTgBeatzaHDR5MWwl6XzKGJnhwG22v9XZFg1NkiYCK4AN7BqrdB1lHNkvgdHAs8BFtnsO0Iz9QNJk4FrbUyUdS+kxOxJYC3zG9qsdbN6QJGk85WGLEcCfgBmUP7hzzXSYpG8CXZQnyNcCn6OMR8p1sx9JmgdMBo4C/gLMAu6izTVSg+dbKLeXXwFm2F4z6G1MQBYRERHRWbllGREREdFhCcgiIiIiOiwBWURERESHJSCLiIiI6LAEZBEREREdloAsYgiRtFPSOkkbJc2XNGo/139dj++/HeT6xtb9XSvpuMGsa09JGl9ft9P6/jFJA54AXNJISd2Shks6RtKCvrf6r+3nSlov6duNtK9JuqDxfaqk6wfa1ojYJQFZxNCyw/Z42+OAfwNfaK5svD18n6ovWBxGeafcG2yfPRj1NVwALLB9qu0/7unGg3g83gKMB94IyGwvsX3DPij+s8Ai2zttP2f7wj632NWuUyj/R04BzpB0WH2D+Vm272pkvQf46P4O6CPezBKQRQxdK4DjJU2WtELSEmCTpIMl/UTShtqzdA6ApOmS7pa0XNLTkma1CpL0pdrrtlHSzJo2RtKTku4ANlJmYBhZe6zm1jzb66ck3Vi33yCpq6ZPrvUtkPRE7b1Rzx2pvU0P156dxZKOqL1PM4HLJC1rs812SXMk/UHSA5KOrunLJX1P0hrgKklT6nHYIOk2SW+t+TZLml3TV0k6vqYfLWmhpNX13/tr+jck3SlpJXAncD3QVY9HVz2+t/RRxgdr/lav39vanNeLqW8cr+dgY+P8LZJ0bz1/s9ts+1o9R8OAg4CdtZ2zmpnqvH/LgaltyoiIvTAof/1FxIGt9tB8BLi3Jp0GjLP9jKRrKL9zT5Y0Flgq6d0135nAOMrbq1dLuocyIe8M4CxAwCOSuoFtwAnANNsP13o/ZXt8myZ9ktJj9D7Km7RXS/pNXXcq8F7gOWAlZS7Ah3psfwdwpe3ueittlu2Zkm4Fttv+bps6DwHW2L5a0tcpQccVdd0I26dLOhh4Gphi+6kaXF5GmdUDypQqJ0u6tKZNpczxOcf2Q5JGA/cB76n5TwIm2t4haTpwuu0r6rGZ3mhbb2VcC1xue6WkQ4F/NXdIZeq3Y21vbrO/UI7xqcCrwJOSbra9pbXS9uOSXgAeowSNxwPDbD/Wpqw1wCTKm84jYoASkEUMLSMlravLKyi9VmcDq2w/U9MnAjcD2H5C0rNAKyC73/bfASQtqnkNLLb9ciN9EmU+uGdbwVgfJgLzbO+kTPjbDZwB/KO2bWstex0whkZAJukw4HDb3TXpdmB+P+p8HfhFXf4ZZeLnllb6iZTJoZ9qlH05uwKyeY3POXX5POCkRkfe22vwBLDE9o5+tK23MlYCN9UexkWt49JwFPDibsp9wPZLAJI2Ae8CtjQz2J7ZWpb0K+Dzkr5KCZbvt/3DuvqvwDH92JeI6IcEZBFDy46ePVT1l/7L/dy+51xrfc291t9yd6c5x99OBu/nVnNf9uZ4tJaHARNs9+y92pNy25YB3FB7Jc8HVkr6sO0nGut3AAfvptx+H0tJHwceBQ4FjrN9kaT7JM21/Uqtpz/BZUT0Q8aQRURPKyjjkKi3KkcDT9Z1H5J0pKSRlAHzK2v+CySNknQI8Ima1s5rkg7qpc4ulScDjwY+AKzqT2Nrj882SZNq0iVA9242aRkGtAa8f5r/vQ0KZb/HtMaHtSm7q/H5u7q8FLiylUFl4u92/gm0GwPWaxmSjrO9wfZ3gNXA2OZGtrcBw+ut1r1Wz9FMYDYwkl3B5nDKBOZQek03DqSeiNglAVlE9PR9YJikDZRbd9Ntt3pWVgELgfXAQttr6viin9Z1jwA/sr22l7J/AKyvt9yaFtcyfw88CHzZ9vN70OZpwI2S1lPGSfXnlQwvA2fWQe/nttum9lDNAObX4/E6cGsjyxG1zquAq2vaF4HT6wMGm+jxJGvDMsptyXWqDzE09FbGTJUHH9ZTBuD/uk25Sym3gAficuD22hO2HhhV9/9R2y/WPOdQnraMiH1A5WGZiIjd6zkI/f+dpO22D+07Z6/bb6Ycj7/tu1YNnKTTgKttXzKIdbwD+LntKYNVR8RQkx6yiIg3kdpjuUzS8EGsZjRwzSCWHzHkpIcsIiIiosPSQxYRERHRYQnIIiIiIjosAVlEREREhyUgi4iIiOiwBGQRERERHZaALCIiIqLD/gM6kxaYPA4Z6AAAAABJRU5ErkJggg==\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": "controversial-invitation",
"metadata": {},
"source": [
"## Option 2"
]
},
{
"cell_type": "code",
"execution_count": 113,
"id": "alternate-ceremony",
"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/typeConstDFAnalysis.csv\")\n",
"typeConstDF = typeConstDF.set_index(typeConstDF.iloc[:, 0])\n",
"\n",
"valTypeConstDF = pd.read_csv(\"../../allConstraintsAnalysis/valueTypeConstDFAnalysis.csv\")\n",
"valTypeConstDF = valTypeConstDF.set_index(valTypeConstDF.iloc[:, 0])\n",
"\n",
"codepConstDF1 = pd.read_csv(\"../../allConstraintsAnalysis/codepConstDFAnalysis.csv\")\n",
"codepConstDF1 = codepConstDF1.set_index(codepConstDF1.iloc[:, 0])\n",
"\n",
"symmConstDF = pd.read_csv(\"../../allConstraintsAnalysis/symmConstDFAnalysis.csv\")\n",
"symmConstDF = symmConstDF.set_index(symmConstDF.iloc[:, 0])\n",
"\n",
"invConstDF = pd.read_csv(\"../../allConstraintsAnalysis/invConstDFAnalysis.csv\")\n",
"invConstDF = invConstDF.set_index(invConstDF.iloc[:, 0])"
]
},
{
"cell_type": "code",
"execution_count": 114,
"id": "complimentary-prague",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1 = typeConstDF.add_suffix(\"_type_const\")[['violation_ratio_type_const']].sort_values(by=['violation_ratio_type_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 115,
"id": "executed-suffering",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1 = valTypeConstDF.add_suffix(\"_valuetype_const\")[['violation_ratio_valuetype_const']].sort_values(by=['violation_ratio_valuetype_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 116,
"id": "green-still",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1 = codepConstDF1.add_suffix(\"_codep_const\")[['violation_ratio_codep_const']].sort_values(by=['violation_ratio_codep_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 117,
"id": "adopted-andrew",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1 = symmConstDF.add_suffix(\"_symm_const\")[['violation_ratio_symm_const']].sort_values(by=['violation_ratio_symm_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 118,
"id": "attended-unknown",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1 = invConstDF.add_suffix(\"_inv_const\")[['violation_ratio_inv_const']].sort_values(by=['violation_ratio_inv_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 119,
"id": "conventional-blues",
"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.940000 \n",
" \n",
" \n",
" P3448 \n",
" 0.879346 \n",
" \n",
" \n",
" P925 \n",
" 0.833333 \n",
" \n",
" \n",
" P926 \n",
" 0.833333 \n",
" \n",
" \n",
" P1029 \n",
" 0.810908 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" violation_ratio_inv_const\n",
"Unnamed: 0 \n",
"P1605 0.940000\n",
"P3448 0.879346\n",
"P925 0.833333\n",
"P926 0.833333\n",
"P1029 0.810908"
]
},
"execution_count": 119,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstDF1_1.head()"
]
},
{
"cell_type": "code",
"execution_count": 147,
"id": "viral-restoration",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1456, 897, 527, 38, 110)"
]
},
"execution_count": 147,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(typeConstDF1), len(valTypeConstDF1), len(codepConstDF1_1), len(symmConstDF), len(invConstDF1_1)"
]
},
{
"cell_type": "code",
"execution_count": 120,
"id": "gross-measurement",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1.index.names = ['property']\n",
"typeConstDF1 = typeConstDF1.reset_index()[['violation_ratio_type_const']]"
]
},
{
"cell_type": "code",
"execution_count": 121,
"id": "fatty-revolution",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1.index.names = ['property']\n",
"valTypeConstDF1 = valTypeConstDF1.reset_index()[['violation_ratio_valuetype_const']]"
]
},
{
"cell_type": "code",
"execution_count": 122,
"id": "short-dallas",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1.index.names = ['property']\n",
"codepConstDF1_1 = codepConstDF1_1.reset_index()[['violation_ratio_codep_const']]"
]
},
{
"cell_type": "code",
"execution_count": 123,
"id": "sublime-helen",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1.index.names = ['property']\n",
"symmConstDF1_1 = symmConstDF1_1.reset_index()[['violation_ratio_symm_const']]"
]
},
{
"cell_type": "code",
"execution_count": 124,
"id": "dying-interview",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1.index.names = ['property']\n",
"invConstDF1_1 = invConstDF1_1.reset_index()[['violation_ratio_inv_const']]"
]
},
{
"cell_type": "code",
"execution_count": 125,
"id": "warming-glucose",
"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": 149,
"id": "intended-bulgarian",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = pd.DataFrame({'index':list(range(100, 0, -1)), 'type': typeConstDF2, 'value type': valTypeConstDF2, 'irs': codepConstDF1_2, 'symmetric': symmConstDF1_2, 'inverse': invConstDF1_2})"
]
},
{
"cell_type": "code",
"execution_count": 150,
"id": "alive-guitar",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" index \n",
" type \n",
" value type \n",
" irs \n",
" symmetric \n",
" inverse \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 100 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.000000 \n",
" \n",
" \n",
" 1 \n",
" 99 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.000000 \n",
" \n",
" \n",
" 2 \n",
" 98 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.000000 \n",
" \n",
" \n",
" 3 \n",
" 97 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.001924 \n",
" \n",
" \n",
" 4 \n",
" 96 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.010648 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" index type value type irs symmetric inverse\n",
"0 100 0.0 0.0 0.0 0.0 0.000000\n",
"1 99 0.0 0.0 0.0 0.0 0.000000\n",
"2 98 0.0 0.0 0.0 0.0 0.000000\n",
"3 97 0.0 0.0 0.0 0.0 0.001924\n",
"4 96 0.0 0.0 0.0 0.0 0.010648"
]
},
"execution_count": 150,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"constAnalysisDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 151,
"id": "tired-breed",
"metadata": {},
"outputs": [],
"source": [
"# constAnalysisDF = typeConstDF1.join(valTypeConstDF1).join(codepConstDF1_1).join(symmConstDF1_1).join(invConstDF1_1).rename(columns={'violation_ratio_type_const':'type', 'violation_ratio_valuetype_const': 'value type', 'violation_ratio_codep_const': 'irs', 'violation_ratio_symm_const': 'symmetric', 'violation_ratio_inv_const': 'inverse'}).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 152,
"id": "fuzzy-oakland",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = constAnalysisDF.melt('index', var_name='constraint', value_name='VR')"
]
},
{
"cell_type": "code",
"execution_count": 153,
"id": "common-april",
"metadata": {},
"outputs": [],
"source": [
"def getSizes(row):\n",
" map1 = {'type': 1456, 'value type': 897, 'irs': 527, 'symmetric': 38, 'inverse':110}\n",
" return map1[row['constraint']]\n",
"constAnalysisDF['len'] = constAnalysisDF.apply(getSizes, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 154,
"id": "interstate-sunday",
"metadata": {},
"outputs": [],
"source": [
"# constAnalysisDF['VR'] *= 100"
]
},
{
"cell_type": "code",
"execution_count": 155,
"id": "continent-representation",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" index \n",
" constraint \n",
" VR \n",
" len \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 100 \n",
" type \n",
" 0.0 \n",
" 1456 \n",
" \n",
" \n",
" 1 \n",
" 99 \n",
" type \n",
" 0.0 \n",
" 1456 \n",
" \n",
" \n",
" 2 \n",
" 98 \n",
" type \n",
" 0.0 \n",
" 1456 \n",
" \n",
" \n",
" 3 \n",
" 97 \n",
" type \n",
" 0.0 \n",
" 1456 \n",
" \n",
" \n",
" 4 \n",
" 96 \n",
" type \n",
" 0.0 \n",
" 1456 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" index constraint VR len\n",
"0 100 type 0.0 1456\n",
"1 99 type 0.0 1456\n",
"2 98 type 0.0 1456\n",
"3 97 type 0.0 1456\n",
"4 96 type 0.0 1456"
]
},
"execution_count": 155,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"constAnalysisDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 162,
"id": "economic-henry",
"metadata": {
"scrolled": false
},
"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": 162,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 6))\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": "compliant-anger",
"metadata": {},
"source": [
"## Option 3"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "sought-charger",
"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/typeConstDFAnalysis.csv\")\n",
"typeConstDF = typeConstDF.set_index(typeConstDF.iloc[:, 0])\n",
"\n",
"valTypeConstDF = pd.read_csv(\"../../allConstraintsAnalysis/valueTypeConstDFAnalysis.csv\")\n",
"valTypeConstDF = valTypeConstDF.set_index(valTypeConstDF.iloc[:, 0])\n",
"\n",
"codepConstDF1 = pd.read_csv(\"../../allConstraintsAnalysis/codepConstDFAnalysis.csv\")\n",
"codepConstDF1 = codepConstDF1.set_index(codepConstDF1.iloc[:, 0])\n",
"\n",
"symmConstDF = pd.read_csv(\"../../allConstraintsAnalysis/symmConstDFAnalysis.csv\")\n",
"symmConstDF = symmConstDF.set_index(symmConstDF.iloc[:, 0])\n",
"\n",
"invConstDF = pd.read_csv(\"../../allConstraintsAnalysis/invConstDFAnalysis.csv\")\n",
"invConstDF = invConstDF.set_index(invConstDF.iloc[:, 0])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "thick-inflation",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1 = typeConstDF.add_suffix(\"_type_const\")[['violation_ratio_type_const']].sort_values(by=['violation_ratio_type_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "smart-activation",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1 = valTypeConstDF.add_suffix(\"_valuetype_const\")[['violation_ratio_valuetype_const']].sort_values(by=['violation_ratio_valuetype_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "whole-missile",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1 = codepConstDF1.add_suffix(\"_codep_const\")[['violation_ratio_codep_const']].sort_values(by=['violation_ratio_codep_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "funky-calibration",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1 = symmConstDF.add_suffix(\"_symm_const\")[['violation_ratio_symm_const']].sort_values(by=['violation_ratio_symm_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "removable-transmission",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1 = invConstDF.add_suffix(\"_inv_const\")[['violation_ratio_inv_const']].sort_values(by=['violation_ratio_inv_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "european-sentence",
"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.940000 \n",
" \n",
" \n",
" P3448 \n",
" 0.879346 \n",
" \n",
" \n",
" P925 \n",
" 0.833333 \n",
" \n",
" \n",
" P926 \n",
" 0.833333 \n",
" \n",
" \n",
" P1029 \n",
" 0.810908 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" violation_ratio_inv_const\n",
"Unnamed: 0 \n",
"P1605 0.940000\n",
"P3448 0.879346\n",
"P925 0.833333\n",
"P926 0.833333\n",
"P1029 0.810908"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstDF1_1.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "lined-discrimination",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1456, 897, 527, 38, 110)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(typeConstDF1), len(valTypeConstDF1), len(codepConstDF1_1), len(symmConstDF), len(invConstDF1_1)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "imported-cooling",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1.index.names = ['property']\n",
"typeConstDF1 = typeConstDF1.reset_index()[['violation_ratio_type_const']]"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "hydraulic-coating",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1.index.names = ['property']\n",
"valTypeConstDF1 = valTypeConstDF1.reset_index()[['violation_ratio_valuetype_const']]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "brief-amsterdam",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1.index.names = ['property']\n",
"codepConstDF1_1 = codepConstDF1_1.reset_index()[['violation_ratio_codep_const']]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "massive-championship",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1.index.names = ['property']\n",
"symmConstDF1_1 = symmConstDF1_1.reset_index()[['violation_ratio_symm_const']]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "psychological-homeless",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1.index.names = ['property']\n",
"invConstDF1_1 = invConstDF1_1.reset_index()[['violation_ratio_inv_const']]"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "alpine-sampling",
"metadata": {},
"outputs": [],
"source": [
"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": 48,
"id": "elementary-attack",
"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": 49,
"id": "focused-georgia",
"metadata": {},
"outputs": [],
"source": [
"# constAnalysisDF = typeConstDF1.join(valTypeConstDF1).join(codepConstDF1_1).join(symmConstDF1_1).join(invConstDF1_1).rename(columns={'violation_ratio_type_const':'type', 'violation_ratio_valuetype_const': 'value type', 'violation_ratio_codep_const': 'irs', 'violation_ratio_symm_const': 'symmetric', 'violation_ratio_inv_const': 'inverse'}).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "military-democrat",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = constAnalysisDF.melt('index', var_name='constraint', value_name='VR')"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "fuzzy-somalia",
"metadata": {},
"outputs": [],
"source": [
"# def getSizes(row):\n",
"# map1 = {'type': 1456, 'value type': 897, 'irs': 527, 'symmetric': 38, 'inverse':110}\n",
"# return map1[row['constraint']]\n",
"# constAnalysisDF['len'] = constAnalysisDF.apply(getSizes, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "alleged-portugal",
"metadata": {},
"outputs": [],
"source": [
"# constAnalysisDF['VR'] *= 100"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "australian-offering",
"metadata": {
"scrolled": true
},
"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": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"constAnalysisDF.head()"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "placed-speech",
"metadata": {
"scrolled": false
},
"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": 54,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAFpCAYAAAAyZzT/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACwxklEQVR4nOzdd3yV1f3A8c+5e+TejJu9yAJCgBAgIkMcgDjALXXgXrWOamutttrWttrxU9tabWvr3ltxVquCC3CEJXsHErL3Tu44vz8uBGIQAiS5IXzfr1deyT3P85zn+wT7yrfnnOd7lNYaIYQQQggROoZQByCEEEIIcaSThEwIIYQQIsQkIRNCCCGECDFJyIQQQgghQkwSMiGEEEKIEJOETAghhBAixEyhDuBQREdH67S0tFCHIYQQQgixX0uWLKnSWsfs7dhhnZClpaVRUFAQ6jCEEEIIIfZLKbXt+47JlKUQQgghRIhJQiaEEEIIEWKSkAkhhBBChNhhvYZMCCGEEAfO6/VSXFxMW1tbqEMZlGw2G8nJyZjN5h5fIwmZEEIIcYQpLi7G5XKRlpaGUirU4QwqWmuqq6spLi4mPT29x9fJlKUQQghxhGlra8Pj8Ugy1geUUng8ngMefZSETAghhDgCSTLWdw7mdysJmRBCCCEGrD/84Q8Hdd1VV13FmjVr9nnOvHnz9ntOf5GETAghhBAD1vclZFprAoHA91736KOPkpOTs8++j4iETCn1uFKqQim1ao+2KKXUh0qpjTu/R+5sV0qpvyulNimlvlVKjeuruHqqwxegqXQD/uKl7ChdxpdbP2RtSQGrdnzJV1s/YlP5t3y97WNW7/iSNaXfsHjL+2wsWULB1o9YUVbAuup1LC5ZzMbajXj93lA/jhBCCNGnnn76aXJzcxkzZgwXX3wxhYWFTJs2jdzcXKZPn8727dsBuOyyy/jxj3/M5MmTycjI4NVXXwWgtLSUY489lry8PEaNGsXnn3/O7bffTmtrK3l5ecydO5fCwkKGDx/OJZdcwqhRoygqKuJHP/oR+fn5jBw5kt/85jed8Rx//PGdu/mEhYVxxx13MGbMGCZOnEh5eTmLFi3irbfe4tZbbyUvL4/Nmzf3/y9tD0pr3TcdK3Us0AQ8rbUetbPt/4AarfWflFK3A5Fa69uUUqcCNwKnAkcDD2itj97fPfLz83VfbJ3U4fOjiwqwdtSx0uHg+oV3MDRyKEPcQ3h1w6vcPO5mXtnwClaTlemp03ls5WNcNvIyFpUsoqKlgktGXsI/l/8Th8nB5aMup7ylnGZvM6ekn8K42HHYTLZej1kIIYToqbVr1zJixIhe62/16tWcddZZLFq0iOjoaGpqarj00ks599xzufTSS3n88cd56623mDdvHpdddhnNzc289NJLrFu3jtNPP51NmzZx//3309bWxh133IHf76elpQWXy0VYWBhNTU0AFBYWkpGRwaJFi5g4cSIANTU1REVF4ff7mT59On//+9/Jzc3l+OOP57777iM/Px+lFG+99RannXYaP//5z3G73dx5551cdtllzJ49m3PPPbfXfhe77O13rJRaorXO39v5fTZCprX+DKj5TvMZwFM7f34KOHOP9qd10JdAhFIqoa9i25/66nIszTtoNFv507f/ora9lqMTjuaVDa8wPGo4q6pXUdxUzElDTuLRlY8Sbg2n1dfK2pq1nJZ5Go9++yjt/vbOxOy5tc8xb9M8fvjhD1lStiRUjyWEEEL0ifnz5zNnzhyio6MBiIqKYvHixVx44YUAXHzxxXzxxRed55955pkYDAZycnIoLy8H4KijjuKJJ57grrvuYuXKlbhcrr3ea8iQIZ3JGMDLL7/MuHHjGDt2LKtXr97rFKTFYmH27NkAjB8/nsLCwl557t7U32vI4rTWpTt/LgPidv6cBBTtcV7xzrZulFLXKKUKlFIFlZWVfRKksb0WBTSYLKysCs64tvvbAcgMz2RNdfAf26d9BHSAVFcqG+s2AmA2mGn0NuIyu6hurabNH3ztdWLCRG4adxMLihbw+sbXKWoo6n5jIYQQ4ghgtVo7f941U3fsscfy2WefkZSUxGWXXcbTTz+912udTmfnz1u3buW+++7j448/5ttvv2XWrFl7LTdhNps733w0Go34fL7efJxeEbJF/Tr4L3DA86Va6/9orfO11vkxMTF9EBn4bB40EOFr56jY4HI2qzH4H8+62nWMiRkDgFEZMSkTW+q3MCIqOCzZ7m8nwhqBwWAgoIOLDeOd8eR4cnhg6QO8tOElfrPoN9y04CbKmsv6JH4hhBCiP02bNo1XXnmF6upqIDiNOHnyZF588UUAnnvuOaZOnbrPPrZt20ZcXBxXX301V111FUuXLgWCyZTXu/e12A0NDTidTsLD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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 6))\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": "adjustable-geneva",
"metadata": {},
"source": [
"## Option 4"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "furnished-northwest",
"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/typeConstDFAnalysis.csv\")\n",
"typeConstDF = typeConstDF.set_index(typeConstDF.iloc[:, 0])\n",
"\n",
"valTypeConstDF = pd.read_csv(\"../../allConstraintsAnalysis/valueTypeConstDFAnalysis.csv\")\n",
"valTypeConstDF = valTypeConstDF.set_index(valTypeConstDF.iloc[:, 0])\n",
"\n",
"codepConstDF1 = pd.read_csv(\"../../allConstraintsAnalysis/codepConstDFAnalysis.csv\")\n",
"codepConstDF1 = codepConstDF1.set_index(codepConstDF1.iloc[:, 0])\n",
"\n",
"symmConstDF = pd.read_csv(\"../../allConstraintsAnalysis/symmConstDFAnalysis.csv\")\n",
"symmConstDF = symmConstDF.set_index(symmConstDF.iloc[:, 0])\n",
"\n",
"invConstDF = pd.read_csv(\"../../allConstraintsAnalysis/invConstDFAnalysis.csv\")\n",
"invConstDF = invConstDF.set_index(invConstDF.iloc[:, 0])"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "proof-screen",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" correct \n",
" incorrect \n",
" paths \n",
" violation_ratio \n",
" total \n",
" \n",
" \n",
" Unnamed: 0 \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P742 \n",
" P742 \n",
" 48903 \n",
" 89 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.001817 \n",
" 48992 \n",
" \n",
" \n",
" P2663 \n",
" P2663 \n",
" 554 \n",
" 7 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.012478 \n",
" 561 \n",
" \n",
" \n",
" P5105 \n",
" P5105 \n",
" 1919 \n",
" 95 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.047170 \n",
" 2014 \n",
" \n",
" \n",
" P6938 \n",
" P6938 \n",
" 3 \n",
" 2 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.400000 \n",
" 5 \n",
" \n",
" \n",
" P3179 \n",
" P3179 \n",
" 5052 \n",
" 13 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.002567 \n",
" 5065 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" P1072 \n",
" P1072 \n",
" 5263 \n",
" 123 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.022837 \n",
" 5386 \n",
" \n",
" \n",
" P1073 \n",
" P1073 \n",
" 2263 \n",
" 22 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.009628 \n",
" 2285 \n",
" \n",
" \n",
" P16 \n",
" P16 \n",
" 49781 \n",
" 238 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.004758 \n",
" 50019 \n",
" \n",
" \n",
" P1465 \n",
" P1465 \n",
" 15071 \n",
" 10 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.000663 \n",
" 15081 \n",
" \n",
" \n",
" P1470 \n",
" P1470 \n",
" 24 \n",
" 0 \n",
" ['../../allConstraintsAnalysis/typeConstraint_... \n",
" 0.000000 \n",
" 24 \n",
" \n",
" \n",
"
\n",
"
1456 rows × 6 columns
\n",
"
"
],
"text/plain": [
" Unnamed: 0 correct incorrect \\\n",
"Unnamed: 0 \n",
"P742 P742 48903 89 \n",
"P2663 P2663 554 7 \n",
"P5105 P5105 1919 95 \n",
"P6938 P6938 3 2 \n",
"P3179 P3179 5052 13 \n",
"... ... ... ... \n",
"P1072 P1072 5263 123 \n",
"P1073 P1073 2263 22 \n",
"P16 P16 49781 238 \n",
"P1465 P1465 15071 10 \n",
"P1470 P1470 24 0 \n",
"\n",
" paths \\\n",
"Unnamed: 0 \n",
"P742 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"P2663 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"P5105 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"P6938 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"P3179 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"... ... \n",
"P1072 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"P1073 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"P16 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"P1465 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"P1470 ['../../allConstraintsAnalysis/typeConstraint_... \n",
"\n",
" violation_ratio total \n",
"Unnamed: 0 \n",
"P742 0.001817 48992 \n",
"P2663 0.012478 561 \n",
"P5105 0.047170 2014 \n",
"P6938 0.400000 5 \n",
"P3179 0.002567 5065 \n",
"... ... ... \n",
"P1072 0.022837 5386 \n",
"P1073 0.009628 2285 \n",
"P16 0.004758 50019 \n",
"P1465 0.000663 15081 \n",
"P1470 0.000000 24 \n",
"\n",
"[1456 rows x 6 columns]"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"typeConstDF"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "naked-depth",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1 = typeConstDF.add_suffix(\"_type_const\")[['violation_ratio_type_const','incorrect_type_const']].sort_values(by=['violation_ratio_type_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "thousand-embassy",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1 = valTypeConstDF.add_suffix(\"_valuetype_const\")[['violation_ratio_valuetype_const','incorrect_valuetype_const']].sort_values(by=['violation_ratio_valuetype_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "anticipated-calgary",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1 = codepConstDF1.add_suffix(\"_codep_const\")[['violation_ratio_codep_const','incorrect_codep_const']].sort_values(by=['violation_ratio_codep_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "vanilla-trouble",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1 = symmConstDF.add_suffix(\"_symm_const\")[['violation_ratio_symm_const','incorrect_symm_const']].sort_values(by=['violation_ratio_symm_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "inappropriate-permit",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1 = invConstDF.add_suffix(\"_inv_const\")[['violation_ratio_inv_const','incorrect_inv_const']].sort_values(by=['violation_ratio_inv_const'],ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "technical-colors",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" violation_ratio_inv_const \n",
" incorrect_inv_const \n",
" \n",
" \n",
" Unnamed: 0 \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" P1605 \n",
" 0.940000 \n",
" 188 \n",
" \n",
" \n",
" P3448 \n",
" 0.879346 \n",
" 4249 \n",
" \n",
" \n",
" P925 \n",
" 0.833333 \n",
" 5 \n",
" \n",
" \n",
" P926 \n",
" 0.833333 \n",
" 5 \n",
" \n",
" \n",
" P1029 \n",
" 0.810908 \n",
" 2037 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" violation_ratio_inv_const incorrect_inv_const\n",
"Unnamed: 0 \n",
"P1605 0.940000 188\n",
"P3448 0.879346 4249\n",
"P925 0.833333 5\n",
"P926 0.833333 5\n",
"P1029 0.810908 2037"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"invConstDF1_1.head()"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "utility-criticism",
"metadata": {},
"outputs": [],
"source": [
"typeConstDF1.index.names = ['property']\n",
"typeConstDF1 = typeConstDF1.reset_index()[['violation_ratio_type_const','incorrect_type_const']]"
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "according-protection",
"metadata": {},
"outputs": [],
"source": [
"valTypeConstDF1.index.names = ['property']\n",
"valTypeConstDF1 = valTypeConstDF1.reset_index()[['violation_ratio_valuetype_const','incorrect_valuetype_const']]"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "choice-relationship",
"metadata": {},
"outputs": [],
"source": [
"codepConstDF1_1.index.names = ['property']\n",
"codepConstDF1_1 = codepConstDF1_1.reset_index()[['violation_ratio_codep_const','incorrect_codep_const']]"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "atomic-foster",
"metadata": {},
"outputs": [],
"source": [
"symmConstDF1_1.index.names = ['property']\n",
"symmConstDF1_1 = symmConstDF1_1.reset_index()[['violation_ratio_symm_const','incorrect_symm_const']]"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "compatible-silly",
"metadata": {},
"outputs": [],
"source": [
"invConstDF1_1.index.names = ['property']\n",
"invConstDF1_1 = invConstDF1_1.reset_index()[['violation_ratio_inv_const','incorrect_inv_const']]"
]
},
{
"cell_type": "code",
"execution_count": 102,
"id": "portuguese-concentrate",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = typeConstDF1.join(valTypeConstDF1).join(codepConstDF1_1).join(symmConstDF1_1).join(invConstDF1_1).rename(columns={'violation_ratio_type_const':'type', 'violation_ratio_valuetype_const': 'value type', 'violation_ratio_codep_const': 'irs', 'violation_ratio_symm_const': 'symmetric', 'violation_ratio_inv_const': 'inverse'}).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 103,
"id": "twenty-gross",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" index \n",
" type \n",
" incorrect_type_const \n",
" value type \n",
" incorrect_valuetype_const \n",
" irs \n",
" incorrect_codep_const \n",
" symmetric \n",
" incorrect_symm_const \n",
" inverse \n",
" incorrect_inv_const \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 1.0 \n",
" 4 \n",
" 1.0 \n",
" 1369.0 \n",
" 1.0 \n",
" 1.0 \n",
" 1.000000 \n",
" 2.0 \n",
" 0.940000 \n",
" 188.0 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 1.0 \n",
" 4 \n",
" 1.0 \n",
" 5.0 \n",
" 1.0 \n",
" 8.0 \n",
" 0.924528 \n",
" 49.0 \n",
" 0.879346 \n",
" 4249.0 \n",
" \n",
" \n",
" 2 \n",
" 2 \n",
" 1.0 \n",
" 1 \n",
" 1.0 \n",
" 13.0 \n",
" 1.0 \n",
" 1.0 \n",
" 0.628133 \n",
" 777.0 \n",
" 0.833333 \n",
" 5.0 \n",
" \n",
" \n",
" 3 \n",
" 3 \n",
" 1.0 \n",
" 3 \n",
" 1.0 \n",
" 3.0 \n",
" 1.0 \n",
" 1.0 \n",
" 0.256228 \n",
" 144.0 \n",
" 0.833333 \n",
" 5.0 \n",
" \n",
" \n",
" 4 \n",
" 4 \n",
" 1.0 \n",
" 64 \n",
" 1.0 \n",
" 12.0 \n",
" 1.0 \n",
" 42211.0 \n",
" 0.161220 \n",
" 1919.0 \n",
" 0.810908 \n",
" 2037.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" index type incorrect_type_const value type incorrect_valuetype_const \\\n",
"0 0 1.0 4 1.0 1369.0 \n",
"1 1 1.0 4 1.0 5.0 \n",
"2 2 1.0 1 1.0 13.0 \n",
"3 3 1.0 3 1.0 3.0 \n",
"4 4 1.0 64 1.0 12.0 \n",
"\n",
" irs incorrect_codep_const symmetric incorrect_symm_const inverse \\\n",
"0 1.0 1.0 1.000000 2.0 0.940000 \n",
"1 1.0 8.0 0.924528 49.0 0.879346 \n",
"2 1.0 1.0 0.628133 777.0 0.833333 \n",
"3 1.0 1.0 0.256228 144.0 0.833333 \n",
"4 1.0 42211.0 0.161220 1919.0 0.810908 \n",
"\n",
" incorrect_inv_const \n",
"0 188.0 \n",
"1 4249.0 \n",
"2 5.0 \n",
"3 5.0 \n",
"4 2037.0 "
]
},
"execution_count": 103,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"constAnalysisDF"
]
},
{
"cell_type": "code",
"execution_count": 105,
"id": "nervous-herald",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF = constAnalysisDF.melt('index', var_name='constraint', value_name='VR')"
]
},
{
"cell_type": "code",
"execution_count": 98,
"id": "standard-conditioning",
"metadata": {},
"outputs": [],
"source": [
"constAnalysisDF['VR'] *= 100"
]
},
{
"cell_type": "code",
"execution_count": 106,
"id": "advisory-nutrition",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" index \n",
" constraint \n",
" VR \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" type \n",
" 1.0 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" type \n",
" 1.0 \n",
" \n",
" \n",
" 2 \n",
" 2 \n",
" type \n",
" 1.0 \n",
" \n",
" \n",
" 3 \n",
" 3 \n",
" type \n",
" 1.0 \n",
" \n",
" \n",
" 4 \n",
" 4 \n",
" type \n",
" 1.0 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 14555 \n",
" 1451 \n",
" incorrect_inv_const \n",
" NaN \n",
" \n",
" \n",
" 14556 \n",
" 1452 \n",
" incorrect_inv_const \n",
" NaN \n",
" \n",
" \n",
" 14557 \n",
" 1453 \n",
" incorrect_inv_const \n",
" NaN \n",
" \n",
" \n",
" 14558 \n",
" 1454 \n",
" incorrect_inv_const \n",
" NaN \n",
" \n",
" \n",
" 14559 \n",
" 1455 \n",
" incorrect_inv_const \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
14560 rows × 3 columns
\n",
"
"
],
"text/plain": [
" index constraint VR\n",
"0 0 type 1.0\n",
"1 1 type 1.0\n",
"2 2 type 1.0\n",
"3 3 type 1.0\n",
"4 4 type 1.0\n",
"... ... ... ...\n",
"14555 1451 incorrect_inv_const NaN\n",
"14556 1452 incorrect_inv_const NaN\n",
"14557 1453 incorrect_inv_const NaN\n",
"14558 1454 incorrect_inv_const NaN\n",
"14559 1455 incorrect_inv_const NaN\n",
"\n",
"[14560 rows x 3 columns]"
]
},
"execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"constAnalysisDF"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "organic-female",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"[Text(0.5, 0, 'Properties'),\n",
" Text(0, 0.5, 'Violation Ratio (in %)'),\n",
" [Text(-200.0, 0, ''),\n",
" Text(0.0, 0, ''),\n",
" Text(200.0, 0, ''),\n",
" Text(400.0, 0, ''),\n",
" Text(600.0, 0, ''),\n",
" Text(800.0, 0, ''),\n",
" Text(1000.0, 0, ''),\n",
" Text(1200.0, 0, ''),\n",
" Text(1400.0, 0, ''),\n",
" Text(1600.0, 0, '')]]"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 6))\n",
"ax = sns.scatterplot(x='index',y='VR',hue='constraint',data=constAnalysisDF)\n",
"ax.set(xlabel=\"Properties\", ylabel = \"Violation Ratio (in %)\",xticklabels=[])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "interior-formula",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "baking-pierce",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "subsequent-reverse",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "unknown-racing",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "lyric-section",
"metadata": {},
"outputs": [],
"source": []
},
{
"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/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/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": false
},
"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
}