diff --git a/client.js b/client.js index aded5348..ce67a6a8 100644 --- a/client.js +++ b/client.js @@ -364,12 +364,14 @@ write-data=${ path.resolve(config.instanceDirectory, instance) }\r\n data = data.toString("utf8").replace(/(\r\n\t|\n|\r\t)/gm,""); console.log(data); if(data.includes("Starting RCON interface")){ - let client = new Rcon(); + let client = new Rcon({ + packetResponseTimeout: 200000, + maxPending: 5 + }); client.connect({ host: 'localhost', port: Number(process.env.RCONPORT) || instconf.clientPort, - password: instconf.clientPassword, - timeout: 5000 + password: instconf.clientPassword }); client.onDidAuthenticate(() => { console.log('Clusterio | RCON Authenticated!'); @@ -493,8 +495,10 @@ write-data=${ path.resolve(config.instanceDirectory, instance) }\r\n // connect to the server with rcon if(true || process.platform != "linux"){ // IP, port, password - client = new Rcon(); - + client = new Rcon({ + packetResponseTimeout: 200000, // 200s, should allow for commands up to 1250kB in length + maxPending: 5 + }); // check the logfile to see if the RCON interface is running as there is no way to continue without it // we read the log every 2 seconds and stop looping when we start connecting to factorio function checkRcon() { @@ -505,7 +509,6 @@ write-data=${ path.resolve(config.instanceDirectory, instance) }\r\n host: 'localhost', port: args["rcon-port"] || Number(process.env.RCONPORT) || instanceconfig.clientPort, password: args["rcon-password"] || instanceconfig.clientPassword, - timeout: 5000 }); } else { setTimeout(function(){ diff --git a/config.json.dist b/config.json.dist index 1c598664..d7f6a6b3 100644 --- a/config.json.dist +++ b/config.json.dist @@ -49,7 +49,7 @@ "logItemTransfers": false, "__comment6.5": "When the master is undersupplied, we have 3 different modes to 'fairly' distribute items. First to ask gets all, dole division using weird formula or experimental neural net tries to make stuff as fair as possible. Feel free to play around.", "disableFairItemDistribution": false, - "useNeuralNetDoleDivider": false, + "useNeuralNetDoleDivider": true, "uploadModsToMaster": true, "msBetweenCommands": 10, "allowRemoteCommandExecution": true, diff --git a/lib/dole_nn_base.js b/lib/dole_nn_base.js index e4dda0b6..ba00188c 100644 --- a/lib/dole_nn_base.js +++ b/lib/dole_nn_base.js @@ -33,12 +33,14 @@ function sigmoid3(x) //carry - carry for item X slave Y //prev_req - Numreq for previous request for item X slave Y //* doleinfo_last - Object with 2 values for last "tick period": numreq - total number or requests for item, numslave - number of slaves requesting that item +//debt - debt for item X slave Y //Returns: Array of 3 elements //0.Number of items to give in that dose //1.New dole for item X //2.New carry for item X slave Y -function Dose(numreq,instore,store_last_tick,dole,carry,prev_req,numreq_total_adj) +//3.New debt +function Dose(numreq,instore,store_last_tick,dole,carry,prev_req,numreq_total_adj,debt) { numreq=Number(numreq); instore=Number(instore); @@ -47,32 +49,37 @@ function Dose(numreq,instore,store_last_tick,dole,carry,prev_req,numreq_total_ad var b=Math.trunc(prev_req/instore_adj*numreq); var inp1=[numreq,instore_adj,store_last_tick/numreq,dole,carry];//0..4 - var inp2=[prev_req/numreq,numreq/numreq_total_adj,store_last_tick/numreq_total_adj,prev_req/instore_adj,b];//5..9 + var inp2=[prev_req/numreq,numreq/numreq_total_adj,store_last_tick/numreq_total_adj,prev_req/instore_adj,b,numreq_total_adj,store_last_tick,debt];//5..12 var inputs=inp1.concat(inp2); - var internal=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; - var outputs=[0,0,0]; + var internal=new Array(20).fill(0); + var outputs=[0,0,0,0]; //NN: Please don't touch :), code is generated -outputs[0]=inputs[2]*3.101320028; -outputs[0]=outputs[0]+inputs[7]*0.5471593142; -outputs[0]=outputs[0]+inputs[3]*2.691268921; -outputs[0]=outputs[0]+outputs[1]*-1.64255929; -outputs[0]=outputs[0]+inputs[6]*0.7746122479; -outputs[0]=sigmoid0(outputs[0]); -outputs[1]=inputs[2]*-0.9946503043; -outputs[1]=outputs[1]+inputs[1]*0.2128598392; +outputs[0]=inputs[7]*0.8058582544; +outputs[0]=sigmoid2(outputs[0]); outputs[1]=sigmoid0(outputs[1]); -outputs[2]=sigmoid2(outputs[2]); +outputs[2]=sigmoid0(outputs[2]); +outputs[3]=inputs[6]*0.2294657379; +outputs[3]=sigmoid0(outputs[3]); - outputs[0]=Number(outputs[0]); - if (outputs[0]<0) outputs[0]=0; - outputs[0]=outputs[0]*numreq; - var res1=Math.round(outputs[0]); - if (res1>numreq) res1=numreq; - if (res1>instore) res1=instore; - if (res1<0) res1=0; - carry=sigmoid0(outputs[2]); - return [res1,sigmoid0(outputs[1]),carry]; + debt=debt || 0; + if (outputs[0]>0.99) outputs[0]=1.0; + + var res1=Number(outputs[0])*numreq+outputs[3]+debt; + var res_capped=Math.round(res1); + + if (res_capped>numreq) res_capped=numreq; + if (res_capped>instore) res_capped=instore; + if (res_capped<0) res_capped=0; + + res1=res1 || 0; + res_capped=res_capped || 0;//Safeguard against wrong values + debt=res1-res_capped; + debt_cap=Math.round(numreq*1.5)+5; + if (debt>debt_cap) debt=debt_cap; + + carry=sigmoid0(outputs[2]*carry+outputs[0]) || 0; + return [res_capped,dole+outputs[1],carry,debt]; } //TICK - Updates values for item X, should be called once for each item for each round of all slaves requesting that item @@ -90,22 +97,16 @@ function Tick(instore,dole,store_last_tick,numreq_total_adj) { var instore_adj=instore; if (instore_adj==0) instore_adj=0.1; - var inputs=[instore,dole,store_last_tick/instore_adj,store_last_tick/numreq_total_adj]; - var internal=[0,0,0,0,0]; + var inputs=[instore,dole,store_last_tick/instore_adj,store_last_tick/numreq_total_adj,store_last_tick,numreq_total_adj]; + var internal=new Array(10).fill(0); var outputs=[0,0]; //NN: Please don't touch :), code is generated -internal[2]=sigmoid0(internal[2]); -outputs[0]=internal[2]*0.4049594998; -outputs[0]=outputs[0]+1.0*-5.026565075; -outputs[0]=outputs[0]+inputs[0]*0.9100194573; -outputs[0]=outputs[0]+inputs[1]*-1.063795686; -outputs[0]=sigmoid1(outputs[0]); -outputs[1]=outputs[0]*1.049500823; -outputs[1]=outputs[1]*inputs[0]*3.437163115; -outputs[1]=sigmoid0(outputs[1]); - - +outputs[0]=inputs[3]*0.9364774823; +outputs[0]=outputs[0]*1.0*0.4590721726; +outputs[0]=sigmoid2(outputs[0]); +outputs[1]=outputs[0]*1.828422785; +outputs[1]=sigmoid3(outputs[1]); avg=outputs[1]; if (numreq_total_adj<0.11) avg=1;//When no item's are requested, result is 0.1 ; In that case there is no deficit, so return 1 = 100% demand fulfilled @@ -115,4 +116,4 @@ outputs[1]=sigmoid0(outputs[1]); return [sigmoid0(outputs[0]),avg]; } -module.exports = {Dose,Tick} +module.exports = {Dose,Tick} \ No newline at end of file diff --git a/package.json b/package.json index 51ee37db..9e8d861f 100644 --- a/package.json +++ b/package.json @@ -56,20 +56,20 @@ "node-factorio-api": "^0.3.1-alpha", "node-forge": "^0.7.1", "prom-client": "^10.2.3", - "rcon-client": "^3.0.2", + "rcon-client": "^3.1.6", "request": "^2.83.0", "right-pad": "^1.0.1", "rmdir-sync": "^1.0.1", "sanitizer": "^0.1.3", "simple-git": "^1.96.0", "single-line-log": "^1.1.2", + "snyk": "^1.134.2", "socket.io": "^2.0.4", "socket.io-client": "^2.0.4", "socket.io-prometheus": "^0.2.1", "sync-request": "^4.0.1", "typescript-collections": "^1.3.2", - "underscore": "^1.8.3", - "snyk": "^1.134.2" + "underscore": "^1.8.3" }, "devDependencies": { "documentation": "^5.4.0", diff --git a/routes/api/remove.js b/routes/api/remove.js index 18feabb1..a29d1165 100644 --- a/routes/api/remove.js +++ b/routes/api/remove.js @@ -33,6 +33,7 @@ class neuralDole { this.carry = {} this.lastRequest = {} this.stats=[] + this.debt= {} setInterval(()=>{ for(let name in this.items){ @@ -71,7 +72,8 @@ class neuralDole { this.dole[object.name], this.carry[object.name+" "+object.instanceID] || 0, this.lastRequest[object.name+"_"+object.instanceID+"_"+object.instanceName] || 0, - this.getRequestStats(object.name,5) + this.getRequestStats(object.name,5), + this.debt[object.name+" "+object.instanceID] || 0 ) if ((this.stats[object.name] || []).length>0) { @@ -84,6 +86,7 @@ class neuralDole { //2.New carry for item X slave Y this.dole[object.name] = magicData[1] this.carry[object.name+" "+object.instanceID] = magicData[2] + this.debt[object.name+" "+object.instanceID] = magicData[3] // Remove item from DB and send it if(this.items.removeItem({count: magicData[0], name: object.name})){ @@ -177,4 +180,4 @@ function doleDivider({ module.exports = { doleDivider, neuralDole -} +} \ No newline at end of file diff --git a/sharedPlugins/statisticsExporter/masterPlugin.js b/sharedPlugins/statisticsExporter/masterPlugin.js index 89b1a97b..7a5da91e 100644 --- a/sharedPlugins/statisticsExporter/masterPlugin.js +++ b/sharedPlugins/statisticsExporter/masterPlugin.js @@ -50,7 +50,10 @@ class masterPlugin { console.log(e) }; } else { - res.send("failure"); + res.send({ + ok:false, + msg:"Invalid request parameters" + }); } }); }