Commit d080b40076ecd7ebad3d03e24b0358a15c5bc21b
1 parent
e43d9d3b
Exists in
master
Paper draft: Extending Probabilities;
Support code: Event and Lattice look fine.
Showing
13 changed files
with
547 additions
and
385 deletions
Show diff stats
.vscode/launch.json
| @@ -4,6 +4,8 @@ | @@ -4,6 +4,8 @@ | ||
| 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 |
| 5 | "version": "0.2.0", | 5 | "version": "0.2.0", |
| 6 | "configurations": [ | 6 | "configurations": [ |
| 7 | + | ||
| 8 | + | ||
| 7 | { | 9 | { |
| 8 | "name": "Python: Current File", | 10 | "name": "Python: Current File", |
| 9 | "type": "python", | 11 | "type": "python", |
code/python/EventLattice.ipynb
| @@ -2,26 +2,37 @@ | @@ -2,26 +2,37 @@ | ||
| 2 | "cells": [ | 2 | "cells": [ |
| 3 | { | 3 | { |
| 4 | "cell_type": "code", | 4 | "cell_type": "code", |
| 5 | - "execution_count": 7, | 5 | + "execution_count": 4, |
| 6 | "id": "57fc5921-9d6b-4b43-a8f6-743a03650d63", | 6 | "id": "57fc5921-9d6b-4b43-a8f6-743a03650d63", |
| 7 | "metadata": {}, | 7 | "metadata": {}, |
| 8 | - "outputs": [], | 8 | + "outputs": [ |
| 9 | + { | ||
| 10 | + "name": "stdout", | ||
| 11 | + "output_type": "stream", | ||
| 12 | + "text": [ | ||
| 13 | + "The autoreload extension is already loaded. To reload it, use:\n", | ||
| 14 | + " %reload_ext autoreload\n" | ||
| 15 | + ] | ||
| 16 | + } | ||
| 17 | + ], | ||
| 9 | "source": [ | 18 | "source": [ |
| 10 | - "import event_lattice as el" | 19 | + "%load_ext autoreload\n", |
| 20 | + "%autoreload 1\n", | ||
| 21 | + "%aimport event_lattice" | ||
| 11 | ] | 22 | ] |
| 12 | }, | 23 | }, |
| 13 | { | 24 | { |
| 14 | "cell_type": "code", | 25 | "cell_type": "code", |
| 15 | - "execution_count": 8, | 26 | + "execution_count": 5, |
| 16 | "id": "00f0eb68", | 27 | "id": "00f0eb68", |
| 17 | "metadata": {}, | 28 | "metadata": {}, |
| 18 | "outputs": [], | 29 | "outputs": [], |
| 19 | "source": [ | 30 | "source": [ |
| 20 | - "def zoom_event(event_str, lattice, lower_op=el.sum_op, upper_op=el.prod_op):\n", | ||
| 21 | - " event = el.Event.from_str(event_str)\n", | 31 | + "def zoom_event(event_str, lattice):\n", |
| 32 | + " event = event_lattice.Event.from_str(event_str)\n", | ||
| 22 | " event_class = lattice.event_class(event)\n", | 33 | " event_class = lattice.event_class(event)\n", |
| 23 | - " propagated = lattice.propagated_value(\n", | ||
| 24 | - " event, lower_op=lower_op, upper_op=upper_op)\n", | 34 | + " propagated = lattice.extended_value(\n", |
| 35 | + " event)\n", | ||
| 25 | "\n", | 36 | "\n", |
| 26 | " print(\n", | 37 | " print(\n", |
| 27 | " f\"Event: {event}\\n\\tClass: {event_class} \\n\\tValue: {propagated}\")" | 38 | " f\"Event: {event}\\n\\tClass: {event_class} \\n\\tValue: {propagated}\")" |
| @@ -29,7 +40,7 @@ | @@ -29,7 +40,7 @@ | ||
| 29 | }, | 40 | }, |
| 30 | { | 41 | { |
| 31 | "cell_type": "code", | 42 | "cell_type": "code", |
| 32 | - "execution_count": 9, | 43 | + "execution_count": 6, |
| 33 | "id": "cdd8c6d6", | 44 | "id": "cdd8c6d6", |
| 34 | "metadata": {}, | 45 | "metadata": {}, |
| 35 | "outputs": [ | 46 | "outputs": [ |
| @@ -49,42 +60,34 @@ | @@ -49,42 +60,34 @@ | ||
| 49 | } | 60 | } |
| 50 | ], | 61 | ], |
| 51 | "source": [ | 62 | "source": [ |
| 52 | - "smodels = el.Lattice.parse({\n", | 63 | + "smodels = event_lattice.Lattice.parse({\n", |
| 53 | " \"A\": 2,\n", | 64 | " \"A\": 2,\n", |
| 54 | " \"ab\": 3,\n", | 65 | " \"ab\": 3,\n", |
| 55 | " \"ac\": 5\n", | 66 | " \"ac\": 5\n", |
| 56 | "})\n", | 67 | "})\n", |
| 57 | "\n", | 68 | "\n", |
| 58 | - "lattice = el.Lattice(smodels)\n", | 69 | + "lattice = event_lattice.Lattice(smodels)\n", |
| 59 | "\n", | 70 | "\n", |
| 60 | "print(lattice)" | 71 | "print(lattice)" |
| 61 | ] | 72 | ] |
| 62 | }, | 73 | }, |
| 63 | { | 74 | { |
| 64 | "cell_type": "code", | 75 | "cell_type": "code", |
| 65 | - "execution_count": 10, | 76 | + "execution_count": 7, |
| 66 | "id": "2b445339", | 77 | "id": "2b445339", |
| 67 | "metadata": {}, | 78 | "metadata": {}, |
| 68 | "outputs": [ | 79 | "outputs": [ |
| 69 | { | 80 | { |
| 70 | - "name": "stdout", | ||
| 71 | - "output_type": "stream", | ||
| 72 | - "text": [ | ||
| 73 | - "Event: abc\n", | ||
| 74 | - "\tClass: <|ac,ab> \n", | ||
| 75 | - "\tValue: 8\n", | ||
| 76 | - "Event: a\n", | ||
| 77 | - "\tClass: <ac,ab|> \n", | ||
| 78 | - "\tValue: 15\n", | ||
| 79 | - "Event: b\n", | ||
| 80 | - "\tClass: <ab|> \n", | ||
| 81 | - "\tValue: 3\n", | ||
| 82 | - "Event: bc\n", | ||
| 83 | - "\tClass: <|> \n", | ||
| 84 | - "\tValue: 0\n", | ||
| 85 | - "Event: ac\n", | ||
| 86 | - "\tClass: <ac|ac> \n", | ||
| 87 | - "\tValue: 5\n" | 81 | + "ename": "TypeError", |
| 82 | + "evalue": "__init__() missing 1 required positional argument: 'lattice'", | ||
| 83 | + "output_type": "error", | ||
| 84 | + "traceback": [ | ||
| 85 | + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | ||
| 86 | + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", | ||
| 87 | + "\u001b[0;32m/tmp/ipykernel_361713/2581811254.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mzoom_event\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"abc\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlattice\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 2\u001b[0m \u001b[0mzoom_event\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"a\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlattice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mzoom_event\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"b\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlattice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mzoom_event\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"bc\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlattice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mzoom_event\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"ac\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlattice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | ||
| 88 | + "\u001b[0;32m/tmp/ipykernel_361713/1675915232.py\u001b[0m in \u001b[0;36mzoom_event\u001b[0;34m(event_str, lattice)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mzoom_event\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevent_str\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlattice\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[1;32m 2\u001b[0m \u001b[0mevent\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mevent_lattice\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mEvent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevent_str\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mevent_class\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlattice\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevent_class\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevent\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 4\u001b[0m propagated = lattice.extended_value(\n\u001b[1;32m 5\u001b[0m event)\n", | ||
| 89 | + "\u001b[0;32m~/sci/projetos/zugzwang/code/python/event_lattice.py\u001b[0m in \u001b[0;36mevent_class\u001b[0;34m(self, event)\u001b[0m\n\u001b[1;32m 146\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mcache\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mevent_class\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mevent\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;32m--> 148\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mEventsClass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstable_core\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevent\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[0m\u001b[1;32m 149\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrelated\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\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", | ||
| 90 | + "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'lattice'" | ||
| 88 | ] | 91 | ] |
| 89 | } | 92 | } |
| 90 | ], | 93 | ], |
| @@ -98,209 +101,10 @@ | @@ -98,209 +101,10 @@ | ||
| 98 | }, | 101 | }, |
| 99 | { | 102 | { |
| 100 | "cell_type": "code", | 103 | "cell_type": "code", |
| 101 | - "execution_count": 11, | 104 | + "execution_count": null, |
| 102 | "id": "f1b85255", | 105 | "id": "f1b85255", |
| 103 | "metadata": {}, | 106 | "metadata": {}, |
| 104 | - "outputs": [ | ||
| 105 | - { | ||
| 106 | - "name": "stdout", | ||
| 107 | - "output_type": "stream", | ||
| 108 | - "text": [ | ||
| 109 | - "Event: \n", | ||
| 110 | - "\tClass: <A,ac,ab|> \n", | ||
| 111 | - "\tValue: 30\n", | ||
| 112 | - "Event: A\n", | ||
| 113 | - "\tClass: <A|A> \n", | ||
| 114 | - "\tValue: 2\n", | ||
| 115 | - "Event: b\n", | ||
| 116 | - "\tClass: <ab|> \n", | ||
| 117 | - "\tValue: 3\n", | ||
| 118 | - "Event: a\n", | ||
| 119 | - "\tClass: <ac,ab|> \n", | ||
| 120 | - "\tValue: 15\n", | ||
| 121 | - "Event: B\n", | ||
| 122 | - "\tClass: <|> \n", | ||
| 123 | - "\tValue: 0\n", | ||
| 124 | - "Event: c\n", | ||
| 125 | - "\tClass: <ac|> \n", | ||
| 126 | - "\tValue: 5\n", | ||
| 127 | - "Event: C\n", | ||
| 128 | - "\tClass: <|> \n", | ||
| 129 | - "\tValue: 0\n", | ||
| 130 | - "Event: Ab\n", | ||
| 131 | - "\tClass: <|A> \n", | ||
| 132 | - "\tValue: 2\n", | ||
| 133 | - "Event: Aa\n", | ||
| 134 | - "\tClass: <|A> \n", | ||
| 135 | - "\tValue: 0\n", | ||
| 136 | - "Event: AB\n", | ||
| 137 | - "\tClass: <|A> \n", | ||
| 138 | - "\tValue: 2\n", | ||
| 139 | - "Event: Ac\n", | ||
| 140 | - "\tClass: <|A> \n", | ||
| 141 | - "\tValue: 2\n", | ||
| 142 | - "Event: AC\n", | ||
| 143 | - "\tClass: <|A> \n", | ||
| 144 | - "\tValue: 2\n", | ||
| 145 | - "Event: ab\n", | ||
| 146 | - "\tClass: <ab|ab> \n", | ||
| 147 | - "\tValue: 3\n", | ||
| 148 | - "Event: Bb\n", | ||
| 149 | - "\tClass: <|> \n", | ||
| 150 | - "\tValue: 0\n", | ||
| 151 | - "Event: bc\n", | ||
| 152 | - "\tClass: <|> \n", | ||
| 153 | - "\tValue: 0\n", | ||
| 154 | - "Event: Cb\n", | ||
| 155 | - "\tClass: <|> \n", | ||
| 156 | - "\tValue: 0\n", | ||
| 157 | - "Event: Ba\n", | ||
| 158 | - "\tClass: <|> \n", | ||
| 159 | - "\tValue: 0\n", | ||
| 160 | - "Event: ac\n", | ||
| 161 | - "\tClass: <ac|ac> \n", | ||
| 162 | - "\tValue: 5\n", | ||
| 163 | - "Event: Ca\n", | ||
| 164 | - "\tClass: <|> \n", | ||
| 165 | - "\tValue: 0\n", | ||
| 166 | - "Event: Bc\n", | ||
| 167 | - "\tClass: <|> \n", | ||
| 168 | - "\tValue: 0\n", | ||
| 169 | - "Event: BC\n", | ||
| 170 | - "\tClass: <|> \n", | ||
| 171 | - "\tValue: 0\n", | ||
| 172 | - "Event: Cc\n", | ||
| 173 | - "\tClass: <|> \n", | ||
| 174 | - "\tValue: 0\n", | ||
| 175 | - "Event: Aab\n", | ||
| 176 | - "\tClass: <|A,ab> \n", | ||
| 177 | - "\tValue: 0\n", | ||
| 178 | - "Event: ABb\n", | ||
| 179 | - "\tClass: <|A> \n", | ||
| 180 | - "\tValue: 0\n", | ||
| 181 | - "Event: Abc\n", | ||
| 182 | - "\tClass: <|A> \n", | ||
| 183 | - "\tValue: 2\n", | ||
| 184 | - "Event: ACb\n", | ||
| 185 | - "\tClass: <|A> \n", | ||
| 186 | - "\tValue: 2\n", | ||
| 187 | - "Event: ABa\n", | ||
| 188 | - "\tClass: <|A> \n", | ||
| 189 | - "\tValue: 0\n", | ||
| 190 | - "Event: Aac\n", | ||
| 191 | - "\tClass: <|A,ac> \n", | ||
| 192 | - "\tValue: 0\n", | ||
| 193 | - "Event: ACa\n", | ||
| 194 | - "\tClass: <|A> \n", | ||
| 195 | - "\tValue: 0\n", | ||
| 196 | - "Event: ABc\n", | ||
| 197 | - "\tClass: <|A> \n", | ||
| 198 | - "\tValue: 2\n", | ||
| 199 | - "Event: ABC\n", | ||
| 200 | - "\tClass: <|A> \n", | ||
| 201 | - "\tValue: 2\n", | ||
| 202 | - "Event: ACc\n", | ||
| 203 | - "\tClass: <|A> \n", | ||
| 204 | - "\tValue: 0\n", | ||
| 205 | - "Event: Bab\n", | ||
| 206 | - "\tClass: <|ab> \n", | ||
| 207 | - "\tValue: 0\n", | ||
| 208 | - "Event: abc\n", | ||
| 209 | - "\tClass: <|ac,ab> \n", | ||
| 210 | - "\tValue: 8\n", | ||
| 211 | - "Event: Cab\n", | ||
| 212 | - "\tClass: <|ab> \n", | ||
| 213 | - "\tValue: 3\n", | ||
| 214 | - "Event: Bbc\n", | ||
| 215 | - "\tClass: <|> \n", | ||
| 216 | - "\tValue: 0\n", | ||
| 217 | - "Event: BCb\n", | ||
| 218 | - "\tClass: <|> \n", | ||
| 219 | - "\tValue: 0\n", | ||
| 220 | - "Event: Cbc\n", | ||
| 221 | - "\tClass: <|> \n", | ||
| 222 | - "\tValue: 0\n", | ||
| 223 | - "Event: Bac\n", | ||
| 224 | - "\tClass: <|ac> \n", | ||
| 225 | - "\tValue: 5\n", | ||
| 226 | - "Event: BCa\n", | ||
| 227 | - "\tClass: <|> \n", | ||
| 228 | - "\tValue: 0\n", | ||
| 229 | - "Event: Cac\n", | ||
| 230 | - "\tClass: <|ac> \n", | ||
| 231 | - "\tValue: 0\n", | ||
| 232 | - "Event: BCc\n", | ||
| 233 | - "\tClass: <|> \n", | ||
| 234 | - "\tValue: 0\n", | ||
| 235 | - "Event: ABab\n", | ||
| 236 | - "\tClass: <|A,ab> \n", | ||
| 237 | - "\tValue: 0\n", | ||
| 238 | - "Event: Aabc\n", | ||
| 239 | - "\tClass: <|A,ac,ab> \n", | ||
| 240 | - "\tValue: 0\n", | ||
| 241 | - "Event: ACab\n", | ||
| 242 | - "\tClass: <|A,ab> \n", | ||
| 243 | - "\tValue: 0\n", | ||
| 244 | - "Event: ABbc\n", | ||
| 245 | - "\tClass: <|A> \n", | ||
| 246 | - "\tValue: 0\n", | ||
| 247 | - "Event: ABCb\n", | ||
| 248 | - "\tClass: <|A> \n", | ||
| 249 | - "\tValue: 0\n", | ||
| 250 | - "Event: ACbc\n", | ||
| 251 | - "\tClass: <|A> \n", | ||
| 252 | - "\tValue: 0\n", | ||
| 253 | - "Event: ABac\n", | ||
| 254 | - "\tClass: <|A,ac> \n", | ||
| 255 | - "\tValue: 0\n", | ||
| 256 | - "Event: ABCa\n", | ||
| 257 | - "\tClass: <|A> \n", | ||
| 258 | - "\tValue: 0\n", | ||
| 259 | - "Event: ACac\n", | ||
| 260 | - "\tClass: <|A,ac> \n", | ||
| 261 | - "\tValue: 0\n", | ||
| 262 | - "Event: ABCc\n", | ||
| 263 | - "\tClass: <|A> \n", | ||
| 264 | - "\tValue: 0\n", | ||
| 265 | - "Event: Babc\n", | ||
| 266 | - "\tClass: <|ac,ab> \n", | ||
| 267 | - "\tValue: 0\n", | ||
| 268 | - "Event: BCab\n", | ||
| 269 | - "\tClass: <|ab> \n", | ||
| 270 | - "\tValue: 0\n", | ||
| 271 | - "Event: Cabc\n", | ||
| 272 | - "\tClass: <|ac,ab> \n", | ||
| 273 | - "\tValue: 0\n", | ||
| 274 | - "Event: BCbc\n", | ||
| 275 | - "\tClass: <|> \n", | ||
| 276 | - "\tValue: 0\n", | ||
| 277 | - "Event: BCac\n", | ||
| 278 | - "\tClass: <|ac> \n", | ||
| 279 | - "\tValue: 0\n", | ||
| 280 | - "Event: ABabc\n", | ||
| 281 | - "\tClass: <|A,ac,ab> \n", | ||
| 282 | - "\tValue: 0\n", | ||
| 283 | - "Event: ABCab\n", | ||
| 284 | - "\tClass: <|A,ab> \n", | ||
| 285 | - "\tValue: 0\n", | ||
| 286 | - "Event: ACabc\n", | ||
| 287 | - "\tClass: <|A,ac,ab> \n", | ||
| 288 | - "\tValue: 0\n", | ||
| 289 | - "Event: ABCbc\n", | ||
| 290 | - "\tClass: <|A> \n", | ||
| 291 | - "\tValue: 0\n", | ||
| 292 | - "Event: ABCac\n", | ||
| 293 | - "\tClass: <|A,ac> \n", | ||
| 294 | - "\tValue: 0\n", | ||
| 295 | - "Event: BCabc\n", | ||
| 296 | - "\tClass: <|ac,ab> \n", | ||
| 297 | - "\tValue: 0\n", | ||
| 298 | - "Event: ABCabc\n", | ||
| 299 | - "\tClass: <|A,ac,ab> \n", | ||
| 300 | - "\tValue: 0\n" | ||
| 301 | - ] | ||
| 302 | - } | ||
| 303 | - ], | 107 | + "outputs": [], |
| 304 | "source": [ | 108 | "source": [ |
| 305 | "from itertools import *\n", | 109 | "from itertools import *\n", |
| 306 | "\n", | 110 | "\n", |
code/python/__pycache__/event_lattice.cpython-39.pyc
No preview for this file type
code/python/event_lattice.py
| 1 | import math | 1 | import math |
| 2 | from functools import cache | 2 | from functools import cache |
| 3 | -from itertools import accumulate | 3 | +from itertools import accumulate, combinations, chain, groupby |
| 4 | import operator | 4 | import operator |
| 5 | 5 | ||
| 6 | 6 | ||
| @@ -32,21 +32,31 @@ def prod_op(x): | @@ -32,21 +32,31 @@ def prod_op(x): | ||
| 32 | 32 | ||
| 33 | 33 | ||
| 34 | class Event: | 34 | class Event: |
| 35 | - """"Events.""" | 35 | + """Events. |
| 36 | + | ||
| 37 | + An event is a set of literals - atoms and negated atoms. | ||
| 38 | + | ||
| 39 | + The convention is that atoms are represented by lower case single letters | ||
| 40 | + and a negated atom by upper case single letters. | ||
| 41 | + """ | ||
| 36 | 42 | ||
| 37 | @staticmethod | 43 | @staticmethod |
| 38 | - def parse(text): | 44 | + def _parse(text): |
| 39 | return frozenset(text) | 45 | return frozenset(text) |
| 40 | 46 | ||
| 41 | @staticmethod | 47 | @staticmethod |
| 42 | - def from_str(text): | ||
| 43 | - return Event(Event.parse(text)) | 48 | + def parse(text): |
| 49 | + """Convert a string to an event. | ||
| 50 | + | ||
| 51 | + Each letter in the string represents a literal. | ||
| 52 | + """ | ||
| 53 | + return Event(Event._parse(text)) | ||
| 44 | 54 | ||
| 45 | 55 | ||
| 46 | def __init__(self, literals): | 56 | def __init__(self, literals): |
| 47 | """Instantiate from a (frozen) set of literals. | 57 | """Instantiate from a (frozen) set of literals. |
| 48 | For example: e = Event(frozenset("abc")).""" | 58 | For example: e = Event(frozenset("abc")).""" |
| 49 | - self._literals = literals | 59 | + self._literals = frozenset(literals) |
| 50 | 60 | ||
| 51 | 61 | ||
| 52 | def literals(self): | 62 | def literals(self): |
| @@ -55,56 +65,74 @@ class Event: | @@ -55,56 +65,74 @@ class Event: | ||
| 55 | 65 | ||
| 56 | def __iter__(self): | 66 | def __iter__(self): |
| 57 | return self._literals.__iter__() | 67 | return self._literals.__iter__() |
| 58 | - | ||
| 59 | - | ||
| 60 | - def co(self): | ||
| 61 | - """Negation is case based: A = not a; a = not A.""" | ||
| 62 | - return Event(x.swapcase() for x in self._literals) | ||
| 63 | - | ||
| 64 | 68 | ||
| 65 | @cache | 69 | @cache |
| 66 | def is_consistent(self): | 70 | def is_consistent(self): |
| 71 | + """True if this event is consistent.""" | ||
| 67 | return all(x.swapcase() not in self._literals for x in self._literals) | 72 | return all(x.swapcase() not in self._literals for x in self._literals) |
| 68 | 73 | ||
| 69 | - def __hash__(self) -> int: | ||
| 70 | - return self._literals.__hash__() | ||
| 71 | 74 | ||
| 75 | + def co(self): | ||
| 76 | + """Negation of this event. | ||
| 77 | + | ||
| 78 | + Negation is case based: A = not a; a = not A.""" | ||
| 79 | + return Event(x.swapcase() for x in self._literals) | ||
| 72 | 80 | ||
| 73 | - def __eq__(self, other): | ||
| 74 | - return self._literals.__eq__(other._literals) | 81 | + def invert(self): |
| 82 | + """Negation of this event. | ||
| 75 | 83 | ||
| 84 | + See the method "co" | ||
| 85 | + """ | ||
| 86 | + return self.co() | ||
| 76 | 87 | ||
| 77 | def __repr__(self) -> str: | 88 | def __repr__(self) -> str: |
| 78 | - return ''.join(str(x) for x in sorted(self._literals)) | 89 | + return ''.join(str(x) for x in sorted(self._literals)) if len(self._literals) > 0 else '0' |
| 79 | 90 | ||
| 80 | - def invert(self): | ||
| 81 | - return self.co() | 91 | + def latex(self): |
| 92 | + """LaTeX representation of this even. | ||
| 93 | + | ||
| 94 | + Negation is represented by overline and the empty event by | ||
| 95 | + | ||
| 96 | + """ | ||
| 97 | + return ''.join( | ||
| 98 | + (str(x) if x.islower() else f"\co{{{x.lower()}}}") \ | ||
| 99 | + for x in sorted(self._literals) | ||
| 100 | + ) if len(self._literals) > 0 else "\set{}" | ||
| 101 | + | ||
| 102 | + def __hash__(self) -> int: | ||
| 103 | + return self._literals.__hash__() | ||
| 82 | 104 | ||
| 83 | 105 | ||
| 84 | def __eq__(self, other): | 106 | def __eq__(self, other): |
| 107 | + """Event equality test.""" | ||
| 85 | return self._literals.__eq__(other._literals) | 108 | return self._literals.__eq__(other._literals) |
| 86 | 109 | ||
| 87 | def __or__(self, other): | 110 | def __or__(self, other): |
| 111 | + """Event union operation.""" | ||
| 88 | return Event(self._literals | other._literals) | 112 | return Event(self._literals | other._literals) |
| 89 | 113 | ||
| 90 | - | ||
| 91 | def __le__(self, other): | 114 | def __le__(self, other): |
| 115 | + """Event subset test.""" | ||
| 92 | return self._literals.__le__(other._literals) | 116 | return self._literals.__le__(other._literals) |
| 93 | 117 | ||
| 94 | 118 | ||
| 95 | def __lt__(self, other): | 119 | def __lt__(self, other): |
| 120 | + """Event strict subset test.""" | ||
| 96 | return self._literals.__lt__(other._literals) | 121 | return self._literals.__lt__(other._literals) |
| 97 | 122 | ||
| 98 | 123 | ||
| 99 | def __ne__(self, other): | 124 | def __ne__(self, other): |
| 125 | + """Event not-equal test.""" | ||
| 100 | return self._literals.__ne__(other._literals) | 126 | return self._literals.__ne__(other._literals) |
| 101 | 127 | ||
| 102 | 128 | ||
| 103 | def __ge__(self, other): | 129 | def __ge__(self, other): |
| 130 | + """Event superset test.""" | ||
| 104 | return self._literals.__ge__(other._literals) | 131 | return self._literals.__ge__(other._literals) |
| 105 | 132 | ||
| 106 | 133 | ||
| 107 | def __gt__(self, other): | 134 | def __gt__(self, other): |
| 135 | + """Event strict superset test.""" | ||
| 108 | return self._literals.__gt__(other._literals) | 136 | return self._literals.__gt__(other._literals) |
| 109 | 137 | ||
| 110 | 138 | ||
| @@ -112,87 +140,120 @@ class Lattice: | @@ -112,87 +140,120 @@ class Lattice: | ||
| 112 | 140 | ||
| 113 | @staticmethod | 141 | @staticmethod |
| 114 | def parse(d): | 142 | def parse(d): |
| 143 | + """Input stable models. | ||
| 144 | + | ||
| 145 | + The input format is a dictionary associating a stable model in string form to an weight. | ||
| 146 | + | ||
| 147 | + For example: | ||
| 148 | + | ||
| 149 | + input_dict = { | ||
| 150 | + "A": 0.3, | ||
| 151 | + "ab": 0.2, | ||
| 152 | + "ac": 0.5 | ||
| 153 | + } | ||
| 154 | + smodels = Lattice.parse(input_dict) | ||
| 155 | + """ | ||
| 115 | result = dict() | 156 | result = dict() |
| 116 | for k, v in d.items(): | 157 | for k, v in d.items(): |
| 117 | - key = Event.from_str(k) | 158 | + key = Event.parse(k) |
| 118 | result[key] = v | 159 | result[key] = v |
| 119 | return result | 160 | return result |
| 120 | 161 | ||
| 121 | 162 | ||
| 122 | @staticmethod | 163 | @staticmethod |
| 123 | - def close_literals(smodels): | ||
| 124 | - base_lits = list(accumulate(smodels, func=operator.or_))[-1] | 164 | + def close_literals(events): |
| 165 | + """Closed set of literals entailed by a set of events. | ||
| 166 | + | ||
| 167 | + Includes the literals in the set of events and any missing negation.""" | ||
| 168 | + base_lits = list(accumulate(events, func=operator.or_))[-1] | ||
| 125 | lits = set() | 169 | lits = set() |
| 126 | for x in base_lits.literals(): | 170 | for x in base_lits.literals(): |
| 127 | lits.add(x) | 171 | lits.add(x) |
| 128 | lits.add(x.swapcase()) | 172 | lits.add(x.swapcase()) |
| 129 | - return lits | 173 | + return sorted(lits) |
| 130 | 174 | ||
| 131 | def __init__(self, smodels_dict): | 175 | def __init__(self, smodels_dict): |
| 132 | - """Create base for Events Lattice.""" | 176 | + """Create an Events lattice.""" |
| 133 | self._smodels = smodels_dict | 177 | self._smodels = smodels_dict |
| 134 | self._literals = Lattice.close_literals(self._smodels.keys()) | 178 | self._literals = Lattice.close_literals(self._smodels.keys()) |
| 135 | 179 | ||
| 136 | def literals(self): | 180 | def literals(self): |
| 181 | + """The literals in this lattice.""" | ||
| 137 | return self._literals | 182 | return self._literals |
| 138 | 183 | ||
| 184 | + @cache | ||
| 139 | def stable_models(self): | 185 | def stable_models(self): |
| 140 | - return list(map(set, self._smodels.keys())) | 186 | + """The stable models that generate this lattice.""" |
| 187 | + return self._smodels.keys() | ||
| 141 | 188 | ||
| 142 | - @cache | ||
| 143 | - def lower_bound(self, event): | ||
| 144 | - return list(set(filter(lambda sm: sm <= event, self._smodels))) | 189 | + #@cache |
| 190 | + def events(self): | ||
| 191 | + """All the events of this lattice.""" | ||
| 192 | + return chain.from_iterable(map(Event, combinations(self._literals, r)) for r in range(len(self._literals)+1)) | ||
| 145 | 193 | ||
| 146 | @cache | 194 | @cache |
| 147 | - def upper_bound(self, event): | ||
| 148 | - return list(set(filter(lambda sm: event <= sm, self._smodels))) | 195 | + def stable_core(self, event): |
| 196 | + """The stable core of an event in this lattice.""" | ||
| 197 | + return set(filter(lambda sm: sm <= event or event <= sm, self.stable_models())) | ||
| 198 | + | ||
| 199 | + # @cache | ||
| 200 | + # def event_class(self, event): | ||
| 201 | + # """The equivalence class of an event.""" | ||
| 202 | + # return EventsClass(self.stable_core(event), self) | ||
| 149 | 203 | ||
| 204 | + @cache | ||
| 205 | + def classes(self): | ||
| 206 | + """The classes of this lattice. | ||
| 207 | + | ||
| 208 | + Each class is presented as a key:value pair where the "key" is the stable core of the elements in "value".""" | ||
| 209 | + map_ev_classes = [(e, tuple(self.stable_core(e))) for e in self.events() if e.is_consistent()] | ||
| 210 | + groups = dict() | ||
| 211 | + for e,c in map_ev_classes: | ||
| 212 | + if c in groups.keys(): | ||
| 213 | + groups[c].add(e) | ||
| 214 | + else: | ||
| 215 | + groups[c] = set([e]) | ||
| 216 | + inconsistent = list(e for e in self.events() if not e.is_consistent()) | ||
| 217 | + inconsistent_repr = inconsistent[0] | ||
| 218 | + groups[(inconsistent_repr,)] = set(inconsistent) | ||
| 219 | + return groups | ||
| 150 | 220 | ||
| 151 | - def event_class(self, event): | ||
| 152 | - return EventsClass( | ||
| 153 | - self.upper_bound(event), | ||
| 154 | - self.lower_bound(event), | ||
| 155 | - self) | ||
| 156 | 221 | ||
| 157 | def related(self, u, v): | 222 | def related(self, u, v): |
| 223 | + """Tests if two events are related.""" | ||
| 158 | u_consistent = u.is_consistent() | 224 | u_consistent = u.is_consistent() |
| 159 | v_consistent = v.is_consistent() | 225 | v_consistent = v.is_consistent() |
| 160 | if u_consistent and (u_consistent == v_consistent): | 226 | if u_consistent and (u_consistent == v_consistent): |
| 161 | - return \ | ||
| 162 | - self.lower_bound(u) == self.lower_bound(v) and \ | ||
| 163 | - self.upper_bound(u) == self.upper_bound(v) | 227 | + return self.stable_core(u) == self.stable_core(v) |
| 164 | else: | 228 | else: |
| 165 | return u_consistent == v_consistent | 229 | return u_consistent == v_consistent |
| 166 | 230 | ||
| 167 | - def factors(self, event): | ||
| 168 | - return [self.lower_bound(event), self.upper_bound(event)] | ||
| 169 | - | ||
| 170 | - def propagated_value(self, event:Event, | ||
| 171 | - lower_op=sum_op, | ||
| 172 | - upper_op=prod_op): | 231 | + def extended_value(self, event:Event, |
| 232 | + op=prod_op): | ||
| 233 | + """TODO: well...""" | ||
| 173 | value = 0 | 234 | value = 0 |
| 174 | - | 235 | + # |
| 236 | + # INCONSISTENT EVENTS | ||
| 237 | + # | ||
| 175 | if not event.is_consistent(): | 238 | if not event.is_consistent(): |
| 176 | return value | 239 | return value |
| 177 | - | ||
| 178 | - lb = self.lower_bound(event) | ||
| 179 | - len_lb = len(lb) | ||
| 180 | - if len_lb > 1: | ||
| 181 | - value = lower_op(map(lambda sm: self._smodels[sm], lb)) | ||
| 182 | - elif len_lb == 1: | ||
| 183 | - value = self._smodels[lb[0]] | 240 | + # |
| 241 | + # CONSISTENT EVENTS | ||
| 242 | + # | ||
| 243 | + score = self.stable_core(event) | ||
| 244 | + len_score = len(score) | ||
| 245 | + # CONSISTENT, INDEPENDENT | ||
| 246 | + if len_score == 0: | ||
| 247 | + value = 0 | ||
| 248 | + elif len_score == 1: | ||
| 249 | + value = self._smodels[score[0]] | ||
| 184 | else: | 250 | else: |
| 185 | - ub = self.upper_bound(event) | ||
| 186 | - len_ub = len(ub) | ||
| 187 | - if len_ub > 1: | ||
| 188 | - value = upper_op(map(lambda sm: self._smodels[sm], ub)) | ||
| 189 | - elif len_ub == 1: | ||
| 190 | - value = self._smodels[ub[0]] | 251 | + value = op(map(lambda sm: self._smodels[sm], score)) |
| 191 | 252 | ||
| 192 | return value | 253 | return value |
| 193 | 254 | ||
| 194 | def __repr__(self): | 255 | def __repr__(self): |
| 195 | - smodels_repr = ',\n\t\t'.join(f"{Event.from_str(k)}: {v:>5}" for k,v in self._smodels.items()) | 256 | + smodels_repr = ',\n\t\t'.join(f"{k}: {v:<}" for k,v in self._smodels.items()) |
| 196 | lits_repr = ','.join(sorted(self._literals)) | 257 | lits_repr = ','.join(sorted(self._literals)) |
| 197 | 258 | ||
| 198 | return "{\n" +\ | 259 | return "{\n" +\ |
| @@ -200,19 +261,41 @@ class Lattice: | @@ -200,19 +261,41 @@ class Lattice: | ||
| 200 | f"\t'literals': {{ {lits_repr} }} \n" +\ | 261 | f"\t'literals': {{ {lits_repr} }} \n" +\ |
| 201 | "}" | 262 | "}" |
| 202 | 263 | ||
| 203 | - | ||
| 204 | - | ||
| 205 | -class EventsClass: | ||
| 206 | - def __init__(self, upper, lower, lattice:Lattice): | ||
| 207 | - self._upper = upper | ||
| 208 | - self._lower = lower | ||
| 209 | - self._lattice = lattice | ||
| 210 | - | ||
| 211 | - def __repr__(self): | ||
| 212 | - upper_repr = "" if len(self._upper) == 0 else ",".join(str(x) for x in self._upper) | ||
| 213 | - lower_repr = "" if len(self._lower) == 0 else ",".join(str(x) for x in self._lower) | ||
| 214 | - return f"<{upper_repr}|{lower_repr}>" | ||
| 215 | - | ||
| 216 | - def __contains__(self, event:Event): | ||
| 217 | - return self.lattice.lower_bound(event) == self._lower and \ | ||
| 218 | - self.lattice.upper_bound(event) == self._upper | ||
| 219 | \ No newline at end of file | 264 | \ No newline at end of file |
| 265 | +# class EventsClass: | ||
| 266 | +# def __init__(self, core, lattice:Lattice): | ||
| 267 | +# self._core = core | ||
| 268 | +# self._lattice = lattice | ||
| 269 | + | ||
| 270 | +# def __repr__(self): | ||
| 271 | +# core_repr = "" if len(self._core) == 0 else ",".join(str(x) for x in self._core) | ||
| 272 | +# return f"<{core_repr}>" | ||
| 273 | + | ||
| 274 | +# def __contains__(self, event:Event): | ||
| 275 | +# return self.lattice.stable_core(event) == self._core | ||
| 276 | + | ||
| 277 | +if __name__ == "__main__": | ||
| 278 | + def zoom_event(event_str, lattice): | ||
| 279 | + event = Event.parse(event_str) | ||
| 280 | + event_class = lattice.event_class(event) | ||
| 281 | + propagated = lattice.extended_value( | ||
| 282 | + event) | ||
| 283 | + | ||
| 284 | + print( | ||
| 285 | + f"Event: {event}\n\tClass: {event_class} \n\tValue: {propagated}") | ||
| 286 | + | ||
| 287 | + smodels = Lattice.parse({ | ||
| 288 | + "A": 2, | ||
| 289 | + "ab": 3, | ||
| 290 | + "ac": 5 | ||
| 291 | + }) | ||
| 292 | + | ||
| 293 | + lattice = Lattice(smodels) | ||
| 294 | + | ||
| 295 | + ev_classes = lattice.classes() | ||
| 296 | + for k,g in ev_classes.items(): | ||
| 297 | + print(f"{tuple(s.latex() for s in k)} {set(e.latex() for e in g)}") | ||
| 298 | + # zoom_event("abc", lattice) | ||
| 299 | + # zoom_event("a", lattice) | ||
| 300 | + # zoom_event("b", lattice) | ||
| 301 | + # zoom_event("bc", lattice) | ||
| 302 | + # zoom_event("ac", lattice) | ||
| 220 | \ No newline at end of file | 303 | \ No newline at end of file |
students/amartins/tarefas/.ipynb_checkpoints/Untitled-checkpoint.ipynb
0 โ 100644
students/amartins/tarefas/.ipynb_checkpoints/Untitled1-checkpoint.ipynb
0 โ 100644
students/amartins/tarefas/.ipynb_checkpoints/tarefa1b-checkpoint.py
0 โ 100644
| @@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
| 1 | +import bnlearn as bn | ||
| 2 | +import networkx as nx | ||
| 3 | +import pydot | ||
| 4 | +from networkx.drawing.nx_pydot import graphviz_layout | ||
| 5 | + | ||
| 6 | +asia = bn.import_DAG("asia2.bif") | ||
| 7 | +model = asia['model'] | ||
| 8 | + | ||
| 9 | +# DiGraph do networkx | ||
| 10 | +G = nx.DiGraph() | ||
| 11 | + | ||
| 12 | +for node in model.nodes: | ||
| 13 | + G.add_node(node) | ||
| 14 | + | ||
| 15 | +for edge in model.edges: | ||
| 16 | + G.add_edge(edge[0], edge[1]) | ||
| 17 | + | ||
| 18 | +# objeto pydot | ||
| 19 | +dot = pydot.Dot(graph_type='digraph') | ||
| 20 | + | ||
| 21 | +for node in model.nodes: | ||
| 22 | + dot.add_node(pydot.Node(node)) | ||
| 23 | + | ||
| 24 | +for edge in model.edges: | ||
| 25 | + dot.add_edge(pydot.Edge(edge[0], edge[1])) | ||
| 26 | + | ||
| 27 | +# defina o layout do grafo | ||
| 28 | +pos = graphviz_layout(G, prog='dot') | ||
| 29 | + | ||
| 30 | +# desenhe o grafo usando o networkx | ||
| 31 | +nx.draw(G, pos, with_labels=True) | ||
| 32 | + | ||
| 33 | +# renderize o grafo com o pydot | ||
| 34 | +graph = pydot.graph_from_dot_data(dot.to_string())[0] | ||
| 35 | +graph.write_png('graph_asia2.png') |
| @@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
| 1 | +# Notas com Alice Martins | ||
| 2 | + | ||
| 3 | +## 2023-05-04 | ||
| 4 | + | ||
| 5 | +### Problemas | ||
| 6 | + | ||
| 7 | +#### Tarefa 1A | ||
| 8 | + | ||
| 9 | +1. Estรก a contar os nรณs "in" e os nรณs "out" ao contrรกrio, certo? `len(children)` diz quantas arestas saem de `x`. | ||
| 10 | +2. Em | ||
| 11 | + ```python | ||
| 12 | + if len(parents) != 0: | ||
| 13 | + asc += 1 | ||
| 14 | + if len(children) != 0: | ||
| 15 | + des += 1 | ||
| 16 | + ``` | ||
| 17 | + deve ser | ||
| 18 | + ```python | ||
| 19 | + if len(parents) != 0: | ||
| 20 | + des += 1 | ||
| 21 | + if len(children) != 0: | ||
| 22 | + asc += 1 | ||
| 23 | + ``` | ||
| 24 | + porque o nรณ `x` รฉ (mais) um descendente se tem ascendentes (e igualmente para ascendente). | ||
| 25 | + | ||
| 26 | +#### Tarefa 1B | ||
| 27 | + | ||
| 28 | +1. Nรฃo deve misturar o cรณdigo para definir o grafo `G` com o cรณdigo para o grafo `dot`. **Exceto** se quiser percorrer apenas uma vez `model.nodes` e `model.edges`. | ||
| 29 | + | ||
| 30 | +### Sugestรตes | ||
| 31 | + | ||
| 32 | +- **Use sempre, e sรณ, o inglรชs no seu cรณdigo**, nรฃo sรณ porque nรฃo se podem usar acentos, como `nรณs_in`, mas tambรฉm porque misturar portuguรชs com inglรชs fica estranho (isto รฉ, _feio_!). ร melhor `nodes_in` do que `nos_in`. | ||
| 33 | +- Use nomes descritivos nas suas variรกveis: `node` em vez de `x`. | ||
| 34 | +- Em vez de `asia = bn.import_DAG("asia2.bif")` talvez `dag = bn.import_DAG("asia2.bif")` seja melhor (**porquรช?**) | ||
| 35 | +- O cรณdigo tambรฉm fica mais simples se usar "f-strings": Em vez de | ||
| 36 | + ```python | ||
| 37 | + print("Nรบmero de nรณs:", len(nos)) | ||
| 38 | + ``` | ||
| 39 | + use | ||
| 40 | + ```python | ||
| 41 | + print(f"Nรบmero de nรณs: {len(nos)}") | ||
| 42 | + ``` | ||
| 43 | +### Desafios | ||
| 44 | + | ||
| 45 | +1. **Torne o seu cรณdigo geral.** | ||
| 46 | + 1. Coloque a parte essencial da tarefa 1A numa funรงรฃo, `summary_dag(filename)`, que tem argumento uma `string` com o nome do ficheiro e devolve um `dict` com chaves `dag_file`, `nodes`, `count_parents`, `count_children`, `count_in_edges`, `count_out_edges`. | ||
| 47 | + 2. Use uma funรงรฃo `summary_str(d)` que tem argumento um `dict` como acima e devolve uma `string` com as perguntas e as respostas "bem formatadas". Por exemplo: | ||
| 48 | + ```text | ||
| 49 | + DAG file: asia2.bif | ||
| 50 | + Number of nodes: 8 | ||
| 51 | + Number of parents: 6 | ||
| 52 | + Number of children: 6 | ||
| 53 | + Average in-degree: 1.0 | ||
| 54 | + Average out-degree: 1.0 | ||
| 55 | + Nodes: | ||
| 56 | + asia | ||
| 57 | + tub | ||
| 58 | + ... | ||
| 59 | + ``` | ||
| 60 | + 3. Por fim, combine as duas funรงรตes: | ||
| 61 | + ```python | ||
| 62 | + summary = summary_dag("asia2.bif") | ||
| 63 | + message = summary_str(summary) | ||
| 64 | + print(message) | ||
| 65 | + ``` | ||
| 66 | + 4. Coloque a parte essencial da tarefa 1B em funรงรตes `show_dag(model)` e `save_dag(model, target_filename)`. | ||
| 67 | +2. **A biblioteca `bnlearn` รฉ excessiva para estas tarefas.** Nรฃo sรณ precisa de vรกrias dependรชncias irrelevantes para o que pretendemos, por exemplo o `pytorch`, como demora imenso tempo a ler o ficheiro. _Procure uma alternativa mais simples._ (**n.b.** nรฃo sei se existe!) | ||
| 0 | \ No newline at end of file | 68 | \ No newline at end of file |
| @@ -0,0 +1,81 @@ | @@ -0,0 +1,81 @@ | ||
| 1 | +from pgmpy.readwrite import BIFReader | ||
| 2 | +import networkx as nx | ||
| 3 | +import pydot | ||
| 4 | +from networkx.drawing.nx_pydot import graphviz_layout | ||
| 5 | + | ||
| 6 | +def summary_dag(filename): | ||
| 7 | + file = BIFReader(filename) | ||
| 8 | + model = file.get_model() # Cria um objeto BayesianModel | ||
| 9 | + nodes = model.nodes() | ||
| 10 | + | ||
| 11 | + asc = 0 | ||
| 12 | + des = 0 | ||
| 13 | + nodes_in = 0 | ||
| 14 | + nodes_out = 0 | ||
| 15 | + | ||
| 16 | + for x in nodes: | ||
| 17 | + # Obtem os nรณs pais e filhos de cada nรณs | ||
| 18 | + parents = model.get_parents(x) | ||
| 19 | + children = model.get_children(x) | ||
| 20 | + | ||
| 21 | + if len(parents) != 0: | ||
| 22 | + des += 1 | ||
| 23 | + if len(children) != 0: | ||
| 24 | + asc += 1 | ||
| 25 | + nodes_in += len(children) | ||
| 26 | + nodes_out += len(parents) | ||
| 27 | + | ||
| 28 | + return {'dag_file': filename, 'nodes': nodes, 'count_parents': des, 'count_children': asc, 'count_in_edges': nodes_in, 'count_out_edges': nodes_out} | ||
| 29 | + | ||
| 30 | +def summary_str(d): | ||
| 31 | + s = "DAG file: " + d["dag_file"] + "\n" | ||
| 32 | + s += " Number of nodes: " + str(len(d["nodes"])) + "\n" | ||
| 33 | + s += " Number of parents: " + str(d["count_parents"]) + "\n" | ||
| 34 | + s += " Number of children: " + str(d["count_children"]) + "\n" | ||
| 35 | + s += " Average in-degree: " + str(d["count_in_edges"]/len(d["nodes"])) + "\n" | ||
| 36 | + s += " Average out-degree: " + str(d["count_out_edges"]/len(d["nodes"])) + "\n" | ||
| 37 | + s += " Nodes:" + "\n" | ||
| 38 | + nodes = d["nodes"] | ||
| 39 | + for x in nodes: | ||
| 40 | + s += " " + str(x) + "\n" | ||
| 41 | + return s | ||
| 42 | + | ||
| 43 | +def show_dag(model): | ||
| 44 | + G = nx.DiGraph() | ||
| 45 | + for node in model.nodes: | ||
| 46 | + G.add_node(node) | ||
| 47 | + for edge in model.edges: | ||
| 48 | + G.add_edge(edge[0], edge[1]) | ||
| 49 | + # objeto pydot | ||
| 50 | + dot = pydot.Dot(graph_type='digraph') | ||
| 51 | + for node in model.nodes: | ||
| 52 | + dot.add_node(pydot.Node(node)) | ||
| 53 | + for edge in model.edges: | ||
| 54 | + dot.add_edge(pydot.Edge(edge[0], edge[1])) | ||
| 55 | + # defina o layout do grafo | ||
| 56 | + pos = graphviz_layout(G, prog='dot') | ||
| 57 | + # desenhe o grafo usando o networkx | ||
| 58 | + nx.draw(G, pos, with_labels=True) | ||
| 59 | + | ||
| 60 | +def save_dag(model, target_filename): | ||
| 61 | + G = nx.DiGraph() | ||
| 62 | + for node in model.nodes: | ||
| 63 | + G.add_node(node) | ||
| 64 | + for edge in model.edges: | ||
| 65 | + G.add_edge(edge[0], edge[1]) | ||
| 66 | + # objeto pydot | ||
| 67 | + dot = pydot.Dot(graph_type='digraph') | ||
| 68 | + for node in model.nodes: | ||
| 69 | + dot.add_node(pydot.Node(node)) | ||
| 70 | + for edge in model.edges: | ||
| 71 | + dot.add_edge(pydot.Edge(edge[0], edge[1])) | ||
| 72 | + # defina o layout do grafo | ||
| 73 | + pos = graphviz_layout(G, prog='dot') | ||
| 74 | + # renderize o grafo com o pydot | ||
| 75 | + graph = pydot.graph_from_dot_data(dot.to_string())[0] | ||
| 76 | + graph.write_png(target_filename) | ||
| 77 | + | ||
| 78 | + | ||
| 79 | +summary = summary_dag("asia2.bif") | ||
| 80 | +message = summary_str(summary) | ||
| 81 | +print(message) | ||
| 0 | \ No newline at end of file | 82 | \ No newline at end of file |
students/amartins/tarefas/tarefa1a.py
| @@ -32,7 +32,7 @@ for x in nos: | @@ -32,7 +32,7 @@ for x in nos: | ||
| 32 | print("Nรณs ascendentes: ", asc) | 32 | print("Nรณs ascendentes: ", asc) |
| 33 | print("Nรณs descendentes: ", des) | 33 | print("Nรณs descendentes: ", des) |
| 34 | # resposta ร pergunta "qual รฉ o nรบmero mรฉdio de arestas "in"? e "out"?" | 34 | # resposta ร pergunta "qual รฉ o nรบmero mรฉdio de arestas "in"? e "out"?" |
| 35 | -nos_in = nos_in/len(nos) | ||
| 36 | -nos_out = nos_out/len(nos) | 35 | +nos_in = float(nos_in/len(nos)) |
| 36 | +nos_out = float(nos_out/len(nos)) | ||
| 37 | print("Nรบmero mรฉdio de arestas in: ", nos_in) | 37 | print("Nรบmero mรฉdio de arestas in: ", nos_in) |
| 38 | print("Nรบmero mรฉdio de arestas out: ", nos_out) | 38 | print("Nรบmero mรฉdio de arestas out: ", nos_out) |
| 39 | \ No newline at end of file | 39 | \ No newline at end of file |
text/paper_01/pre-paper.pdf
No preview for this file type
text/paper_01/pre-paper.tex
| @@ -246,6 +246,8 @@ The stable models $ab, ac$ from \cref{running.example} result from the clause $b | @@ -246,6 +246,8 @@ The stable models $ab, ac$ from \cref{running.example} result from the clause $b | ||
| 246 | 246 | ||
| 247 | The diagram in \cref{F:stableexample} illustrates the problem of extending probabilities from total choice nodes to stable models and then to general events in a \emph{node-wise} process. This quickly leads to coherence problems concerning probability, with no clear systematic approach --- Instead, weight extension can be based in the relation an event has with the stable models. | 247 | The diagram in \cref{F:stableexample} illustrates the problem of extending probabilities from total choice nodes to stable models and then to general events in a \emph{node-wise} process. This quickly leads to coherence problems concerning probability, with no clear systematic approach --- Instead, weight extension can be based in the relation an event has with the stable models. |
| 248 | 248 | ||
| 249 | +\subsection{An Equivalence Relation}\label{subsec:equivalence.relation} | ||
| 250 | + | ||
| 249 | Given an ASP specification | 251 | Given an ASP specification |
| 250 | % DONE: {\bruno This should be defined somewhere (maybe in the introduction).} | 252 | % DONE: {\bruno This should be defined somewhere (maybe in the introduction).} |
| 251 | \remark{{\bruno Introduce also the sets mentioned below}}{how?} | 253 | \remark{{\bruno Introduce also the sets mentioned below}}{how?} |
| @@ -277,24 +279,24 @@ This focus on the \acp{SM} leads to the following definition: | @@ -277,24 +279,24 @@ This focus on the \acp{SM} leads to the following definition: | ||
| 277 | % \lset{e} = \set{s \in \fml{S} \given e \supseteq s}, \label{eq:lset} | 279 | % \lset{e} = \set{s \in \fml{S} \given e \supseteq s}, \label{eq:lset} |
| 278 | % \end{equation} | 280 | % \end{equation} |
| 279 | % \begin{equation} | 281 | % \begin{equation} |
| 280 | - % \stablecore{e} = \uset{e} \cup \lset{e} \label{eq:xset} | 282 | + % \stablecore{e} = \uset{e} \cup \lset{e} \label{def:stable.core} |
| 281 | % \end{equation} | 283 | % \end{equation} |
| 282 | \begin{equation} | 284 | \begin{equation} |
| 283 | - \stablecore{e} := \set{s \in \fml{S} \given e \subseteq s \vee s \subseteq e} \label{eq:xset} | 285 | + \stablecore{e} := \set{s \in \fml{S} \given e \subseteq s \vee s \subseteq e} \label{eq:stable.core} |
| 284 | \end{equation} | 286 | \end{equation} |
| 285 | 287 | ||
| 286 | \end{definition} | 288 | \end{definition} |
| 287 | 289 | ||
| 288 | We now define an equivalence relation, $\sim$, so that two events are related if they are either both inconsistent or both consistent with the same stable core. | 290 | We now define an equivalence relation, $\sim$, so that two events are related if they are either both inconsistent or both consistent with the same stable core. |
| 289 | 291 | ||
| 290 | -\begin{definition}\label{D:equiv.rel} | 292 | +\begin{definition}\label{def:equiv.rel} |
| 291 | For a given specification, let $u, v \in \fml{E}$. The equivalence relation $\sim$ is defined by | 293 | For a given specification, let $u, v \in \fml{E}$. The equivalence relation $\sim$ is defined by |
| 292 | \begin{equation} | 294 | \begin{equation} |
| 293 | - u \sim v :\iff u,v \not\in\fml{W} \vee \del{u,v \in \fml{W} \wedge \stablecore{u} = \stablecore{v}}.\label{eq:rel.events} | 295 | + u \sim v :\iff u,v \not\in\fml{W} \vee \del{u,v \in \fml{W} \wedge \stablecore{u} = \stablecore{v}}.\label{eq:equiv.rel} |
| 294 | \end{equation} | 296 | \end{equation} |
| 295 | \end{definition} | 297 | \end{definition} |
| 296 | 298 | ||
| 297 | -Observe that the minimality of stable models implies that, in \cref{eq:xset}, either $e$ is a stable model or one of $e \subseteq s, s \subseteq e$ is never true. | 299 | +Observe that the minimality of stable models implies that, in \cref{def:stable.core}, either $e$ is a stable model or one of $e \subseteq s, s \subseteq e$ is never true. |
| 298 | % | 300 | % |
| 299 | % \begin{definition}\label{def:smodel.events} | 301 | % \begin{definition}\label{def:smodel.events} |
| 300 | % For $\set{s_1, \ldots, s_n} \subseteq \fml{S}$ define | 302 | % For $\set{s_1, \ldots, s_n} \subseteq \fml{S}$ define |
| @@ -321,21 +323,21 @@ This relation defines a partition of the events space, where each class holds a | @@ -321,21 +323,21 @@ This relation defines a partition of the events space, where each class holds a | ||
| 321 | \set{u \in \fml{W} \given \stablecore{u} = \stablecore{e}} &\text{if~} e \in \fml{W}, \\ | 323 | \set{u \in \fml{W} \given \stablecore{u} = \stablecore{e}} &\text{if~} e \in \fml{W}, \\ |
| 322 | % \lclass{\uset{e}} &\text{if~} \uset{e} \not= \emptyset, \\ | 324 | % \lclass{\uset{e}} &\text{if~} \uset{e} \not= \emptyset, \\ |
| 323 | % \uclass{\lset{e}} &\text{otherwise}. | 325 | % \uclass{\lset{e}} &\text{otherwise}. |
| 324 | - \end{cases} | 326 | + \end{cases}\label{eq:event.class} |
| 325 | \end{equation} | 327 | \end{equation} |
| 326 | 328 | ||
| 327 | -The stable core defines a \emph{canonical} representative of each class: | ||
| 328 | -\begin{theorem} | ||
| 329 | - Let $e\in\fml{E}$ and $\stablecore{e} = \set{s_1, \ldots, s_n} \subseteq \fml{S}$. Then | ||
| 330 | - \begin{equation} | ||
| 331 | - \class{e} = \class{s_1 \cup \cdots \cup s_n}. | ||
| 332 | - \end{equation} | ||
| 333 | - We simplify the notation with $\class{s_1, \ldots, s_n} := \class{s_1 \cup \cdots \cup s_n}$. | ||
| 334 | - \todo{This only works for consistent $s_1, \ldots, s_n$: $\set{\set{}} = \class{\co{a}, ab, ac} \not= \class{a\co{a}bc} = \inconsistent$.} | ||
| 335 | -\end{theorem} | ||
| 336 | -\begin{proof} | ||
| 337 | -\todo{tbd} | ||
| 338 | -\end{proof} | 329 | +% The stable core defines a \emph{canonical} representative of each class: |
| 330 | +% \begin{theorem} | ||
| 331 | +% Let $e\in\fml{E}$ and $\stablecore{e} = \set{s_1, \ldots, s_n} \subseteq \fml{S}$. Then | ||
| 332 | +% \begin{equation} | ||
| 333 | +% \class{e} = \class{s_1 \cup \cdots \cup s_n}. | ||
| 334 | +% \end{equation} | ||
| 335 | +% We simplify the notation with $\class{s_1, \ldots, s_n} := \class{s_1 \cup \cdots \cup s_n}$. | ||
| 336 | +% \todo{This only works for consistent $s_1, \ldots, s_n$: $\set{\set{}} = \class{\co{a}, ab, ac} \not= \class{a\co{a}bc} = \inconsistent$.} | ||
| 337 | +% \end{theorem} | ||
| 338 | +% \begin{proof} | ||
| 339 | +% \todo{tbd} | ||
| 340 | +% \end{proof} | ||
| 339 | 341 | ||
| 340 | The subsets of the stable models, together with $\inconsistent$, form a set of representatives. Consider again Example~\ref{running.example}. As previously mentioned, the stable models are $\fml{S} = \co{a}, ab, ac$ so the quotient set of this relation is $\class{\fml{E}}:$ | 342 | The subsets of the stable models, together with $\inconsistent$, form a set of representatives. Consider again Example~\ref{running.example}. As previously mentioned, the stable models are $\fml{S} = \co{a}, ab, ac$ so the quotient set of this relation is $\class{\fml{E}}:$ |
| 341 | \begin{equation} | 343 | \begin{equation} |
| @@ -388,19 +390,21 @@ For example, | @@ -388,19 +390,21 @@ For example, | ||
| 388 | % \item The extended probability \emph{events} are the \emph{classes}. | 390 | % \item The extended probability \emph{events} are the \emph{classes}. |
| 389 | \end{itemize} | 391 | \end{itemize} |
| 390 | 392 | ||
| 393 | +\subsection{From Total Choices to Events}\label{subsec:from.tchoices.to.events} | ||
| 394 | + | ||
| 391 | \todo{Check adaptation} Our path to set a probability measure on $\fml{E}$ has two phases: | 395 | \todo{Check adaptation} Our path to set a probability measure on $\fml{E}$ has two phases: |
| 392 | \begin{itemize} | 396 | \begin{itemize} |
| 393 | \item Extending the probabilities, \emph{as weights}, of the total choices to events. | 397 | \item Extending the probabilities, \emph{as weights}, of the total choices to events. |
| 394 | \item Normalization of the weights. | 398 | \item Normalization of the weights. |
| 395 | \end{itemize} | 399 | \end{itemize} |
| 396 | 400 | ||
| 397 | -The ``extension'' phase, traced by equations (\ref{eq:prob.total.choice}) and (\ref{eq:weight.tchoice} --- \ref{eq:weight.events}), starts with the weight (probability) of total choices, $\pw{c} = \pr{C = c}$, expands it to stable models, $\pw{s}$, and then, within the equivalence relation from Equation \eqref{eq:rel.events}, to (general) events, $\pw{e}$, including (consistent) worlds. | 401 | +The ``extension'' phase, traced by equations (\ref{eq:prob.total.choice}) and (\ref{eq:weight.tchoice} --- \ref{eq:weight.events}), starts with the weight (probability) of total choices, $\pw{c} = \pr{C = c}$, expands it to stable models, $\pw{s}$, and then, within the equivalence relation from Equation \eqref{eq:equiv.rel}, to (general) events, $\pw{e}$, including (consistent) worlds. |
| 398 | 402 | ||
| 399 | \begin{description} | 403 | \begin{description} |
| 400 | % | 404 | % |
| 401 | \item[Total Choices.] Using \eqref{eq:prob.total.choice}, this case is given by | 405 | \item[Total Choices.] Using \eqref{eq:prob.total.choice}, this case is given by |
| 402 | \begin{equation} | 406 | \begin{equation} |
| 403 | - \pw{c} = \pr{C = c}= \prod_{a\in c} p \prod_{a \not\in c} \co{p} | 407 | + \pw{c} := \pr{C = c}= \prod_{a\in c} p \prod_{a \not\in c} \co{p} |
| 404 | \label{eq:weight.tchoice} | 408 | \label{eq:weight.tchoice} |
| 405 | \end{equation} | 409 | \end{equation} |
| 406 | % | 410 | % |
| @@ -409,7 +413,7 @@ The ``extension'' phase, traced by equations (\ref{eq:prob.total.choice}) and (\ | @@ -409,7 +413,7 @@ The ``extension'' phase, traced by equations (\ref{eq:prob.total.choice}) and (\ | ||
| 409 | Given a stable model $s \in \fml{S}$, a total choice $c$, and variables/values $\theta_{s,c} \in \intcc{0, 1}$, | 413 | Given a stable model $s \in \fml{S}$, a total choice $c$, and variables/values $\theta_{s,c} \in \intcc{0, 1}$, |
| 410 | \begin{equation} | 414 | \begin{equation} |
| 411 | \pw{s, c} := \begin{cases} | 415 | \pw{s, c} := \begin{cases} |
| 412 | - \theta_{s,c} & \text{if~} s \in S_c\cr | 416 | + \pw{c}\theta_{s,c} & \text{if~} s \in S_c\cr |
| 413 | 0&\text{otherwise} | 417 | 0&\text{otherwise} |
| 414 | \end{cases} | 418 | \end{cases} |
| 415 | \label{eq:weight.stablemodel} | 419 | \label{eq:weight.stablemodel} |
| @@ -425,29 +429,141 @@ The ``extension'' phase, traced by equations (\ref{eq:prob.total.choice}) and (\ | @@ -425,29 +429,141 @@ The ``extension'' phase, traced by equations (\ref{eq:prob.total.choice}) and (\ | ||
| 425 | \end{equation} | 429 | \end{equation} |
| 426 | \item \textbf{Independent Class.} A world that neither contains nor is contained in a stable model describes a case that, according to the specification, should never be observed. So the respective weight is set to zero: | 430 | \item \textbf{Independent Class.} A world that neither contains nor is contained in a stable model describes a case that, according to the specification, should never be observed. So the respective weight is set to zero: |
| 427 | \begin{equation} | 431 | \begin{equation} |
| 428 | - \pw{\emptyset, c} := 0. | 432 | + \pw{\class{e}, c} := 0,~\text{if}~\stablecore{e} = \emptyset. |
| 429 | \label{eq:weight.class.independent} | 433 | \label{eq:weight.class.independent} |
| 430 | \end{equation} | 434 | \end{equation} |
| 431 | \item \textbf{Other Classes.} The extension must be constant within a class, its value should result from the elements in the stable core, and respect the assumption \ref{assumption:smodels.independence}: | 435 | \item \textbf{Other Classes.} The extension must be constant within a class, its value should result from the elements in the stable core, and respect the assumption \ref{assumption:smodels.independence}: |
| 432 | \begin{equation} | 436 | \begin{equation} |
| 433 | - \pw{\stablecore{s_1, \ldots, s_n}, c} := \prod_{k}\pw{s_k, c}. | ||
| 434 | - \label{eq:weight.class.upper} | 437 | + \pw{\class{e}, c} := \prod_{k=1}^{n}\pw{s_k, c},~\text{if}~\stablecore{e} = \set{s_1, \ldots, s_n}. |
| 438 | + \label{eq:weight.class.other} | ||
| 435 | \end{equation} | 439 | \end{equation} |
| 436 | \end{itemize} | 440 | \end{itemize} |
| 437 | % | 441 | % |
| 438 | \item[Events.] \label{item:event.cases} Each (general) event $e$ is in the class defined by its stable core, $\stablecore{e}$. So, we set: | 442 | \item[Events.] \label{item:event.cases} Each (general) event $e$ is in the class defined by its stable core, $\stablecore{e}$. So, we set: |
| 439 | \begin{equation} | 443 | \begin{equation} |
| 440 | - \pw{e, c} := \pw{\stablecore{e}, c}. | 444 | + \pw{e, c} := \pw{\class{e}, c}. |
| 441 | \label{eq:weight.events} | 445 | \label{eq:weight.events} |
| 442 | \end{equation} | 446 | \end{equation} |
| 447 | + and | ||
| 448 | + \begin{equation} | ||
| 449 | + \pw{e} := \sum_{c\in\fml{C}} \pw{e, c}. | ||
| 450 | + \label{eq:weight.events.unconditional} | ||
| 451 | + \end{equation} | ||
| 443 | \end{description} | 452 | \end{description} |
| 444 | 453 | ||
| 445 | % PARAMETERS FOR UNCERTAINTY | 454 | % PARAMETERS FOR UNCERTAINTY |
| 455 | +\begin{itemize} | ||
| 456 | + \item \todo{Remark that $\pw{\inconsistent, c} = 0$ is independent of the total choice.} | ||
| 457 | + \item \todo{Remark the example $bc$ for equation \ref{eq:weight.class.independent}.} | ||
| 458 | + \item \todo{Remark that equation \eqref{eq:weight.events.unconditional}, together with observations, can be used to learn about the \emph{initial} probabilities of the atoms, in the specification.} | ||
| 459 | +\end{itemize} | ||
| 446 | 460 | ||
| 447 | -Equation \eqref{eq:weight.stablemodel} expresses the \emph{specification's} lack of knowledge about the weight assignment, when a single total choice entails more than one stable model. In this case, how to distribute the respective weights? Our \replace{answer}{proposal} to \replace{}{address} this problem consists in assigning an unknown weight, $\theta_{s,c}$, conditional {\bruno depending???} on the total choice, $c$, to each stable model $s$. This approach allows the expression of an unknown quantity and future estimation, given observed data. | 461 | + |
| 462 | +The $\theta_{s,c}$ parameters in equation \eqref{eq:weight.stablemodel} express the \emph{specification's} lack of knowledge about the weight assignment, when a single total choice entails more than one stable model. In that case, how to distribute the respective weights? Our \replace{answer}{proposal} to \replace{}{address} this problem consists in assigning an unknown weight, $\theta_{s,c}$, conditional {\bruno depending???} on the total choice, $c$, to each stable model $s$. This approach allows the expression of an unknown quantity and future estimation, given observed data. | ||
| 448 | 463 | ||
| 449 | % SUPERSET | 464 | % SUPERSET |
| 450 | -Equation \eqref{eq:weight.class.upper} results from conditional independence of stable models. | 465 | +Equation \eqref{eq:weight.class.other} results from conditional independence of stable models. |
| 466 | + | ||
| 467 | + | ||
| 468 | +\section{Developed Examples} | ||
| 469 | + | ||
| 470 | +\subsection{The SBF Example} | ||
| 471 | + | ||
| 472 | +We continue with the specification from Equation \eqref{eq:example.1}. | ||
| 473 | + | ||
| 474 | +\textbf{Total Choices.} The total choices, and respective stable models, are | ||
| 475 | +\begin{center} | ||
| 476 | + \begin{tabular}{l|r|r} | ||
| 477 | + Total Choice ($c$) & $\pw{c}$ & Stable Models ($s$)\\ | ||
| 478 | + \hline | ||
| 479 | + $a$ & $0.3$ & $ab$ and $ac$.\\ | ||
| 480 | + $\co{a} = \neg a$ & $\co{0.3} = 0.7$ & $\co{a}$. | ||
| 481 | + \end{tabular} | ||
| 482 | +\end{center} | ||
| 483 | + | ||
| 484 | +\textbf{Stable Models.} The weights from equation \eqref{eq:weight.stablemodel} can be tabulated by a matrix where a column represents a total choice and a row a stable model. We get: | ||
| 485 | +\begin{multline*} | ||
| 486 | + \pw{s, c} = | ||
| 487 | + \begin{pmatrix} | ||
| 488 | + \pw{ab, a} & \pw{ab, \co{a}} \\ | ||
| 489 | + \pw{ac, a} & \pw{ac, \co{a}} \\ | ||
| 490 | + \pw{\co{a}, a} & \pw{\co{a}, \co{a}} | ||
| 491 | + \end{pmatrix} | ||
| 492 | + = | ||
| 493 | + \begin{pmatrix} | ||
| 494 | + \pw{a} \theta_{ab, a} & \pw{\co{a}} \theta_{ab, \co{a}} \\ | ||
| 495 | + \pw{a} \theta_{ac, a} & \pw{\co{a}} \theta_{ac, \co{a}} \\ | ||
| 496 | + \pw{a} \theta_{\co{a}, a} & \pw{\co{a}} \theta_{\co{a}, \co{a}} | ||
| 497 | + \end{pmatrix} | ||
| 498 | + \\ | ||
| 499 | + = | ||
| 500 | + \begin{pmatrix} | ||
| 501 | + 0.3 \times \theta_{ab, a} & 0.7 \times 0.0 \\ | ||
| 502 | + 0.3 \times \theta_{ac, a} & 0.7 \times 0.0 \\ | ||
| 503 | + 0.3 \times 0.0 & 0.7 \times 1.0 | ||
| 504 | + \end{pmatrix} | ||
| 505 | + = | ||
| 506 | + \begin{pmatrix} | ||
| 507 | + 0.3\theta & 0.0 \\ | ||
| 508 | + 0.3\co{\theta} & 0.0 \\ | ||
| 509 | + 0.0 & 7.0 | ||
| 510 | + \end{pmatrix} | ||
| 511 | +\end{multline*} | ||
| 512 | +where we set $\theta = \theta_{ab, a}$ to simplify the notation. | ||
| 513 | + | ||
| 514 | +\textbf{Classes.} Following the definitions in \cref{eq:stable.core,eq:equiv.rel,eq:event.class} and in \cref{eq:weight.class.inconsistent,eq:weight.class.independent,eq:weight.class.other} we get the following quotient set, and weights: | ||
| 515 | +\begin{equation*} | ||
| 516 | + \begin{array}{ll|rr} | ||
| 517 | + \text{\textbf{Core}} & \text{\textbf{Class}} & \text{\textbf{Parameters}} & \text{\textbf{Weights}}\\ | ||
| 518 | + \hline | ||
| 519 | + % | ||
| 520 | + \inconsistent | ||
| 521 | + & \text{inconsistent events} | ||
| 522 | + & 0.0 | ||
| 523 | + \\ | ||
| 524 | + % | ||
| 525 | + \emptyset | ||
| 526 | + & \co{b}, \co{c}, bc, \co{b}a, \co{b}c, \co{b}\co{c}, \co{c}a, \co{c}b, \co{b}\co{c}a | ||
| 527 | + & 0.0 | ||
| 528 | + \\ | ||
| 529 | + % | ||
| 530 | + \co{a} | ||
| 531 | + & \co{a}, \co{a}b, \co{a}c, \co{a}\co{b}, \co{a}\co{c}, \co{a}bc, \co{a}b\co{c}, \co{a}\co{b}c, \co{a}\co{b}\co{c} | ||
| 532 | + & 1.0 | ||
| 533 | + & 0.7 | ||
| 534 | + \\ | ||
| 535 | + % | ||
| 536 | + ab | ||
| 537 | + & b, ab, ab\co{c} | ||
| 538 | + & \theta | ||
| 539 | + & 0.3 | ||
| 540 | + \\ | ||
| 541 | + % | ||
| 542 | + ac | ||
| 543 | + & c, ac, a\co{b}c | ||
| 544 | + & \co{\theta} | ||
| 545 | + & 0.3 | ||
| 546 | + \\ | ||
| 547 | + % | ||
| 548 | + ab, ac | ||
| 549 | + & a, abc | ||
| 550 | + & \co{\theta}\theta | ||
| 551 | + & 0.3 | ||
| 552 | + \\ | ||
| 553 | + % | ||
| 554 | + \co{a}, ab, ac | ||
| 555 | + & \set{} | ||
| 556 | + & \co{\theta}\theta, 1.0 | ||
| 557 | + & 0.3, 0.7 | ||
| 558 | + \end{array} | ||
| 559 | +\end{equation*} | ||
| 560 | +\remark{fc}{I really don't like those squares} | ||
| 561 | + | ||
| 562 | +\subsection{A Not So Simple Example} | ||
| 563 | + | ||
| 564 | +\todo{this subsection} | ||
| 565 | + | ||
| 566 | +\section{Discussion} | ||
| 451 | 567 | ||
| 452 | % % SUBSET | 568 | % % SUBSET |
| 453 | % \hrule | 569 | % \hrule |
| @@ -543,55 +659,6 @@ $$ | @@ -543,55 +659,6 @@ $$ | ||
| 543 | 659 | ||
| 544 | Prove the four world cases (done), support the product (done) and sum (tbd) options, with the independence assumptions. | 660 | Prove the four world cases (done), support the product (done) and sum (tbd) options, with the independence assumptions. |
| 545 | \end{quotation} | 661 | \end{quotation} |
| 546 | - | ||
| 547 | -\section{Developed Example} | ||
| 548 | - | ||
| 549 | -We continue with the specification from Equation \eqref{eq:example.1}. | ||
| 550 | - | ||
| 551 | -\textbf{Step 1: Total Choices.} The total choices, and respective stable models, are | ||
| 552 | -\begin{center} | ||
| 553 | - \begin{tabular}{l|r|r} | ||
| 554 | - Total Choice ($c$) & $\pr{C = c}$ & Stable Models ($s$)\\ | ||
| 555 | - \hline | ||
| 556 | - $a$ & $0.3$ & $ab$ and $ac$.\\ | ||
| 557 | - $\co{a} = \neg a$ & $\co{0.3} = 0.7$ & $\co{a}$. | ||
| 558 | - \end{tabular} | ||
| 559 | -\end{center} | ||
| 560 | - | ||
| 561 | -\textbf{Step 2: Stable Models.} Suppose now that | ||
| 562 | -\begin{center} | ||
| 563 | - \begin{tabular}{l|c|r} | ||
| 564 | - Stable Models ($s$) & Total Choice ($c$) & $\pr{S = c \given C = c}$\\ | ||
| 565 | - \hline | ||
| 566 | - $\co{a}$ & $1.0$ & $\co{a}$. \\ | ||
| 567 | - $ab$ & $0.8$ & $a$. \\ | ||
| 568 | - $ac$ & $0.2 = \co{0.8}$ & $a$. | ||
| 569 | - \end{tabular} | ||
| 570 | -\end{center} | ||
| 571 | - | ||
| 572 | -\textbf{Step 3: Worlds.} Following equations \ref{eq:world.fold.stablemodel} --- \ref{eq:world.fold.independent} we get: | ||
| 573 | -\begin{center} | ||
| 574 | - \begin{tabular}{l|c|l|c|r} | ||
| 575 | - Occ. ($o$) & S.M. ($s$) & Relation & T.C. ($c$) & $\pr{W = w}$\\ | ||
| 576 | - \hline | ||
| 577 | - $\emptyset$ & all & contained & $a$, $\co{a}$ & $1.0$ \\ | ||
| 578 | - $a$ & $ab$, $ac$ & contained & $a$ & $0.8\times 0.3 + 0.2\times 0.3 = 0.3$ \\ | ||
| 579 | - $b$ & $ab$ & contained & $a$ & $0.8\times 0.3 = 0.24$ \\ | ||
| 580 | - $c$ & $ac$ & contained & $a$ & $0.2\times 0.3 = 0.06$ \\ | ||
| 581 | - $\co{a}$ & $\co{a}$ & stable model & $\co{a}$ & $1.0\times 0.3 = 0.3$ \\ | ||
| 582 | - $\co{b}$ & none & independent & none & $0.0$ \\ | ||
| 583 | - $\co{c}$ & none & \ldots & & \\ | ||
| 584 | - $ab$ & $ab$ & stable model & $a$ & $0.24$ \\ | ||
| 585 | - $ac$ & $ac$ & stable model & $a$ & $0.06$ \\ | ||
| 586 | - $a\co{b}$ & none & \ldots & & \\ | ||
| 587 | - $a\co{c}$ & none & \ldots & & \\ | ||
| 588 | - $\co{a}b$ & $\co{a}$ & contains & $\co{a}$ & $1.0$ \\ | ||
| 589 | - $\co{a}c$ & $\co{a}$ & \ldots & & \\ | ||
| 590 | - $\co{a}\co{b}$ & $\co{a}$ & \ldots & & \\ | ||
| 591 | - $\co{a}\co{c}$ & $\co{a}$ & \ldots & & \\ | ||
| 592 | - $abc$ & $ab$, $ac$ & contains & $a$ & $0.8\times 0.2 = 0.016$ \\ | ||
| 593 | - \end{tabular} | ||
| 594 | -\end{center} | ||
| 595 | 662 | ||
| 596 | \section{Final Remarks} | 663 | \section{Final Remarks} |
| 597 | 664 | ||
| @@ -600,8 +667,13 @@ We continue with the specification from Equation \eqref{eq:example.1}. | @@ -600,8 +667,13 @@ We continue with the specification from Equation \eqref{eq:example.1}. | ||
| 600 | \begin{itemize} | 667 | \begin{itemize} |
| 601 | \item The measure of the inconsistent events doesn't need to be set to $0$ and, maybe, in some cases, it shouldn't. | 668 | \item The measure of the inconsistent events doesn't need to be set to $0$ and, maybe, in some cases, it shouldn't. |
| 602 | \item The physical system might have \emph{latent} variables, possibly also represented in the specification. These variables are never observed, so observations should be concentrated \emph{somewhere else}. | 669 | \item The physical system might have \emph{latent} variables, possibly also represented in the specification. These variables are never observed, so observations should be concentrated \emph{somewhere else}. |
| 670 | + \item Comment on the possibility of extending equation \eqref{eq:weight.events.unconditional} with parameters expressing further uncertainties, enabling a tuning of the model's total choices, given observations. | ||
| 671 | + \begin{equation*} | ||
| 672 | + \pw{e} := \sum_{c\in\fml{C}} \pw{e, c}\theta_c. | ||
| 673 | + \end{equation*} | ||
| 603 | \end{itemize} | 674 | \end{itemize} |
| 604 | 675 | ||
| 676 | + | ||
| 605 | \section*{Acknowledgements} | 677 | \section*{Acknowledgements} |
| 606 | 678 | ||
| 607 | This work is supported by NOVA\textbf{LINCS} (UIDB/04516/2020) with the financial support of FCT.IP. | 679 | This work is supported by NOVA\textbf{LINCS} (UIDB/04516/2020) with the financial support of FCT.IP. |