/**CFile****************************************************************

 FileName    [extraBddThresh.c]

 SystemName  [ABC: Logic synthesis and verification system.]

 PackageName [extra]

 Synopsis    [Dealing with threshold functions.]

 Author      [Augusto Neutzling, Jody Matos, and Alan Mishchenko (UC Berkeley).]

 Affiliation [Federal University of Rio Grande do Sul, Brazil]

 Date        [Ver. 1.0. Started - October 7, 2014.]

 Revision    [$Id: extraBddThresh.c,v 1.0 2014/10/07 00:00:00 alanmi Exp $]

 ***********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "base/main/main.h"
#include "misc/extra/extra.h"
#include "bdd/cudd/cudd.h"
#include "bool/kit/kit.h"

#include "misc/vec/vec.h"
#include "misc/util/utilTruth.h"

ABC_NAMESPACE_IMPL_START

////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

 Synopsis    [Checks thresholdness of the function.]

 Description []

 SideEffects []

 SeeAlso     []

 ***********************************************************************/
void Extra_ThreshPrintChow(int Chow0, int * pChow, int nVars) {
    int i;
    for (i = 0; i < nVars; i++)
        printf("%d ", pChow[i]);
    printf("  %d\n", Chow0);
}
int Extra_ThreshComputeChow(word * t, int nVars, int * pChow) {
    int i, k, Chow0 = 0, nMints = (1 << nVars);
    memset(pChow, 0, sizeof(int) * nVars);
    // compute Chow coefs
    for (i = 0; i < nMints; i++)
        if (Abc_TtGetBit(t, i))
            for (Chow0++, k = 0; k < nVars; k++)
                if ((i >> k) & 1)
                    pChow[k]++;
    // compute modified Chow coefs
    for (k = 0; k < nVars; k++)
        pChow[k] = 2 * pChow[k] - Chow0;
    return Chow0 - (1 << (nVars - 1));
}
void Extra_ThreshSortByChow(word * t, int nVars, int * pChow) {
    int i, nWords = Abc_TtWordNum(nVars);
    //sort the variables by Chow in ascending order
    while (1) {
        int fChange = 0;
        for (i = 0; i < nVars - 1; i++) {
            if (pChow[i] >= pChow[i + 1])
                continue;
            ABC_SWAP(int, pChow[i], pChow[i + 1]);
            Abc_TtSwapAdjacent(t, nWords, i);
            fChange = 1;
        }
        if (!fChange)
            return;
    }
}
void Extra_ThreshSortByChowInverted(word * t, int nVars, int * pChow) {
    int i, nWords = Abc_TtWordNum(nVars);
    //sort the variables by Chow in descending order
    while (1) {
        int fChange = 0;
        for (i = 0; i < nVars - 1; i++) {
            if (pChow[i] <= pChow[i + 1])
                continue;
            ABC_SWAP(int, pChow[i], pChow[i + 1]);
            Abc_TtSwapAdjacent(t, nWords, i);
            fChange = 1;
        }
        if (!fChange)
            return;
    }
}
int Extra_ThreshInitializeChow(int nVars, int * pChow) {
    int i = 0, Aux[16], nChows = 0;
    //group the variables which have the same Chow
    for (i = 0; i < nVars; i++) {
        if (i == 0 || (pChow[i] == pChow[i - 1]))
            Aux[i] = nChows;
        else {
            nChows++;
            Aux[i] = nChows;
        }
    }
    for (i = 0; i < nVars; i++)
        pChow[i] = Aux[i];
    nChows++;
    return nChows;

}
static inline int Extra_ThreshWeightedSum(int * pW, int nVars, int m) {
    int i, Cost = 0;
    for (i = 0; i < nVars; i++)
        if ((m >> i) & 1)
            Cost += pW[i];
    return Cost;
}
static inline int Extra_ThreshCubeWeightedSum1(int * pWofChow, int * pChow,
        char * pIsop, int nVars, int j) {
    int k, Cost = 0;
    for (k = j; k < j + nVars; k++)
        if (pIsop[k] == '1')
            Cost += pWofChow[pChow[k - j]];
    return Cost;
}
static inline int Extra_ThreshCubeWeightedSum2(int * pWofChow, int * pChow,
        char * pIsop, int nVars, int j) {
    int k, Cost = 0;
    for (k = j; k < j + nVars; k++)
        if (pIsop[k] == '-')
            Cost += pWofChow[pChow[k - j]];
    return Cost;
}

