Skip to main content

VISTA — VISualization of relation Topologies of Alternatives

CI Python 3.10+ License: MIT

Overview

VISTA overview

VISTA is a visualization framework for Multi-Criteria Decision Analysis (MCDA) ranking methods. For a given ranking method it sweeps a test alternative across a 2-D criteria space and classifies every point by its pairwise relation to a fixed reference alternative:

Symbol Relation Meaning
P+ Better The test alternative is preferred over the reference
I Indifferent The method cannot distinguish the two alternatives
P− Worse The reference alternative is preferred
R Incomparable The method cannot order the two alternatives

The resulting colour-coded map reveals decision boundaries and structural differences between MCDA ranking methods at a glance.


Installation

Install directly from PyPI:

pip install mcda-vista

To include the interactive Streamlit dashboard:

pip install mcda-vista[app]

For development (linting, type-checking, tests):

git clone https://github.com/dabrze/mcda-vista.git
cd mcda-vista
pip install -e ".[dev]"

Quick Start

from mcda_vista import generate_vista, plot_vista

result = generate_vista("topsis", resolution=101, delta=0.10, progress=True)
fig = plot_vista(result, point_size=7)
fig.savefig("topsis_vista.png", dpi=300)
Example vista

generate_vista sweeps a 101 × 101 grid of alternatives over the criterion space, evaluates the ranking method (in this case TOPSIS) at every point, and returns a VistaResult dataclass. plot_vista renders it as a scatter plot coloured by the relation type - adjust the point_size parameter to the resolution and size of the image.

You will find practical examples of how to use vistas in the notebooks folders. A portion of that functionality is highlighted below.


Available Ranking Methods

The package works with pyDecision's built-in methods and any custom method that follows the expected interface. The following methods are registered by default:

Key Display Name Key Parameters
saw SAW delta — indifference threshold (default 0.1)
topsis TOPSIS delta — indifference threshold (default 0.1)
vikor VIKOR v — strategy coefficient (default 0.5)
macbeth MACBETH delta — indifference threshold (default 0.1)
borda Borda (parameter-free)
oreste ORESTE alpha — alpha threshold (default 0.4)
spotis SPOTIS delta — indifference threshold (default 0.1)
etopsis E-TOPSIS aggregation (A/I/R), epsilon, delta
uta UTA k — breakpoints, form (L/X/V/S), delta
assess ASSESS k — breakpoints, form (L/X/V/S), delta
electre_iii ELECTRE III q, p, v — thresholds; alpha, beta — cut-level
electre_iiic ELECTRE IIIc q, p, v — thresholds; lamb — credibility cutting level
promethee_i PROMETHEE I f (t1–t7) — preference function; q, p, s
promethee_ii PROMETHEE II f (t1–t7), q, p, s, delta
promethee_iii PROMETHEE III f (t1–t7), q, p, s, lmbd — interval width
regime REGIME (parameter-free)

List registered methods programmatically:

from mcda_vista.methods import list_methods
print(list_methods())

If a pyDecision method is not available by default, you can add it by creating an adapter with register_method() or use a custom callable (see below).


Custom Methods

You can pass any callable that accepts a dataset, weights, and keyword parameters and returns a Relation:

from mcda_vista import generate_vista, plot_vista, Relation
import numpy as np

def my_method(dataset, weights, **params):
    # dataset[0] = reference, dataset[1] = test point
    score_ref = np.dot(dataset[0], weights)
    score_test = np.dot(dataset[1], weights)
    delta = params.get("delta", 0.05)
    if abs(score_ref - score_test) < delta:
        return Relation.INDIFFERENT
    return Relation.BETTER if score_test > score_ref else Relation.WORSE

result = generate_vista(my_method, resolution=101, delta=0.05)
fig = plot_vista(result)
fig.savefig("custom_method.png", dpi=300)

Exploratory Diagnostic Protocol

The VISTA exploratory protocol is a systematic six-step checklist that assesses whether a ranking method meets the decision maker's expectations:

  1. Dominance relation — no violations in dominating/dominated cones
  2. Self-indifference — identical alternatives are indifferent
  3. Diagonal preference change — at most one transition along the diagonal
  4. Radial preference change — at most one transition along any ray
  5. Preference ratio — shows whether the Better/Worse ratio is balanced or not
  6. Third alternative stability (IIA check) — verifies whether the VISTA remains stable when a third alternative is added
from mcda_vista.protocol import run_protocol, plot_protocol_report

report = run_protocol("topsis", resolution=101, delta=0.10)
fig = plot_protocol_report(report, point_size=3)
fig.savefig("protocol_report.png", dpi=300)
print(report.summary())

Protocol report for TOPSIS

