/* test on the functions in adepath_d */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "phcpack.h"
#include "syscon.h"
#include "solcon.h"
#include "adepath_d.h"

void test_newton ( void );
/* 
 * DESCRIPTION :
 *   The user is prompted for a start system
 *   and Newton's method is called. */

void test_onepath ( void );
/* 
 * DESCRIPTION :
 *   The user is prompted for a target and start system
 *   and one solution path is tracked. */

void test_manypaths ( void );
/* 
 * DESCRIPTION :
 *   The user is prompted for a target and start system
 *   and many solution paths are tracked. */

int main ( int argc, char *argv[] )
{
   int choice;
   char ch;

   adainit();

   printf("\nMENU to apply algorithmic differentiation : \n");
   printf("  0. in Newton's method to correct one solution;\n");
   printf("  1. to track one solution path;\n");
   printf("  2. to track many solution paths.\n");
   printf("Type 0, 1, or 2 to select : ");
   scanf("%d",&choice);
   scanf("%c",&ch); /* skip newline symbol */

   if(choice == 0)
      test_newton();
   else if(choice == 1)
      test_onepath();
   else if(choice == 2)
      test_manypaths();
   else
      printf("invalid selection, please try again\n");

   adafinal();

   return 0;
}

void test_newton ( void )
{
   int fail,dim,len;

   printf("\nRunning Newton's method ...\n");
   fail = read_standard_start_system();
   fail = copy_start_system_to_container();
   fail = copy_start_solutions_to_container();
   fail = syscon_number_of_standard_polynomials(&dim);
   printf("The system container has %d polynomials.\n",dim);
   fail = solcon_number_of_standard_solutions(&len);
   printf("The solution container has size %d.\n",len);
   fail = ade_newton_d(1);
   printf("The solutions after Newton's method :\n");
   fail = solcon_write_standard_solutions();
}

void test_onepath ( void )
{
   int fail,len;

   printf("\nTracking one solution path ...\n");
   fail = read_standard_target_system();
   fail = read_standard_start_system();
   fail = copy_start_solutions_to_container();
   fail = solcon_number_of_standard_solutions(&len);
   printf("The solution container has size %d.\n",len);
   fail = ade_onepath_d(1,1.0,0.0);
   printf("The solutions after Newton's method :\n");
   fail = solcon_write_standard_solutions();
}

void test_manypaths ( void )
{
   int fail,len;

   printf("\nTracking many solution paths ...\n");
   fail = read_standard_target_system();
   fail = read_standard_start_system();
   fail = copy_start_solutions_to_container();
   fail = solcon_number_of_standard_solutions(&len);
   printf("The solution container has size %d.\n",len);
   fail = ade_manypaths_d(1,1.0,0.0);
   printf("The solutions after Newton's method :\n");
   fail = solcon_write_standard_solutions();
}