static inline int Extra_ThreshCubeWeightedSum3(int * pWofChow, int nChows,
        unsigned long ** pGreaters, int j) {
    int i, Cost = 0;
    for (i = 0; i < nChows; i++)
        Cost += pWofChow[i] * pGreaters[j][i];
    return Cost;
}
static inline int Extra_ThreshCubeWeightedSum4(int * pWofChow, int nChows,
        unsigned long ** pSmallers, int j) {
    int i, Cost = 0;
    for (i = 0; i < nChows; i++)
        Cost += pWofChow[i] * pSmallers[j][i];
    return Cost;
}
int Extra_ThreshSelectWeights3(word * t, int nVars, int * pW) {
    int m, Lmin, Lmax, nMints = (1 << nVars);
    assert(nVars == 3);
    for (pW[2] = 1; pW[2] <= nVars; pW[2]++)
        for (pW[1] = pW[2]; pW[1] <= nVars; pW[1]++)
            for (pW[0] = pW[1]; pW[0] <= nVars; pW[0]++) {
                Lmin = 10000;
                Lmax = 0;
                for (m = 0; m < nMints; m++) {
                    if (Abc_TtGetBit(t, m))
                        Lmin = Abc_MinInt(Lmin,
                                Extra_ThreshWeightedSum(pW, nVars, m));
                    else
                        Lmax = Abc_MaxInt(Lmax,
                                Extra_ThreshWeightedSum(pW, nVars, m));
                    if (Lmax >= Lmin)
                        break;
//            printf( "%c%d ", Abc_TtGetBit(t, m) ? '+' : '-', Extra_ThreshWeightedSum(pW, nVars, m) );
                }
//        printf( "  -%d +%d\n", Lmax, Lmin );
                if (m < nMints)
                    continue;
                assert(Lmax < Lmin);
                return Lmin;
            }
    return 0;
}
int Extra_ThreshSelectWeights4(word * t, int nVars, int * pW) {
    int m, Lmin, Lmax, nMints = (1 << nVars);
    assert(nVars == 4);
    for (pW[3] = 1; pW[3] <= nVars; pW[3]++)
        for (pW[2] = pW[3]; pW[2] <= nVars; pW[2]++)
            for (pW[1] = pW[2]; pW[1] <= nVars; pW[1]++)
                for (pW[0] = pW[1]; pW[0] <= nVars; pW[0]++) {
                    Lmin = 10000;
                    Lmax = 0;
                    for (m = 0; m < nMints; m++) {
                        if (Abc_TtGetBit(t, m))
                            Lmin = Abc_MinInt(Lmin,
                                    Extra_ThreshWeightedSum(pW, nVars, m));
                        else
                            Lmax = Abc_MaxInt(Lmax,
                                    Extra_ThreshWeightedSum(pW, nVars, m));
                        if (Lmax >= Lmin)
                            break;
                    }
                    if (m < nMints)
                        continue;
                    assert(Lmax < Lmin);
                    return Lmin;
                }
    return 0;
}
int Extra_ThreshSelectWeights5(word * t, int nVars, int * pW) {
    int m, Lmin, Lmax, nMints = (1 << nVars), Limit = nVars + 0;
    assert(nVars == 5);
    for (pW[4] = 1; pW[4] <= Limit; pW[4]++)
        for (pW[3] = pW[4]; pW[3] <= Limit; pW[3]++)
            for (pW[2] = pW[3]; pW[2] <= Limit; pW[2]++)
                for (pW[1] = pW[2]; pW[1] <= Limit; pW[1]++)
                    for (pW[0] = pW[1]; pW[0] <= Limit; pW[0]++) {
                        Lmin = 10000;
                        Lmax = 0;
                        for (m = 0; m < nMints; m++) {
                            if (Abc_TtGetBit(t, m))
                                Lmin = Abc_MinInt(Lmin,
                                        Extra_ThreshWeightedSum(pW, nVars, m));
                            else
                                Lmax = Abc_MaxInt(Lmax,
                                        Extra_ThreshWeightedSum(pW, nVars, m));
                            if (Lmax >= Lmin)
                                break;
                        }
                        if (m < nMints)
                            continue;
                        assert(Lmax < Lmin);
                        return Lmin;
                    }
    return 0;
}
int Extra_ThreshSelectWeights6(word * t, int nVars, int * pW) {
    int m, Lmin, Lmax, nMints = (1 << nVars), Limit = nVars + 3;
    assert(nVars == 6);
    for (pW[5] = 1; pW[5] <= Limit; pW[5]++)
        for (pW[4] = pW[5]; pW[4] <= Limit; pW[4]++)
            for (pW[3] = pW[4]; pW[3] <= Limit; pW[3]++)
                for (pW[2] = pW[3]; pW[2] <= Limit; pW[2]++)
                    for (pW[1] = pW[2]; pW[1] <= Limit; pW[1]++)
                        for (pW[0] = pW[1]; pW[0] <= Limit; pW[0]++) {
                            Lmin = 10000;
                            Lmax = 0;
                            for (m = 0; m < nMints; m++) {
                                if (Abc_TtGetBit(t, m))
                                    Lmin = Abc_MinInt(Lmin,
                                            Extra_ThreshWeightedSum(pW, nVars,
                                                    m));
                                else
                                    Lmax = Abc_MaxInt(Lmax,
                                            Extra_ThreshWeightedSum(pW, nVars,
                                                    m));
                                if (Lmax >= Lmin)
                                    break;
                            }
                            if (m < nMints)
                                continue;
                            assert(Lmax < Lmin);
                            return Lmin;
                        }
    return 0;
}
int Extra_ThreshSelectWeights7(word * t, int nVars, int * pW) {
    int m, Lmin, Lmax, nMints = (1 << nVars), Limit = nVars + 6;
    assert(nVars == 7);
    for (pW[6] = 1; pW[6] <= Limit; pW[6]++)
        for (pW[5] = pW[6]; pW[5] <= Limit; pW[5]++)
            for (pW[4] = pW[5]; pW[4] <= Limit; pW[4]++)
                for (pW[3] = pW[4]; pW[3] <= Limit; pW[3]++)
                    for (pW[2] = pW[3]; pW[2] <= Limit; pW[2]++)
                        for (pW[1] = pW[2]; pW[1] <= Limit; pW[1]++)
                            for (pW[0] = pW[1]; pW[0] <= Limit; pW[0]++) {
                                Lmin = 10000;
                                Lmax = 0;
                                for (m = 0; m < nMints; m++) {
                                    if (Abc_TtGetBit(t, m))
                                        Lmin = Abc_MinInt(Lmin,
                                                Extra_ThreshWeightedSum(pW,
                                                        nVars, m));
                                    else
                                        Lmax = Abc_MaxInt(Lmax,
                                                Extra_ThreshWeightedSum(pW,
                                                        nVars, m));
                                    if (Lmax >= Lmin)
                                        break;
                                }
                                if (m < nMints)
                                    continue;
                                assert(Lmax < Lmin);
                                return Lmin;
                            }
    return 0;
}
int Extra_ThreshSelectWeights8(word * t, int nVars, int * pW) {
    int m, Lmin, Lmax, nMints = (1 << nVars), Limit = nVars + 1; // <<-- incomplete detection to save runtime!
    assert(nVars == 8);
    for (pW[7] = 1; pW[7] <= Limit; pW[7]++)
        for (pW[6] = pW[7]; pW[6] <= Limit; pW[6]++)
            for (pW[5] = pW[6]; pW[5] <= Limit; pW[5]++)
                for (pW[4] = pW[5]; pW[4] <= Limit; pW[4]++)
                    for (pW[3] = pW[4]; pW[3] <= Limit; pW[3]++)
                        for (pW[2] = pW[3]; pW[2] <= Limit; pW[2]++)
                            for (pW[1] = pW[2]; pW[1] <= Limit; pW[1]++)
                                for (pW[0] = pW[1]; pW[0] <= Limit; pW[0]++) {
                                    Lmin = 10000;
                                    Lmax = 0;
                                    for (m = 0; m < nMints; m++) {
                                        if (Abc_TtGetBit(t, m))
                                            Lmin = Abc_MinInt(Lmin,
                                                    Extra_ThreshWeightedSum(pW,
                                                            nVars, m));
                                        else
                                            Lmax = Abc_MaxInt(Lmax,
                                                    Extra_ThreshWeightedSum(pW,
                                                            nVars, m));
                                        if (Lmax >= Lmin)
                                            break;
                                    }
                                    if (m < nMints)
                                        continue;
                                    assert(Lmax < Lmin);
                                    return Lmin;
                                }
    return 0;
}
int Extra_ThreshSelectWeights(word * t, int nVars, int * pW) {
    if (nVars <= 2)
        return (t[0] & 0xF) != 6 && (t[0] & 0xF) != 9;
    if (nVars == 3)
        return Extra_ThreshSelectWeights3(t, nVars, pW);
    if (nVars == 4)
        return Extra_ThreshSelectWeights4(t, nVars, pW);
    if (nVars == 5)
        return Extra_ThreshSelectWeights5(t, nVars, pW);
    if (nVars == 6)
        return Extra_ThreshSelectWeights6(t, nVars, pW);
    if (nVars == 7)
        return Extra_ThreshSelectWeights7(t, nVars, pW);
    if (nVars == 8)
        return Extra_ThreshSelectWeights8(t, nVars, pW);
    return 0;
}
void Extra_ThreshIncrementWeights(int nChows, int * pWofChow, int i) {
    int k;
    for (k = i; k < nChows; k++) {
        pWofChow[k]++;
    }
}
void Extra_ThreshDecrementWeights(int nChows, int * pWofChow, int i) {
    int k;
    for (k = i; k < nChows; k++) {
        pWofChow[k]--;
    }
}
void Extra_ThreshPrintInequalities(unsigned long ** pGreaters,
        unsigned long ** pSmallers, int nChows, int nInequalities) {
    int i = 0, k = 0;
    for (k = 0; k < nInequalities; k++) {
        printf("\n Inequality [%d] = ", k);
        for (i = 0; i < nChows; i++) {
            printf("%ld ", pGreaters[k][i]);
        }
        printf(" > ");

        for (i = 0; i < nChows; i++) {
            printf("%ld ", pSmallers[k][i]);
        }
    }
}
void Extra_ThreshCreateInequalities(char * pIsop, char * pIsopFneg, int nVars,
        int * pWofChow, int * pChow, int nChows, int nInequalities,
        unsigned long ** pGreaters, unsigned long ** pSmallers) {
    int i = 0, j = 0, k = 0, m = 0;

    int nCubesIsop = strlen(pIsop) / (nVars + 3);
    int nCubesIsopFneg = strlen(pIsopFneg) / (nVars + 3);

    for (k = 0; k < nCubesIsop * nCubesIsopFneg; k++)
        for (i = 0; i < nChows; i++) {
            pGreaters[k][i] = 0;
            pSmallers[k][i] = 0;
        }
    m = 0;
    for (i = 0; i < (int)strlen(pIsop); i += (nVars + 3))
        for (j = 0; j < nCubesIsopFneg; j++) {
            for (k = 0; k < nVars; k++)
                if (pIsop[i + k] == '1')
                    pGreaters[m][pChow[k]] = pGreaters[m][(pChow[k])] + 1;

            m++;
        }
    m = 0;
    for (i = 0; i < nCubesIsop; i++)
        for (j = 0; j < (int)strlen(pIsopFneg); j += (nVars + 3)) {
            for (k = 0; k < nVars; k++)
                if (pIsopFneg[j + k] == '-')
                    pSmallers[m][pChow[k]] = pSmallers[m][pChow[k]] + 1;
            m++;
        }
//        Extra_ThreshPrintInequalities( pGreaters, pSmallers, nChows, nInequalities);
//        printf( "\nInequalities was Created \n");
}

