@dra2020/district-analytics 17.0.1 → 17.1.0

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/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # District Analytics
2
2
 
3
- Type definitions and code used by dra-client and fn-all (lambdas), and which invokes dra-analytics
3
+ A layer between `dra-client` and `fn-all` (the scoring lambda), on the one hand, and `dra-analytics`, on the other,
4
+ that knows enough about DRA and the analytics proper in `dra-analytics` to take data in, compose the various lower-level
5
+ analytics calls, and make the various artifacts: scorecard, ratings, requirements checklist, etc. This allows the callers
6
+ to remain high-level and agnostic of the analytics specifics and the analytics proper to no nothing about DRA.
4
7
 
5
8
  ## Build Status
6
9
 
@@ -11,10 +14,12 @@ Type definitions and code used by dra-client and fn-all (lambdas), and which inv
11
14
  ```javascript
12
15
  import * as DA from 'district-analytics';
13
16
 
17
+ // Create a session request
18
+
14
19
  let sr = {} as DA.SessionRequest;
15
- sr['title'] = "NC 2016 Contingent Corrected Map";
20
+ sr['title'] = "NC 2020 Congress";
16
21
  sr['stateXX'] = "NC";
17
- sr['nDistricts'] = 13;
22
+ sr['nDistricts'] = 14;
18
23
  sr['planType'] = PlanType.congress; // One or ...
19
24
  sr['legislativeDistricts'] = false; // ... the other
20
25
  sr['data'] = data as T.GeoFeatureCollection;
@@ -25,17 +30,18 @@ sr['districtShapes'] = districtShapes as T.GeoFeatureCollection;
25
30
  sr['aggregates'] = aggregates as PF.PackedFields[];
26
31
  sr['config'] = config as T.Dict;
27
32
 
33
+ // Create an analytics session
34
+
28
35
  let s = new DA.AnalyticsSession(sr);
29
36
 
37
+ // Run the analytics
38
+
30
39
  let bLog = false;
31
40
  s.analyzePlan(bLog);
32
41
 
33
- const statistics: DA.DistrictStatistics = s.getDistrictStatistics();
34
- const requirements: DA.RequirementsChecklist = s.getRequirementsChecklist();
42
+ // Retrieve the artifacts
43
+
35
44
  const scorecard: DA.Scorecard = s.getPlanScorecard();
36
45
  const ratings: DA.Ratings = s.getRatings();
37
-
38
- const discontiguous = DA.GeoFeatureCollection = s.getDiscontiguousDistrictFeatures();
39
-
46
+ const requirements: DA.RequirementsChecklist = s.getRequirementsChecklist();
40
47
  ```
41
-
package/dist/_api.d.ts CHANGED
@@ -1,39 +1,16 @@
1
1
  import { Types } from '@dra2020/dra-analytics';
2
- import { PF } from '@dra2020/dra-types';
3
- import { RequirementsChecklist } from './results';
4
- import { DistrictStatistics } from './results';
5
- import * as D from './_data';
2
+ import * as D from './data';
6
3
  import * as T from './types';
7
4
  import * as L from './legacy-types';
8
5
  export declare class AnalyticsSession {
9
- title: string;
10
- legislativeDistricts: boolean;
11
- config: T.Dict;
12
- bOneTimeProcessingDone: boolean;
13
- bPlanAnalyzed: boolean;
14
- bPostProcessingDone: boolean;
15
- tests: T.TestEntries;
16
- _profile?: L.Profile;
17
- _scorecard?: L.Scorecard;
18
- state: D.State;
19
- counties: D.Counties;
20
- graph: D.GraphClass;
21
- features: D.Features;
22
- plan: D.Plan;
23
- districts: D.Districts;
24
- aggregates: PF.PackedFields[];
25
- repsByDistrict?: number[];
6
+ data: D.SessionData;
7
+ bLog: boolean;
26
8
  constructor(SessionRequest: T.SessionRequest);
27
- processConfig(config: T.Dict): T.Dict;
28
9
  analyzePlan(bLog?: boolean, overridesJSON?: any): boolean;
29
- getGoodShapes(): T.GeoFeatureCollection;
30
10
  analyzeRacialPolarization(districtID: number, groups: Types.MinorityFilter, bLog?: boolean): Types.RPVAnalysis | undefined;
31
- getDistrictStatistics(bLog?: boolean): DistrictStatistics;
32
11
  getPlanProfile(bLog?: boolean): L.Profile;
33
12
  getPlanScorecard(bLog?: boolean): L.Scorecard;
34
13
  getRatings(bLog?: boolean): T.Ratings;
35
- getRequirementsChecklist(bLog?: boolean): RequirementsChecklist;
36
- getDiscontiguousDistrictFeatures(bLog?: boolean): T.GeoFeatureCollection;
37
- getTest(testID: T.Test): T.TestEntry;
38
- populationDeviationThreshold(): number;
14
+ getRequirementsChecklist(bLog?: boolean): T.RequirementsChecklist;
15
+ getDistrictStatistics(bLog?: boolean): T.DistrictStatistics;
39
16
  }
