@dra2020/district-analytics 1.0.7 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +761 -594
- package/dist/cli.js.map +1 -1
- package/package.json +2 -1
- package/.prettierrc +0 -5
- package/jestconfig.json +0 -14
- package/lib/HelloWorld.d.ts +0 -3
- package/lib/HelloWorld.js +0 -11
- package/lib/_api.js +0 -91
- package/lib/_api.js.map +0 -1
- package/lib/_cli.js +0 -434
- package/lib/_cli.js.map +0 -1
- package/lib/_data.js +0 -425
- package/lib/_data.js.map +0 -1
- package/lib/analyze.d.ts +0 -3
- package/lib/analyze.js +0 -69
- package/lib/analyze.js.map +0 -1
- package/lib/api.d.ts +0 -34
- package/lib/api.js +0 -117
- package/lib/api.js.map +0 -1
- package/lib/cli.d.ts +0 -1
- package/lib/cli.js +0 -386
- package/lib/cli.js.map +0 -1
- package/lib/cohesive.d.ts +0 -4
- package/lib/cohesive.js +0 -132
- package/lib/cohesive.js.map +0 -1
- package/lib/compact.d.ts +0 -4
- package/lib/compact.js +0 -183
- package/lib/compact.js.map +0 -1
- package/lib/constants.js +0 -367
- package/lib/constants.js.map +0 -1
- package/lib/data.js +0 -188
- package/lib/data.js.map +0 -1
- package/lib/equal.d.ts +0 -4
- package/lib/equal.js +0 -59
- package/lib/equal.js.map +0 -1
- package/lib/features.js +0 -19
- package/lib/features.js.map +0 -1
- package/lib/geofeature.js +0 -112
- package/lib/geofeature.js.map +0 -1
- package/lib/index.d.ts +0 -5
- package/lib/index.js +0 -11
- package/lib/index.js.map +0 -1
- package/lib/minority.d.ts +0 -3
- package/lib/minority.js +0 -61
- package/lib/minority.js.map +0 -1
- package/lib/political.d.ts +0 -7
- package/lib/political.js +0 -88
- package/lib/political.js.map +0 -1
- package/lib/preprocess.d.ts +0 -4
- package/lib/preprocess.js +0 -101
- package/lib/preprocess.js.map +0 -1
- package/lib/report.d.ts +0 -14
- package/lib/report.js +0 -817
- package/lib/report.js.map +0 -1
- package/lib/sample.d.ts +0 -1
- package/lib/sample.js +0 -32
- package/lib/sample.js.map +0 -1
- package/lib/scorecard.d.ts +0 -4
- package/lib/scorecard.js +0 -237
- package/lib/scorecard.js.map +0 -1
- package/lib/settings.d.ts +0 -5
- package/lib/settings.js +0 -18
- package/lib/settings.js.map +0 -1
- package/lib/types.d.ts +0 -125
- package/lib/types.js +0 -7
- package/lib/types.js.map +0 -1
- package/lib/utils.d.ts +0 -20
- package/lib/utils.js +0 -223
- package/lib/utils.js.map +0 -1
- package/lib/valid.d.ts +0 -5
- package/lib/valid.js +0 -230
- package/lib/valid.js.map +0 -1
- package/main.js +0 -4
- package/src/_api.ts +0 -121
- package/src/_data.ts +0 -595
- package/src/analyze.ts +0 -92
- package/src/cohesive.ts +0 -156
- package/src/compact.ts +0 -208
- package/src/constants.ts +0 -371
- package/src/equal.ts +0 -75
- package/src/geofeature.ts +0 -138
- package/src/index.ts +0 -6
- package/src/minority.ts +0 -70
- package/src/political.ts +0 -114
- package/src/preprocess.ts +0 -132
- package/src/report.ts +0 -1022
- package/src/settings.ts +0 -20
- package/src/types.ts +0 -185
- package/src/utils.ts +0 -245
- package/src/valid.ts +0 -275
- package/tsconfig.json +0 -25
- package/tslint.json +0 -3
- package/types/polygon-clipping/index.d.ts +0 -1
- package/webpack.config.js +0 -73
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dra2020/district-analytics",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "District analytics TypeScript package",
|
|
5
5
|
"main": "dist/district-analytics.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [ "dist/" ],
|
|
7
8
|
"scripts": {
|
|
8
9
|
"test": "echo test not configured",
|
|
9
10
|
"build": "webpack",
|
package/.prettierrc
DELETED
package/jestconfig.json
DELETED
package/lib/HelloWorld.d.ts
DELETED
package/lib/HelloWorld.js
DELETED
package/lib/_api.js
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
//
|
|
3
|
-
// THE NODE PACKAGE API
|
|
4
|
-
//
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const preprocess_1 = require("./preprocess");
|
|
7
|
-
const analyze_1 = require("./analyze");
|
|
8
|
-
const report_1 = require("./report");
|
|
9
|
-
const D = require("./_data");
|
|
10
|
-
const U = require("./utils");
|
|
11
|
-
class AnalyticsSession {
|
|
12
|
-
constructor(SessionRequest) {
|
|
13
|
-
this.config = {};
|
|
14
|
-
this.bOneTimeProcessingDone = false;
|
|
15
|
-
this.bPlanAnalyzed = false;
|
|
16
|
-
this.bPostProcessingDone = false;
|
|
17
|
-
this.testScales = {};
|
|
18
|
-
this.tests = {};
|
|
19
|
-
this.scorecard = {};
|
|
20
|
-
this.title = SessionRequest['title'];
|
|
21
|
-
this.legislativeDistricts = SessionRequest['legislativeDistricts'];
|
|
22
|
-
this.config = this.processConfig(SessionRequest['config']);
|
|
23
|
-
this.state = new D.State(this, SessionRequest['stateXX'], SessionRequest['nDistricts']);
|
|
24
|
-
this.counties = new D.Counties(this, SessionRequest['counties']);
|
|
25
|
-
this.graph = new D.Graph(this, SessionRequest['graph']);
|
|
26
|
-
this.features = new D.Features(this, SessionRequest['data'], this.config['datasets']);
|
|
27
|
-
this.plan = new D.Plan(this, SessionRequest['plan']);
|
|
28
|
-
this.districts = new D.Districts(this, SessionRequest['districtShapes']);
|
|
29
|
-
// NOTE: I've pulled these out of the individual analytics to here. Eventually,
|
|
30
|
-
// we could want them to passed into an analytics session as data, along with
|
|
31
|
-
// everything else. For now, this keeps branching out of the main code.
|
|
32
|
-
report_1.doConfigureScales(this);
|
|
33
|
-
}
|
|
34
|
-
processConfig(config) {
|
|
35
|
-
// NOTE - Session settings are required:
|
|
36
|
-
// - Analytics suites can be defaulted to all with [], but
|
|
37
|
-
// - Dataset keys must be explicitly specified with 'dataset'
|
|
38
|
-
let defaultSuites = [0 /* Legal */, 1 /* Fair */, 2 /* Best */];
|
|
39
|
-
// If the config passed in has no suites = [], use the default suites
|
|
40
|
-
if (U.isArrayEmpty(config['suites'])) {
|
|
41
|
-
config['suites'] = defaultSuites;
|
|
42
|
-
}
|
|
43
|
-
// Default the Census & redistricting cycle to 2010
|
|
44
|
-
if (!(U.keyExists('cycle', config)))
|
|
45
|
-
config['cycle'] = 2010;
|
|
46
|
-
return config;
|
|
47
|
-
}
|
|
48
|
-
// Using the the data in the analytics session, calculate all the
|
|
49
|
-
// analytics & validations, saving/updating the individual test results.
|
|
50
|
-
analyzePlan(bLog = false) {
|
|
51
|
-
try {
|
|
52
|
-
preprocess_1.doPreprocessData(this);
|
|
53
|
-
analyze_1.doAnalyzeDistricts(this, bLog);
|
|
54
|
-
analyze_1.doAnalyzePlan(this, bLog);
|
|
55
|
-
report_1.doAnalyzePostProcessing(this);
|
|
56
|
-
}
|
|
57
|
-
catch (_a) {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
return true;
|
|
61
|
-
}
|
|
62
|
-
// Get an individual test, so you can drive UI with the results.
|
|
63
|
-
getTest(testID) {
|
|
64
|
-
// Get the existing test entries
|
|
65
|
-
// T.Test is a numeric enum, so convert the string keys to numbers
|
|
66
|
-
let testValues = U.getNumericObjectKeys(this.tests);
|
|
67
|
-
// If there's no entry for this test, create & initialize one
|
|
68
|
-
if (!(testValues.includes(testID))) {
|
|
69
|
-
this.tests[testID] = {};
|
|
70
|
-
this.tests[testID]['score'] = undefined;
|
|
71
|
-
this.tests[testID]['details'] = {};
|
|
72
|
-
}
|
|
73
|
-
// Return a pointer to the the test entry for this test
|
|
74
|
-
return this.tests[testID];
|
|
75
|
-
}
|
|
76
|
-
// Prepare a scorecard for rendering
|
|
77
|
-
// NOTE - This assumes that analyzePlan() has been run!
|
|
78
|
-
prepareScorecard() {
|
|
79
|
-
return report_1.doPrepareScorecard(this);
|
|
80
|
-
}
|
|
81
|
-
// Prepare test results for rendering
|
|
82
|
-
// NOTE - This assumes that analyzePlan() has been run!
|
|
83
|
-
prepareTestLog() {
|
|
84
|
-
return report_1.doPrepareTestLog(this);
|
|
85
|
-
}
|
|
86
|
-
populationDeviationThreshold() {
|
|
87
|
-
return 1 - this.testScales[4 /* PopulationDeviation */]['testScale'][0];
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
exports.AnalyticsSession = AnalyticsSession;
|
|
91
|
-
//# sourceMappingURL=_api.js.map
|
package/lib/_api.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_api.js","sourceRoot":"","sources":["../src/_api.ts"],"names":[],"mappings":"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"}
|
package/lib/_cli.js
DELETED
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
//
|
|
3
|
-
// A SIMPLE COMMAND-LINE INTERFACE FOR EXERCISING THE ANALYTICS & VALIDATIONS
|
|
4
|
-
//
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const yargs = require("yargs");
|
|
7
|
-
const PC = require("polygon-clipping");
|
|
8
|
-
const Poly = require("@dra2020/poly");
|
|
9
|
-
const fs = require("fs");
|
|
10
|
-
const path = require("path");
|
|
11
|
-
const parse = require("csv-parse/lib/sync");
|
|
12
|
-
const _api_1 = require("./_api");
|
|
13
|
-
const preprocess_1 = require("./preprocess");
|
|
14
|
-
const analyze_1 = require("./analyze");
|
|
15
|
-
const valid_1 = require("./valid");
|
|
16
|
-
const equal_1 = require("./equal");
|
|
17
|
-
const compact_1 = require("./compact");
|
|
18
|
-
const cohesive_1 = require("./cohesive");
|
|
19
|
-
const political_1 = require("./political");
|
|
20
|
-
const minority_1 = require("./minority");
|
|
21
|
-
const U = require("./utils");
|
|
22
|
-
const S = require("./settings");
|
|
23
|
-
// Simulate DRA unioning district shapes in the background
|
|
24
|
-
function addToPoly(poly, polys) {
|
|
25
|
-
return PC.union(poly, ...polys);
|
|
26
|
-
}
|
|
27
|
-
console.log("Starting command @ ", new Date());
|
|
28
|
-
// COMMAND LINE
|
|
29
|
-
let argv = yargs
|
|
30
|
-
.usage('Usage: $0 command [options]')
|
|
31
|
-
.example('$0 equal -f foo.geojson', 'Calculate population deviation')
|
|
32
|
-
.demandCommand(1, 'You must specify a command to execute.')
|
|
33
|
-
.command('valid', 'Perform validations.')
|
|
34
|
-
.command('equal', 'Calculate population deviation.')
|
|
35
|
-
.command('compact', 'Calculate compactness.')
|
|
36
|
-
.command('cohesive', 'Calculate cohesiveness.')
|
|
37
|
-
.command('political', 'Assess fairness.')
|
|
38
|
-
.command('minority', 'Count majority-minority districts.')
|
|
39
|
-
.command('analyze', 'API call to analyze a plan.')
|
|
40
|
-
.command('scorecard', 'Analyze plan & generate a scorecard.')
|
|
41
|
-
.command('testlog', 'Analyze plan & generate a testlog.')
|
|
42
|
-
.command('report', 'API call to generate a scorecard.')
|
|
43
|
-
.option('state', {
|
|
44
|
-
alias: 'x',
|
|
45
|
-
describe: 'Specify the state.',
|
|
46
|
-
type: 'string'
|
|
47
|
-
})
|
|
48
|
-
.option('number', {
|
|
49
|
-
alias: 'n',
|
|
50
|
-
describe: 'Specify the number of districts.',
|
|
51
|
-
type: 'number'
|
|
52
|
-
})
|
|
53
|
-
.option('legislative', {
|
|
54
|
-
alias: 'l',
|
|
55
|
-
describe: 'Specify that districts are legislative.',
|
|
56
|
-
type: 'boolean',
|
|
57
|
-
default: false
|
|
58
|
-
})
|
|
59
|
-
.option('plan', {
|
|
60
|
-
alias: 'p',
|
|
61
|
-
describe: 'Specify the plan to evaluate.',
|
|
62
|
-
type: 'string'
|
|
63
|
-
})
|
|
64
|
-
.option('data', {
|
|
65
|
-
alias: 'd',
|
|
66
|
-
describe: 'Specify the census & election data to use.',
|
|
67
|
-
type: 'string'
|
|
68
|
-
})
|
|
69
|
-
.option('shapes', {
|
|
70
|
-
alias: 's',
|
|
71
|
-
describe: 'Specify the shapes to use.',
|
|
72
|
-
type: 'string'
|
|
73
|
-
})
|
|
74
|
-
.option('graph', {
|
|
75
|
-
alias: 'g',
|
|
76
|
-
describe: 'Specify the contiguity graph to use.',
|
|
77
|
-
type: 'string'
|
|
78
|
-
})
|
|
79
|
-
.option('counties', {
|
|
80
|
-
alias: 'c',
|
|
81
|
-
describe: 'Specify the FIPS-to-county-name map to use.',
|
|
82
|
-
type: 'string'
|
|
83
|
-
})
|
|
84
|
-
.option('empty', {
|
|
85
|
-
describe: 'Specify whether a district should be empty.',
|
|
86
|
-
type: 'boolean',
|
|
87
|
-
default: false
|
|
88
|
-
})
|
|
89
|
-
.option('suites', {
|
|
90
|
-
describe: 'Specify the test suites to run.',
|
|
91
|
-
type: 'array',
|
|
92
|
-
default: []
|
|
93
|
-
})
|
|
94
|
-
.option('verbose', {
|
|
95
|
-
alias: 'v',
|
|
96
|
-
describe: 'Specify whether code should log to STDOUT.',
|
|
97
|
-
type: 'boolean',
|
|
98
|
-
default: false
|
|
99
|
-
})
|
|
100
|
-
.demandOption(['number', 'plan', 'data', 'shapes', 'counties'], 'Please specify all the args.')
|
|
101
|
-
.help()
|
|
102
|
-
.argv;
|
|
103
|
-
// PROCESS COMMAND LINE ARGS
|
|
104
|
-
let command = argv._[0];
|
|
105
|
-
let xx = argv.state;
|
|
106
|
-
let bLegislativeDistricts = argv.legislative;
|
|
107
|
-
let nDistricts = argv.n;
|
|
108
|
-
let planByGeoID = readPlanCSV(argv.plan);
|
|
109
|
-
let graph = {};
|
|
110
|
-
let data = {};
|
|
111
|
-
let counties = {};
|
|
112
|
-
// Don't load other datasets, if just calculating compactness
|
|
113
|
-
if (command != 'compact') {
|
|
114
|
-
graph = readJSON(argv.graph);
|
|
115
|
-
data = readJSON(argv.data);
|
|
116
|
-
counties = readJSON(argv.counties);
|
|
117
|
-
}
|
|
118
|
-
let shapes = readJSON(argv.shapes);
|
|
119
|
-
let bEmpty = argv.empty;
|
|
120
|
-
let suites = argv.suites;
|
|
121
|
-
// Some default dataset keys
|
|
122
|
-
let datasetKeys = {
|
|
123
|
-
CENSUS: "D16F",
|
|
124
|
-
VAP: "D16T",
|
|
125
|
-
ELECTION: "E16GPR"
|
|
126
|
-
};
|
|
127
|
-
// Session settings are required:
|
|
128
|
-
// - Analytics suites can be defaulted to all with [], but
|
|
129
|
-
// - Dataset must be explicitly specified
|
|
130
|
-
let sessionSettings = {
|
|
131
|
-
'suites': suites,
|
|
132
|
-
'datasets': datasetKeys
|
|
133
|
-
};
|
|
134
|
-
let bLog = argv.verbose;
|
|
135
|
-
// Invert the plan, so you can create the district shapes for the SessionRequest.
|
|
136
|
-
let planByDistrictID = U.invertPlan(planByGeoID);
|
|
137
|
-
// SIMULATE THE HOST
|
|
138
|
-
// 1 - Create district shapes & extract properties (area, diameter, perimeter)
|
|
139
|
-
const polyOptions = {
|
|
140
|
-
noLatitudeCorrection: false
|
|
141
|
-
};
|
|
142
|
-
// Index the shapes by geoID
|
|
143
|
-
let shapesByGeoID = {};
|
|
144
|
-
let idStr = "GEOID";
|
|
145
|
-
// TODO - Terry: But sometimes "GEOID10" hasn't been set to "GEOID"
|
|
146
|
-
let firstFeature = shapes.features[0];
|
|
147
|
-
if (!(firstFeature.properties == null)) {
|
|
148
|
-
if (U.keyExists("GEOID10", firstFeature.properties))
|
|
149
|
-
idStr = "GEOID10";
|
|
150
|
-
}
|
|
151
|
-
for (let f of shapes.features) {
|
|
152
|
-
if (!(f.properties == null)) {
|
|
153
|
-
// let idStr = "GEOID";
|
|
154
|
-
// TODO - Terry: Sometimes "GEOID10" hasn't been => to "GEOID!"
|
|
155
|
-
// if (U.keyExists("GEOID10", f.properties)) idStr = "GEOID10";
|
|
156
|
-
let geoID = f.properties[idStr];
|
|
157
|
-
shapesByGeoID[geoID] = f;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
// Find the smallest Feature
|
|
161
|
-
// COPIED from dra-client/geodistrict.ts, and lightly modified
|
|
162
|
-
let geo = shapes;
|
|
163
|
-
let minFeatureArea = Poly.polyArea(geo.features[0], polyOptions);
|
|
164
|
-
for (let i = 1; i < geo.features.length; i++) {
|
|
165
|
-
let a = Poly.polyArea(geo.features[i], polyOptions);
|
|
166
|
-
if (a < minFeatureArea)
|
|
167
|
-
minFeatureArea = a;
|
|
168
|
-
}
|
|
169
|
-
// Eliminate anomalous holes
|
|
170
|
-
// COPIED from dra-client/geodistrict.ts, and lightly modified
|
|
171
|
-
// This is a bit of a hack in the sense that it is still an open question as to whether this is a problem
|
|
172
|
-
// with either the underlying shape data or a problem in our simplification of that shape data.
|
|
173
|
-
// But in any case, what this does is eliminate any holes that are smaller than the smallest feature. Such
|
|
174
|
-
// a hole must be an anomaly. CA/2010_VT in particular seems to have many such issues.
|
|
175
|
-
function eliminateAnomalousHoles(mp) {
|
|
176
|
-
// Normalize to multipolygon
|
|
177
|
-
if (U.depthof(mp) == 4)
|
|
178
|
-
mp = [mp];
|
|
179
|
-
for (let i = 0; i < mp.length; i++) {
|
|
180
|
-
let p = mp[i];
|
|
181
|
-
let cleanp = [p[0]];
|
|
182
|
-
for (let j = 1; j < p.length; j++) {
|
|
183
|
-
let a = Poly.polyArea(p[j], polyOptions);
|
|
184
|
-
if (a >= minFeatureArea)
|
|
185
|
-
cleanp.push(p[j]);
|
|
186
|
-
}
|
|
187
|
-
if (cleanp.length < p.length)
|
|
188
|
-
mp[i] = cleanp;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
// Create district shapes
|
|
192
|
-
let districtShapes = {};
|
|
193
|
-
districtShapes['type'] = "FeatureCollection";
|
|
194
|
-
districtShapes['features'] = [];
|
|
195
|
-
for (let districtID = 1; districtID <= nDistricts; districtID++) {
|
|
196
|
-
let districtFeatures = [];
|
|
197
|
-
// Collect Features by district
|
|
198
|
-
planByDistrictID[districtID].forEach(function (geoID) {
|
|
199
|
-
districtFeatures.push(shapesByGeoID[geoID]);
|
|
200
|
-
});
|
|
201
|
-
// Union them together
|
|
202
|
-
let poly1Coordinates = Poly.polyNormalize(districtFeatures[0], polyOptions);
|
|
203
|
-
let polyNCoordinates = districtFeatures.slice(1).map((i) => Poly.polyNormalize(i, polyOptions));
|
|
204
|
-
let poly = addToPoly(poly1Coordinates, polyNCoordinates);
|
|
205
|
-
// Convert the result to a Feature
|
|
206
|
-
let bPolygon = U.depthof(poly) == 4;
|
|
207
|
-
if (!bPolygon && poly.length == 1) {
|
|
208
|
-
bPolygon = true;
|
|
209
|
-
poly = poly[0];
|
|
210
|
-
}
|
|
211
|
-
eliminateAnomalousHoles(poly);
|
|
212
|
-
let f = {
|
|
213
|
-
type: 'Feature',
|
|
214
|
-
properties: { districtID: `${districtID}` },
|
|
215
|
-
geometry: {
|
|
216
|
-
type: bPolygon ? 'Polygon' : 'MultiPolygon',
|
|
217
|
-
coordinates: poly
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
districtShapes.features.push(f);
|
|
221
|
-
}
|
|
222
|
-
// CONSTRUCT A SESSION REQUEST
|
|
223
|
-
let SessionRequest = {};
|
|
224
|
-
SessionRequest['title'] = "CLI Test";
|
|
225
|
-
SessionRequest['stateXX'] = xx;
|
|
226
|
-
SessionRequest['nDistricts'] = nDistricts;
|
|
227
|
-
SessionRequest['legislativeDistricts'] = bLegislativeDistricts;
|
|
228
|
-
SessionRequest['data'] = data;
|
|
229
|
-
SessionRequest['counties'] = counties;
|
|
230
|
-
SessionRequest['graph'] = graph;
|
|
231
|
-
SessionRequest['plan'] = planByGeoID;
|
|
232
|
-
SessionRequest['districtShapes'] = districtShapes;
|
|
233
|
-
SessionRequest['config'] = sessionSettings;
|
|
234
|
-
// CREATE AND INITIALIZE AN ANALYTICS SESSION
|
|
235
|
-
let s = new _api_1.AnalyticsSession(SessionRequest);
|
|
236
|
-
// DISPATCH TO REQUESTED COMMAND W/ NEEDED SCAFFOLDING
|
|
237
|
-
let t;
|
|
238
|
-
let text;
|
|
239
|
-
function echoTestResult(test, t) {
|
|
240
|
-
console.log("");
|
|
241
|
-
console.log("Test:", test);
|
|
242
|
-
console.log("Score:", t['score']);
|
|
243
|
-
let keys = U.getObjectKeys(t['details']);
|
|
244
|
-
if (keys.length > 0) {
|
|
245
|
-
console.log("Details:");
|
|
246
|
-
for (let i in keys) {
|
|
247
|
-
let key = keys[i];
|
|
248
|
-
console.log("-", key, "=", t['details'][key]);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
console.log("___");
|
|
252
|
-
}
|
|
253
|
-
switch (command) {
|
|
254
|
-
case 'valid': {
|
|
255
|
-
preprocess_1.doPreprocessData(s);
|
|
256
|
-
if (bEmpty) {
|
|
257
|
-
// Make one random district empty
|
|
258
|
-
let randomDistrict = Math.floor(Math.random() * s.state.nDistricts) + 1;
|
|
259
|
-
let reassignFeatures = s.plan._planByDistrictID[randomDistrict];
|
|
260
|
-
s.plan._planByDistrictID[S.NOT_ASSIGNED] = reassignFeatures;
|
|
261
|
-
s.plan.initializeDistrict(randomDistrict);
|
|
262
|
-
}
|
|
263
|
-
analyze_1.doAnalyzeDistricts(s);
|
|
264
|
-
t = valid_1.doIsComplete(s);
|
|
265
|
-
echoTestResult("Complete:", t);
|
|
266
|
-
t = valid_1.doIsContiguous(s);
|
|
267
|
-
echoTestResult("Contiguous:", t);
|
|
268
|
-
t = valid_1.doIsFreeOfHoles(s);
|
|
269
|
-
echoTestResult("Free of holes:", t);
|
|
270
|
-
t = equal_1.doPopulationDeviation(s);
|
|
271
|
-
echoTestResult("Population deviation (%):", t);
|
|
272
|
-
t = equal_1.doHasEqualPopulations(s);
|
|
273
|
-
echoTestResult("Equal populations:", t);
|
|
274
|
-
break;
|
|
275
|
-
}
|
|
276
|
-
case 'equal': {
|
|
277
|
-
preprocess_1.doPreprocessData(s);
|
|
278
|
-
analyze_1.doAnalyzeDistricts(s);
|
|
279
|
-
t = equal_1.doPopulationDeviation(s);
|
|
280
|
-
echoTestResult("Population deviation (%):", t);
|
|
281
|
-
break;
|
|
282
|
-
}
|
|
283
|
-
case 'compact': {
|
|
284
|
-
preprocess_1.doPreprocessData(s);
|
|
285
|
-
analyze_1.doAnalyzeDistricts(s);
|
|
286
|
-
t = compact_1.doReock(s, bLog);
|
|
287
|
-
echoTestResult("Reock:", t);
|
|
288
|
-
t = compact_1.doPolsbyPopper(s, bLog);
|
|
289
|
-
echoTestResult("Polsby-Popper:", t);
|
|
290
|
-
break;
|
|
291
|
-
}
|
|
292
|
-
case 'cohesive': {
|
|
293
|
-
preprocess_1.doPreprocessData(s);
|
|
294
|
-
analyze_1.doAnalyzeDistricts(s);
|
|
295
|
-
t = cohesive_1.doCountySplits(s);
|
|
296
|
-
echoTestResult("County splits:", t);
|
|
297
|
-
cohesive_1.doPlanComplexity(s);
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
case 'political': {
|
|
301
|
-
preprocess_1.doPreprocessData(s);
|
|
302
|
-
analyze_1.doAnalyzeDistricts(s);
|
|
303
|
-
political_1.doSeatsBias(s);
|
|
304
|
-
political_1.doVotesBias(s);
|
|
305
|
-
political_1.doResponsiveness(s);
|
|
306
|
-
political_1.doResponsiveDistricts(s);
|
|
307
|
-
t = political_1.doEfficiencyGap(s);
|
|
308
|
-
echoTestResult("Efficiency gap (%):", t);
|
|
309
|
-
break;
|
|
310
|
-
}
|
|
311
|
-
case 'minority': {
|
|
312
|
-
preprocess_1.doPreprocessData(s);
|
|
313
|
-
analyze_1.doAnalyzeDistricts(s);
|
|
314
|
-
minority_1.doMajorityMinorityDistricts(s);
|
|
315
|
-
break;
|
|
316
|
-
}
|
|
317
|
-
case 'analyze': {
|
|
318
|
-
console.log("");
|
|
319
|
-
console.log("Analyzing a plan ...");
|
|
320
|
-
console.log("");
|
|
321
|
-
s.analyzePlan(bLog);
|
|
322
|
-
break;
|
|
323
|
-
}
|
|
324
|
-
case 'scorecard': {
|
|
325
|
-
s.analyzePlan(bLog);
|
|
326
|
-
text = s.prepareScorecard();
|
|
327
|
-
console.log("");
|
|
328
|
-
for (let line of text.data) {
|
|
329
|
-
switch (line['variant']) {
|
|
330
|
-
case 'beginTable':
|
|
331
|
-
case 'endTable':
|
|
332
|
-
console.log(line['variant']);
|
|
333
|
-
break;
|
|
334
|
-
case 'row':
|
|
335
|
-
console.log(line['variant'], line['cells']);
|
|
336
|
-
break;
|
|
337
|
-
default:
|
|
338
|
-
console.log(line['variant'], line['text']);
|
|
339
|
-
break;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
console.log("");
|
|
343
|
-
break;
|
|
344
|
-
}
|
|
345
|
-
case 'testlog': {
|
|
346
|
-
s.analyzePlan(bLog);
|
|
347
|
-
text = s.prepareTestLog();
|
|
348
|
-
console.log("");
|
|
349
|
-
for (let line of text.data) {
|
|
350
|
-
console.log(line['variant'], line['text']);
|
|
351
|
-
}
|
|
352
|
-
console.log("");
|
|
353
|
-
break;
|
|
354
|
-
}
|
|
355
|
-
case 'limit': {
|
|
356
|
-
s.analyzePlan(bLog);
|
|
357
|
-
text = s.prepareScorecard();
|
|
358
|
-
console.log("");
|
|
359
|
-
for (let line of text.data) {
|
|
360
|
-
console.log(line['variant'], line['text']);
|
|
361
|
-
}
|
|
362
|
-
console.log("");
|
|
363
|
-
text = s.prepareTestLog();
|
|
364
|
-
console.log("");
|
|
365
|
-
for (let line of text.data) {
|
|
366
|
-
console.log(line['variant'], line['text']);
|
|
367
|
-
}
|
|
368
|
-
console.log("");
|
|
369
|
-
break;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
console.log("Ending command @ ", new Date());
|
|
373
|
-
// HELPERS TO LOAD SAMPLE DATA FROM DISK
|
|
374
|
-
// A clone of 'carefulRead' in DRA-CLI
|
|
375
|
-
function readJSONcareful(file) {
|
|
376
|
-
try {
|
|
377
|
-
let s = fs.readFileSync(file, 'utf8');
|
|
378
|
-
let o = JSON.parse(s);
|
|
379
|
-
return o;
|
|
380
|
-
}
|
|
381
|
-
catch (err) {
|
|
382
|
-
console.log("Error reading JSON file ...");
|
|
383
|
-
return null;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
exports.readJSONcareful = readJSONcareful;
|
|
387
|
-
function readJSON(file) {
|
|
388
|
-
let fullPath;
|
|
389
|
-
if (path.isAbsolute(file)) {
|
|
390
|
-
fullPath = file;
|
|
391
|
-
}
|
|
392
|
-
else {
|
|
393
|
-
fullPath = path.join(__dirname, file);
|
|
394
|
-
}
|
|
395
|
-
return readJSONcareful(fullPath);
|
|
396
|
-
}
|
|
397
|
-
exports.readJSON = readJSON;
|
|
398
|
-
// Following the clone above, except for CSV, using the csv-parse/sync API
|
|
399
|
-
function readCSV(file) {
|
|
400
|
-
try {
|
|
401
|
-
let input = fs.readFileSync(file, 'utf8');
|
|
402
|
-
let dictRows = parse(input, {
|
|
403
|
-
columns: true,
|
|
404
|
-
skip_empty_lines: true
|
|
405
|
-
});
|
|
406
|
-
return dictRows;
|
|
407
|
-
}
|
|
408
|
-
catch (err) {
|
|
409
|
-
console.log("Error reading CSV file ...");
|
|
410
|
-
return null;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
exports.readCSV = readCSV;
|
|
414
|
-
// Read a plan from a .csv file
|
|
415
|
-
function readPlanCSV(file) {
|
|
416
|
-
var plan = {};
|
|
417
|
-
let fullPath;
|
|
418
|
-
if (path.isAbsolute(file)) {
|
|
419
|
-
fullPath = file;
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
fullPath = path.join(__dirname, file);
|
|
423
|
-
}
|
|
424
|
-
var csvArray = readCSV(fullPath);
|
|
425
|
-
for (let dictRow of csvArray) {
|
|
426
|
-
let geoID = dictRow['GEOID'];
|
|
427
|
-
let districtID = Number(dictRow['DISTRICT']);
|
|
428
|
-
plan[geoID] = districtID;
|
|
429
|
-
}
|
|
430
|
-
return plan;
|
|
431
|
-
}
|
|
432
|
-
exports.readPlanCSV = readPlanCSV;
|
|
433
|
-
// FIN
|
|
434
|
-
//# sourceMappingURL=_cli.js.map
|
package/lib/_cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_cli.js","sourceRoot":"","sources":["../src/_cli.ts"],"names":[],"mappings":"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"}
|