void Extra_ThreshSimplifyInequalities(int nInequalities, int nChows,
        unsigned long ** pGreaters, unsigned long ** pSmallers) {
    int i = 0, k = 0;

    for (k = 0; k < nInequalities; k++) {
        for (i = 0; i < nChows; i++) {
            if ((pGreaters[k][i]) == (pSmallers[k][i])) {
                pGreaters[k][i] = 0;
                pSmallers[k][i] = 0;
            } else if ((pGreaters[k][i]) > (pSmallers[k][i])) {
                pGreaters[k][i] = pGreaters[k][i] - pSmallers[k][i];
                pSmallers[k][i] = 0;
            } else {
                pSmallers[k][i] = pSmallers[k][i] - pGreaters[k][i];
                ;
                pGreaters[k][i] = 0;
            }
        }
    }
//        Extra_ThreshPrintInequalities( pGreaters, pSmallers, nChows, nInequalities);
//        printf( "\nInequalities was Siplified \n");
}
int Extra_ThreshAssignWeights(word * t, char * pIsop, char * pIsopFneg,
        int nVars, int * pW, int * pChow, int nChows, int Wmin) {

    int i = 0, j = 0, Lmin = 1000, Lmax = 0, Limit = nVars * 2, delta = 0,
            deltaOld = -1000, fIncremented = 0;
    //******************************
    int * pWofChow = ABC_ALLOC( int, nChows );
    int nCubesIsop = strlen(pIsop) / (nVars + 3);
    int nCubesIsopFneg = strlen(pIsopFneg) / (nVars + 3);
    int nInequalities = nCubesIsop * nCubesIsopFneg;
    unsigned long **pGreaters;
    unsigned long **pSmallers;

    pGreaters = (unsigned long **)malloc(nCubesIsop * nCubesIsopFneg * sizeof *pGreaters);
    for (i = 0; i < nCubesIsop * nCubesIsopFneg; i++) {
        pGreaters[i] = (unsigned long *)malloc(nChows * sizeof *pGreaters[i]);
    }
    pSmallers = (unsigned long **)malloc(nCubesIsop * nCubesIsopFneg * sizeof *pSmallers);
    for (i = 0; i < nCubesIsop * nCubesIsopFneg; i++) {
        pSmallers[i] = (unsigned long *)malloc(nChows * sizeof *pSmallers[i]);
    }

    //******************************
    Extra_ThreshCreateInequalities(pIsop, pIsopFneg, nVars, pWofChow, pChow,
            nChows, nInequalities, pGreaters, pSmallers);
    Extra_ThreshSimplifyInequalities(nInequalities, nChows, pGreaters,
            pSmallers);

    //initializes the weights
    pWofChow[0] = Wmin;
    for (i = 1; i < nChows; i++) {
        pWofChow[i] = pWofChow[i - 1] + 1;
    }
    i = 0;

    //assign the weights respecting the inequalities
    while (i < nChows && pWofChow[nChows - 1] <= Limit) {
        Lmin = 1000;
        Lmax = 0;

        while (j < nInequalities) {
            if (pGreaters[j][i] != 0) {
                Lmin = Extra_ThreshCubeWeightedSum3(pWofChow, nChows, pGreaters,
                        j);
                Lmax = Extra_ThreshCubeWeightedSum4(pWofChow, nChows, pSmallers,
                        j);
                delta = Lmin - Lmax;

                if (delta > 0) {
                    if (fIncremented == 1) {
                        j = 0;
                        fIncremented = 0;
                        deltaOld = -1000;
                    } else
                        j++;
                    continue;
                }
                if (delta > deltaOld) {
                    Extra_ThreshIncrementWeights(nChows, pWofChow, i);
                    deltaOld = delta;
                    fIncremented = 1;
                } else if (fIncremented == 1) {
                    Extra_ThreshDecrementWeights(nChows, pWofChow, i);
                    j++;
                    deltaOld = -1000;
                    fIncremented = 0;
                    continue;
                } else
                    j++;
            } else
                j++;

        }
        i++;
        j = 0;
    }

    //******************************
    for (i = 0; i < nCubesIsop * nCubesIsopFneg; i++) {
        free(pGreaters[i]);
    }
    free(pGreaters);
    for (i = 0; i < nCubesIsop * nCubesIsopFneg; i++) {
        free(pSmallers[i]);
    }
    free(pSmallers);
    //******************************

    i = 0;
    Lmin = 1000;
    Lmax = 0;

    //check the assigned weights in the original system
    for (j = 0; j < (int)strlen(pIsop); j += (nVars + 3))
        Lmin = Abc_MinInt(Lmin,
                Extra_ThreshCubeWeightedSum1(pWofChow, pChow, pIsop, nVars, j));
    for (j = 0; j < (int)strlen(pIsopFneg); j += (nVars + 3))
        Lmax = Abc_MaxInt(Lmax,
                Extra_ThreshCubeWeightedSum2(pWofChow, pChow, pIsopFneg, nVars,
                        j));

    for (i = 0; i < nVars; i++) {
        pW[i] = pWofChow[pChow[i]];
    }

    ABC_FREE( pWofChow );
    if (Lmin > Lmax)
        return Lmin;
    else
        return 0;
}
void Extra_ThreshPrintWeights(int T, int * pW, int nVars) {
    int i;

    if (T == 0)
        fprintf( stdout, "\nHeuristic method: is not TLF\n\n");
    else {
        fprintf( stdout, "\nHeuristic method: Weights and threshold value:\n");
        for (i = 0; i < nVars; i++)
            printf("%d ", pW[i]);
        printf("  %d\n", T);
    }
}
/**Function*************************************************************


 Synopsis    [Checks thresholdness of the function.]

 Description []

 SideEffects []


 SeeAlso     []

 ***********************************************************************/
