///
declare module graphlib {
interface GraphOptions {
name: string;
/**
* Direction for rank nodes. Can be TB, BT, LR, or RL, where T = top,
* B = bottom, L = left, and R = right.
*/
rankdir: string;
type: string|number;
/** Number of pixels between each rank in the layout. */
ranksep?: number;
/** Number of pixels that separate nodes horizontally in the layout. */
nodesep?: number;
}
export interface EdgeObject {
v: string;
w: string;
name?: string;
}
export class Graph {
constructor(opt?: Object);
setNode(name: string, value?: N): void;
hasNode(name: string): boolean;
setEdge(fromName: string, toName: string, value?: E): void;
hasEdge(fromName: string, toName: string): boolean;
edge(fromName: string, toName: string): E;
edge(edgeObject: EdgeObject): E;
removeEdge(v: string, w: string): void;
nodes(): string[];
node(name: string): N;
removeNode(name: string): void;
setGraph(graphOptions: GraphOptions): void;
graph(): GraphOptions;
nodeCount(): number;
neighbors(name: string): string[];
successors(name: string): string[];
predecessors(name: string): string[];
edges(): EdgeObject[];
outEdges(name: string): E[];
inEdges(name: string): E[];
/** Returns those nodes in the graph that have no in-edges. Takes O(|V|) time. */
sources(): string[];
/**
* Remove the node with the id v in the graph or do nothing if
* the node is not in the graph. If the node was removed this
* function also removes any incident edges. Returns the graph,
* allowing this to be chained with other functions. Takes O(|E|) time.
*/
removeNode(name: string): Graph;
setParent(name: string, parentName: string): void;
}
}
module tf {
/**
* Recommended delay (ms) when running an expensive task asynchronously
* that gives enough time for the progress bar to update its UI.
*/
const ASYNC_TASK_DELAY = 20;
export function time(msg: string, task: () => T) {
let start = Date.now();
let result = task();
/* tslint:disable */
console.log(msg, ":", Date.now() - start, "ms");
/* tslint:enable */
return result;
}
/**
* Tracks task progress. Each task being passed a progress tracker needs
* to call the below-defined methods to notify the caller about the gradual
* progress of the task.
*/
export interface ProgressTracker {
updateProgress(incrementValue: number): void;
setMessage(msg: string): void;
reportError(msg: string): void;
}
/**
* Creates a tracker for a subtask given the parent tracker, the total progress
* of the subtask and the subtask message. The parent task should pass a
* subtracker to its subtasks. The subtask reports its own progress which
* becames relative to the main task.
*/
export function getSubtaskTracker(parentTracker: ProgressTracker,
impactOnTotalProgress: number, subtaskMsg: string): ProgressTracker {
return {
setMessage: function(progressMsg) {
// The parent should show a concatenation of its message along with
// its subtask tracker message.
parentTracker.setMessage(subtaskMsg + " : " + progressMsg);
},
updateProgress: function(incrementValue) {
// Update the parent progress relative to the child progress.
// For example, if the sub-task progresses by 30%, and the impact on the
// total progress is 50%, then the task progresses by 30% * 50% = 15%.
parentTracker
.updateProgress(incrementValue * impactOnTotalProgress / 100);
},
reportError: function(errorMsg) {
// The parent should show a concatenation of its message along with
// its subtask error message.
parentTracker.reportError(subtaskMsg + " : " + errorMsg);
}
};
}
/**
* Runs an expensive task asynchronously and returns a promise of the result.
*/
export function runAsyncTask(msg: string, incProgressValue: number,
task: () => T, tracker: ProgressTracker): Promise {
return new Promise((resolve, reject) => {
// Update the progress message to say the current running task.
tracker.setMessage(msg);
// Run the expensive task with a delay that gives enough time for the
// UI to update.
setTimeout(function() {
try {
var result = tf.time(msg, task);
// Update the progress value.
tracker.updateProgress(incProgressValue);
// Return the result to be used by other tasks.
resolve(result);
} catch (e) {
reject(result);
}
}, ASYNC_TASK_DELAY);
});
}
/**
* Returns a query selector with escaped special characters that are not
* allowed in a query selector.
*/
export function escapeQuerySelector(querySelector: string): string {
return querySelector.replace( /([:.\[\],/\\\(\)])/g, "\\$1" );
}
/**
* TensorFlow node definition as definied in the graph proto file.
*/
export interface TFNode {
/** Name of the node */
name: string;
/** List of nodes that are inputs for this node. */
input: string[];
/** The name of the device where the computation will run. */
device: string;
/** The name of the operation associated with this node. */
op: string;
/** List of attributes that describe/modify the operation. */
attr: {key: string, value: Object}[];
}
/**
* TensorFlow stats file definition as defined in the stats proto file.
*/
export interface TFStats {
devStats: {device: string, nodeStats: TFNodeStats[]}[];
}
/**
* TensorFlow stats for a node as defined in the stats proto file.
*/
export interface TFNodeStats {
nodeName: string;
// The next 4 properties are currently stored as string in json
// and must be parsed.
allStartMicros: number;
opStartRelMicros: number;
opEndRelMicros: number;
allEndRelMicros: number;
memory: {
allocatorName: string;
totalBytes: number; // Stored as string in json and should be parsed.
peakBytes: number; // Stored as string in json and should be parsed.
}[];
/** Output sizes recorded for a single execution of a graph node */
output: TFNodeOutput[];
timelineLabel: string;
scheduledMicros: string;
threadId: string;
}
/**
* Description for the output tensor(s) of an operation in the graph.
*/
export interface TFNodeOutput {
slot: number; // Stored as string in json and should be parsed.
/** Was the tensor allocated by this Op or a previous computation */
allocationType: string;
tensorDescription: {
/** Data type of tensor elements */
dtype: string;
/** Shape of the tensor */
shape: {
/**
* Dimensions of the tensor, such as [{name: "input", size: 30},
* {name: "output", size: 40}] for a 30 x 40 2D tensor. The names
* are optional. The order of entries in "dim" matters: It indicates
* the layout of the values in the tensor in-memory representation.
*/
dim: {
/** Size of the tensor in that dimension */
size: number, // Stored as string in json and should be parsed.
/** Optional name of the tensor dimension */
name?: string
}[];
};
/** Information about the size and allocator used for the data */
allocationDescription: {
// The next 2 properties are stored as string in json and
// should be parsed.
/** Total number of bytes requested */
requestedBytes: number;
/** Total number of bytes allocated, if known */
allocatedBytes?: number;
/** Name of the allocator used */
allocatorName: string;
};
};
}
} // close module tf
/**
* Declaring dagre var used for dagre layout.
*/
declare var dagre: { layout(graph: graphlib.Graph): void; };