Move some files from core/attribution/ to analysis/ (#944)

The `core/attribution/` folder has some code that really is "core" in
that it deals with very basic concepts around converting graphs to
markov chains and running PageRank on them, and some code that is less
"core", like for normalizing scores and doing analysis on them.

To make progresson #704, we need an intermediary directory that has
analysis-related code that is e.g. aware of Node and Edge types, and
weights on those types, and can use them to run weight-informed
PageRank. That code shouldn't live in the app directory (since it is not
coupled to the frontend rendering), but also shouldn't live in core
(since "core" is basically finalized code with fully baked abstractions,
and per #710, this is not true of the node/edge type system).

Thus, I've decided to create the `analysis` directory. To get that
directory started, I've moved the non-core code in `core/attribution/`
to `analysis/`.

Test plan: `yarn test` passes, which is all we need, since this is a
straightforward file rename.
This commit is contained in:
Dandelion Mané 2018-10-29 22:54:15 +00:00 committed by GitHub
parent 542e2f9723
commit 917b793aca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 31 additions and 30 deletions

View File

@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP // Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`core/attribution/pagerankNodeDecomposition decompose has the expected output on a simple asymmetric chain 1`] = ` exports[`analysis/pagerankNodeDecomposition decompose has the expected output on a simple asymmetric chain 1`] = `
Map { Map {
"NodeAddress[\\"n1\\"]" => Object { "NodeAddress[\\"n1\\"]" => Object {
"score": 0.19117656878499834, "score": 0.19117656878499834,

View File

@ -1,7 +1,7 @@
// @flow // @flow
import {NodeAddress, type NodeAddressT} from "../graph"; import {NodeAddress, type NodeAddressT} from "../core/graph";
import type {NodeDistribution} from "./graphToMarkovChain"; import type {NodeDistribution} from "../core/attribution/graphToMarkovChain";
export type NodeScore = Map<NodeAddressT, number>; export type NodeScore = Map<NodeAddressT, number>;

View File

@ -1,8 +1,9 @@
// @flow // @flow
import {NodeAddress} from "../graph"; import {NodeAddress} from "../core/graph";
import {scoreByMaximumProbability, scoreByConstantTotal} from "./nodeScore"; import {scoreByMaximumProbability, scoreByConstantTotal} from "./nodeScore";
describe("core/attribution/nodeScore", () => {
describe("analysis/nodeScore", () => {
const foo = NodeAddress.fromParts(["foo"]); const foo = NodeAddress.fromParts(["foo"]);
const bar = NodeAddress.fromParts(["bar"]); const bar = NodeAddress.fromParts(["bar"]);
const zod = NodeAddress.fromParts(["zod"]); const zod = NodeAddress.fromParts(["zod"]);

View File

@ -1,12 +1,12 @@
// @flow // @flow
import {type Edge, Graph, NodeAddress, type NodeAddressT} from "../graph"; import {type Edge, Graph, NodeAddress, type NodeAddressT} from "../core/graph";
import { import {
distributionToNodeDistribution, distributionToNodeDistribution,
createConnections, createConnections,
createOrderedSparseMarkovChain, createOrderedSparseMarkovChain,
type EdgeWeight, type EdgeWeight,
} from "./graphToMarkovChain"; } from "../core/attribution/graphToMarkovChain";
import { import {
decompose, decompose,
type PagerankNodeDecomposition, type PagerankNodeDecomposition,
@ -14,9 +14,9 @@ import {
import {scoreByConstantTotal} from "./nodeScore"; import {scoreByConstantTotal} from "./nodeScore";
import {findStationaryDistribution} from "./markovChain"; import {findStationaryDistribution} from "../core/attribution/markovChain";
export type {NodeDistribution} from "./graphToMarkovChain"; export type {NodeDistribution} from "../core/attribution/graphToMarkovChain";
export type {PagerankNodeDecomposition} from "./pagerankNodeDecomposition"; export type {PagerankNodeDecomposition} from "./pagerankNodeDecomposition";
export type PagerankOptions = {| export type PagerankOptions = {|
+selfLoopWeight?: number, +selfLoopWeight?: number,
@ -29,7 +29,7 @@ export type PagerankOptions = {|
+totalScoreNodePrefix?: NodeAddressT, +totalScoreNodePrefix?: NodeAddressT,
|}; |};
export type {EdgeWeight} from "./graphToMarkovChain"; export type {EdgeWeight} from "../core/attribution/graphToMarkovChain";
export type EdgeEvaluator = (Edge) => EdgeWeight; export type EdgeEvaluator = (Edge) => EdgeWeight;
function defaultOptions(): PagerankOptions { function defaultOptions(): PagerankOptions {

View File

@ -2,15 +2,15 @@
import sortBy from "lodash.sortby"; import sortBy from "lodash.sortby";
import type {NodeAddressT} from "../graph"; import type {NodeAddressT} from "../core/graph";
import { import {
type Connection, type Connection,
type NodeToConnections, type NodeToConnections,
adjacencySource, adjacencySource,
} from "./graphToMarkovChain"; } from "../core/attribution/graphToMarkovChain";
import type {NodeScore} from "./nodeScore"; import type {NodeScore} from "./nodeScore";
import * as MapUtil from "../../util/map"; import * as MapUtil from "../util/map";
import * as NullUtil from "../../util/null"; import * as NullUtil from "../util/null";
export type ScoredConnection = {| export type ScoredConnection = {|
+connection: Connection, +connection: Connection,

View File

@ -1,16 +1,16 @@
// @flow // @flow
import {EdgeAddress, Graph, NodeAddress, edgeToStrings} from "../graph"; import {EdgeAddress, Graph, NodeAddress, edgeToStrings} from "../core/graph";
import { import {
distributionToNodeDistribution, distributionToNodeDistribution,
createConnections, createConnections,
createOrderedSparseMarkovChain, createOrderedSparseMarkovChain,
} from "./graphToMarkovChain"; } from "../core/attribution/graphToMarkovChain";
import {findStationaryDistribution} from "./markovChain"; import {findStationaryDistribution} from "../core/attribution/markovChain";
import {decompose} from "./pagerankNodeDecomposition"; import {decompose} from "./pagerankNodeDecomposition";
import * as MapUtil from "../../util/map"; import * as MapUtil from "../util/map";
import {advancedGraph} from "../graphTestUtil"; import {advancedGraph} from "../core/graphTestUtil";
/** /**
* Format a decomposition to be shown in a snapshot. This converts * Format a decomposition to be shown in a snapshot. This converts
@ -108,7 +108,7 @@ function validateDecomposition(decomposition) {
} }
} }
describe("core/attribution/pagerankNodeDecomposition", () => { describe("analysis/pagerankNodeDecomposition", () => {
describe("decompose", () => { describe("decompose", () => {
it("has the expected output on a simple asymmetric chain", async () => { it("has the expected output on a simple asymmetric chain", async () => {
const n1 = NodeAddress.fromParts(["n1"]); const n1 = NodeAddress.fromParts(["n1"]);

View File

@ -5,7 +5,7 @@ import * as NullUtil from "../../../util/null";
import type {NodeAddressT} from "../../../core/graph"; import type {NodeAddressT} from "../../../core/graph";
import type {Connection} from "../../../core/attribution/graphToMarkovChain"; import type {Connection} from "../../../core/attribution/graphToMarkovChain";
import type {ScoredConnection} from "../../../core/attribution/pagerankNodeDecomposition"; import type {ScoredConnection} from "../../../analysis/pagerankNodeDecomposition";
import {DynamicAdapterSet} from "../../adapters/adapterSet"; import {DynamicAdapterSet} from "../../adapters/adapterSet";
import {TableRow} from "./TableRow"; import {TableRow} from "./TableRow";
import {NodeRow} from "./Node"; import {NodeRow} from "./Node";

View File

@ -5,7 +5,7 @@ import sortBy from "lodash.sortby";
import * as NullUtil from "../../../util/null"; import * as NullUtil from "../../../util/null";
import {type NodeAddressT, NodeAddress} from "../../../core/graph"; import {type NodeAddressT, NodeAddress} from "../../../core/graph";
import type {PagerankNodeDecomposition} from "../../../core/attribution/pagerankNodeDecomposition"; import type {PagerankNodeDecomposition} from "../../../analysis/pagerankNodeDecomposition";
import {DynamicAdapterSet} from "../../adapters/adapterSet"; import {DynamicAdapterSet} from "../../adapters/adapterSet";
import type {DynamicPluginAdapter} from "../../adapters/pluginAdapter"; import type {DynamicPluginAdapter} from "../../adapters/pluginAdapter";
import {FALLBACK_NAME} from "../../adapters/fallbackAdapter"; import {FALLBACK_NAME} from "../../adapters/fallbackAdapter";

View File

@ -5,7 +5,7 @@ import stringify from "json-stable-stringify";
import * as MapUtil from "../../../util/map"; import * as MapUtil from "../../../util/map";
import {NodeTrie, EdgeTrie} from "../../../core/trie"; import {NodeTrie, EdgeTrie} from "../../../core/trie";
import type {NodeType, EdgeType} from "../../adapters/pluginAdapter"; import type {NodeType, EdgeType} from "../../adapters/pluginAdapter";
import type {ScoredConnection} from "../../../core/attribution/pagerankNodeDecomposition"; import type {ScoredConnection} from "../../../analysis/pagerankNodeDecomposition";
// Sorted by descending `summary.score` // Sorted by descending `summary.score`
export type FlatAggregations = $ReadOnlyArray<FlatAggregation>; export type FlatAggregations = $ReadOnlyArray<FlatAggregation>;

View File

@ -9,7 +9,7 @@ import {
import {DynamicAdapterSet} from "../../adapters/adapterSet"; import {DynamicAdapterSet} from "../../adapters/adapterSet";
import type {PagerankNodeDecomposition} from "../../../core/attribution/pagerankNodeDecomposition"; import type {PagerankNodeDecomposition} from "../../../analysis/pagerankNodeDecomposition";
export function nodeDescription( export function nodeDescription(
address: NodeAddressT, address: NodeAddressT,

View File

@ -1,7 +1,7 @@
// @flow // @flow
import {dynamicAdapterSet} from "../../adapters/demoAdapters"; import {dynamicAdapterSet} from "../../adapters/demoAdapters";
import {pagerank} from "../../../core/attribution/pagerank"; import {pagerank} from "../../../analysis/pagerank";
import {defaultWeightsForAdapterSet} from "../weights/weights"; import {defaultWeightsForAdapterSet} from "../weights/weights";
export const COLUMNS = () => ["Description", "", "Cred"]; export const COLUMNS = () => ["Description", "", "Cred"];

View File

@ -5,12 +5,12 @@ import deepEqual from "lodash.isequal";
import {Graph, type NodeAddressT} from "../../core/graph"; import {Graph, type NodeAddressT} from "../../core/graph";
import type {Assets} from "../../app/assets"; import type {Assets} from "../../app/assets";
import type {RepoId} from "../../core/repoId"; import type {RepoId} from "../../core/repoId";
import {type EdgeEvaluator} from "../../core/attribution/pagerank"; import {type EdgeEvaluator} from "../../analysis/pagerank";
import { import {
type PagerankNodeDecomposition, type PagerankNodeDecomposition,
type PagerankOptions, type PagerankOptions,
pagerank, pagerank,
} from "../../core/attribution/pagerank"; } from "../../analysis/pagerank";
import {StaticAdapterSet, DynamicAdapterSet} from "../adapters/adapterSet"; import {StaticAdapterSet, DynamicAdapterSet} from "../adapters/adapterSet";
import type {WeightedTypes} from "./weights/weights"; import type {WeightedTypes} from "./weights/weights";

View File

@ -10,7 +10,7 @@ import {
import {Graph, NodeAddress} from "../../core/graph"; import {Graph, NodeAddress} from "../../core/graph";
import {Assets} from "../assets"; import {Assets} from "../assets";
import {makeRepoId, type RepoId} from "../../core/repoId"; import {makeRepoId, type RepoId} from "../../core/repoId";
import {type EdgeEvaluator} from "../../core/attribution/pagerank"; import {type EdgeEvaluator} from "../../analysis/pagerank";
import { import {
type WeightedTypes, type WeightedTypes,
defaultWeightsForAdapterSet, defaultWeightsForAdapterSet,
@ -19,7 +19,7 @@ import {StaticAdapterSet, DynamicAdapterSet} from "../adapters/adapterSet";
import type { import type {
PagerankNodeDecomposition, PagerankNodeDecomposition,
PagerankOptions, PagerankOptions,
} from "../../core/attribution/pagerank"; } from "../../analysis/pagerank";
import {staticAdapterSet} from "../adapters/demoAdapters"; import {staticAdapterSet} from "../adapters/demoAdapters";
describe("app/credExplorer/state", () => { describe("app/credExplorer/state", () => {

View File

@ -2,7 +2,7 @@
import type {Edge} from "../../../core/graph"; import type {Edge} from "../../../core/graph";
import type {WeightedTypes} from "./weights"; import type {WeightedTypes} from "./weights";
import type {EdgeEvaluator} from "../../../core/attribution/pagerank"; import type {EdgeEvaluator} from "../../../analysis/pagerank";
import {NodeTrie, EdgeTrie} from "../../../core/trie"; import {NodeTrie, EdgeTrie} from "../../../core/trie";
export function weightsToEdgeEvaluator(weights: WeightedTypes): EdgeEvaluator { export function weightsToEdgeEvaluator(weights: WeightedTypes): EdgeEvaluator {