package/dist/_data.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Types } from '@dra2020/dra-analytics';
2
1
  import * as T from './types';
2
+ export * from './data';
3
3
  import { AnalyticsSession } from './_api';
4
4
  export type TransposedTable = {
5
5
  totalPop: number[];
@@ -32,7 +32,7 @@ export type TransposedTable = {
32
32
  asianPct: number[];
33
33
  nativePct: number[];
34
34
  };
35
- export declare class Districts {
35
+ export declare class LegacyDistricts {
36
36
  _session: AnalyticsSession;
37
37
  _shapes: T.GeoFeatureCollection;
38
38
  _geoProperties: T.DistrictProperties;
@@ -48,69 +48,4 @@ export declare class Districts {
48
48
  recalcStatistics(bLog?: boolean): void;
49
49
  extractDistrictShapeProperties(bLog?: boolean): void;
50
50
  getCountyIndex(geoID: string): number;
51
- extractVotesByDemographic(districtID: number, groups: Types.MinorityFilter, bLog?: boolean): Types.DemographicVotingByFeature | undefined;
52
- }
53
- export declare function inferSelectedMinority(groups: Types.MinorityFilter): string;
54
- export declare class Features {
55
- _session: AnalyticsSession;
56
- _data: T.GeoFeatureCollection;
57
- _keys: T.DatasetKeys;
58
- _featureIDs: T.FeaturesByGeoID;
59
- constructor(s: AnalyticsSession, data: T.GeoFeatureCollection, keys: T.DatasetKeys);
60
- nFeatures(): number;
61
- featureByIndex(i: number): T.GeoFeature;
62
- resetDataset(d: T.Dataset, k: string): void;
63
- mapGeoIDsToFeatureIDs(): void;
64
- featureID(i: string): number;
65
- }
66
- export declare function geoIDForFeature(f: any): string;
67
- export declare function fieldForFeature(f: any, dk: string, ff: T.FeatureField): any;
68
- export declare class Counties {
69
- _session: AnalyticsSession;
70
- _data: T.GeoFeatureCollection;
71
- _countyNameLookup: T.FIPSCodeToCountyNameMap;
72
- nCounties: number;
73
- index: T.FIPSToOrdinalMap;
74
- fips: T.OrdinalToFIPSlMap;
75
- totalPopulation: number[];
76
- constructor(s: AnalyticsSession, data: T.GeoFeatureCollection);
77
- countyByIndex(i: number): T.GeoFeature;
78
- propertyForCounty(f: any, pk: string): any;
79
- mapFIPSToName(fips: string, name: string): void;
80
- nameFromFIPS(fips: string): string;
81
- indexFromFIPS(fips: string): number;
82
- }
83
- export declare class State {
84
- _session: AnalyticsSession;
85
- xx: string;
86
- nDistricts: number;
87
- nReps: number;
88
- totalPop: number;
89
- targetSize: number;
90
- tooBigFIPS: string[];
91
- tooBigName: string[];
92
- singleCountyDistrictMax: number;
93
- expectedSplits: number;
94
- expectedAffected: number;
95
- constructor(s: AnalyticsSession, xx: string, n: number);
96
- }
97
- export declare class Plan {
98
- _session: AnalyticsSession;
99
- _planByGeoID: T.PlanByGeoID;
100
- _planByDistrictID: T.PlanByDistrictID;
101
- districtIDs: number[];
102
- constructor(s: AnalyticsSession, p: T.PlanByGeoID);
103
- invertPlan(bLog?: boolean): void;
104
- initializeDistrict(i: number): void;
105
- byGeoID(): T.PlanByGeoID;
106
- byDistrictID(): T.PlanByDistrictID;
107
- districtForGeoID(i: string): number;
108
- geoIDsForDistrictID(i: number): Set<string>;
109
- }
110
- export declare function invertPlan(plan: T.PlanByGeoID, s?: AnalyticsSession, bLog?: boolean): T.PlanByDistrictID;
111
- export declare class GraphClass {
112
- _session: AnalyticsSession;
113
- _graph: T.ContiguityGraph;
114
- constructor(s: AnalyticsSession, graph: T.ContiguityGraph);
115
- peerNeighbors(node: string): string[];
116
51
  }
package/dist/analyze.d.ts CHANGED
@@ -1,4 +1,2 @@
1
1
  import { AnalyticsSession } from './_api';
2
- export declare function doAnalyzeDistricts(s: AnalyticsSession, bLog?: boolean): void;
3
- export declare function doAnalyzePlan(s: AnalyticsSession, bLog?: boolean): void;
4
- export declare function doDeriveSecondaryTests(s: AnalyticsSession, bLog?: boolean): void;
2
+ export declare function newAnalyzePlan(s: AnalyticsSession): boolean;
@@ -1,4 +1,3 @@
1
1
  import * as T from './types';
2
- import { AnalyticsSession } from './_api';
3
- export declare function doFindCountiesSplitUnexpectedly(s: AnalyticsSession, bLog?: boolean): T.TestEntry;
4
- export declare function doFindSplitVTDs(s: AnalyticsSession, bLog?: boolean): T.TestEntry;
2
+ import * as D from './data';
3
+ export declare function findCountiesSplitUnexpectedly(container: D.SessionData, bLog?: boolean): T.TestEntry;
package/dist/compact.d.ts CHANGED
@@ -1,2 +0,0 @@
1
- import { AnalyticsSession } from './_api';
2
- export declare function extractDistrictProperties(s: AnalyticsSession, bLog?: boolean): void;
package/dist/data.d.ts CHANGED
@@ -1,37 +1,80 @@
1
+ import { PF } from '@dra2020/dra-types';
2
+ import { Types } from '@dra2020/dra-analytics';
1
3
  import * as T from './types';
4
+ import * as L from './legacy-types';
5
+ import * as D from './data';
2
6
  import { AnalyticsSession } from './_api';
3
- export declare class Districts {
7
+ export declare class SessionData {
4
8
  _session: AnalyticsSession;
9
+ profile?: L.Profile;
10
+ legacyScorecardAlt?: L.Scorecard;
11
+ newScorecard?: Types.Scorecard;
12
+ ratings?: T.Ratings;
13
+ checklist?: T.RequirementsChecklist;
14
+ statistics?: T.DistrictStatistics;
15
+ bOneTimeProcessingDone: boolean;
16
+ bPlanAnalyzed: boolean;
17
+ title: string;
18
+ legislativeDistricts: boolean;
19
+ repsByDistrict?: number[];
20
+ config: T.Dict;
21
+ state: State;
22
+ counties: Counties;
23
+ graph: T.ContiguityGraph;
24
+ features: Features;
25
+ plan: Plan;
26
+ districts: Districts;
27
+ aggregates: Aggregates;
28
+ CxD: number[][];
29
+ constructor(s: AnalyticsSession, SessionRequest: T.SessionRequest);
30
+ }
31
+ export declare class Aggregates {
32
+ _container: D.SessionData;
33
+ _aggregates: PF.PackedFields[];
34
+ unpacked: {
35
+ [key: string]: {
36
+ [key: string]: number[];
37
+ };
38
+ };
39
+ columns: {
40
+ [key: string]: any[];
41
+ };
42
+ constructor(container: D.SessionData, aggregates: PF.PackedFields[]);
43
+ process(): void;
44
+ transpose(): T.DistrictRow[];
45
+ private _unpack;
46
+ private _columnize;
47
+ private _checkReqs;
48
+ private _convert;
49
+ }
50
+ export declare class Districts {
51
+ _container: D.SessionData;
5
52
  _shapes: T.GeoFeatureCollection;
6
- _geoProperties: T.DistrictProperties;
7
- constructor(s: AnalyticsSession, ds: T.GeoFeatureCollection);
8
- getDistrictShapes(): T.GeoFeatureCollection;
9
- getDistrictShapeByID(id: number): T.GeoFeature | undefined;
10
- getCountyIndex(geoID: string): number;
53
+ constructor(container: D.SessionData, ds: T.GeoFeatureCollection);
54
+ getShapes(): T.GeoFeatureCollection;
11
55
  }
12
56
  export declare class Features {
13
- _session: AnalyticsSession;
57
+ _container: D.SessionData;
14
58
  _data: T.GeoFeatureCollection;
15
59
  _keys: T.DatasetKeys;
16
60
  _featureIDs: T.FeaturesByGeoID;
17
- constructor(s: AnalyticsSession, data: T.GeoFeatureCollection, keys: T.DatasetKeys);
61
+ constructor(container: D.SessionData, data: T.GeoFeatureCollection, keys: T.DatasetKeys);
18
62
  nFeatures(): number;
19
63
  featureByIndex(i: number): T.GeoFeature;
20
- resetDataset(d: T.Dataset, k: string): void;
21
64
  mapGeoIDsToFeatureIDs(): void;
22
65
  featureID(i: string): number;
23
66
  }
24
67
  export declare function geoIDForFeature(f: any): string;
25
68
  export declare function fieldForFeature(f: any, dk: string, ff: T.FeatureField): any;
26
69
  export declare class Counties {
27
- _session: AnalyticsSession;
70
+ _container: D.SessionData;
28
71
  _data: T.GeoFeatureCollection;
29
72
  _countyNameLookup: T.FIPSCodeToCountyNameMap;
30
73
  nCounties: number;
31
74
  index: T.FIPSToOrdinalMap;
32
75
  fips: T.OrdinalToFIPSlMap;
33
76
  totalPopulation: number[];
34
- constructor(s: AnalyticsSession, data: T.GeoFeatureCollection);
77
+ constructor(container: D.SessionData, data: T.GeoFeatureCollection);
35
78
  countyByIndex(i: number): T.GeoFeature;
36
79
  propertyForCounty(f: any, pk: string): any;
37
80
  mapFIPSToName(fips: string, name: string): void;
@@ -39,7 +82,7 @@ export declare class Counties {
39
82
  indexFromFIPS(fips: string): number;
40
83
  }
41
84
  export declare class State {
42
- _session: AnalyticsSession;
85
+ _container: D.SessionData;
43
86
  xx: string;
44
87
  nDistricts: number;
45
88
  nReps: number;
@@ -50,14 +93,14 @@ export declare class State {
50
93
  singleCountyDistrictMax: number;
51
94
  expectedSplits: number;
52
95
  expectedAffected: number;
53
- constructor(s: AnalyticsSession, xx: string, n: number);
96
+ constructor(container: D.SessionData, xx: string, n: number);
54
97
  }
55
98
  export declare class Plan {
56
- _session: AnalyticsSession;
99
+ _container: D.SessionData;
57
100
  _planByGeoID: T.PlanByGeoID;
58
101
  _planByDistrictID: T.PlanByDistrictID;
59
102
  districtIDs: number[];
60
- constructor(s: AnalyticsSession, p: T.PlanByGeoID);
103
+ constructor(container: D.SessionData, p: T.PlanByGeoID);
61
104
  invertPlan(bLog?: boolean): void;
62
105
  initializeDistrict(i: number): void;
63
106
  byGeoID(): T.PlanByGeoID;
@@ -65,4 +108,5 @@ export declare class Plan {
65
108
  districtForGeoID(i: string): number;
66
109
  geoIDsForDistrictID(i: number): Set<string>;
67
110
  }
68
- export declare function invertPlan(plan: T.PlanByGeoID, s?: AnalyticsSession, bLog?: boolean): T.PlanByDistrictID;
111
+ export declare function invertPlan(plan: T.PlanByGeoID, container?: D.SessionData, bLog?: boolean): T.PlanByDistrictID;
112
+ export declare function processConfig(config: T.Dict): T.Dict;