Skip to content

CLI tool to rank proposals according to Majority Judgment, from an input CSV

License

Notifications You must be signed in to change notification settings

MieuxVoter/majority-judgment-cli

Repository files navigation

Majority Judgment CLI tool

MIT Release Build Status Code Quality A+ LoC Discord Chat

Resolve Majority Judgment polls and compute the rank of each proposal.

Download

Hand-made builds for Windows and Linux/Mac are provided in the Assets of each Release.

Remember to enable the execution bit: chmod u+x ./mj

Usage

Say you have a tally CSV like so:

     , reject, poor, fair, good, very good, excellent
Pizza,      3,    2,    1,    4,         4,        2
Chips,      2,    3,    0,    4,         3,        4
Pasta,      4,    5,    1,    4,         0,        2

You can run

./mj example.csv

and get

Merit profiles in ASCII art, with colors

You probably want to --sort the proposals by their rank as well:

./mj example.csv --sort

Merit profiles in ASCII art, with colors, and sorted

or use - to read from stdin:

cat example.csv | mj - --sort

You can also disable color with the flag --no-color:

./mj example.csv --no-color

#2   Pizza 000000000000011111111222233333333|333333334444444444444444455555555
#1   Chips 000000001111111111111333333333333|333344444444444445555555555555555
#3   Pasta 000000000000000001111111111111111|111122223333333333333333355555555

   Legend: 0=reject  1=poor  2=fair  3=good  4=very good  5=excellent

Balancing

Majority Judgment, to stay fair, requires tallies to be balanced ; all proposals must have received the same amount of judgments.

If your tally is not balanced, you may use a default judgment strategy:

mj example.csv --default 0
mj example.csv --default excellent
mj example.csv --default "très bien" --judges 42
mj example.csv --default majority
mj example.csv --normalize

The default balancing strategy is to replace missing votes with the "worst", most conservative vote, that is --default 0.

Formats

You can specify the format of the output:

./mj example.csv --format json > results.json
./mj example.csv --format csv > results.csv
./mj example.csv --format yml > results.yml
./mj example.csv --format svg > merit.svg

And even format gnuplot scripts that render charts:

./mj example.csv --sort --format gnuplot | gnuplot

Linear merit profiles okf the proposals of a poll

You can specify the kind of chart you want:

./mj example.csv --format gnuplot --chart opinion | gnuplot

Opinion chart, the cumulative amounts of judgments per grade

Available charts:

  • merit (default)
  • opinion
  • a LOT more would be possible with ballot data per participant

Install

Copy the binary somewhere in your PATH.

Or don't, and use it from anywhere.

Build

You can also grab the source and build it:

git clone https://github.com/MieuxVoter/majority-judgment-cli

Install golang.

Example:

  • Ubuntu: sudo snap install go --classic

Then go into this project directory and run:

go get
go run .
go run . example/example.csv --sort
go build -o mj
./mj
./mj example/example.csv --sort

Build distributables

We have a convenience script build.sh that will handle version embedding from git, using the clever govvv.

But basically, it's:

go build -ldflags "-s -w" -o mj

Yields a mj binary of about 5 Mio.

They say we should not strip go builds.

You can run upx on the binary to reduce its size:

upx mj

For Windows

GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o mj.exe

Sometimes, Go builds for Windows are falsely detected by antiviral software.

Run tests

go test -v