📄 fxuint.h
字号:
int HNum; // the heap number of this divisor int Weight; // the weight of this divisor Fxu_Var * pVar1; // the first variable of the single-cube divisor Fxu_Var * pVar2; // the second variable of the single-cube divisor Fxu_Single * pPrev; // the previous divisor in the list Fxu_Single * pNext; // the next divisor in the list};/////////////////////////////////////////////////////////////////////////// MACRO DEFITIONS ///////////////////////////////////////////////////////////////////////////// minimum/maximum#define Fxu_Min( a, b ) ( ((a)<(b))? (a):(b) )#define Fxu_Max( a, b ) ( ((a)>(b))? (a):(b) )// selection of the minimum/maximum cube in the pair#define Fxu_PairMinCube( pPair ) (((pPair)->iCube1 < (pPair)->iCube2)? (pPair)->pCube1: (pPair)->pCube2)#define Fxu_PairMaxCube( pPair ) (((pPair)->iCube1 > (pPair)->iCube2)? (pPair)->pCube1: (pPair)->pCube2)#define Fxu_PairMinCubeInt( pPair ) (((pPair)->iCube1 < (pPair)->iCube2)? (pPair)->iCube1: (pPair)->iCube2)#define Fxu_PairMaxCubeInt( pPair ) (((pPair)->iCube1 > (pPair)->iCube2)? (pPair)->iCube1: (pPair)->iCube2)// iterators#define Fxu_MatrixForEachCube( Matrix, Cube )\ for ( Cube = (Matrix)->lCubes.pHead;\ Cube;\ Cube = Cube->pNext )#define Fxu_MatrixForEachCubeSafe( Matrix, Cube, Cube2 )\ for ( Cube = (Matrix)->lCubes.pHead, Cube2 = (Cube? Cube->pNext: NULL);\ Cube;\ Cube = Cube2, Cube2 = (Cube? Cube->pNext: NULL) )#define Fxu_MatrixForEachVariable( Matrix, Var )\ for ( Var = (Matrix)->lVars.pHead;\ Var;\ Var = Var->pNext )#define Fxu_MatrixForEachVariableSafe( Matrix, Var, Var2 )\ for ( Var = (Matrix)->lVars.pHead, Var2 = (Var? Var->pNext: NULL);\ Var;\ Var = Var2, Var2 = (Var? Var->pNext: NULL) )#define Fxu_MatrixForEachSingle( Matrix, Single )\ for ( Single = (Matrix)->lSingles.pHead;\ Single;\ Single = Single->pNext )#define Fxu_MatrixForEachSingleSafe( Matrix, Single, Single2 )\ for ( Single = (Matrix)->lSingles.pHead, Single2 = (Single? Single->pNext: NULL);\ Single;\ Single = Single2, Single2 = (Single? Single->pNext: NULL) )#define Fxu_TableForEachDouble( Matrix, Key, Div )\ for ( Div = (Matrix)->pTable[Key].pHead;\ Div;\ Div = Div->pNext )#define Fxu_TableForEachDoubleSafe( Matrix, Key, Div, Div2 )\ for ( Div = (Matrix)->pTable[Key].pHead, Div2 = (Div? Div->pNext: NULL);\ Div;\ Div = Div2, Div2 = (Div? Div->pNext: NULL) )#define Fxu_MatrixForEachDouble( Matrix, Div, Index )\ for ( Index = 0; Index < (Matrix)->nTableSize; Index++ )\ Fxu_TableForEachDouble( Matrix, Index, Div )#define Fxu_MatrixForEachDoubleSafe( Matrix, Div, Div2, Index )\ for ( Index = 0; Index < (Matrix)->nTableSize; Index++ )\ Fxu_TableForEachDoubleSafe( Matrix, Index, Div, Div2 )#define Fxu_CubeForEachLiteral( Cube, Lit )\ for ( Lit = (Cube)->lLits.pHead;\ Lit;\ Lit = Lit->pHNext )#define Fxu_CubeForEachLiteralSafe( Cube, Lit, Lit2 )\ for ( Lit = (Cube)->lLits.pHead, Lit2 = (Lit? Lit->pHNext: NULL);\ Lit;\ Lit = Lit2, Lit2 = (Lit? Lit->pHNext: NULL) )#define Fxu_VarForEachLiteral( Var, Lit )\ for ( Lit = (Var)->lLits.pHead;\ Lit;\ Lit = Lit->pVNext )#define Fxu_CubeForEachDivisor( Cube, Div )\ for ( Div = (Cube)->lDivs.pHead;\ Div;\ Div = Div->pCNext )#define Fxu_DoubleForEachPair( Div, Pair )\ for ( Pair = (Div)->lPairs.pHead;\ Pair;\ Pair = Pair->pDNext )#define Fxu_DoubleForEachPairSafe( Div, Pair, Pair2 )\ for ( Pair = (Div)->lPairs.pHead, Pair2 = (Pair? Pair->pDNext: NULL);\ Pair;\ Pair = Pair2, Pair2 = (Pair? Pair->pDNext: NULL) )// iterator through the cube pairs belonging to the given cube #define Fxu_CubeForEachPair( pCube, pPair, i )\ for ( i = 0;\ i < pCube->pVar->nCubes &&\ (((unsigned)(pPair = pCube->pVar->ppPairs[pCube->iCube][i])) >= 0);\ i++ )\ if ( pPair )// iterator through all the items in the heap#define Fxu_HeapDoubleForEachItem( Heap, Div )\ for ( Heap->i = 1;\ Heap->i <= Heap->nItems && (Div = Heap->pTree[Heap->i]);\ Heap->i++ )#define Fxu_HeapSingleForEachItem( Heap, Single )\ for ( Heap->i = 1;\ Heap->i <= Heap->nItems && (Single = Heap->pTree[Heap->i]);\ Heap->i++ )// starting the rings#define Fxu_MatrixRingCubesStart( Matrix ) (((Matrix)->ppTailCubes = &((Matrix)->pOrderCubes)), ((Matrix)->pOrderCubes = NULL))#define Fxu_MatrixRingVarsStart( Matrix ) (((Matrix)->ppTailVars = &((Matrix)->pOrderVars)), ((Matrix)->pOrderVars = NULL))// stopping the rings#define Fxu_MatrixRingCubesStop( Matrix )#define Fxu_MatrixRingVarsStop( Matrix )// resetting the rings#define Fxu_MatrixRingCubesReset( Matrix ) (((Matrix)->pOrderCubes = NULL), ((Matrix)->ppTailCubes = NULL))#define Fxu_MatrixRingVarsReset( Matrix ) (((Matrix)->pOrderVars = NULL), ((Matrix)->ppTailVars = NULL))// adding to the rings#define Fxu_MatrixRingCubesAdd( Matrix, Cube) ((*((Matrix)->ppTailCubes) = Cube), ((Matrix)->ppTailCubes = &(Cube)->pOrder), ((Cube)->pOrder = (Fxu_Cube *)1))#define Fxu_MatrixRingVarsAdd( Matrix, Var ) ((*((Matrix)->ppTailVars ) = Var ), ((Matrix)->ppTailVars = &(Var)->pOrder ), ((Var)->pOrder = (Fxu_Var *)1))// iterating through the rings#define Fxu_MatrixForEachCubeInRing( Matrix, Cube )\ if ( (Matrix)->pOrderCubes )\ for ( Cube = (Matrix)->pOrderCubes;\ Cube != (Fxu_Cube *)1;\ Cube = Cube->pOrder )#define Fxu_MatrixForEachCubeInRingSafe( Matrix, Cube, Cube2 )\ if ( (Matrix)->pOrderCubes )\ for ( Cube = (Matrix)->pOrderCubes, Cube2 = ((Cube != (Fxu_Cube *)1)? Cube->pOrder: (Fxu_Cube *)1);\ Cube != (Fxu_Cube *)1;\ Cube = Cube2, Cube2 = ((Cube != (Fxu_Cube *)1)? Cube->pOrder: (Fxu_Cube *)1) )#define Fxu_MatrixForEachVarInRing( Matrix, Var )\ if ( (Matrix)->pOrderVars )\ for ( Var = (Matrix)->pOrderVars;\ Var != (Fxu_Var *)1;\ Var = Var->pOrder )#define Fxu_MatrixForEachVarInRingSafe( Matrix, Var, Var2 )\ if ( (Matrix)->pOrderVars )\ for ( Var = (Matrix)->pOrderVars, Var2 = ((Var != (Fxu_Var *)1)? Var->pOrder: (Fxu_Var *)1);\ Var != (Fxu_Var *)1;\ Var = Var2, Var2 = ((Var != (Fxu_Var *)1)? Var->pOrder: (Fxu_Var *)1) )// the procedures are related to the above macrosextern void Fxu_MatrixRingCubesUnmark( Fxu_Matrix * p );extern void Fxu_MatrixRingVarsUnmark( Fxu_Matrix * p );// macros working with memory// MEM_ALLOC: allocate the given number (Size) of items of type (Type)// MEM_FREE: deallocate the pointer (Pointer) to the given number (Size) of items of type (Type)#ifdef USE_SYSTEM_MEMORY_MANAGEMENT#define MEM_ALLOC_FXU( Manager, Type, Size ) ((Type *)malloc( (Size) * sizeof(Type) ))#define MEM_FREE_FXU( Manager, Type, Size, Pointer ) if ( Pointer ) { free(Pointer); Pointer = NULL; }#else#define MEM_ALLOC_FXU( Manager, Type, Size )\ ((Type *)Fxu_MemFetch( Manager, (Size) * sizeof(Type) ))#define MEM_FREE_FXU( Manager, Type, Size, Pointer )\ if ( Pointer ) { Fxu_MemRecycle( Manager, (char *)(Pointer), (Size) * sizeof(Type) ); Pointer = NULL; }#endif/////////////////////////////////////////////////////////////////////////// FUNCTION DEFITIONS ////////////////////////////////////////////////////////////////////////////*===== fxu.c ====================================================*/extern char * Fxu_MemFetch( Fxu_Matrix * p, int nBytes );extern void Fxu_MemRecycle( Fxu_Matrix * p, char * pItem, int nBytes );/*===== fxuCreate.c ====================================================*//*===== fxuReduce.c ====================================================*//*===== fxuPrint.c ====================================================*/extern void Fxu_MatrixPrint( FILE * pFile, Fxu_Matrix * p );extern void Fxu_MatrixPrintDivisorProfile( FILE * pFile, Fxu_Matrix * p );/*===== fxuSelect.c ====================================================*/extern int Fxu_Select( Fxu_Matrix * p, Fxu_Single ** ppSingle, Fxu_Double ** ppDouble );extern int Fxu_SelectSCD( Fxu_Matrix * p, int Weight, Fxu_Var ** ppVar1, Fxu_Var ** ppVar2 );/*===== fxuUpdate.c ====================================================*/extern void Fxu_Update( Fxu_Matrix * p, Fxu_Single * pSingle, Fxu_Double * pDouble );extern void Fxu_UpdateDouble( Fxu_Matrix * p );extern void Fxu_UpdateSingle( Fxu_Matrix * p );/*===== fxuPair.c ====================================================*/extern void Fxu_PairCanonicize( Fxu_Cube ** ppCube1, Fxu_Cube ** ppCube2 );extern unsigned Fxu_PairHashKeyArray( Fxu_Matrix * p, int piVarsC1[], int piVarsC2[], int nVarsC1, int nVarsC2 );extern unsigned Fxu_PairHashKey( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2, int * pnBase, int * pnLits1, int * pnLits2 );extern unsigned Fxu_PairHashKeyMv( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2, int * pnBase, int * pnLits1, int * pnLits2 );extern int Fxu_PairCompare( Fxu_Pair * pPair1, Fxu_Pair * pPair2 );extern void Fxu_PairAllocStorage( Fxu_Var * pVar, int nCubes );extern void Fxu_PairFreeStorage( Fxu_Var * pVar );extern void Fxu_PairClearStorage( Fxu_Cube * pCube );extern Fxu_Pair * Fxu_PairAlloc( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2 );extern void Fxu_PairAdd( Fxu_Pair * pPair );/*===== fxuSingle.c ====================================================*/extern void Fxu_MatrixComputeSingles( Fxu_Matrix * p );extern void Fxu_MatrixComputeSinglesOne( Fxu_Matrix * p, Fxu_Var * pVar );extern int Fxu_SingleCountCoincidence( Fxu_Matrix * p, Fxu_Var * pVar1, Fxu_Var * pVar2 );/*===== fxuMatrix.c ====================================================*/// matrixextern Fxu_Matrix * Fxu_MatrixAllocate();extern void Fxu_MatrixDelete( Fxu_Matrix * p );// double-cube divisorextern void Fxu_MatrixAddDivisor( Fxu_Matrix * p, Fxu_Cube * pCube1, Fxu_Cube * pCube2 );extern void Fxu_MatrixDelDivisor( Fxu_Matrix * p, Fxu_Double * pDiv );// single-cube divisorextern void Fxu_MatrixAddSingle( Fxu_Matrix * p, Fxu_Var * pVar1, Fxu_Var * pVar2, int Weight );// variableextern Fxu_Var * Fxu_MatrixAddVar( Fxu_Matrix * p );// cubeextern Fxu_Cube * Fxu_MatrixAddCube( Fxu_Matrix * p, Fxu_Var * pVar, int iCube );// literalextern void Fxu_MatrixAddLiteral( Fxu_Matrix * p, Fxu_Cube * pCube, Fxu_Var * pVar );extern void Fxu_MatrixDelLiteral( Fxu_Matrix * p, Fxu_Lit * pLit );/*===== fxuList.c ====================================================*/// matrix -> variable extern void Fxu_ListMatrixAddVariable( Fxu_Matrix * p, Fxu_Var * pVar );extern void Fxu_ListMatrixDelVariable( Fxu_Matrix * p, Fxu_Var * pVar );// matrix -> cubeextern void Fxu_ListMatrixAddCube( Fxu_Matrix * p, Fxu_Cube * pCube );extern void Fxu_ListMatrixDelCube( Fxu_Matrix * p, Fxu_Cube * pCube );// matrix -> singleextern void Fxu_ListMatrixAddSingle( Fxu_Matrix * p, Fxu_Single * pSingle );extern void Fxu_ListMatrixDelSingle( Fxu_Matrix * p, Fxu_Single * pSingle );// table -> divisorextern void Fxu_ListTableAddDivisor( Fxu_Matrix * p, Fxu_Double * pDiv );extern void Fxu_ListTableDelDivisor( Fxu_Matrix * p, Fxu_Double * pDiv );// cube -> literal extern void Fxu_ListCubeAddLiteral( Fxu_Cube * pCube, Fxu_Lit * pLit );extern void Fxu_ListCubeDelLiteral( Fxu_Cube * pCube, Fxu_Lit * pLit );// var -> literalextern void Fxu_ListVarAddLiteral( Fxu_Var * pVar, Fxu_Lit * pLit );extern void Fxu_ListVarDelLiteral( Fxu_Var * pVar, Fxu_Lit * pLit );// divisor -> pairextern void Fxu_ListDoubleAddPairLast( Fxu_Double * pDiv, Fxu_Pair * pLink );extern void Fxu_ListDoubleAddPairFirst( Fxu_Double * pDiv, Fxu_Pair * pLink );extern void Fxu_ListDoubleAddPairMiddle( Fxu_Double * pDiv, Fxu_Pair * pSpot, Fxu_Pair * pLink );extern void Fxu_ListDoubleDelPair( Fxu_Double * pDiv, Fxu_Pair * pPair );/*===== fxuHeapDouble.c ====================================================*/extern Fxu_HeapDouble * Fxu_HeapDoubleStart();extern void Fxu_HeapDoubleStop( Fxu_HeapDouble * p );extern void Fxu_HeapDoublePrint( FILE * pFile, Fxu_HeapDouble * p );extern void Fxu_HeapDoubleCheck( Fxu_HeapDouble * p );extern void Fxu_HeapDoubleCheckOne( Fxu_HeapDouble * p, Fxu_Double * pDiv );extern void Fxu_HeapDoubleInsert( Fxu_HeapDouble * p, Fxu_Double * pDiv ); extern void Fxu_HeapDoubleUpdate( Fxu_HeapDouble * p, Fxu_Double * pDiv ); extern void Fxu_HeapDoubleDelete( Fxu_HeapDouble * p, Fxu_Double * pDiv ); extern int Fxu_HeapDoubleReadMaxWeight( Fxu_HeapDouble * p ); extern Fxu_Double * Fxu_HeapDoubleReadMax( Fxu_HeapDouble * p ); extern Fxu_Double * Fxu_HeapDoubleGetMax( Fxu_HeapDouble * p ); /*===== fxuHeapSingle.c ====================================================*/extern Fxu_HeapSingle * Fxu_HeapSingleStart();extern void Fxu_HeapSingleStop( Fxu_HeapSingle * p );extern void Fxu_HeapSinglePrint( FILE * pFile, Fxu_HeapSingle * p );extern void Fxu_HeapSingleCheck( Fxu_HeapSingle * p );extern void Fxu_HeapSingleCheckOne( Fxu_HeapSingle * p, Fxu_Single * pSingle );extern void Fxu_HeapSingleInsert( Fxu_HeapSingle * p, Fxu_Single * pSingle ); extern void Fxu_HeapSingleUpdate( Fxu_HeapSingle * p, Fxu_Single * pSingle ); extern void Fxu_HeapSingleDelete( Fxu_HeapSingle * p, Fxu_Single * pSingle ); extern int Fxu_HeapSingleReadMaxWeight( Fxu_HeapSingle * p ); extern Fxu_Single * Fxu_HeapSingleReadMax( Fxu_HeapSingle * p );extern Fxu_Single * Fxu_HeapSingleGetMax( Fxu_HeapSingle * p ); /////////////////////////////////////////////////////////////////////////// END OF FILE ///////////////////////////////////////////////////////////////////////////#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -