/*
  File : parallel.cs

  Copyright : Copyright (c) MOSEK ApS, Denmark. All rights reserved.

  Description :  Demonstrates parallel optimization
                 using optimizebatch()
*/
using System.Threading.Tasks;
using System;

namespace mosek.example
{
  public class Parallel
  {
   /** Example of how to use env.optimizebatch(). 
       Optimizes tasks whose names were read from command line.
    */
    public static void Main(string[] argv)
    {
      int n = argv.Length;
      mosek.Task[] tasks      = new mosek.Task[n];
      mosek.rescode[] res     = new mosek.rescode[n];
      mosek.rescode[] trm     = new mosek.rescode[n];
  
      /* Size of thread pool available for all tasks */
      int threadpoolsize = 6; 

      using (var env = new mosek.Env())
      {
        /* Create an example list of tasks to optimize */
        for(int i = 0; i < n; i++) 
        {
          tasks[i] = new mosek.Task(env);
          tasks[i].readdata(argv[i]);
          // We can set the number of threads for each task
          tasks[i].putintparam(mosek.iparam.num_threads, 2);
        }

        // Optimize all the given tasks in parallel
        env.optimizebatch(false,          // No race
                          -1.0,           // No time limit
                          threadpoolsize,
                          tasks,          // Array of tasks to optimize
                          res,
                          trm);
        
        for(int i = 0; i < n; i++) 
          Console.WriteLine("Task  {0}  res {1}   trm {2}   obj_val  {3}  time {4}", 
            i, 
            res[i], 
            trm[i],  
            tasks[i].getdouinf(mosek.dinfitem.intpnt_primal_obj),
            tasks[i].getdouinf(mosek.dinfitem.optimizer_time));
      }
    }
  }
}
