You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
914 lines
33 KiB
914 lines
33 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2002-
|
|
// Authors:
|
|
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford, formerly University of Birmingham)
|
|
// * Vojtech Forejt <vojtech.forejt@cs.ox.ac.uk> (University of Oxford)
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// This file is part of PRISM.
|
|
//
|
|
// PRISM 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 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// PRISM 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 PRISM; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
//==============================================================================
|
|
|
|
#include "JDD.h"
|
|
#include "JDDNode.h"
|
|
#include "JDDVars.h"
|
|
#include "DebugJDD.h"
|
|
#include "jnipointer.h"
|
|
|
|
#include <stdio.h>
|
|
#include <util.h>
|
|
#include <cudd.h>
|
|
#include <dd.h>
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
static DdManager *ddman;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_GetCUDDManager(JNIEnv *env, jclass cls)
|
|
{
|
|
return ptr_to_jlong(ddman);
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1SetOutputStream(JNIEnv *env, jclass cls, jlong __jlongpointer fp)
|
|
{
|
|
DD_SetOutputStream(jlong_to_FILE(fp));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1GetOutputStream(JNIEnv *env, jclass cls)
|
|
{
|
|
return ptr_to_jlong(DD_GetOutputStream());
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd_cudd
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1InitialiseCUDD__(JNIEnv *env, jclass cls)
|
|
{
|
|
ddman = DD_InitialiseCUDD();
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1InitialiseCUDD__JD(JNIEnv *env, jclass cls, jlong max_mem, jdouble epsilon)
|
|
{
|
|
ddman = DD_InitialiseCUDD(max_mem, epsilon);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1SetCUDDMaxMem(JNIEnv *env, jclass cls, jlong max_mem)
|
|
{
|
|
DD_SetCUDDMaxMem(ddman, max_mem);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1SetCUDDEpsilon(JNIEnv *env, jclass cls, jdouble epsilon)
|
|
{
|
|
DD_SetCUDDEpsilon(ddman, epsilon);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1CloseDownCUDD(JNIEnv *env, jclass cls, jboolean check)
|
|
{
|
|
DD_CloseDownCUDD(ddman, check);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1Ref(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
Cudd_Ref(jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1Deref(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
Cudd_RecursiveDeref(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintCacheInfo(JNIEnv *env, jclass cls)
|
|
{
|
|
DD_PrintCacheInfo(ddman);
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd_basics
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Create(JNIEnv *env, jclass cls)
|
|
{
|
|
return ptr_to_jlong(DD_Create(ddman));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Constant(JNIEnv *env, jclass cls, jdouble value)
|
|
{
|
|
return ptr_to_jlong(DD_Constant(ddman, value));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1PlusInfinity(JNIEnv *env, jclass cls)
|
|
{
|
|
return ptr_to_jlong(DD_PlusInfinity(ddman));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1MinusInfinity(JNIEnv *env, jclass cls)
|
|
{
|
|
return ptr_to_jlong(DD_MinusInfinity(ddman));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Var(JNIEnv *env, jclass cls, jint i)
|
|
{
|
|
return ptr_to_jlong(DD_Var(ddman, i));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Not(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return ptr_to_jlong(DD_Not(ddman, jlong_to_DdNode(dd)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Or(JNIEnv *env, jclass cls, jlong __jlongpointer dd1, jlong __jlongpointer dd2)
|
|
{
|
|
return ptr_to_jlong(DD_Or(ddman, jlong_to_DdNode(dd1), jlong_to_DdNode(dd2)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1And(JNIEnv *env, jclass cls, jlong __jlongpointer dd1, jlong __jlongpointer dd2)
|
|
{
|
|
return ptr_to_jlong(DD_And(ddman, jlong_to_DdNode(dd1), jlong_to_DdNode(dd2)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Xor(JNIEnv *env, jclass cls, jlong __jlongpointer dd1, jlong __jlongpointer dd2)
|
|
{
|
|
return ptr_to_jlong(DD_Xor(ddman, jlong_to_DdNode(dd1), jlong_to_DdNode(dd2)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Implies(JNIEnv *env, jclass cls, jlong __jlongpointer dd1, jlong __jlongpointer dd2)
|
|
{
|
|
return ptr_to_jlong(DD_Implies(ddman, jlong_to_DdNode(dd1), jlong_to_DdNode(dd2)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Apply(JNIEnv *env, jclass cls, jint op, jlong __jlongpointer dd1, jlong __jlongpointer dd2)
|
|
{
|
|
return ptr_to_jlong(DD_Apply(ddman, op, jlong_to_DdNode(dd1), jlong_to_DdNode(dd2)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1MonadicApply(JNIEnv *env, jclass cls, jint op, jlong __jlongpointer dd)
|
|
{
|
|
return ptr_to_jlong(DD_MonadicApply(ddman, op, jlong_to_DdNode(dd)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Restrict(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer cube)
|
|
{
|
|
return ptr_to_jlong(DD_Restrict(ddman, jlong_to_DdNode(dd), jlong_to_DdNode(cube)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1ITE(JNIEnv *env, jclass cls, jlong __jlongpointer dd1, jlong __jlongpointer dd2, jlong __jlongpointer dd3)
|
|
{
|
|
return ptr_to_jlong(DD_ITE(ddman, jlong_to_DdNode(dd1), jlong_to_DdNode(dd2), jlong_to_DdNode(dd3)));
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd_vars
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1PermuteVariables(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer old_vars, jlong __jlongpointer new_vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_PermuteVariables(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(old_vars), jlong_to_DdNode_array(new_vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1SwapVariables(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer old_vars, jlong __jlongpointer new_vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_SwapVariables(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(old_vars), jlong_to_DdNode_array(new_vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1VariablesGreaterThan(JNIEnv *env, jclass cls, jlong __jlongpointer x_vars, jlong __jlongpointer y_vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_VariablesGreaterThan(ddman, jlong_to_DdNode_array(x_vars), jlong_to_DdNode_array(y_vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1VariablesGreaterThanEquals(JNIEnv *env, jclass cls, jlong __jlongpointer x_vars, jlong __jlongpointer y_vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_VariablesGreaterThanEquals(ddman, jlong_to_DdNode_array(x_vars), jlong_to_DdNode_array(y_vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1VariablesLessThan(JNIEnv *env, jclass cls, jlong __jlongpointer x_vars, jlong __jlongpointer y_vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_VariablesLessThan(ddman, jlong_to_DdNode_array(x_vars), jlong_to_DdNode_array(y_vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1VariablesLessThanEquals(JNIEnv *env, jclass cls, jlong __jlongpointer x_vars, jlong __jlongpointer y_vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_VariablesLessThanEquals(ddman, jlong_to_DdNode_array(x_vars), jlong_to_DdNode_array(y_vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1VariablesEquals(JNIEnv *env, jclass cls, jlong __jlongpointer x_vars, jlong __jlongpointer y_vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_VariablesEquals(ddman, jlong_to_DdNode_array(x_vars), jlong_to_DdNode_array(y_vars), num_vars));
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd_abstr
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1ThereExists(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_ThereExists(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1ForAll(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_ForAll(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1SumAbstract(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_SumAbstract(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1ProductAbstract(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_ProductAbstract(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1MinAbstract(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_MinAbstract(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1MaxAbstract(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_MaxAbstract(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars));
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd_term
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1GreaterThan(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jdouble threshold)
|
|
{
|
|
return ptr_to_jlong(DD_GreaterThan(ddman, jlong_to_DdNode(dd), threshold));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1GreaterThanEquals(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jdouble threshold)
|
|
{
|
|
return ptr_to_jlong(DD_GreaterThanEquals(ddman, jlong_to_DdNode(dd), threshold));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1LessThan(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jdouble threshold)
|
|
{
|
|
return ptr_to_jlong(DD_LessThan(ddman, jlong_to_DdNode(dd), threshold));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1LessThanEquals(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jdouble threshold)
|
|
{
|
|
return ptr_to_jlong(DD_LessThanEquals(ddman, jlong_to_DdNode(dd), threshold));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Equals(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jdouble value)
|
|
{
|
|
return ptr_to_jlong(DD_Equals(ddman, jlong_to_DdNode(dd), value));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Interval(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jdouble lower, jdouble upper)
|
|
{
|
|
return ptr_to_jlong(DD_Interval(ddman, jlong_to_DdNode(dd), lower, upper));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1RoundOff(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jint places)
|
|
{
|
|
return ptr_to_jlong(DD_RoundOff(ddman, jlong_to_DdNode(dd), places));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_jdd_JDD_DD_1EqualSupNorm(JNIEnv *env, jclass cls, jlong __jlongpointer dd1, jlong __jlongpointer dd2, jdouble epsilon)
|
|
{
|
|
return DD_EqualSupNorm(ddman, jlong_to_DdNode(dd1), jlong_to_DdNode(dd2), epsilon);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jdouble JNICALL Java_jdd_JDD_DD_1FindMin(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return DD_FindMin(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jdouble JNICALL Java_jdd_JDD_DD_1FindMax(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return DD_FindMax(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1RestrictToFirst(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_RestrictToFirst(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars));
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd_info
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT jint JNICALL Java_jdd_JDD_DD_1GetNumNodes(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return DD_GetNumNodes(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_jdd_JDD_DD_1GetNumTerminals(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return DD_GetNumTerminals(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jdouble JNICALL Java_jdd_JDD_DD_1GetNumMinterms(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jint num_vars)
|
|
{
|
|
return DD_GetNumMinterms(ddman, jlong_to_DdNode(dd), num_vars);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jdouble JNICALL Java_jdd_JDD_DD_1GetNumPaths(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return DD_GetNumPaths(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintInfo(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jint num_vars)
|
|
{
|
|
DD_PrintInfo(ddman, jlong_to_DdNode(dd), num_vars);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintInfoBrief(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jint num_vars)
|
|
{
|
|
DD_PrintInfoBrief(ddman, jlong_to_DdNode(dd), num_vars);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintSupport(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
DD_PrintSupport(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintSupportNames(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jobject var_names)
|
|
{
|
|
// If no var names passed in, don't use them
|
|
if (!var_names) {
|
|
DD_PrintSupport(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
// Otherwise, need to convert Java array to C array first
|
|
else {
|
|
int i;
|
|
jint size;
|
|
jclass vn_cls;
|
|
jmethodID vn_mid;
|
|
const char **names;
|
|
jstring *names_jstrings;
|
|
// get size of vector of names
|
|
vn_cls = env->GetObjectClass(var_names);
|
|
vn_mid = env->GetMethodID(vn_cls, "size", "()I");
|
|
if (vn_mid == 0) {
|
|
return;
|
|
}
|
|
size = env->CallIntMethod(var_names,vn_mid);
|
|
// put names from vector into array
|
|
names = new const char*[size];
|
|
names_jstrings = new jstring[size];
|
|
vn_mid = env->GetMethodID(vn_cls, "get", "(I)Ljava/lang/Object;");
|
|
if (vn_mid == 0) {
|
|
return;
|
|
}
|
|
for (i = 0; i < size; i++) {
|
|
names_jstrings[i] = (jstring)env->CallObjectMethod(var_names, vn_mid, i);
|
|
names[i] = env->GetStringUTFChars(names_jstrings[i], 0);
|
|
}
|
|
// call the function
|
|
DD_PrintSupportNames(ddman, jlong_to_DdNode(dd), (char **)names);
|
|
// release memory
|
|
for (i = 0; i < size; i++) {
|
|
env->ReleaseStringUTFChars(names_jstrings[i], names[i]);
|
|
}
|
|
delete[] names;
|
|
delete[] names_jstrings;
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_jdd_JDD_DD_1GetSupport(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return ptr_to_jlong(DD_GetSupport(ddman, jlong_to_DdNode(dd)));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintTerminals(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
DD_PrintTerminals(ddman, jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintTerminalsAndNumbers(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jint num_vars)
|
|
{
|
|
DD_PrintTerminalsAndNumbers(ddman, jlong_to_DdNode(dd), num_vars);
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd_matrix
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1SetVectorElement(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars, jlong index, jdouble value)
|
|
{
|
|
return ptr_to_jlong(DD_SetVectorElement(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars, index, value));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1SetMatrixElement(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer rvars, jint num_rvars, jlong __jlongpointer cvars, jint num_cvars, jlong rindex, jlong cindex, jdouble value)
|
|
{
|
|
return ptr_to_jlong(DD_SetMatrixElement(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(rvars), num_rvars, jlong_to_DdNode_array(cvars), num_cvars, rindex, cindex, value));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Set3DMatrixElement(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer rvars, jint num_rvars, jlong __jlongpointer cvars, jint num_cvars, jlong __jlongpointer lvars, jint num_lvars, jlong rindex, jlong cindex, jlong lindex, jdouble value)
|
|
{
|
|
return ptr_to_jlong(DD_Set3DMatrixElement(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(rvars), num_rvars, jlong_to_DdNode_array(cvars), num_cvars, jlong_to_DdNode_array(lvars), num_lvars, rindex, cindex, lindex, value));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jdouble JNICALL Java_jdd_JDD_DD_1GetVectorElement(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars, jlong index)
|
|
{
|
|
return DD_GetVectorElement(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars, index);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Identity(JNIEnv *env, jclass cls, jlong __jlongpointer rvars, jlong __jlongpointer cvars, jint num_vars)
|
|
{
|
|
return ptr_to_jlong(DD_Identity(ddman, jlong_to_DdNode_array(rvars), jlong_to_DdNode_array(cvars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1Transpose(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer rvars, jlong __jlongpointer cvars, jint num_vars, jint lvars, jint num_lvars)
|
|
{
|
|
return ptr_to_jlong(DD_Transpose(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(rvars), jlong_to_DdNode_array(cvars), num_vars));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDD_DD_1MatrixMultiply(JNIEnv *env, jclass cls, jlong __jlongpointer dd1, jlong __jlongpointer dd2, jlong __jlongpointer vars, jint num_vars, jint method)
|
|
{
|
|
return ptr_to_jlong(DD_MatrixMultiply(ddman, jlong_to_DdNode(dd1), jlong_to_DdNode(dd2), jlong_to_DdNode_array(vars), num_vars, method));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintVector(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer vars, jint num_vars, jint acc)
|
|
{
|
|
DD_PrintVector(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(vars), num_vars, acc);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintMatrix(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer rvars, jint num_rvars, jlong __jlongpointer cvars, jint num_cvars, jint acc)
|
|
{
|
|
DD_PrintMatrix(ddman, jlong_to_DdNode(dd), jlong_to_DdNode_array(rvars), num_rvars, jlong_to_DdNode_array(cvars), num_cvars, acc);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1PrintVectorFiltered(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer filter, jlong __jlongpointer vars, jint num_vars, jint acc)
|
|
{
|
|
DD_PrintVectorFiltered(ddman, jlong_to_DdNode(dd), jlong_to_DdNode(filter), jlong_to_DdNode_array(vars), num_vars, acc);
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Wrapper functions for dd_export
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1ExportDDToDotFile(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jstring filename)
|
|
{
|
|
const char *str = env->GetStringUTFChars(filename, 0);
|
|
DD_ExportDDToDotFile(ddman, jlong_to_DdNode(dd), (char *)str);
|
|
env->ReleaseStringUTFChars(filename, str);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1ExportDDToDotFileLabelled(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jstring filename, jobject var_names)
|
|
{
|
|
int i;
|
|
jint size;
|
|
jclass vn_cls;
|
|
jmethodID vn_mid;
|
|
const char **names;
|
|
jstring *names_strings;
|
|
const char *filenamestr;
|
|
|
|
// get size of vector of names
|
|
vn_cls = env->GetObjectClass(var_names);
|
|
vn_mid = env->GetMethodID(vn_cls, "size", "()I");
|
|
if (vn_mid == 0) {
|
|
return;
|
|
}
|
|
size = env->CallIntMethod(var_names,vn_mid);
|
|
// put names from vector into array
|
|
names = new const char*[size];
|
|
names_strings = new jstring[size];
|
|
vn_mid = env->GetMethodID(vn_cls, "elementAt", "(I)Ljava/lang/Object;");
|
|
if (vn_mid == 0) {
|
|
return;
|
|
}
|
|
for (i = 0; i < size; i++) {
|
|
names_strings[i] = (jstring)env->CallObjectMethod(var_names, vn_mid, i);
|
|
names[i] = env->GetStringUTFChars(names_strings[i], 0);
|
|
}
|
|
|
|
// get filename string
|
|
filenamestr = env->GetStringUTFChars(filename, 0);
|
|
|
|
// call dd_export... function
|
|
DD_ExportDDToDotFileLabelled(ddman, jlong_to_DdNode(dd), (char *)filenamestr, (char **)names);
|
|
|
|
// release memory
|
|
for (i = 0; i < size; i++) {
|
|
env->ReleaseStringUTFChars(names_strings[i], names[i]);
|
|
}
|
|
env->ReleaseStringUTFChars(filename, filenamestr);
|
|
delete[] names;
|
|
delete[] names_strings;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1ExportMatrixToPPFile(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer rvars, jint num_rvars, jlong __jlongpointer cvars, jint num_cvars, jstring filename)
|
|
{
|
|
const char *str = env->GetStringUTFChars(filename, 0);
|
|
DD_ExportMatrixToPPFile(
|
|
ddman, jlong_to_DdNode(dd),
|
|
jlong_to_DdNode_array(rvars), num_rvars,
|
|
jlong_to_DdNode_array(cvars), num_cvars,
|
|
(char *)str
|
|
);
|
|
env->ReleaseStringUTFChars(filename, str);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1Export3dMatrixToPPFile(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer rvars, jint num_rvars, jlong __jlongpointer cvars, jint num_cvars, jlong __jlongpointer nvars, jint num_nvars, jstring filename)
|
|
{
|
|
const char *str = env->GetStringUTFChars(filename, 0);
|
|
DD_Export3dMatrixToPPFile(
|
|
ddman, jlong_to_DdNode(dd),
|
|
jlong_to_DdNode_array(rvars), num_rvars,
|
|
jlong_to_DdNode_array(cvars), num_cvars,
|
|
jlong_to_DdNode_array(nvars), num_nvars,
|
|
(char *)str
|
|
);
|
|
env->ReleaseStringUTFChars(filename, str);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1ExportMatrixToMatlabFile(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer rvars, jint num_rvars, jlong __jlongpointer cvars, jint num_cvars, jstring name, jstring filename)
|
|
{
|
|
const char *str1 = env->GetStringUTFChars(name, 0);
|
|
const char *str2 = env->GetStringUTFChars(filename, 0);
|
|
DD_ExportMatrixToMatlabFile(
|
|
ddman, jlong_to_DdNode(dd),
|
|
jlong_to_DdNode_array(rvars), num_rvars,
|
|
jlong_to_DdNode_array(cvars), num_cvars,
|
|
(char *)str1, (char *)str2
|
|
);
|
|
env->ReleaseStringUTFChars(name, str1);
|
|
env->ReleaseStringUTFChars(filename, str2);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDD_DD_1ExportMatrixToSpyFile(JNIEnv *env, jclass cls, jlong __jlongpointer dd, jlong __jlongpointer rvars, jint num_rvars, jlong __jlongpointer cvars, jint num_cvars, jint depth, jstring filename)
|
|
{
|
|
const char *str = env->GetStringUTFChars(filename, 0);
|
|
DD_ExportMatrixToSpyFile(
|
|
ddman, jlong_to_DdNode(dd),
|
|
jlong_to_DdNode_array(rvars), num_rvars,
|
|
jlong_to_DdNode_array(cvars), num_cvars,
|
|
depth, (char *)str
|
|
);
|
|
env->ReleaseStringUTFChars(filename, str);
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Functions for JDDNode class
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT jboolean JNICALL Java_jdd_JDDNode_DDN_1IsConstant(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return Cudd_IsConstant(jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_jdd_JDDNode_DDN_1GetIndex(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return (jlong_to_DdNode(dd))->index;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jdouble JNICALL Java_jdd_JDDNode_DDN_1GetValue(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return Cudd_V(jlong_to_DdNode(dd));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDDNode_DDN_1GetThen(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
DdNode *node = jlong_to_DdNode(dd);
|
|
if (Cudd_IsConstant(node)) return ptr_to_jlong(NULL);
|
|
return ptr_to_jlong(Cudd_T(node));
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDDNode_DDN_1GetElse(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
DdNode *node = jlong_to_DdNode(dd);
|
|
if (Cudd_IsConstant(node)) return ptr_to_jlong(NULL);
|
|
return ptr_to_jlong(Cudd_E(node));
|
|
}
|
|
|
|
//==============================================================================
|
|
//
|
|
// Functions for JDDVars class
|
|
//
|
|
//==============================================================================
|
|
|
|
JNIEXPORT jlong __jlongpointer JNICALL Java_jdd_JDDVars_DDV_1BuildArray(JNIEnv *env, jobject obj)
|
|
{
|
|
jclass cls;
|
|
jmethodID mid;
|
|
DdNode **arr;
|
|
int i, n;
|
|
|
|
cls = env->GetObjectClass(obj);
|
|
mid = env->GetMethodID(cls, "getNumVars", "()I");
|
|
if (mid == 0) {
|
|
return 0;
|
|
}
|
|
n = env->CallIntMethod(obj, mid);
|
|
arr = new DdNode*[n];
|
|
mid = env->GetMethodID(cls, "getVarPtr", "(I)J");
|
|
if (mid == 0) {
|
|
delete[] arr;
|
|
return 0;
|
|
}
|
|
for (i = 0; i < n; i++) {
|
|
arr[i] = jlong_to_DdNode(env->CallLongMethod(obj, mid, i));
|
|
}
|
|
|
|
return ptr_to_jlong(arr);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_jdd_JDDVars_DDV_1FreeArray(JNIEnv *env, jobject obj, jlong __jlongpointer arr)
|
|
{
|
|
delete[] jlong_to_DdNode_array(arr);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_jdd_JDDVars_DDV_1GetIndex(JNIEnv *env, jobject obj, jlong __jlongpointer dd)
|
|
{
|
|
return (jlong_to_DdNode(dd))->index;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jint JNICALL Java_jdd_DebugJDD_DebugJDD_1GetRefCount(JNIEnv *env, jclass cls, jlong __jlongpointer dd)
|
|
{
|
|
return (jlong_to_DdNode(dd))->ref;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jlongArray JNICALL Java_jdd_DebugJDD_DebugJDD_1GetExternalRefCounts(JNIEnv *env, jclass cls)
|
|
{
|
|
// get external reference counts and return as a long[] Java array
|
|
// the entries of the array will be alternating ptr / count values
|
|
std::map<DdNode*, int> external_refs;
|
|
DD_GetExternalRefCounts(ddman, external_refs);
|
|
std::size_t v_size = 2 * external_refs.size();
|
|
|
|
jlong* v = new jlong[v_size];
|
|
std::size_t i = 0;
|
|
for (std::map<DdNode*,int>::iterator it = external_refs.begin();
|
|
it != external_refs.end();
|
|
++it) {
|
|
DdNode *node = it->first;
|
|
int refs = it->second;
|
|
|
|
v[i++] = ptr_to_jlong(node);
|
|
v[i++] = refs;
|
|
}
|
|
|
|
// printf("v_size = %lu\n", v_size);
|
|
jlongArray result = env->NewLongArray(v_size);
|
|
env->SetLongArrayRegion(result, 0, v_size, v);
|
|
delete[] v;
|
|
|
|
return result;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
JNIEXPORT jboolean JNICALL Java_jdd_JDD_DD_1GetErrorFlag(JNIEnv *env, jclass cls)
|
|
{
|
|
return DD_GetErrorFlag(ddman);
|
|
}
|