2:- module( plfann, [
    3
    4        % When using version 2.2.0, uncomment the
    5        % functions in the interface definition
    6
    7        % Specific to plfann (3)
    8
    9        fann_type/1,
   10        fann_set_type/1,
   11        fann_error/1,
   12        fann_swi_mode/0,
   13        fann_print_mode/1,
   14
   15        % Creation, Destruction & Execution (24[25])
   16
   17        fann_create_standard/4,
   18        fann_create_standard/5,
   19        fann_create_standard/6,
   20        fann_create_standard/7,
   21        fann_create_standard_array/2,
   22        fann_create_standard_array/3,
   23        fann_create_sparse/5,
   24        fann_create_sparse/6,
   25        fann_create_sparse/7,
   26        fann_create_sparse/8,
   27        fann_create_sparse_array/3,
   28        fann_create_sparse_array/4,
   29        fann_create_shortcut/4,
   30        fann_create_shortcut/5,
   31        fann_create_shortcut/6,
   32        fann_create_shortcut/7,
   33        fann_create_shortcut_array/2,
   34        fann_create_shortcut_array/3,
   35        fann_destroy/1,
   36        % fann_copy/2,
   37        fann_run/3,
   38        fann_run_unsafe/3,
   39        fann_randomize_weights/3,
   40        fann_init_weights/2,
   41        fann_print_connections/1,
   42
   43        % Parameters (16)
   44
   45        fann_print_parameters/1,
   46        fann_get_num_input/2,
   47        fann_get_num_output/2,
   48        fann_get_total_neurons/2,
   49        fann_get_total_connections/2,
   50        fann_get_network_type/2,
   51        fann_get_connection_rate/2,
   52        fann_get_num_layers/2,
   53        fann_get_layer_array/2,
   54        fann_get_bias_array/2,
   55        fann_get_connection_array/2,
   56        fann_set_weight_array/2,
   57        fann_set_weight/4,
   58        fann_set_user_data/2,
   59        fann_get_user_data/2,
   60        fann_get_decimal_point/2,
   61        fann_get_multiplier/2,
   62
   63        % Training (5)
   64
   65        fann_train/3,
   66        fann_test/3,
   67        fann_get_MSE/2,
   68        fann_get_bit_fail/2,
   69        fann_reset_MSE/1,
   70
   71        % Training Data Training (4)
   72
   73        fann_train_on_data/5,
   74        fann_train_on_file/5,
   75        fann_train_epoch/2,
   76        fann_test_data/3,
   77
   78        % Training Data Manipulation (24[26])
   79
   80        fann_read_train_from_file/2,
   81        % fann_create_train/4,
   82        % fann_create_train_from_callback/na,
   83        fann_destroy_train/1,
   84        fann_shuffle_train_data/1,
   85        fann_scale_train/2,
   86        fann_descale_train/2,
   87        fann_set_input_scaling_params/4,
   88        fann_set_output_scaling_params/4,
   89        fann_set_scaling_params/6,
   90        fann_clear_scaling_params/1,
   91        fann_scale_input/2,
   92        fann_scale_output/2,
   93        fann_descale_input/2,
   94        fann_descale_output/2,
   95        fann_scale_input_train_data/3,
   96        fann_scale_output_train_data/3,
   97        fann_scale_train_data/3,
   98        fann_merge_train_data/3,
   99        fann_duplicate_train_data/2,
  100        fann_subset_train_data/4,
  101        fann_length_train_data/2,
  102        fann_num_input_train_data/2,
  103        fann_num_output_train_data/2,
  104        fann_save_train/2,
  105        fann_save_train_to_fixed/3,
  106
  107        % Parameters (36[45])
  108
  109        fann_get_training_algorithm/2,
  110        fann_set_training_algorithm/2,
  111        fann_get_learning_rate/2,
  112        fann_set_learning_rate/2,
  113        fann_get_learning_momentum/2,
  114        fann_set_learning_momentum/2,
  115        fann_get_activation_function/4,
  116        fann_set_activation_function/4,
  117        fann_set_activation_function_layer/3,
  118        fann_set_activation_function_hidden/2,
  119        fann_set_activation_function_output/2,
  120        fann_get_activation_steepness/4,
  121        fann_set_activation_steepness/4,
  122        fann_set_activation_steepness_layer/3,
  123        fann_set_activation_steepness_hidden/2,
  124        fann_set_activation_steepness_output/2,
  125        fann_get_train_error_function/2,
  126        fann_set_train_error_function/2,
  127        fann_get_train_stop_function/2,
  128        fann_set_train_stop_function/2,
  129        fann_get_bit_fail_limit/2,
  130        fann_set_bit_fail_limit/2,
  131        % fann_set_callback/na,
  132        fann_get_quickprop_decay/2,
  133        fann_set_quickprop_decay/2,
  134        fann_get_quickprop_mu/2,
  135        fann_set_quickprop_mu/2,
  136        fann_get_rprop_increase_factor/2,
  137        fann_set_rprop_increase_factor/2,
  138        fann_get_rprop_decrease_factor/2,
  139        fann_set_rprop_decrease_factor/2,
  140        fann_get_rprop_delta_min/2,
  141        fann_set_rprop_delta_min/2,
  142        fann_get_rprop_delta_max/2,
  143        fann_set_rprop_delta_max/2,
  144        fann_get_rprop_delta_zero/2,
  145        fann_set_rprop_delta_zero/2,
  146        % fann_get_sarprop_weight_decay_shift/2,
  147        % fann_set_sarprop_weight_decay_shift/2,
  148        % fann_get_sarprop_step_error_threshold_factor/2,
  149        % fann_set_sarprop_step_error_threshold_factor/2,
  150        % fann_get_sarprop_step_error_shift/2,
  151        % fann_set_sarprop_step_error_shift/2,
  152        % fann_get_sarprop_temperature/2,
  153        % fann_set_sarprop_temperature/2,
  154
  155        %  Cascade Training (2)
  156
  157        fann_cascadetrain_on_data/5,
  158        fann_cascadetrain_on_file/5,
  159
  160        % Parameters (25[29])
  161
  162        fann_get_cascade_output_change_fraction/2,
  163        fann_set_cascade_output_change_fraction/2,
  164        fann_get_cascade_output_stagnation_epochs/2,
  165        fann_set_cascade_output_stagnation_epochs/2,
  166        fann_get_cascade_candidate_change_fraction/2,
  167        fann_set_cascade_candidate_change_fraction/2,
  168        fann_get_cascade_candidate_stagnation_epochs/2,
  169        fann_set_cascade_candidate_stagnation_epochs/2,
  170        fann_get_cascade_weight_multiplier/2,
  171        fann_set_cascade_weight_multiplier/2,
  172        fann_get_cascade_candidate_limit/2,
  173        fann_set_cascade_candidate_limit/2,
  174        fann_get_cascade_max_out_epochs/2,
  175        fann_set_cascade_max_out_epochs/2,
  176        % fann_get_cascade_min_out_epochs/2,
  177        % fann_set_cascade_min_out_epochs/2,
  178        fann_get_cascade_max_cand_epochs/2,
  179        fann_set_cascade_max_cand_epochs/2,
  180        % fann_get_cascade_min_cand_epochs/2,
  181        % fann_set_cascade_min_cand_epochs/2,
  182        fann_get_cascade_num_candidates/2,
  183        fann_get_cascade_activation_functions_count/2,
  184        fann_get_cascade_activation_functions/2,
  185        fann_set_cascade_activation_functions/2,
  186        fann_get_cascade_activation_steepnesses_count/2,
  187        fann_get_cascade_activation_steepnesses/2,
  188        fann_set_cascade_activation_steepnesses/2,
  189        fann_get_cascade_num_candidate_groups/2,
  190        fann_set_cascade_num_candidate_groups/2,
  191
  192        % File Input and Output (3)
  193
  194        fann_create_from_file/2,
  195        fann_save/2,
  196        fann_save_to_fixed/2,
  197
  198        % Error Handling (8)
  199
  200        fann_set_error_log/2,
  201        fann_get_errno/2,
  202        fann_reset_errno/1,
  203        fann_reset_errstr/1,
  204        fann_get_errstr/2,
  205        fann_print_error/0,
  206        fann_print_error/1,
  207        fann_print_error_core/1
  208    ]).  209
  210
  211:- load_foreign_library( foreign( plfann ) ).  212
  213
  214fann_swi_mode :- fann_print_mode( 'FANN_SWI' ).
  215
  216:- fann_swi_mode.  217
  218fann_set_type(X):-
  219	var(X),!,fail.
  220fann_set_type('FANN_FLOAT'):-
  221	ignore(unload_foreign_library(foreign(plfann_double))),
  222	ignore(unload_foreign_library(foreign(plfann_fixed))),
  223	load_foreign_library(foreign(plfann)).
  224fann_set_type('FANN_DOUBLE'):-
  225	ignore(unload_foreign_library(foreign(plfann))),
  226	ignore(unload_foreign_library(foreign(plfann_fixed))),
  227	load_foreign_library(foreign(plfann_double)).
  228fann_set_type('FANN_FIXED'):-
  229	ignore(unload_foreign_library(foreign(plfann_double))),
  230	ignore(unload_foreign_library(foreign(plfann))),
  231	load_foreign_library(foreign(plfann_fixed)).
  232
  233
  234% Wrapper predicates defined in prolog.
  235% -------------------------------------
  236
  237% First argument is the number of layers, but is ignored
  238
  239fann_create_standard(_, A, B, X) :-
  240        fann_create_standard_array([ A, B], X), !.
  241fann_create_standard(_, _, _, _) :- !, fail.
  242fann_create_standard(_, A, B, C, X) :-
  243        fann_create_standard_array([ A, B, C], X), !.
  244fann_create_standard(_, _, _, _, _) :- !, fail.
  245fann_create_standard(_, A, B, C, D, X) :-
  246        fann_create_standard_array([ A, B, C, D], X), !.
  247fann_create_standard(_, _, _, _, _, _) :- !, fail.
  248fann_create_standard(_, A, B, C, D, E, X) :-
  249        fann_create_standard_array([ A, B, C, D, E], X), !.
  250fann_create_standard(_, _, _, _, _, _, _) :- !, fail.
  251
  252
  253% First argument is the number of layers, but is ignored
  254
  255fann_create_standard_array(_, X, Y) :-
  256        fann_create_standard_array(X, Y), !.
  257fann_create_standard_array(_, _, _) :- !, fail.
  258
  259
  260% First argument is the number of layers, but is ignored
  261
  262fann_create_sparse(Y, _, A, B, X) :-
  263        fann_create_sparse_array(Y, [ A, B], X), !.
  264fann_create_sparse(_, _, _, _, _) :- !, fail.
  265fann_create_sparse(Y, _, A, B, C, X) :-
  266        fann_create_sparse_array(Y, [ A, B, C], X), !.
  267fann_create_sparse(_, _, _, _, _, _) :- !, fail.
  268fann_create_sparse(Y, _, A, B, C, D, X) :-
  269        fann_create_sparse_array(Y, [ A, B, C, D], X), !.
  270fann_create_sparse(_, _, _, _, _, _, _) :- !, fail.
  271fann_create_sparse(Y, _, A, B, C, D, E, X) :-
  272        fann_create_sparse_array(Y, [ A, B, C, D, E], X), !.
  273fann_create_sparse(_, _, _, _, _, _, _, _) :- !, fail.
  274
  275
  276% First argument is the number of layers, but is ignored
  277
  278fann_create_sparse_array(X, _, Y, Z) :-
  279        fann_create_sparse_array(X, Y, Z), !.
  280fann_create_sparse_array(_, _, _, _) :- !, fail.
  281
  282
  283% First argument is the number of layers, but is ignored
  284
  285fann_create_shortcut(_, A, B, X) :-
  286        fann_create_shortcut_array([ A, B], X), !.
  287fann_create_shortcut(_, _, _, _) :- !, fail.
  288fann_create_shortcut(_, A, B, C, X) :-
  289        fann_create_shortcut_array([ A, B, C], X), !.
  290fann_create_shortcut(_, _, _, _, _) :- !, fail.
  291fann_create_shortcut(_, A, B, C, D, X) :-
  292        fann_create_shortcut_array([ A, B, C, D], X), !.
  293fann_create_shortcut(_, _, _, _, _, _) :- !, fail.
  294fann_create_shortcut(_, A, B, C, D, E, X) :-
  295        fann_create_shortcut_array([ A, B, C, D, E], X), !.
  296fann_create_shortcut(_, _, _, _, _, _, _) :- !, fail.
  297
  298
  299% First argument is the number of layers, but is ignored
  300
  301fann_create_shortcut_array(_, X, Y) :-
  302        fann_create_shortcut_array( X, Y), !.
  303fann_create_shortcut_array(_, _, _) :- !, fail.
  304
  305
  306% Error Printing through the SWI-Prolog Message system.
  307% -----------------------------------------------------
  308
  309fann_print_error( ErrorData ) :-
  310		fann_error( ErrorData ),
  311		fann_get_errno( ErrorData, LastErrorNo ),
  312		fann_get_errstr( ErrorData, LastErrorStr ),
  313		ErrorMessage =.. [ error, LastErrorNo, LastErrorStr ],
  314		print_message( error, plfann( ErrorMessage ) ), !.
  315fann_print_error( _ ) :- !.
  316
  317fann_print_error :-
  318        fann_print_error( 'NULL' ), !.
  319
  320
  321% Messages.
  322% ---------
  323
  324:- multifile
  325	prolog:message/3.  326
  327% print message (called directly from c).
  328% ---------------------------------------
  329
  330prolog:message( plfann( print_message( Message ) ) ) -->
  331        [ '~s'-[Message], flush ].
  332
  333prolog:message( plfann( print_message_at_same_line( Message ) ) ) -->
  334        [ at_same_line, '~s'-[Message], flush ].
  335
  336
  337% print errors.
  338% -------------
  339
  340prolog:message( plfann( error( No, Str ) ) ) -->
  341        [ 'FANN Error ~d: ~s'-[No, Str] ]