VISTA Protocol Report: topsis
=============================
  ✓ PASS  Dominance relation: No violations (2500 dominating, 2500 dominated points).
  ✗? FAIL  Self-indifference: Reference point is Error — likely a numerical issue (nearest grid point at distance 0.0000).
  ✓ PASS  Diagonal preference change: Upper-right: 1 transition(s), lower-left: 1 transition(s).
  ✓ PASS  Radial preference change: All 36 rays have at most 1 transition.
  ● IMBALANCED  Preference ratio: Imbalanced (56.8% worse, 37.9% better than reference).
  ✗ FAIL  Third alternative stability: Max change 14.4% > 5%. Changes: [0.5, 0.5]: 4.5%, [0.25, 0.5]: 10.3%, [0.5, 0.75]: 4.5%, [0.25, 0.25]: 7.4%, [0.25, 0.75]: 14.4%.

The protocol uses equal weights and the midpoint as reference by default. Optionally pass extra_weights to test weight sensitivity (e.g., extra_weights=[[0.25, 0.75], [0.25, 0.50], [0.50, 0.50], [0.50, 0.25], [0.75, 0.25]]). See notebooks/12_protocol_check.ipynb for a full walkthrough with Fuzzy TOPSIS.


VISTA Grid

Use plot_vista_grid to compare multiple methods in a single faceted figure. The example below contrasts different PROMETHEE I function types side by side:

from mcda_vista import generate_vista
from mcda_vista.plotting import plot_vista_grid

weights = [[0.25, 0.50], [0.50, 0.50], [0.50, 0.25]]
promethee_types = ["t1", "t2", "t3", "t4"]

results = [
  [
    generate_vista("promethee_i", resolution=101, weights=w, f=ptype, q=0.05, p=0.20)
    for ptype in promethee_types
  ]
  for w in weights
]

fig = plot_vista_grid(
  results,
  row_labels=[f"w={w}" for w in weights],
  col_labels=["PROMETHEE I (t1)", "PROMETHEE I (t2)", "PROMETHEE I (t3)","PROMETHEE I (t4)"],
  title="Comparison of PROMETHEE I versions",
  point_size=1.5,
)
fig.savefig("vista_grid_promethee.png", dpi=300)

VISTA grid for PROMETHEE I

Experiments

Reproducible experiments are configured via YAML files stored in experiments/configs/. Each config specifies the method, parameter ranges, resolution, and output paths. To run an experiment:

python experiments/run_experiments.py experiments/configs/my_config.yaml --plot

Results (CSV grids + metadata JSON) are written to the configured output directory and can be reloaded with load_vista().


Dashboard

The optional Streamlit dashboard provides an interactive UI for exploring VISTA maps interactively. Launch it with:

streamlit run src\mcda_vista\app\dashboard.py

Dashboard screenshot

Select a method, adjust parameters with sliders, and watch the VISTA map update live. Install the dashboard extra to enable it:

pip install .[app]

License

This project is licensed under the MIT License.


Support and Citation

If you have questions or run into problems, please open an issue on GitHub.

If you use VISTA in your research, please cite:

@article{vista,
  author  = {Susmaga, Robert and Szcz\c{e}ch, Izabela and Brzezinski, Dariusz},
  title   = {Visualization of Preferential Relations in Analyses of Multicriteria Ranking Methods},
  note    = {In review},
  year    = {2026}
}

Metadata

Release files for mcda-vista 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mcda-vista 0.2.0
File Size Uploaded Provenance Actions
mcda_vista-0.2.0.tar.gz 2.6 MB With provenance Details for mcda_vista-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for mcda-vista 0.2.0
File Interpreter ABI Platform Actions
mcda_vista-0.2.0-py3-none-any.whl Python 3 none any Details for mcda_vista-0.2.0-py3-none-any.whl

Total release size: 2.7 MB

Release files / mcda_vista-0.2.0.tar.gz

Download URL mcda_vista-0.2.0.tar.gz
Size 2.6 MB
Tags Source
SHA-256 checksum
How to use checksums
b13077cece7c5340a80dfe42048fac7614ee324c1e284261355bb5c9e4c21853
BLAKE2b-256 checksum
How to use checksums
bab55d403cb2459f4a36c347cdfe47f304b3350c70ca4155b2e95d0c540354af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 3, 2026.

Transparency log

Release files / mcda_vista-0.2.0-py3-none-any.whl

Download URL mcda_vista-0.2.0-py3-none-any.whl
Size 66.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
13876c79fade19562d4af32ad290055c810914a51b3bf0e4ae17318cf505376e
BLAKE2b-256 checksum
How to use checksums
0ce94d89b0ac061c02dc4fbfaed8685e1d65493bff734c5eae6831aff61e10e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 3, 2026.

Transparency log

Security for mcda-vista 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for mcda_vista-0.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 3, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page