diff --git a/src/frontend/core/Randomize.js b/src/frontend/core/Randomize.js new file mode 100644 index 0000000000000000000000000000000000000000..e6b35bb376649294cc40f2723989234b78e72d31 --- /dev/null +++ b/src/frontend/core/Randomize.js @@ -0,0 +1,47 @@ +const integer = (min = 1, max = 9) => { + return (Math.random() * (max - min + 1) | 0) + min; +}; + +const array1D = (N, options) => { + return array2D(1, N, options)[0]; +}; + +const array2D = (N = 10, M = 10, options = {}) => { + const { sorted = false, min, max } = options; + const D = []; + for (let i = 0; i < N; i++) { + D.push([]); + for (let j = 0; j < M; j++) { + D[i].push(integer(min, max)); + } + if (sorted) D[i].sort((a, b) => a - b); + } + return D; +}; + +const graph = (N = 5, options = {}) => { + const { directed = true, weighted = false, ratio = .3, min, max } = options; + const G = new Array(N); + for (let i = 0; i < N; i++) G[i] = new Array(N); + for (let i = 0; i < N; i++) { + G[i][i] = 0; + if (directed) { + for (let j = 0; j < N; j++) { + if (i === j) continue; + G[i][j] = Math.random() < ratio ? weighted ? integer(min, max) : 1 : 0; + } + } else { + for (let j = 0; j < i; j++) { + G[i][j] = G[j][i] = Math.random() < ratio ? weighted ? integer(min, max) : 1 : 0; + } + } + } + return G; +}; + +export default { + integer, + array1D, + array2D, + graph, +}; \ No newline at end of file diff --git a/src/frontend/core/datas/Array2DData.js b/src/frontend/core/datas/Array2DData.js index d9eddb6967daabd9227991ce9981ac5dd242dbaa..a2feeeb9d1e290b4531756ed8ff1dca96752bad6 100644 --- a/src/frontend/core/datas/Array2DData.js +++ b/src/frontend/core/datas/Array2DData.js @@ -18,7 +18,7 @@ class Array2DData extends Data { super.set(); } - notify(x, y, v) { + notify(x, y, v = this.data[x][y].value) { this.data[x][y].value = v; this.data[x][y].notified = true; this.render(); diff --git a/src/frontend/core/datas/GraphData.js b/src/frontend/core/datas/GraphData.js index d77dab65c9368a8ce7be9f677c85d4b4c54998c7..435e78dd919de3f1ca8e9dd89cd0fcf64cb30abc 100644 --- a/src/frontend/core/datas/GraphData.js +++ b/src/frontend/core/datas/GraphData.js @@ -108,12 +108,12 @@ class Graph { } addNode(id, weight, visited, x = 0, y = 0) { - if (this.findNode(id)) throw new Error(`Node '${id}' is already added.`); + if (this.findNode(id)) return; this.nodes.push({ id, weight, visited, x, y }); } addEdge(source, target, weight, visited) { - if (this.findEdge(source, target)) throw new Error(`Edge from '${source}' to '${target}' is already added.`); + if (this.findEdge(source, target)) return; this.edges.push({ source, target, weight, visited }); } diff --git a/src/frontend/core/index.js b/src/frontend/core/index.js index 4197bf05964e754726366f1f79910a6b44945ff2..7f90fed1fb315cc1a16484cf74e957eca6eaf65e 100644 --- a/src/frontend/core/index.js +++ b/src/frontend/core/index.js @@ -1,2 +1,3 @@ +export { default as Randomize } from './Randomize'; export { default as Seed } from './Seed'; export { default as tracerManager } from './tracerManager'; \ No newline at end of file diff --git a/src/frontend/core/tracerManager.jsx b/src/frontend/core/tracerManager.jsx index 1208a6cbb2864beac561b9289e3ddac4a49fe39d..7d7e7e2ccddd24cc552270334bc5875b68479fce 100644 --- a/src/frontend/core/tracerManager.jsx +++ b/src/frontend/core/tracerManager.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Seed } from '/core'; +import { Randomize, Seed } from '/core'; import * as Tracers from '/core/tracers'; import { Tracer } from '/core/tracers'; import * as Datas from '/core/datas'; @@ -8,6 +8,7 @@ import { Array1DRenderer, Array2DRenderer, ChartRenderer, GraphRenderer, LogRend Object.assign(window, Tracers); Object.assign(window, Datas); +Object.assign(window, { Randomize }); class TracerManager { constructor() { diff --git a/src/frontend/core/tracers/Tracer.js b/src/frontend/core/tracers/Tracer.js index 846e2e9e966eac2603ea121601d411765b2f210f..5374a9ff994d8b2c571d572d27bb150dee7bb033 100644 --- a/src/frontend/core/tracers/Tracer.js +++ b/src/frontend/core/tracers/Tracer.js @@ -1,5 +1,9 @@ class Tracer { constructor(title = this.constructor.name, options = {}) { + if (typeof title === 'object') { + options = title; + title = this.constructor.name; + } this.key = Tracer.seed.addTracer(this.constructor.name, title, options); this.register( 'reset',