{ "cells": [ { "cell_type": "markdown", "id": "d0f55167", "metadata": {}, "source": [ "# Multi-Criteria Analysis — Advanced Usage\n", "\n", "This notebook complements `analyze_multicriteria.ipynb` with advanced patterns:\n", "\n", "1. Continuous scoring via `Input(..., score_routine=...)`\n", "2. Mixed operators and threshold formats\n", "3. Weighted aggregation with `MulticriteriAnalysis(..., method=Operator.WEIGHTED_SUM)`\n", "\n", "The examples use synthetic arrays for reproducibility." ] }, { "cell_type": "code", "execution_count": 1, "id": "74ace646", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from wolfhece.multicriteria.analysis import (\n", " Criteria,\n", " Format,\n", " Input,\n", " MulticriteriAnalysis,\n", " Operations,\n", " Operator,\n", " Scores,\n", " )" ] }, { "cell_type": "markdown", "id": "c12a5bed", "metadata": {}, "source": [ "## 1. Build reproducible test layers" ] }, { "cell_type": "code", "execution_count": 2, "id": "4b78b6a3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "depth range : 0.006362218409776688 1.8548145294189453\n", "velocity range: 0.008835050277411938 1.4408305883407593\n", "hazard range : 0.0035901775117963552 2.406481981277466\n" ] } ], "source": [ "rng = np.random.default_rng(123)\n", "shape = (8, 8)\n", "\n", "depth = np.ma.MaskedArray(rng.uniform(0.0, 2.0, shape).astype(np.float32), mask=False)\n", "velocity = np.ma.MaskedArray(rng.uniform(0.0, 1.5, shape).astype(np.float32), mask=False)\n", "hazard = np.ma.MaskedArray((depth * velocity).astype(np.float32), mask=False)\n", "\n", "print('depth range :', float(depth.min()), float(depth.max()))\n", "print('velocity range:', float(velocity.min()), float(velocity.max()))\n", "print('hazard range :', float(hazard.min()), float(hazard.max()))" ] }, { "cell_type": "markdown", "id": "73c7747d", "metadata": {}, "source": [ "## 2. Define continuous scoring routines\n", "\n", "A custom routine receives `(values, criteria)` and returns a masked array with the same shape/mask.\n", "\n", "Below, we use a linear ramp in [0, 1]." ] }, { "cell_type": "code", "execution_count": 3, "id": "d441aa0e", "metadata": {}, "outputs": [], "source": [ "def linear_ramp(values: np.ma.MaskedArray, criteria: Criteria) -> np.ma.MaskedArray:\n", " if not isinstance(criteria.threshold, tuple):\n", " raise ValueError('linear_ramp expects threshold as tuple: (low, high)')\n", " low, high = criteria.threshold\n", " if high <= low:\n", " raise ValueError('Invalid threshold tuple: high must be > low')\n", " out = (values - low) / (high - low)\n", " out = np.ma.clip(out, 0.0, 1.0)\n", " return out.astype(np.float32)\n", "\n", "def inverse_linear_ramp(values: np.ma.MaskedArray, criteria: Criteria) -> np.ma.MaskedArray:\n", " return (1.0 - linear_ramp(values, criteria)).astype(np.float32)" ] }, { "cell_type": "markdown", "id": "87804c80", "metadata": {}, "source": [ "## 3. Create advanced inputs\n", "\n", "- `depth_score`: continuous score increases with depth in [0.2, 1.5]\n", "- `velocity_score`: continuous score decreases with velocity in [0.3, 1.2]\n", "- `hazard_binary`: classic binary criterion" ] }, { "cell_type": "code", "execution_count": 4, "id": "b6b48f0e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "depth score dtype : float32\n", "velocity score dtype: float32\n", "hazard score dtype : int32\n" ] } ], "source": [ "depth_input = Input(name='depth_score',\n", " array=depth,\n", " condition=Operator.BETWEEN,\n", " threshold=(0.2, 1.5),\n", " score_routine=linear_ramp)\n", "\n", "velocity_input = Input(name='velocity_score',\n", " array=velocity,\n", " condition=Operator.BETWEEN,\n", " threshold=(0.3, 1.2),\n", " score_routine=inverse_linear_ramp)\n", "\n", "hazard_input = Input(name='hazard_binary',\n", " array=hazard,\n", " condition=Operator.SUPERIOR_OR_EQUAL,\n", " threshold=0.9)\n", "\n", "score_depth = depth_input.score.score\n", "score_velocity = velocity_input.score.score\n", "score_hazard = hazard_input.score.score\n", "\n", "print('depth score dtype :', score_depth.dtype)\n", "print('velocity score dtype:', score_velocity.dtype)\n", "print('hazard score dtype :', score_hazard.dtype)" ] }, { "cell_type": "code", "execution_count": 5, "id": "4cfc5a1b", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABVYAAAGWCAYAAACTnti1AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWBtJREFUeJzt3QmcHVWdL/DTSUjCEgKyhSWsgoAsgSA8NhFZIiKKjoiIEsOiMjAi0RGjQsCF4MaAyiLINk95LCrKKAYRWYZHGCDIDKiALJIMEBYHkhAkge56n3/h7Xe700m6bm+3bn2/fsrQN1X3nlu3U797Tp36V1uWZVkCAAAAAKDXhvV+VQAAAAAADKwCAAAAADTAjFUAAAAAgIIMrAIAAAAAFGRgFQAAAACgIAOrAAAAAAAFGVgFAAAAACjIwCoAAAAAQEEGVgEAAAAACjKwSiHveMc78qXqPv7xj6dNN910yF4/Xvs973nPkL0+ADKxry6//PLU1taW/vKXvwzIr9Ppp5+ePz8AQyeOw3E8LqNW63Ppy8PAMLDaxB577LH0yU9+Mm2++eZp9OjRafXVV0977rlnOvfcc9Pf/va3AXvdP/7xj3n4DVRHB58DQFEykf5w5plnpp///Od2JkAfT4rVL+uuu27ad999069//Wv7FaicEUPdAHr2q1/9Kh122GFp1KhR6aijjkrbbbddWrJkSbrjjjvSP//zP6c//OEP6aKLLhqwgdUzzjgjP6PVfVbmb37zGx/ZIFne5wBQJTKRRnz5y19OX/jCF5YaWP3gBz+YDj30UDsVoA++8pWvpM022yxlWZaeffbZfMD13e9+d/q3f/u3LrM8Y0LQiBGGHYDW5QjXhJ544on04Q9/OG2yySbpd7/7XVp//fU7/+6EE05Ijz76aN7JHAojR44ckteltbz++uupo6PD7xOwQjKRRkVHviqd+UWLFqVVV111qJsBVMhBBx2Udtlll86fjznmmLTeeuul//N//k+XgdW48nKwxWDvq6++mlZeeeVUJa2SBdFPjEllQ/G7A41QCqAJffOb30wvv/xyuuSSS7oMqta8+c1vTieddFKXQaqvfvWraYsttshnuMbsxi9+8Ytp8eLFPdaIiVmvu+66a36gijID//qv/9q5TpxpjJmyIS7nqF3eceutt/ZYlyUej7+/5ppr0te//vW00UYb5c+733775QPA3V8/apP2ptbLc8891xnO8Xw77rhjuuKKK7qsU3vtWttqooRBPB7vpWbevHlpypQpeftiH8V+fd/73tercgdxyWDMGI52xJ/XXXfdMgPgnHPOSW9961vzdaPtUcrhxRdf7PFziNm/EyZMyNfddttt089+9rNefw41y/ssl+eqq65KEydOTGPGjMlLTGy//fZ5iYl6L730Ujr55JPz9sY+i30Xs6dfeOGFQp9T7fP49re/ne+f2u9pzMgNDz30UD576E1velP+HPEF7frrr+/V+wBan0xsjkyMY3g8z5NPPrnU302bNi0/UVafd//xH/+R3vWud6WxY8emVVZZJe2zzz7p//7f/9urz/z888/PszTatsEGG+QnlSOTuovXiNlRa665Zt6R3GGHHbpkWfcaq/Hf0emMfVfL1fhecsstt+T/3VO+X3nllfnfzZo1a5ntfe211/IrTLbccsv881lrrbXSXnvtlW666aYu60XefehDH0rrrLNO3tl/y1vekr70pS91Wef3v/99PlgR2bzaaqvl36fuuuuuHi/Dve2229I//uM/5pfgxmdZE5fi7r333vk+iZw/+OCD8yudAAbSGmuskR/bup/Q6l5jtXZsjr5iHINju8iKyKVXXnmly7aXXXZZeuc735kf5yITos90wQUXLPXatf7VjTfemPcloh0/+MEP8uyJzOxJHIMnTZrUq/e2oj7X//zP/6TPfe5zeZ8qjt1xDI9j+X/+538u1c7uZRS69/MiZ+PYHu2L9xGZEv3C7hm9oiyIq1uj3xXPEW3/93//99RbkV+RY/HZxPuJtsT4Qr0YuI7Pcquttsr3S3yX+MAHPpCXbqqJzP3sZz+bxo8fn39+8TzxfSIGvuvF+zjxxBPTj3/84878nzlzZv53Tz31VDr66KPz70DxePz9pZde2uv3AoOhGqfxSyYun4gD9h577NGr9Y899ti8kxCDU3Hgio7GjBkz0p/+9KelOgkRYLFedNAmT56cH5Qi0GKQLQ5Sb3/729OnP/3p9N3vfjc/eG6zzTb5drU/l+Wss85Kw4YNywNl/vz5eUf4yCOPzNtSVFwuEgOt0dY4wMYlJtdee23ezuhY1Q8q99Y//MM/5J2Kf/qnf8oDLTqpERhz5sxZ7mX2MfgZ20aIxz7961//2tkZ7S4GUSPg4u9jH8Ysq+9///t5Jyk6kyuttFLnun/+85/T4Ycfnj71qU/ln0N8aYjAjAA54IADevU5rOizXJZ430cccUTeWfvGN76RPxa/K9HG2r6Ngf3olMXjEWQ777xzPqAaA57//d//ndZee+3Cn1O8xwjgT3ziE3koxkBqfCZRN3jDDTfML9eMTmAM0sclmj/96U/T+9///kKfM9B6ZGJzZGIMCH7+85/Pj9FRkqhePHbggQfmA5whrraJDmXk0fTp0/PvB7XOcXTsooO3LNFJi0HK/fffPx1//PHp4YcfzjvR99xzT5csjfZGJzo6crEPxo0bl2fWL3/5y2Xuk//9v/93/p0pXj+yKESn83/9r/+Vd/qiQ9c9d+KxWGf33XdfbpvjO0LtuRcsWJDuvffedN999+WZHv7rv/4rz9Vof7x27OfofMbvd5yYDvGZxDrRIY99HevGwEB8/tFx3m233bq8bnSkY5D2tNNOyzuvtfcY3wlisCAyPgYpYv9FBzm+jygtBPSX6PNF/yAGySJHvve97+V9iI9+9KO92j5yJTItjp9xvPzhD3+YDw7W+ichjl/Rr3nve9+bD9jGMTOOfTGhJU661Yu8iD5O9MmOO+64fBAvBgXjvx988MF8gkxNZMojjzySl4xZkd70uR5//PF8Mk705+I9RWmE2sBuTCaJk4QhJpnEPqr3L//yL+n+++/PB1BrbbvzzjvzK1ijzxkDqrEfIgviueJk5YqyICZoxX6I8YTPfOYzeftiH0b/K/JueSKLIl/jZGWUe4h+W+yD+pOj7e3t+To333xz3s7I3YULF+bZHPs6cjN+L+I14+Rl7LuYUBQD3/EdIgZL433Xi+8O8X0ivutEXzPyKvZjZHRt4DXeZ5w8jOeLrI33Bk0ho6nMnz8/Tt9k73vf+3q1/v3335+vf+yxx3Z5/HOf+1z++O9+97vOxzbZZJP8sdtvv73zseeeey4bNWpU9tnPfrbzsWuvvTZf75Zbblnq9fbZZ598qYl1Yt1tttkmW7x4cefj5557bv74Aw880OX1J0+evMLnPOecc/Jtf/SjH3U+tmTJkmz33XfPVltttWzBggVdXrt7O5944on88csuuyz/+cUXX8x//ta3vpUVNWHChGz99dfPXnrppc7HfvOb3+TPF++n5t///d/zx3784x932X7mzJlLPV77HH760592+dzjdXbaaadefQ69/Sx7ctJJJ2Wrr7569vrrry9zndNOOy1//p/97GdL/V1HR0ehz6n2ecRrRhvr7bffftn222+fvfrqq12ef4899si23HLL5b4PoPXJxObKxHjNiRMndnns7rvvzp/vX//1XzuP4XH8njRpUmdehFdeeSXbbLPNsgMOOKDzsWhTbBttDJERI0eOzA488MCsvb29c73vf//7+XqXXnpp/nPkVzxXZGG8n3r1rzl9+vR8u3qrrrpqj99Fpk2blmdofd5He0aMGJE/z/LsuOOO2cEHH7zcdd7+9rdnY8aMyZ588slltvfQQw/N3/9jjz3W+djTTz+dbxfbd99ve+21V5csX7hwYbbGGmtkxx13XJfXmDdvXjZ27NilHgdoRO0Y1H2JY+jll1++1Prxd/XH0dqx+eijj+6y3vvf//5srbXW6vJYZEd3kS+bb755j32j6HvVi2P66NGjs1NOOaXL45/+9KfzPHj55ZeX+1572+eKvkx9boXItljvK1/5yjKf/5prrsmfv36dnt7zrFmzumTt8rIgviOsu+66eT+2vn9+0UUX5evX97t78i//8i/5es8///wy14k8jnXOPvvspf6ulms///nP83W+9rWvdfn7D37wg1lbW1v26KOPdj4W6w0bNiz7wx/+0GXdY445Ju8jv/DCC10e//CHP5znWk/7CoaCUgBNJs68hLh0qzduuOGG/M+pU6d2eTxmrobutVhj5mXMhqiJsz5xNi/OYvVFzNKsr79ae41GnjfeU8w8iTOONTFrI2Zwxhm+mLVRRFz+EG2Lyyu6X5a/PM8880x+9jDOTMblKTUx+yT2Y72YPRTrxN/FmdvaEmcy40xpnKmrF2ct62fFxOyUuMw+ZpPEJZq90ehnGZd0xNnM7pco1ovZonHZTE8zRmuXVRb9nGKGVLSx/pKZODMZZ6vjDGdtn8Ws4JhpE7N642wmUF0ysXkyMcSVFrNnz+5ymd/VV1+dz2aJUgIhcjOO3x/5yEfy43nt2B65E1dK3H777flMo5789re/zWuqxQyUmOVaE7ONIidr32kiK+OqkFgvMq1e/aX/RUQGRwmln/zkJ13eW5RbWtHsq2hDzPCJ992T559/Pn/fcQXIxhtv3GN7Y/ZPXCUTV2zEVUs1MSM39mVchlr791C/X4YPH975c+R6zGKO35X67yKxTsx27f5dBKAvzjvvvPy4E8uPfvSj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o2k98sgj2XHHHZdtuumm2ciRI7MxY8Zke+65Z/a9730ve/XVVzvXe+2117Izzjgj22yzzbKVVlopGz9+fDZt2rQu64RNNtkkO/jgg5d6nX322Sdf6l188cXZ5ptvng0fPjxOOWW33HJLj+vG4/H31157bZftn3jiifzxyy67rMvj3/nOd7INN9wwGzVqVP5e7r333h5f/9lnn82mTJmSrb322vl733777Zd6rvD8889n//AP/5Ctssoq2Zprrpl98pOfzB588MEur/3CCy9kJ5xwQrb11ltnq666ajZ27Nhst912y6655ppefQ4//elPs2222SZv87bbbpv97Gc/yyZPnpzvz+4uuuiibOLEidnKK6+cf17R7s9//vPZ008/vdTncOONN2Y77LBD/rzRtu77cHmfQ5HPsruf/OQn2YEHHpitu+66+b7deOON8/32zDPPdFnvr3/9a3biiSfmn1est9FGG+XvO/Znkc+p9rvwrW99q8f2PPbYY9lRRx2VjRs3Lv/9jdd7z3vek7cToEYmNkcm1rIpnjNy7m9/+1uP6/z+97/PPvCBD2RrrbVWnnORWx/60Ieym2++uXOdaFM8T+REve9///t5+yIT1ltvvez444/PXnzxxaVe44477sgOOOCAvB3xXiJT4ztSzfTp0/Pnr/fQQw9lb3/72/Ocjr+LXKu3ePHifN/FflnWe+vua1/7Wrbrrrtma6yxRv680favf/3r2ZIlS7qsF5/F+9///ny90aNHZ295y1uyU089tcs69913XzZp0qRstdVWyz/HfffdN7vzzju7rFPbb/fcc0+P7YnvCvEc8R7idbbYYovs4x//eP6dC6Cvaseg+iWONRMmTMguuOCCrKOjo8v68fdxPO5+bI7M6ul56zPh+uuvz4/t8fzRJ/7GN76RXXrppUutt6y+Ub1vfvOb+XZnnnlmr99rb/tc0e/+7Gc/m62//vp5DkQ/d9asWUut132/1S+1fl7kXa1/FVkQx/PIrmhLfWatKAvOP//8fHwgMniXXXbJbr/99l71FSOn3/e+92UbbLBB/p0j/jziiCPy72H1XnnllexLX/pS5xhE9OU++MEP5n27moULF2Ynn3xy/hyxzpZbbpn3CXv6HYnvJj2J/mb8XYxx1F5nv/32y/vd0Cza4v+GZkgXqilmG8UZ05hJBAA0jyizEDNZY6ZN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ggvSDjvskFZfffV82X333dOvf/3r4q8KQPMNrDa6sExyE6DFyMwBJTcBWkzW+n3NQgOrG220UTrrrLPS7Nmz07333pve+c53pve9733pD3/4w8C1EABKSm4CgNwEoHUVKgVwyCGHdPn561//en5W8a677kpvfetb+7ttAAyCtj7UWG24NmtFyE2A1iIzB5bcBGgtbRXoazZcY7W9vT1de+21adGiRXlJgGVZvHhxvtQsWLCg0ZcEgNLqTW7KTACQmwCUR6FSAOGBBx5Iq622Who1alT61Kc+la677rq07bbbLnP9GTNmpLFjx3Yu48eP72ubAehPFah7M5SK5KbMBGhyMnPAyU2AFpK1fl+z8MDqW97ylnT//fen//iP/0jHH398mjx5cvrjH/+4zPWnTZuW5s+f37nMnTu3r20GgNIokpsyE4Cqk5sAlEnhUgAjR45Mb37zm/P/njhxYrrnnnvSueeem37wgx/0uH7M0IkFgOZUhbo3Q6lIbspMgOYmMwee3ARoHW0V6Gs2XGO1pqOjo0sNVQBKqCSh1QrkJkDJycxBJTcBSi5LLa3QwGpconjQQQeljTfeOC1cuDBdeeWV6dZbb0033njjwLUQgIHVl/o1LR6SfSU3AVqMzBxQchOgxWSt39csNLD63HPPpaOOOio988wz+Y2odthhh3xQ9YADDhi4FgJASclNAJCbALSuQgOrl1xyycC1BIAhUYW6N0NFbgK0Fpk5sOQmQGtpq0Bfs881VgEouQpcngEA/UJmAoDcrGNgFaDiqnAWEQD6g8wEALlZb1iXnwBggJ133nlp0003TaNHj0677bZbuvvuu3u13VVXXZXa2trSoYce6jMCoDLkJgA0b24aWAWouqyPSwFXX311mjp1apo+fXq677770o477pgmTZqU3+Rpef7yl7+kz33uc2nvvffu23sFgJJkZpCbAJRa1vq5aWAVoOoGMezOPvvsdNxxx6UpU6akbbfdNl144YVplVVWSZdeeukyt2lvb09HHnlkOuOMM9Lmm2/e9/cLACXpIMpNAEota/3cNLAKUHG1enGNLmHBggVdlsWLFy/1OkuWLEmzZ89O+++/f+djw4YNy3+eNWvWMtv3la98Ja277rrpmGOOGZgdAABNlplBbgJQdm0VyE0DqwD02fjx49PYsWM7lxkzZiy1zgsvvJCfDVxvvfW6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L6Ytt9wyv0PjdtttN4TvovzKcjwqSzvL1NaytLNMbS1LO8vU1rK0czDIzaFXpt/HsrS1LO0sU1vL0s4ytbUs7SxbW1sxN9uyqEgLAAAAAECvqbEKAAAAAFCQgVUAAAAAgIIMrAIAAAAAFGRgFQAAAACgagOr5513Xtp0003T6NGj02677Zbuvvvu1Ixuv/32dMghh6QNNtggtbW15XcZa0YzZsxIb3vb29KYMWPSuuuumw499ND08MMPp2ZzwQUXpB122CGtvvrq+bL77runX//616nZnXXWWfnn/5nPfCY1m9NPPz1vW/2y9dZbp2b11FNPpY9+9KNprbXWSiuvvHLafvvt07333puaSRybuu/TWE444YShbhoVVobclJn9T25WOzfLkJlBbtKM5Gb/0dccePqb/UNuUpmB1auvvjpNnTo1TZ8+Pd13331pxx13TJMmTUrPPfdcajaLFi3K2xfB3Mxuu+22fNDnrrvuSjfddFN67bXX0oEHHpi3v5lstNFGeWjMnj077xi8853vTO973/vSH/7wh9Ss7rnnnvSDH/wgHxBuVm9961vTM88807nccccdqRm9+OKLac8990wrrbRSPqD+xz/+MX3nO99Ja665Zmq2z7x+f8a/qXDYYYcNddOoqLLkpszsf3KzurlZlswMcpNmIzf7l77mwNLf7B9yk8KyEtt1112zE044ofPn9vb2bIMNNshmzJiRNbPY7dddd11WBs8991ze3ttuuy1rdmuuuWb2wx/+MGtGCxcuzLbccsvspptuyvbZZ5/spJNOyprN9OnTsx133DErg1NOOSXba6+9srKJz32LLbbIOjo6hropVFQZc1NmDhy5WY3cLGtmBrnJUJObA0tfs//ob/YfuUlRpZ2xumTJkny24v7779/52LBhw/KfZ82aNaRtayXz58/P/3zTm96UmlV7e3u66qqr8hlOURKgGcUs4IMPPrjL72sz+vOf/5yXq9h8883TkUcemebMmZOa0fXXX5922WWXfOZnlKzYaaed0sUXX5ya/Zj1ox/9KB199NH55aIwFL+DcnNglSEzg9ysVm6WMTOD3GSoyc2BV4bcLENmBv3N/iM3Kaq0A6svvPBCfpBbb731ujweP8+bN2/I2tVKOjo68lqgcfnYdtttl5rNAw88kFZbbbU0atSo9KlPfSpdd911adttt03NJoI4LrmNmkLNLGotXn755WnmzJl5Lb4nnngi7b333mnhwoWp2Tz++ON5G7fccst04403puOPPz59+tOfTldccUVqVlFX+aWXXkof//jHh7opVJTcrHZmBrlZzdwsY2YGuclQk5vVzs2yZGbQ3+xfcpOiRhTegsqIs14PPvhgU9YLC295y1vS/fffn5/p/MlPfpImT56c1+1ppsCbO3duOumkk/LamnGjmGZ20EEHdf531IGNDuMmm2ySrrnmmnTMMcekZvsiFrNvzjzzzPznmH0Tv6sXXnhh/nvQjC655JJ8H8fMJqD1NHtmBrlZzdwsY2YGuQmtrdlzswyZGfQ3+5/cpDIzVtdee+00fPjw9Oyzz3Z5PH4eN27ckLWrVZx44onpl7/8ZbrlllvyG140o5EjR6Y3v/nNaeLEifls0LgJy7nnnpuaSVx2GzeF2XnnndOIESPyJQL5u9/9bv7fMeu6Wa2xxhppq622So8++mhqNuuvv/5SX2q22WabprwEMzz55JPpt7/9bTr22GOHuilUmNysdmYGuVnN3CxbZga5STOQm9XOzTJkZtDf7H9yk8oMrMaBLg5yN998c5czC/FzM9c+aXZxn5AIurjU4Xe/+13abLPNUlnE57948eLUTPbbb7/8MpI421lbYtZI1GGL/46TA83q5ZdfTo899lgeLM0mLhl6+OGHuzz2yCOP5DOFmtFll12W17WLOrswVORm/ytzZga5WY3cLFtmBrlJM5Cb/a/MudmMmRn0N/uf3KRSpQCmTp2aT8mPgapdd901nXPOOXlR6SlTpqRm/LJdP4Mh6nDFwFoU6t54441TM12SceWVV6Zf/OIXacyYMZ31aseOHZtWXnnl1CymTZuWX4IX+y5qmUWbb7311rx2WDOJfdi9ZtCqq66a1lprraarJfS5z30uHXLIIXlH6+mnn07Tp0/PB36POOKI1GxOPvnktMcee+SXNX7oQx9Kd999d7rooovypRm/hEUHMY5VMUsZhlJZclNm9j+5Wd3cLFNmBrlJM5Gb/Utfs//pb/Y/uUlhWcl973vfyzbeeONs5MiR2a677prdddddWTO65ZZbstjd3ZfJkydnzaSnNsZy2WWXZc3k6KOPzjbZZJP8c19nnXWy/fbbL/vNb36TlcE+++yTnXTSSVmzOfzww7P1118/36cbbrhh/vOjjz6aNat/+7d/y7bbbrts1KhR2dZbb51ddNFFWTO68cYb839DDz/88FA3BUqTmzKz/8nNaudmWTIzyE2ajdzsP/qag0N/s+/kJkW0xf8VH44FAAAAAKiu0tZYBQAAAAAYKgZWAQAAAAAKMrAKAAAAAFCQgVUAAAAAgIIMrAIAAAAAFGRgFQAAAACgIAOrAAAAAAAFGVgFAAAAACjIwCoAAAAAQEEGVgEAAAAACjKwCgAAAABQkIFVAAAAAIBUzP8DJqRa9ye7+ewAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(1, 3, figsize=(14, 4))\n", "for ax, arr, title, vmax in [\n", " (axes[0], score_depth, 'Continuous depth score', 1.0),\n", " (axes[1], score_velocity, 'Continuous velocity score', 1.0),\n", " (axes[2], score_hazard, 'Binary hazard score', 1.0),\n", "]:\n", " im = ax.imshow(arr.T, origin='lower', vmin=0.0, vmax=vmax, cmap='viridis')\n", " ax.set_title(title)\n", " plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04)\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "c697a544", "metadata": {}, "source": [ "## 4. Combine scores: standard MCDA, product, and weighted sum\n", "\n", "`MulticriteriAnalysis` now supports: `SUM`, `PRODUCT`, `WEIGHTED_SUM`, `AVERAGE`, `PERCENTAGE`.\n", "\n", "For `WEIGHTED_SUM`, pass an explicit `weight` dictionary where keys are the `Input` objects (not strings)." ] }, { "cell_type": "code", "execution_count": 6, "id": "32bab270", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:No weight provided. Setting weight to equal distribution.\n", "WARNING:root:No weight provided. Setting weight to equal distribution.\n", "WARNING:root:No weight provided. Setting weight to equal distribution.\n", "WARNING:root:No weight provided. Setting weight to equal distribution.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "avg_result dtype : float32\n", "product_result dtype: float32\n", "weighted_sum dtype : float32\n", "weighted min/max : 0.02992250956594944 0.8957045078277588\n" ] } ], "source": [ "inputs = [depth_input, velocity_input, hazard_input]\n", "\n", "mcda_avg = MulticriteriAnalysis(inputs=inputs, method=Operator.AVERAGE)\n", "avg_result = mcda_avg.results.array\n", "\n", "mcda_product = MulticriteriAnalysis(inputs=inputs, method=Operator.PRODUCT)\n", "product_result = mcda_product.results.array\n", "\n", "weights_by_input = {depth_input: 0.5,\n", " velocity_input: 0.3,\n", " hazard_input: 0.2,\n", " }\n", "\n", "# New API: weight keys are Input objects in MulticriteriAnalysis.\n", "# Fallback keeps compatibility with older installed versions.\n", "try:\n", " mcda_weighted = MulticriteriAnalysis(inputs=inputs,\n", " method=Operator.WEIGHTED_SUM,\n", " weight=weights_by_input,\n", " dtype=Format.FLOAT32.value,\n", " )\n", " weighted = mcda_weighted.results.array\n", "except TypeError:\n", " scores = Scores({i.name: i.score for i in inputs})\n", " weights_by_name = {depth_input.name: 0.5,\n", " velocity_input.name: 0.3,\n", " hazard_input.name: 0.2,\n", " }\n", " ops = Operations(scores=scores, weight=weights_by_name)\n", " weighted = ops.weighted_sum()\n", "\n", "print('avg_result dtype :', avg_result.dtype)\n", "print('product_result dtype:', product_result.dtype)\n", "print('weighted_sum dtype :', weighted.dtype)\n", "print('weighted min/max :', float(weighted.min()), float(weighted.max()))" ] }, { "cell_type": "code", "execution_count": 7, "id": "a872a065", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAAGGCAYAAAAeiy5/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAS9dJREFUeJzt3Ql8VNXZ+PFnEkhCkEQUIQIR3IEiiyAUUUFFqaIV2yquLFVaERSlfV+hKuAGWi2lVhSlIvyrFmzrVheoomhVFIX6uoLiloisVglLSSBz/p/n4MTJMElmbiYz9578vnxOywxzZ+7cxHnmOctzQsYYIwAAAAAA1FNWfZ8AAAAAAAASTAAAAABAyjCCCQAAAABICRJMAAAAAEBKkGACAAAAAFKCBBMAAAAAkBIkmAAAAACAlCDBBAAAAACkBAkmAAAAACAlSDABJCUUCsnUqVO5agCQQSNHjpSOHTt6PnafffaRTJo3b56NJ59//nlGz8NFAwcOtA3IFBJMn4t8AGt75ZVX9vp3Y4wUFxfbfz/jjDP2+vedO3fK73//e+nbt68UFhZKXl6eHHHEETJu3Dj56KOPqh6nCUPkdbTl5+fLQQcdJGeeeaY88MADUl5eXuM5VlZWStu2be1xzz77bArfPYLgtddes78/3377baZPBQAy6pFHHrGx8LHHHtvr37p3727/7cUXX9zr3zTeHnvsseI3O3bssJ/vS5cuzfSpoB6++uor+3N8++23uY5ICxLMgNDE8OGHH97r/pdeekm+/PJLyc3N3evfNm/eLMcdd5xMmDBBWrduLTfeeKPMmjVLhg4dKk8++aR07dp1r2Puuece+fOf/yx//OMf5dJLL5X//Oc/8vOf/1z69OkjpaWlcc/thRdekHXr1tme1IceeihF7xhBSjBvuOEGEkwAjZ7GXBXbIVxWVibvvfeeNGnSRF599dVq/6axVVvk2ETNmTNHVq9e3eAJpn6+k2AGP8HUnyMJJtKlSdpeCfVy+umny1//+le58847bYCK0KSzV69eNpmMNwXm3//+t/ztb3+Tn/70p9X+7aabbpJrr712r2N+9rOfSatWrapuT5482SaNw4cPl3POOUdef/31vY558MEH5eijj5YRI0bIb37zG9m+fbs0b948UD/x3bt3SzgclpycHPG7IJ0rADQmOpvn4IMP3ivBXLZsmZ1xpHE09t8it5NNMJs2bZqCM0ZD0J+1ziBr1qwZFxiNEiOYAXH++efL119/Lc8991zVfRUVFTZ5vOCCC/Z6/BtvvCFPP/20XHLJJXsll0pHPO+4446EXvvCCy+0o5n6nNGvr/773//aqUDnnXeenHvuufb2E088kdDz6ujor3/9aznqqKPsWpCCggI57bTT5P/+7/+qHrNhwwabUGvPWyztudXpRnfddVfVfTpN86qrrrLThvU9HnbYYXLbbbfZhCxC13vocfr+Z86cKYceeqh97AcffGCvqSbVmrTrlGJNlI8//vi4U5r053HxxRfb8953331tgq3nrs+tU5ujrVq1yibv++23nx2N7t27tx1Frktt55ro8+7atctev8MPP9w+Zv/997dfZKJ/ljWt16hrjY9Oufmf//kf+3f9UhWZYs2aGgCNlX6+aueuxsMIHbX8wQ9+YGOcdtRGxyT9N/3c7N+/f7WOW41DmqDo57vG2NhZRPE+n5OJS2rt2rV2VpPG4AMOOMDGZF32ovRzXO9TGkMin+/Ra/ATjW3vv/++nHTSSfb9tG/fXm6++eZq16A269evl1GjRtnjNP4deOCBctZZZ1WLMzXVBtDro9cpdtmRJvVXXnmlfX96nX75y1/a+K/fIbRDvWXLlrb97//+r00W66Kvo8uUFi9ebK+Bvs9777034e8lasGCBfZn3qJFC/vz0+9Gf/jDH/ZaypTsWlYdfT7mmGPs3/U6Rn6O8X4fgFRhBDMg9MOrX79+8pe//MUGKKXrHbds2WIDj45sRot8wGugSQV9nvvuu0/++c9/yimnnFLtdbZt22bPoaioyCYpOuIZL+mN9emnn8rjjz9ue3Q1OdFkUj+QBwwYYBMo7Qlu06aNva3rWqZMmVLt+IULF0p2drY9PjKVRx+rAVODha5p0embkyZNslN4NUGLpmtLtYfxF7/4hf3Q1wCp05j+9Kc/2YR+9OjRsnXrVrn//vtl8ODBsnz5cunRo4c9VgODrk/V+8aMGSOdOnWyibUG83iBVb84tGvXTiZOnGiTVn0/GtT//ve/y9lnn13ntYp3rok+rwal6dOn204Cneqs7/Gtt96SlStXVvtZevGTn/zEruXV30td6xsZ/Y58KQGAxphg6lIT7ZSNdNxpEqlrLLVp3Nbpst26dav6N40h2vmnbrnlFrn++uttp61+bm/atMkuWznhhBNs4qoJUTzJxCWliaTGNq3RoJ2Yzz//vPzud7+zHZl6vH6O67IZ/bvGE/28V5HzTjQGaYJ44okn2tk3kcfp94lER/e0k1xf64orrrDfhTZu3Gg7SEtKSjwXOdLn0u8smjhrwq/no9dVvzPod4dp06bJM888I7fffrtdTqRJZ12001u/O+j3D/3+cOSRRyb8vUTfjx578skn2+RTffjhh/Z3Y/z48VIfnTt3tkuktPNcv0Nop7ny45pfOMTA1x544AHtOjNvvvmmueuuu0yLFi3Mjh077L+dc8455sQTT7R/79ChgxkyZEjVcWeffbY97ptvvknodaZMmWIfv2nTprj/rs+j/67PG+2MM84w/fv3r7p93333mSZNmpiNGzfW+Zo7d+40lZWV1e777LPPTG5urrnxxhur7rv33nvta7/77rvVHtulSxdz0kknVd2+6aabTPPmzc1HH31U7XETJ0402dnZpqSkpOo19PkKCgr2Os/du3eb8vLyvd57mzZtzM9//vOq+/7+97/b55g5c2bVffpe9Hz0fv25RZx88snmqKOOsu83IhwOm2OPPdYcfvjhtV6j2s410eft3r17td+NeAYMGGBbrBEjRtjfrWh6Pvr7EnH77bfb+/RcAaCxe//99+1nosYktWvXLhub5s+fb29rPJk1a5b9e1lZmY1Po0ePtrc///xze/uWW26p9pwa/zS2Rt8f+/mcTFzSY/W+6FirevbsaXr16lV1W78TxH7mJxuDrrrqKvscb7zxRtV9Gs8KCwvrjB2R7x4aZ2pT0znq9dH3GvudavDgwfZcI/r162dCoZC57LLLqn0faN++fdzYGO919HkXLVpU7f5Ev5eMHz/exnl9zbq+p8WKvKfo6xgb0/U7ZOzvANCQmCIbIJEpqE899ZQdWdP/r2mkUEeplE61SIVIOXN93eipODodRHvdonsadeqF9mLWRUfisrKyqnpS9fn0dbTXT0fXIrTXVKfJ6ohlhPb+6ijnsGHDqu7TNaraM6fTWnRNaqQNGjTIPv/LL79c7fX1XGNH2nRENLK2UXuDdRqv9rrqlJfoc1q0aJFd/6K9lBH6XsaOHVvt+fR4LYKkPzu9dpFz0veqPccff/yx7dmsS+y5JvO82iurvb96HwCgYemIkY5GRtZW6hRVrU0QGTHS/48U+tG1mRqfIusvH330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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(1, 2, figsize=(10, 4))\n", "\n", "im0 = axes[0].imshow(avg_result.T, origin='lower', cmap='magma')\n", "axes[0].set_title('MCDA average result')\n", "plt.colorbar(im0, ax=axes[0], fraction=0.046, pad=0.04)\n", "\n", "im1 = axes[1].imshow(weighted.T, origin='lower', cmap='cividis')\n", "axes[1].set_title('Weighted sum result')\n", "plt.colorbar(im1, ax=axes[1], fraction=0.046, pad=0.04)\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "d81ae3cc", "metadata": {}, "source": [ "## 5. Notes\n", "\n", "- Keep custom routines deterministic and vectorized.\n", "- Return a `np.ma.MaskedArray` with same shape/mask as input.\n", "- Use tuple thresholds for ramp-like routines.\n", "- You can mix binary and continuous inputs in the same analysis.\n", "- With `WEIGHTED_SUM`, provide an explicit weight dictionary keyed by `Input` objects." ] } ], "metadata": { "kernelspec": { "display_name": "python311", "language": "python", "name": "python3" }, "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.11.9" } }, "nbformat": 4, "nbformat_minor": 5 }