{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-seminars/EUD2020/project_2/src/smoothPropagator.js"],"names":["Ceres","backprop_strings","round","number","Math","Number","EPSILON","SmoothPropagator","constructor","data","fnString","fn","eval","target","updateTarget","bind","updateTable","dataContainsOnlyNumbers","table","editor","result","initAsyncHTML","then","setFromArray","map","x","addEventListener","value","evt","ctrlKey","key","lively","notify","stopPropagation","preventDefault","getPropagator","sleep","every","isNaN","asArray","flat","solveNumber","solver","solution","promise","i","length","add_function","val","abs","x_0","st","solve","solutions","remove"],"mappings":"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","file":"smoothPropagator.js","sourcesContent":["import { Ceres } from \"https://cdn.jsdelivr.net/gh/Pterodactylus/Ceres.js@master/Ceres-v1.4.13.js\";\nimport backprop_strings from './stringBackprop.js';\n\nconst round = number => Math.round((number + Number.EPSILON) * 100) / 100;\n\nexport class SmoothPropagator {\n  constructor(data = [5, 6], fnString = \"x => x[0] + x[1]\") {\n    this.data = data;\n    this.fnString = fnString;\n    this.fn = eval(fnString);\n    this.target;\n    \n    this.updateTarget = this.updateTarget.bind(this);\n    this.updateTable = this.updateTable.bind(this);\n    this.dataContainsOnlyNumbers = this.dataContainsOnlyNumbers.bind(this);\n    \n    this.table;\n    this.editor;\n    this.result = (<input input={this.updateTable} value={this.target}></input>);\n    this.initAsyncHTML().then(() => this.updateTarget());\n  }\n  \n  async initAsyncHTML() {\n    this.table = await (<lively-table\n                          style=\"font-weight:400;\"></lively-table>);\n    await this.table.setFromArray(this.data.map(x => [x]));\n    this.table.addEventListener(\"keydown\", this.updateTarget);\n    \n    this.editor = await (<lively-code-mirror></lively-code-mirror>);\n    this.editor.addEventListener(\"blur\", this.updateTarget);\n    this.editor.value = this.fnString;\n    this.editor.addEventListener(\"keydown\", (evt) => {\n      if (evt.ctrlKey && evt.key == \"s\") {\n        lively.notify(\"Save is disabled...\");\n        evt.stopPropagation();\n        evt.preventDefault();\n      }\n    });\n  }\n  \n  async getPropagator() {\n    // wait for HTML to be initialized\n    await lively.sleep(0);\n    return(\n      <div class=\"propagator-container\" style=\"width: 100%;\">\n        <div class=\"propagator\" \n             style=\"\n                display: flex;\n                justify-content: space-around;\n                align-items: center;\n                width: 800px;\n                padding: 10px;\n                margin: 20px auto;\n                box-shadow: 0 3px 7px 0 rgba(0,0,0,0.3);\n                border-radius: 5px;\n              \">\n          <div>{this.table}</div>\n          <span>></span>\n          <div style=\"width: 50%;\">{this.editor}</div>\n          <span>=</span>\n          <div>{this.result}</div>\n        </div>\n      </div>\n  )};\n  \n  dataContainsOnlyNumbers() {\n    return this.data.every(x => !isNaN(x));\n  };\n\n  async updateTarget() {\n    this.fn = eval(this.editor.value);\n    // wait for table state to update\n    await lively.sleep(0);\n    this.data = this.table.asArray().flat();\n    // explicitly convert all values to Number\n    if (this.dataContainsOnlyNumbers()) {\n      this.data = this.data.map(x => Number(x));\n      this.result.value = round(this.fn(this.data));\n    } else {\n      this.result.value = this.fn(this.data);\n    }\n  };\n\n\n  async updateTable(evt) {\n    this.target = evt.target.value;\n    if (this.dataContainsOnlyNumbers()) {\n      this.data = await this.solveNumber(this.fn, this.data.map(x => Number(x)), Number(this.target));\n    } else {\n      this.data = backprop_strings(this.fn, this.data, this.target);\n    }\n    this.table.setFromArray(this.data.map((x) => [x]));\n  };\n\n  async solveNumber(fn, data, target) {\n    var solver = new Ceres();\n    let solution = await solver.promise.then(() => {\n      // Ceres requires one optimizable function per input value\n      for (let i = 0; i < data.length; i++) {\n        solver.add_function((val) => Math.abs(fn(val) - target));\n      }\n      let x_0 = data;\n      let st = solver.solve(x_0);\n      let solutions = st.x; // assign the calculated solution array\n      solver.remove(); // required to free the memory in C++\n      return solutions.map(round);\n    });\n    return solution;\n  };           \n}\n"]}