int Extra_ThreshCheck(word * t, int nVars, int * pW) {
    int Chow0, Chow[16];
    if (!Abc_TtIsUnate(t, nVars))
        return 0;
    Abc_TtMakePosUnate(t, nVars);
    Chow0 = Extra_ThreshComputeChow(t, nVars, Chow);
    Extra_ThreshSortByChow(t, nVars, Chow);
    return Extra_ThreshSelectWeights(t, nVars, pW);
}
/**Function*************************************************************


 Synopsis    [Checks thresholdness of the function by using a heuristic method.]

 Description []

 SideEffects []


 SeeAlso     []

 ***********************************************************************/
int Extra_ThreshHeuristic(word * t, int nVars, int * pW) {

    extern char * Abc_ConvertBddToSop( Mem_Flex_t * pMan, DdManager * dd, DdNode * bFuncOn, DdNode * bFuncOnDc, int nFanins, int fAllPrimes, Vec_Str_t * vCube, int fMode );
    int Chow0, Chow[16], nChows, i, T = 0;
    DdManager * dd;
    Vec_Str_t * vCube;
    DdNode * ddNode, * ddNodeFneg;
    char * pIsop, * pIsopFneg;
    if (nVars <= 1)
        return 1;
    if (!Abc_TtIsUnate(t, nVars))
        return 0;
    Abc_TtMakePosUnate(t, nVars);
    Chow0 = Extra_ThreshComputeChow(t, nVars, Chow);
    Extra_ThreshSortByChowInverted(t, nVars, Chow);
    nChows = Extra_ThreshInitializeChow(nVars, Chow);

    dd = (DdManager *) Abc_FrameReadManDd();
    vCube = Vec_StrAlloc(nVars);
    for (i = 0; i < nVars; i++)
        Cudd_bddIthVar(dd, i);
    ddNode = Kit_TruthToBdd(dd, (unsigned *) t, nVars, 0);
    Cudd_Ref(ddNode);
    pIsop = Abc_ConvertBddToSop( NULL, dd, ddNode, ddNode, nVars, 1,
            vCube, 1);

    Abc_TtNot(t, Abc_TruthWordNum(nVars));
    ddNodeFneg = Kit_TruthToBdd(dd, (unsigned *) t, nVars, 0);
    Cudd_Ref(ddNodeFneg);

    pIsopFneg = Abc_ConvertBddToSop( NULL, dd, ddNodeFneg, ddNodeFneg,
            nVars, 1, vCube, 1);

    Cudd_RecursiveDeref(dd, ddNode);
    Cudd_RecursiveDeref(dd, ddNodeFneg);

    T = Extra_ThreshAssignWeights(t, pIsop, pIsopFneg, nVars, pW, Chow, nChows,
            1);

    for (i = 2; (i < 4) && (T == 0) && (nVars >= 6); i++)
        T = Extra_ThreshAssignWeights(t, pIsop, pIsopFneg, nVars, pW, Chow,
                nChows, i);

    free(pIsop);
    free(pIsopFneg);
    Vec_StrFree(vCube);

    return T;
}

