aboutsummaryrefslogtreecommitdiff
path: root/src/trainMSVMMaj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/trainMSVMMaj.c')
-rw-r--r--src/trainMSVMMaj.c55
1 files changed, 37 insertions, 18 deletions
diff --git a/src/trainMSVMMaj.c b/src/trainMSVMMaj.c
index a16c008..32c36c4 100644
--- a/src/trainMSVMMaj.c
+++ b/src/trainMSVMMaj.c
@@ -3,20 +3,21 @@
#define MINARGS 2
void print_null(const char *s) {}
-
-void parse_command_line(int argc, char **argv, char *input_filename, struct Model *model);
void exit_with_help();
+void parse_command_line(int argc, char **argv, struct Model *model,
+ char *input_filename, char *output_filename);
void exit_with_help()
{
printf("This is MSVMMaj, version %1.1f\n\n", VERSION);
- printf("Usage: trainMSVMMaj [options] training_data_file [output_file]\n");
+ printf("Usage: trainMSVMMaj [options] training_data_file\n");
printf("Options:\n");
printf("-c folds : perform cross validation with given number of folds\n");
printf("-e epsilon : set the value of the stopping criterion\n");
printf("-h | -help : print this help.\n");
printf("-k kappa : set the value of kappa used in the Huber hinge\n");
printf("-l lambda : set the value of lambda (lambda > 0)\n");
+ printf("-o output_file : write output to file\n");
printf("-p p-value : set the value of p in the lp norm (1.0 <= p <= 2.0)\n");
printf("-q : quiet mode (no output)\n");
printf("-r rho : choose the weigth specification (1 = unit, 2 = group)\n");
@@ -30,30 +31,46 @@ void exit_with_help()
int main(int argc, char **argv)
{
char input_filename[MAX_LINE_LENGTH];
+ char model_filename[MAX_LINE_LENGTH];
+
struct Model *model = Malloc(struct Model, 1);
struct Data *data = Malloc(struct Data, 1);
- if (argc < MINARGS || check_argv(argc, argv, "-help") || check_argv_eq(argc, argv, "-h") ) {
+ if (argc < MINARGS || check_argv(argc, argv, "-help") || check_argv_eq(argc, argv, "-h") )
exit_with_help();
- }
- parse_command_line(argc, argv, input_filename, model);
+ parse_command_line(argc, argv, model, input_filename, model_filename);
- // read data and allocate all memory for the model
- read_data(data, model, input_filename);
+ // read data file
+ read_data(data, input_filename);
+
+ // copy dataset parameters to model
+ model->n = data->n;
+ model->m = data->m;
+ model->K = data->K;
+ model->data_file = input_filename;
+
+ // allocate model and initialize weights
allocate_model(model);
initialize_weights(data, model);
+ // start training
main_loop(model, data);
+ // write_model to file
+ if (check_argv_eq(argc, argv, "-o")) {
+ write_model(model, model_filename);
+ info("Output written to %s\n", model_filename);
+ }
+
// free model and data
free_model(model);
free_data(data);
return 0;
-
}
-void parse_command_line(int argc, char **argv, char *input_filename, struct Model *model)
+void parse_command_line(int argc, char **argv, struct Model *model,
+ char *input_filename, char *output_filename)
{
int i;
void (*print_func)(const char*) = NULL;
@@ -72,24 +89,26 @@ void parse_command_line(int argc, char **argv, char *input_filename, struct Mode
exit_with_help();
}
switch (argv[i-1][1]) {
- case 'p':
- model->p = atof(argv[i]);
- break;
- case 'l':
- model->lambda = atof(argv[i]);
- break;
case 'e':
model->epsilon = atof(argv[i]);
break;
case 'k':
model->kappa = atof(argv[i]);
break;
- case 'r':
- model->weight_idx = atoi(argv[i]);
+ case 'l':
+ model->lambda = atof(argv[i]);
+ break;
+ case 'o':
+ strcpy(output_filename, argv[i]);
+ break;
+ case 'p':
+ model->p = atof(argv[i]);
break;
case 'q':
print_func = &print_null;
i--;
+ case 'r':
+ model->weight_idx = atoi(argv[i]);
break;
default:
fprintf(stderr, "Unknown option: -%c\n", argv[i-1][1]);