/* Test NNC_Polyhedron Java test class of the Parma Polyhedra Library Java
   interface.
   Copyright (C) 2001-2010 Roberto Bagnara <bagnara@cs.unipr.it>
   Copyright (C) 2010-2016 BUGSENG srl (http://bugseng.com)

This file is part of the Parma Polyhedra Library (PPL).

The PPL is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.

The PPL is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.

For the most up-to-date information see the Parma Polyhedra Library
site: http://bugseng.com/products/ppl/ . */

import parma_polyhedra_library.*;

public class NNC_Polyhedron_test1 {
    static {
        try {
            System.loadLibrary("ppl_java");
        }
        catch (UnsatisfiedLinkError  e) {
            System.out.println("Unable to load the library");
            System.out.println(e.getMessage());
            System.exit(-1);
        }
    }

    public static boolean test01() {
        Variable X = new Variable(0);
        Variable Y = new Variable(1);
        Variable Z = new Variable(2);
        NNC_Polyhedron ph = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
        Linear_Expression le_X = new Linear_Expression_Variable(X);
        Linear_Expression le_Y = new Linear_Expression_Variable(Y);
        Linear_Expression le_Z = new Linear_Expression_Variable(Z);
        Linear_Expression le_2Y = le_Y.times(new Coefficient(2));
        Linear_Expression le_5Z = le_Z.times(new Coefficient(5));
        Linear_Expression le_7
            = new Linear_Expression_Coefficient(new Coefficient(7));
        Linear_Expression le_5
            = new Linear_Expression_Coefficient(new Coefficient(5));
        Linear_Expression lhs1 = le_X.sum(le_2Y.sum(le_5Z));
        NNC_Polyhedron ph1
            = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
        ph1.add_constraint(new Constraint(lhs1,
                                          Relation_Symbol.GREATER_OR_EQUAL,
                                          le_7));
        ph1.add_constraint(new Constraint(le_X,
                                          Relation_Symbol.LESS_THAN,
                                          le_5Z));
        PPL_Test.println_if_noisy(ph1.constraints().toString());
        Constraint c = new Constraint(le_5Z,
                                      Relation_Symbol.GREATER_THAN,
                                      le_X);
        Poly_Con_Relation rel = ph1.relation_with(c);
        return rel.implies(Poly_Con_Relation.is_included());
    }

    public static boolean test02() {
        // Test if `minimized_constraints' returns an empty Constraint_System
        // if the Polyhedron is built from universe with a dimension greater
        // than zero.
        Variable X = new Variable(0);
        Variable Y = new Variable(1);
        Variable Z = new Variable(2);
        NNC_Polyhedron ph = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
        Constraint_System cs = ph.minimized_constraints();
        return cs.isEmpty();
    }

    public static boolean test03() {
        // Test termination methods.
        Variable X1 = new Variable(0);
        Variable X2 = new Variable(1);
        Variable XP1 = new Variable(2);
        Variable XP2 = new Variable(3);
        NNC_Polyhedron ph = new NNC_Polyhedron(4, Degenerate_Element.UNIVERSE);
        Coefficient coeff_1 = new Coefficient(1);
        Coefficient coeff_0 = new Coefficient(0);
        Linear_Expression le_X1 = new Linear_Expression_Variable(X1);
        Linear_Expression le_X2 = new Linear_Expression_Variable(X2);
        Linear_Expression le_XP1 = new Linear_Expression_Variable(XP1);
        Linear_Expression le_XP2 = new Linear_Expression_Variable(XP2);
        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
        Linear_Expression le_0 = new Linear_Expression_Coefficient(coeff_0);
        Linear_Expression le_X1_difference_XP1 = le_X1.sum(le_XP1);
        Constraint c_XP2_eq_1
          = new Constraint(le_XP2, Relation_Symbol.EQUAL, le_1);
        Constraint c_X1_geq_1
          = new Constraint(le_X1, Relation_Symbol.GREATER_OR_EQUAL, le_1);
        Constraint c_X1_minus_XP1_geq_1
          = new Constraint(le_X1_difference_XP1, Relation_Symbol.GREATER_OR_EQUAL, le_1);
        Constraint c_X2_leq_0
          = new Constraint(le_X2, Relation_Symbol.LESS_OR_EQUAL, le_0);
        ph.add_constraint(c_XP2_eq_1);
        ph.add_constraint(c_X1_geq_1);
        ph.add_constraint(c_X1_minus_XP1_geq_1);
        ph.add_constraint(c_X2_leq_0);
        return Termination.termination_test_MS_NNC_Polyhedron(ph);
    }

    public static void main(String[] args) {
        Parma_Polyhedra_Library.initialize_library();
        boolean test_result_ok =
            Test_Executor.executeTests(NNC_Polyhedron_test1.class);
        Parma_Polyhedra_Library.finalize_library();
        if (!test_result_ok)
            System.exit(1);
        System.exit(0);
    }

}
