improve and refactor scheduling logic.

[?]
Apr 20, 2020, 4:02 PM
4ACCU75NFJ4ZD5CMHBBYCFLBWL2XQH4RS65FTR4JDJPBHTABYJZAC

Dependencies

  • [2] NQ22FUSW add more options to `main.js`. update `README.md`.
  • [3] BZ6FC2BT add `cp.js`.
  • [4] 3TYF4BJS target only hackable servers. replace servers continually.
  • [5] 6MBUKAG6 remove unneeded functions and comments. update readme.
  • [6] EYKBOK3O optimised the scheduling logic by ensuring that cycles start and finish at minimum security of target.
  • [7] 2LU5Y77O fixed optimum percentage to steal calculator.
  • [8] 2BKHJI2S init
  • [9] CJBGAILA add optional `--target` parameter for `main.js`. update `README.md`.
  • [10] VHWFHMNW 2nd attempt to fix percentage to steal
  • [11] VMXI7PS4 added action cap. improved scoring system. fixed parts of security and cash predictors. made lshw loopable.
  • [12] HHZNTFCT remove `-t` flag for `main.js` which conflicted with the same flag for the `run` command.

Change contents

  • replacement in lib/lib.js at line 702
    [3.3771697][3.1710:1829]()
    const string_job_decide = function(ns, string_server_target, float_server_target_security, float_server_target_cash) {
    [3.3771697]
    [3.3771878]
    const string_job_decider_prepare = function(ns, string_server_target, float_server_target_security, float_server_target_cash) {
    if (float_server_target_security > ns.getServerMinSecurityLevel(string_server_target)) {
    return "weaken";
    }
    if (float_server_target_cash < ns.getServerMaxMoney(string_server_target)) {
    return "grow";
    }
    return "";
    };
    const string_job_decider = function(ns, string_server_target, float_server_target_security, float_server_target_cash) {
  • edit in lib/lib.js at line 768
    [3.7945][3.1576:1787](),[3.1853][3.1853:3730](),[3.3730][3.2874:2996](),[3.2996][3.3849:5277](),[3.3849][3.3849:5277]()
    };
    // weakens the target server. should be finished running before running main schedule
    const array_make_schedule_weaken = function(ns, integer_job_cap, float_padding_seconds, string_server_target_argument) {
    const object_scripts = object_get_constants(ns).object_scripts;
    const array_servers_rooted_sorted_by_ram = array_get_servers_rooted_sorted_by_ram(ns);
    let string_server_target = string_server_target_argument;
    if (string_server_target_argument === null) {
    string_server_target = string_get_server_rooted_hackable_with_score_biggest(ns);
    }
    const float_server_target_security_minimum = ns.getServerMinSecurityLevel(string_server_target);
    const float_time_weaken = float_get_time_weaken(ns, string_server_target, ns.getServerSecurityLevel(string_server_target));
    let float_server_target_security_current = ns.getServerSecurityLevel(string_server_target);
    let array_schedule_weaken = [];
    let integer_array_schedule_weaken_length = 0;
    // assumes weaken takes longest
    let integer_time_job_finishes_seconds = float_time_weaken;
    // iterate through servers in reverse to use servers with the biggest rams first
    for (let integer_indices_0 = array_servers_rooted_sorted_by_ram.length - 1; integer_indices_0 >= 0; --integer_indices_0) {
    if (float_server_target_security_current <= float_server_target_security_minimum ||
    integer_array_schedule_weaken_length >= integer_job_cap) {
    break;
    }
    const string_server_used = array_servers_rooted_sorted_by_ram[integer_indices_0];
    let float_server_used_ram_free_current = float_get_server_ram_free(ns, string_server_used);
    while (
    float_server_target_security_current > float_server_target_security_minimum &&
    float_server_used_ram_free_current > 0 &&
    integer_array_schedule_weaken_length < integer_job_cap
    ) {
    let schedule_item = {
    string_job: "weaken",
    string_server_used: string_server_used,
    string_server_target: string_server_target,
    float_server_target_security_before: float_server_target_security_current
    };
    if (!boolean_can_server_run_script_threads(ns, float_server_used_ram_free_current, object_scripts.weaken.ram, 1)) {
    // ram of the currently used server isn't actually 0, we're just doing this to skip it and start using a server with more ram
    float_server_used_ram_free_current = 0;
    break;
    }
    const integer_threads_weaken = integer_get_threads_weaken(ns, float_server_used_ram_free_current, string_server_target, float_server_target_security_current);
    float_server_used_ram_free_current -= integer_threads_weaken * object_scripts.weaken.ram;
    const float_server_target_security_uncorrected = float_server_target_security_current - float_get_security_decrease_from_weaken(ns, integer_threads_weaken);
    if (float_server_target_security_uncorrected < float_server_target_security_minimum) {
    float_server_target_security_current = float_server_target_security_minimum;
    }
    else {
    float_server_target_security_current = float_server_target_security_uncorrected;
    }
    schedule_item.float_delay_seconds = integer_time_job_finishes_seconds - float_time_weaken + float_padding_seconds;
    integer_time_job_finishes_seconds += float_padding_seconds;
    schedule_item.integer_time_job_finishes_seconds = integer_time_job_finishes_seconds;
    schedule_item.integer_threads = integer_threads_weaken;
    array_schedule_weaken.push(schedule_item);
    ++integer_array_schedule_weaken_length;
    break;
    }
    }
    return array_schedule_weaken;
  • replacement in lib/lib.js at line 770
    [3.3774474][3.5278:5338](),[3.5338][3.1886:2034](),[3.3774474][3.1886:2034]()
    // makes the actual weakening, growing and hacking schedule
    const array_make_schedule = function(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target_argument) {
    [3.3774474]
    [3.3774634]
    // makes a schedule
    const array_make_schedule = function(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target_argument, string_decider) {
  • edit in lib/lib.js at line 785
    [3.3775472]
    [3.3775472]
    // tripwires
    let boolean_end_loop_array_servers = false;
    let boolean_end_loop_server = false;
  • replacement in lib/lib.js at line 799
    [3.8317][3.2097:2157]()
    if (integer_array_schedule_length >= integer_job_cap) {
    [3.8317]
    [3.8380]
    if (integer_array_schedule_length >= integer_job_cap ||
    boolean_end_loop_array_servers) {
  • replacement in lib/lib.js at line 808
    [3.8460][3.2158:2212]()
    integer_array_schedule_length < integer_job_cap
    [3.8460]
    [3.8517]
    integer_array_schedule_length < integer_job_cap &&
    !boolean_end_loop_array_servers &&
    !boolean_end_loop_server
  • replacement in lib/lib.js at line 812
    [3.8525][3.2213:2355](),[3.2355][3.3776288:3776316](),[3.3776288][3.3776288:3776316]()
    const string_job = string_job_decide(ns, string_server_target, float_server_target_security_current, float_server_target_cash_current);
    let schedule_item = {
    [3.8525]
    [3.2356]
    const string_job = string_decider(ns, string_server_target, float_server_target_security_current, float_server_target_cash_current);
    const schedule_item = {
  • edit in lib/lib.js at line 821
    [3.2417]
    [3.3776730]
    case "": {
    boolean_end_loop_array_servers = true;
    break;
    }
  • replacement in lib/lib.js at line 828
    [3.3123][3.3776878:3777068](),[3.3776878][3.3776878:3777068]()
    // ram of the currently used server isn't actually 0, we're just doing this to skip it and start using a server with more ram
    float_server_used_ram_free_current = 0;
    [3.3123]
    [3.3777068]
    // start using a server with more ram
    boolean_end_loop_server = true;
  • edit in lib/lib.js at line 844
    [3.3777861]
    [3.3777861]
    schedule_item.float_server_target_security_current = float_server_target_security_current;
  • replacement in lib/lib.js at line 861
    [3.3248][3.3778961:3779151](),[3.3778961][3.3778961:3779151]()
    // ram of the currently used server isn't actually 0, we're just doing this to skip it and start using a server with more ram
    float_server_used_ram_free_current = 0;
    [3.3248]
    [3.3779151]
    // start using a server with more ram
    boolean_end_loop_server = true;
  • edit in lib/lib.js at line 881
    [3.3780240]
    [3.2711]
    schedule_item.float_server_target_security_current = float_server_target_security_current;
  • replacement in lib/lib.js at line 897
    [3.3373][3.3781559:3781749](),[3.3781559][3.3781559:3781749]()
    // ram of the currently used server isn't actually 0, we're just doing this to skip it and start using a server with more ram
    float_server_used_ram_free_current = 0;
    [3.3373]
    [3.3781749]
    // start using a server with more ram
    boolean_end_loop_server = true;
  • edit in lib/lib.js at line 918
    [3.10917]
    [3.3783068]
    schedule_item.float_server_target_security_current = float_server_target_security_current;
  • replacement in lib/lib.js at line 940
    [3.3900][3.5983:6055](),[3.5983][3.5983:6055]()
    if (boolean_have_not_seen_item_with_security_minimum === false) {
    [3.3900]
    [3.6055]
    if (!boolean_have_not_seen_item_with_security_minimum) {
  • replacement in lib/lib.js at line 944
    [3.3968][3.6138:6239](),[3.6138][3.6138:6239]()
    if (object_job.float_server_target_security_before === float_server_target_security_minimum) {
    [3.3968]
    [3.6239]
    if (object_job.float_server_target_security_current === float_server_target_security_minimum) {
  • edit in lib/lib.js at line 946
    [3.6305][3.3969:4029]()
    array_schedule_edited.splice(integer_indices_1, 1);
  • edit in lib/lib.js at line 979
    [3.3785513]
    [3.3785513]
    const void_schedule_runner = async function(ns, array_schedule) {
    for (let integer_indices_0 = 0; integer_indices_0 < array_schedule.length; ++integer_indices_0) {
    switch (array_schedule[integer_indices_0].string_job) {
    case "weaken": {
    await void_exec_script_weaken(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);
    break;
    }
    case "grow": {
    await void_exec_script_grow(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);
    break;
    }
    case "hack": {
    await void_exec_script_hack(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);
    break;
    }
    }
    }
    };
  • replacement in lib/lib.js at line 998
    [3.3785514][3.3785514:3785593](),[3.3785593][3.3293:3474]()
    // schedule runner. returns the the time it'll take to finish in milliseconds.
    export const void_schedule_runner = async function(ns, string_servers_bought_name, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target) {
    [3.3785514]
    [3.3785788]
    // returns the the time it'll take to finish in milliseconds.
    export const void_runner = async function(ns, string_servers_bought_name, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target) {
  • replacement in lib/lib.js at line 1013
    [3.2824][3.6466:7136]()
    // weaken target if necessary to reduce the time it takes to finish later jobs
    const array_schedule_weaken = array_make_schedule_weaken(ns, integer_job_cap, float_padding_seconds, string_server_target);
    if (array_schedule_weaken.length >= 1) {
    for (let integer_indices_0 = 0; integer_indices_0 < array_schedule_weaken.length; ++integer_indices_0) {
    await void_exec_script_weaken(ns, array_schedule_weaken[integer_indices_0].string_server_used, array_schedule_weaken[integer_indices_0].string_server_target, array_schedule_weaken[integer_indices_0].integer_threads, array_schedule_weaken[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);
    [3.2824]
    [3.7136]
    // prepare the target if necessary
    while (true) {
    if (
    ns.getServerSecurityLevel(string_server_target) === ns.getServerMinSecurityLevel(string_server_target) &&
    ns.getServerMoneyAvailable(string_server_target) === ns.getServerMaxMoney(string_server_target)
    ) {
  • replacement in lib/lib.js at line 1021
    [3.7155][3.7155:7311](),[3.7311][3.3475:3621](),[3.2824][3.3475:3621](),[3.2260][3.3786731:3786831](),[3.3621][3.3786731:3786831](),[3.11279][3.3786731:3786831](),[3.3786731][3.3786731:3786831](),[3.3786831][3.3622:3682](),[3.3682][3.3786894:3787879](),[3.3786894][3.3786894:3787879]()
    await ns.sleep(array_schedule_weaken[array_schedule_weaken.length - 1].integer_time_job_finishes_seconds * 1000);
    }
    // make and run actual schedule
    const array_schedule = array_make_schedule(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target);
    for (let integer_indices_0 = 0; integer_indices_0 < array_schedule.length; ++integer_indices_0) {
    switch (array_schedule[integer_indices_0].string_job) {
    case "weaken": {
    await void_exec_script_weaken(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);
    break;
    }
    case "grow": {
    await void_exec_script_grow(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);
    break;
    }
    case "hack": {
    await void_exec_script_hack(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);
    break;
    }
    [3.7155]
    [3.3787879]
    const array_schedule_prepare = array_make_schedule(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target, string_job_decider_prepare);
    if (array_schedule_prepare.length > 0) {
    await void_schedule_runner(ns, array_schedule_prepare);
    await ns.sleep(array_schedule_prepare[array_schedule_prepare.length - 1].integer_time_job_finishes_seconds * 1000);
  • edit in lib/lib.js at line 1027
    [3.3787889]
    [3.3683]
    // make and run actual hacking schedule
    const array_schedule = array_make_schedule(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target, string_job_decider);
    await void_schedule_runner(ns, array_schedule);
  • replacement in bin/main.js at line 5
    [3.3793740][3.3793740:3793763]()
    void_schedule_runner
    [3.3793740]
    [3.3793763]
    void_runner
  • replacement in bin/main.js at line 79
    [3.3794595][3.4012:4211]()
    integer_time_finishes = await void_schedule_runner(ns, string_servers_bought_name, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target) + Date.now();
    [3.3794595]
    [3.3794956]
    integer_time_finishes = await void_runner(ns, string_servers_bought_name, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target) + Date.now();
  • replacement in README.md at line 32
    [2.3750][2.3750:4035]()
    * SERVER = The server that should be targetted by the `weaken`, `grow` and `hack` functions. Should be a string. Defaults to choosing an optimal target using a scroing system based on the server's maximum cash, growth, required hacking level, and the player's current hacking level.
    [2.3750]
    [2.4035]
    * SERVER = The server that should be targetted by the `weaken`, `grow` and `hack` functions. Should be a string. Defaults to choosing an optimal target using a scoring system based on the server's maximum cash, growth, required hacking level, and the player's current hacking level.
  • replacement in README.md at line 57
    [2.4989][2.4989:5163]()
    * Runs the script with up to 4000 jobs, targetting "harakiri-sushi" and stealing up to 50% of it's cash per `hack` job, whilst the remaining variables are set to defaults.
    [2.4989]
    [2.5163]
    * Runs the script with up to 4000 jobs, targetting "harakiri-sushi" and stealing only up to 50% of it's cash per "hack.js" job that finishes executing, whilst the remaining variables are set to defaults.
  • replacement in README.md at line 73
    [2.5443][2.5443:5546]()
    * Kills all scripts named `grow.js` and `hack.js` on any servers that they are currently running on.
    [2.5443]
    [2.5546]
    * Kills all scripts named "grow.js" and "hack.js" on any servers that they are currently running on.