/**Function*************************************************************

 Synopsis    [Checks unateness of a function.]

 Description []

 SideEffects []

 SeeAlso     []

 ***********************************************************************/
void Extra_ThreshCheckTest() {
    int nVars = 6;
    int T, Chow0, Chow[16], Weights[16];
//    word t =  s_Truths6[0] & s_Truths6[1] & s_Truths6[2] & s_Truths6[3] & s_Truths6[4];
//    word t =  (s_Truths6[0] & s_Truths6[1]) | (s_Truths6[0] & s_Truths6[2] & s_Truths6[3]) | (s_Truths6[0] & s_Truths6[2] & s_Truths6[4]);
//    word t = (s_Truths6[2] & s_Truths6[1])
//            | (s_Truths6[2] & s_Truths6[0] & s_Truths6[3])
//            | (s_Truths6[2] & s_Truths6[0] & ~s_Truths6[4]);
    word t = (s_Truths6[0] & s_Truths6[1] & s_Truths6[2])| (s_Truths6[0] & s_Truths6[1] & s_Truths6[3]) | (s_Truths6[0] & s_Truths6[1] & s_Truths6[4] & s_Truths6[5]) | (s_Truths6[0] & s_Truths6[2] & s_Truths6[3] & s_Truths6[4] & s_Truths6[5]);
//    word t =  (s_Truths6[0] & s_Truths6[1]) | (s_Truths6[0] & s_Truths6[2] & s_Truths6[3]) | (s_Truths6[0] & s_Truths6[2] & s_Truths6[4]) | (s_Truths6[1] & s_Truths6[2] & s_Truths6[3]);
//    word t =  (s_Truths6[0] & s_Truths6[1]) | (s_Truths6[0] & s_Truths6[2]) | (s_Truths6[0] & s_Truths6[3] & s_Truths6[4] & s_Truths6[5]) | 
//        (s_Truths6[1] & s_Truths6[2] & s_Truths6[3]) | (s_Truths6[1] & s_Truths6[2] & s_Truths6[4]) | (s_Truths6[1] & s_Truths6[2] & s_Truths6[5]);
    int i;
    assert(nVars <= 8);
    for (i = 0; i < nVars; i++)
        printf("%d %d %d\n", i, Abc_TtPosVar(&t, nVars, i),
                Abc_TtNegVar(&t, nVars, i));
//    word t = s_Truths6[0] & s_Truths6[1] & s_Truths6[2];
    Chow0 = Extra_ThreshComputeChow(&t, nVars, Chow);
    if ((T = Extra_ThreshCheck(&t, nVars, Weights)))
        Extra_ThreshPrintChow(T, Weights, nVars);
    else
        printf("No threshold\n");
}
void Extra_ThreshHeuristicTest() {
    int nVars = 6;
    int T, Weights[16];

    //    word t = 19983902376700760000;
    word t = (s_Truths6[0] & s_Truths6[1] & s_Truths6[2])| (s_Truths6[0] & s_Truths6[1] & s_Truths6[3]) | (s_Truths6[0] & s_Truths6[1] & s_Truths6[4] & s_Truths6[5]) | (s_Truths6[0] & s_Truths6[2] & s_Truths6[3] & s_Truths6[4] & s_Truths6[5]);
    word * pT = &t;
    T = Extra_ThreshHeuristic(pT, nVars, Weights);
    Extra_ThreshPrintWeights(T, Weights, nVars);

}
////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////

ABC_NAMESPACE_IMPL_END

