// -*- c++ -*-

// This file is part of the Collective Variables module (Colvars).
// The original version of Colvars and its updates are located at:
// https://github.com/Colvars/colvars
// Please update all Colvars source files before making any changes.
// If you wish to distribute your changes, please submit them to the
// Colvars repository at GitHub.


CVSCRIPT(bias_bin,
         "Get the current grid bin index (flattened if more than 1d)\n"
         "bin : integer - Bin index",
         0, 0,
         "",
         script->set_result_int(this_bias->current_bin());
         return COLVARS_OK;
         )

/// This is deprecated in the context of mwABF; no other known uses
/// But removing it may break user scripts
CVSCRIPT(bias_bincount,
         "Get the number of samples at the given grid bin (1D ABF only for now)\n"
         "samples : integer - Number of samples",
         0, 1,
         "index : integer - Grid index; defaults to current bin",
         int index = this_bias->current_bin();
         char const *indexarg =
           script->obj_to_str(script->get_bias_cmd_arg(0, objc, objv));
         if (indexarg) {
           std::string const param(indexarg);
           if (!(std::istringstream(param) >> index)) {
             script->add_error_msg("bincount: error parsing bin index");
             return COLVARSCRIPT_ERROR;
           }
         }
         script->set_result_int(this_bias->bin_count(index));
         return COLVARS_OK;
         )

CVSCRIPT(bias_local_sample_count,
         "Get the number of samples around the current bin"
         "samples : integer - Number of samples",
         0, 1,
         "radius : integer - Sum over radius bins around current bin",
        int radius = 0;
        char const *arg =
           script->obj_to_str(script->get_bias_cmd_arg(0, objc, objv));
         if (arg) {
           std::string const param(arg);
           if (!(std::istringstream(param) >> radius)) {
             script->add_error_msg("local_sample_count: error parsing radius");
             return COLVARSCRIPT_ERROR;
           }
         }
         script->set_result_str(cvm::to_str(this_bias->local_sample_count(radius)));
         return COLVARS_OK;
         )

CVSCRIPT(bias_binnum,
         "Get the total number of grid points of this bias (1D ABF only for now)\n"
         "Bins : integer - Number of grid points",
         0, 0,
         "",
         int r = this_bias->bin_num();
         if (r < 0) {
           script->add_error_msg("Error: calling bin_num() for bias " +
                                 this_bias->name);
           return COLVARSCRIPT_ERROR;
         }
         script->set_result_int(r);
         return COLVARS_OK;
         )

CVSCRIPT(bias_delete,
         "Delete this bias",
         0, 0,
         "",
         delete this_bias;
         return COLVARS_OK;
         )

CVSCRIPT(bias_energy,
         "Get the current energy of this bias\n"
         "E : float - Energy value",
         0, 0,
         "",
         script->set_result_real(this_bias->get_energy());
         return COLVARS_OK;
         )

CVSCRIPT(bias_get,
         "Get the value of the given feature for this bias\n"
         "state : 1/0 - State of the given feature",
         1, 1,
         "feature : string - Name of the feature",
         return script->proc_features(this_bias, objc, objv);
         )

CVSCRIPT(bias_getconfig,
         "Return the configuration string of this bias\n"
         "conf : string - Current configuration string",
         0, 0,
         "",
         script->set_result_str(this_bias->get_config());
         return COLVARS_OK;
         )

CVSCRIPT(bias_help,
         "Get a help summary or the help string of one bias subcommand\n"
         "help : string - Help string",
         0, 1,
         "command : string - Get the help string of this specific command",
         unsigned char *const cmdobj =
           script->get_colvar_cmd_arg(0, objc, objv);
         if (this_bias) {
         }
         if (cmdobj) {
           std::string const cmdstr(script->obj_to_str(cmdobj));
           if (cmdstr.size()) {
             script->set_result_str(script->get_command_cmdline_help(colvarscript::use_bias,
                                                                     cmdstr));
             return cvmodule->get_error();
           } else {
             return COLVARSCRIPT_ERROR;
           }
         } else {
           script->set_result_str(script->get_cmdline_help_summary(colvarscript::use_bias));
           return COLVARS_OK;
         }
         )

CVSCRIPT(bias_load,
         "Load data into this bias",
         1, 1,
         "prefix : string - Read from a file with this name or prefix",
         char const *arg =
           script->obj_to_str(script->get_bias_cmd_arg(0, objc, objv));
         return this_bias->read_state_prefix(std::string(arg));
         )

CVSCRIPT(bias_loadfromstring,
         "Load state data into this bias from a string",
         1, 1,
         "buffer : string - String buffer containing the state information",
         char const *buffer = script->obj_to_str(script->get_bias_cmd_arg(0, objc, objv));
         return this_bias->read_state_string(buffer);
         )

CVSCRIPT(bias_save,
         "Save data from this bias into a file with the given prefix",
         1, 1,
         "prefix : string - Prefix for the state file of this bias",
         std::string const prefix =
           cvmodule->state_file_prefix(script->obj_to_str(script->get_bias_cmd_arg(0, objc, objv)));
         return this_bias->write_state_prefix(prefix);
         )

CVSCRIPT(bias_savetostring,
         "Save data from this bias into a string and return it\n"
         "state : string - The bias state",
         0, 0,
         "",
         return this_bias->write_state_string(script->modify_str_result());
         )

CVSCRIPT(bias_set,
         "Set the given feature of this bias to a new value",
         2, 2,
         "feature : string - Name of the feature\n"
         "value : string - String representation of the new feature value",
         return script->proc_features(this_bias, objc, objv);
         )

CVSCRIPT(bias_share,
         "Share bias information with other replicas (multiple-walker scheme)",
         0, 0,
         "",
         if (this_bias->replica_share() != COLVARS_OK) {
           script->add_error_msg("Error: calling replica_share() for bias " +
                                 this_bias->name);
           return COLVARSCRIPT_ERROR;
         }
         return COLVARS_OK;
         )

CVSCRIPT(bias_state,
         "Print a string representation of the feature state of this bias\n"
         "state : string - String representation of the bias features",
         0, 0,
         "",
         this_bias->print_state();
         return COLVARS_OK;
         )

CVSCRIPT(bias_type,
         "Print the type of this bias object\n"
         "type : string - Type of this bias object (e.g. metadynamics)",
         0, 0,
         "",
         script->set_result_str(this_bias->bias_type);
         return COLVARS_OK;
         )

CVSCRIPT(bias_update,
         "Recompute this bias and return its up-to-date energy\n"
         "E : float - Energy value",
         0, 0,
         "",
         this_bias->update();
         script->set_result_colvarvalue(this_bias->get_energy());
         return COLVARS_OK;
         )
