Complete history (most recent first)
New since last release
Interface Changes
Implementation
New in Version 0.17.6 (released 11 Nov 2024)
Overview
Most changes this release are to clean up the compute table interface and the operation interfaces, to make it easier to implement operations.
Interface Changes
-
Added new object,
rangeval
, for generic items returned by functions. -
The
unary_operation
andbinary_operation
interfaces are changing; the old interface is still supported for now. The main differences are new virtual compute() methods that are “low level” for speed but also generic to minimize the number of overloaded compute() methods. See filesoper_binary.h
andoper_unary.h
for details. -
The
compute_table
class now maintains a list of all compute tables, mainly for garbage collection purposes. -
operation::showAllComputeTables
is nowcompute_table::showAll
-
An
operation
object may now be deleted directly, instead of usingoperation::destroy()
. -
Added new object,
ct_itemtype
, for type-checking compute table entries. -
Existing object,
ct_entry_type
, is now based on vectors ofct_itemtype
objects. -
The registry of compute table entry types has been moved to class
ct_entry_type
. -
The monolithic compute table has been moved from class
operation
to classcompute_table
. -
New method
forest::isSingletonNode
replaces oldforest::getSingletonIndex
andforest::getSingletonDown
methods. -
New methods
forest::makeRedundantsTo
andforest::makeIdentitiesTo
should be used when converting between reduction types (typically in operations). -
New method
forest::redirectSingleton
should be used to eliminate illegal edges to singleton nodes in identity reduced forests (works for all reduction types).
Implementation
-
New unified compute table implementation in file
ct_styles.cc
, based on templates. -
Added possibility for huge (more than 4 billion entries) compute tables. This is a compute table setting, with a default of non-huge tables to save memory.
-
Node reduction (in class
forest
) is now a local operation; helper virtual methods (normalize
,isIdentityEdge
, etc) have been removed. -
Boolean (MDD or MXD) Intersection, Union, Difference, and Complement operations have been rewritten using the new compute table and operation interfaces.
-
Copy operations have been rewritten using the new compute table and operation interfaces.
-
Comparison operations have been collected into a single source file (operations/compare.cc) and rewritten using the new interfaces
New in Version 0.17.5 (released 05 Apr 2024)
Changes to variables
Variable names are now std::string
objects instead
of char *
.
For an un-named variable, use an empty string.
Changes to operations
Builtin operations are now functions with arguments.
-
For unary operations, the arguments are the forest to pull the input argument from, and either the forest for the output result, or the type of output result.
-
For binary operations, the arguments are the forests for the input arguments and output result.
-
For ternary operations (for example, constrained saturation), the arguments are the forests for the input arguments and output result.
-
For numerical operations, the arguments are whatever was passed previously to build the specialized operation, but without the
argument
class hierarchy. -
For saturation operations, the arguments are the initial states forest, the relation, and the result forest.
Deprecated methods
Uncomment ALLOW_DEPRECATED_0_17_5
in defines.h
to use these deprecated methods:
-
destroyOperation
: useoperation::destroy
instead -
getOperation
: the builtin operation can be used as a function in the same way. For example, instead ofgetOperation(UNION, a, b, c)
, useUNION(a, b, c)
, wherea
andb
are the forests for the operands, andc
is the forest for the result.
Renamed classes
-
satpregen_opname::pregen_relation
is nowpregen_relation
satotf_opname::subevent
is nowotf_subevent
satotf_opname::event
is nowotf_event
-
satotf_opname::relation
is nowotf_relation
-
satimpl_opname::implicit_relation
is nowimplicit_relation
-
satimpl_opname::implicit_relation
is nowimplicit_relation
sathyb_opname::subevent
is nowhybrid_subevent
sathyb_opname::event
is nowhybrid_event
sathyb_opname::hybrid_relation
is nowhybrid_relation
Removed classes
-
The entire
opname
class hierarchy is now deprecated, and has been removed. -
Class
specialized_operation
is no longer needed, and has been removed.
New in Version 0.17.4 (released 19 Dec 2023)
Updates to unpacked nodes
The unpacked_node
interface has been updated.
For efficiency, an unpacked node is now permanently attached to
one forest, and there is a free list of unpacked nodes for each forest.
Also, the interface has been updated to increase readability.
Updates to forests
-
All methods have been moved from
expert_forest
class toforest
class. -
All instances of
expert_forest
have been replaced byforest
.
Deprecated methods
Uncomment ALLOW_DEPRECATED_0_17_4
in defines.h
to use these deprecated methods.
This is intended to help developers migrate to the new interface.
Deprecated methods appear at the bottom of forest.h
and unpacked.h
.
New in Version 0.17.3 (released 03 Dec 2023)
Interface Changes
Uncomment ALLOW_DEPRECATED_0_17_3
in defines.h
to use these deprecated methods.
This is intended to help developers migrate to the new interface.
-
Moved
node_headers
inner classes toarrays.h
-
Created
node_marker
object, for mark and sweep (or just various mark applications). -
Created
dot_maker
object inio_dot.h
, for creating dot files from MDDs. -
Methods
expert_forest::writeNodeGraphPicture
anddd_edge::writePicture
are now deprecated; use objectdot_maker
instead. -
Created
mdd_writer
andmdd_reader
objects inio_mdds.h
, for reading and writing MDDs in an exchange format. -
Methods
forest::writeEdges
andforest::readEdges
are now deprecated; use objectsmdd_writer
andmdd_reader
instead. -
Removed several inlined forest methods related to policy decisions (reordering policiy, how to store nodes) as these can be obtained almost as easily using
forest::getPolicy().someOtherInlinedMethod()
. -
Removed method
forest::useDomain()
, useforest::getDomain()
(now overloaded) instead. -
Moved reporting flags (
HUMAN_READABLE_MEMORY
,BASIC_STATS
,EXTRA_STATS
,FOREST_STATS
,STORAGE_STATS
,STORAGE_DETAILED
,UNIQUE_TABLE_STATS
,UNIQUE_TABLE_DETAILED
,HOLE_MANAGER_STATS
,HOLE_MANAGER_DETAILED
) out ofexpert_forest
and intopolicies.h
. -
Moved display flags (
SHOW_TERMINALS
,SHOW_INDEX
,SHOW_DETAILS
,SHOW_UNREACHABLE
,SHOW_DELETED
) out ofexpert_forest
and intopolicies.h
. -
Moved several methods and members from
expert_forest
toforest
.
Implementation
Slightly faster node marking implementation.
New in Version 0.17.2 (released 11 Nov 2023)
New objects
-
edge_value
: object for generic edge values. -
terminal
: object for terminal nodes.
Interface changes
Uncomment ALLOW_DEPRECATED_0_17_2
in defines.h
to use deprecated methods.
This is intended to help developers migrate to the new interface.
-
Mostly I/O related, but overall the interface will gradually replace overloaded methods for specific edge value types, with a single method using the generic edge value object. Similar for terminal nodes.
-
Source files
encoders.h
andencoders.cc
were removed, as this functionality is now captured by the newedge_value
andterminal
objects. -
The
expert_domain
class has been merged intodomain
. -
Removed
domain::getExpertVar()
; usedomain::getVar()
instead. -
Methods
domain::createForest()
should be replaced withforest::create()
.
Implementation
Note that the exchange format for reading/writing DDs has changed. Files written with earlier versions of the library will not be readable.
New in Version 0.17.1 (released 11 Sep 2023)
Interface Changes
Most changes are simplifications and reorganization of class dd_edge
.
Some method changes:
-
Use method
attach()
in place ofsetForest()
. -
For method
writePicture()
, using an extension ofdot
will produce a dot file, without running any of the Graphviz utilities. -
Method
show()
does not take the verbosity level parameter any more. To display the graph, use new methodshowGraph()
. -
Method
getCardinality()
has been removed (use apply(CARDINALITY…) instead). -
Operators are still supported, but the interface and implementation have been moved to operators.h/.cc.
New in Version 0.17.0 (released 13 May 2023)
Interface Changes
This release mainly changes the file layout.
Header file meddly.h
is now an umbrella header,
and implementation is further divided out into
header and implementation files.
Mostly the interface itself is unchanged, with a few exceptions.
-
Header file
meddly_expert.h
has been eliminated. -
Necessary header files will be installed under
(prefix)/include/meddly
, instead of(prefix)/include
. -
Class
expert_variable
has been merged into classvariable
. It is anticipated that other simple and expert versions of classes will be merged in future releases. -
Operation names (COMPLEMENT, CARDINALITY, etc.) have changed type; they are now functions of no parameters, that return an operation name.
-
Several enums, structs, and classes that were within other classes, have become stand-alone (top-level) enum classes, structs, or classes.
Type changes
Old type | New type |
---|---|
struct MEDDLY::forest::policies | struct MEDDLY::policies |
enum MEDDLY::forest::policies::reduction_rule | enum class MEDDLY::reduction_rule |
enum MEDDLY::forest::range_type | enum class MEDDLY::range_type |
enum MEDDLY::forest::edge_labeling | enum class MEDDLY::edge_labeling |
class MEDDLY::expert_forest::bool_Tencoder | class MEDDLY::bool_Tencoder |
class MEDDLY::expert_forest::int_Tencoder | class MEDDLY::int_Tencoder |
class MEDDLY::expert_forest::float_Tencoder | class MEDDLY::float_Tencoder |
class MEDDLY::expert_forest::EVencoder | class MEDDLY::EVencoder |
enum MEDDLY::unpacked_node::storage_style | MEDDLY::node_storage_flags |
struct MEDDLY::ct_initializer::settings | struct MEDDLY::ct_settings |
enum MEDDLY::compute_table::typeID | enum class MEDDLY::ct_typeID |
union MEDDLY::compute_table::entry_item | union MEDDLY::ct_entry_item |
class MEDDLY::compute_table::entry_type | class MEDDLY::ct_entry_type |
class MEDDLY::compute_table::entry_key | class MEDDLY::ct_entrry_key |
class MEDDLY::compute_table::entry_result | class MEDDLY::ct_entry_result |
Enum item changes
Old item | New item |
---|---|
MEDDLY::forest::policies::PESSIMISTIC_DELETION | MEDDLY::policies::node_deletion::PESSIMISTIC |
MEDDLY::forest::policies::OPTIMISTIC_DELETION | MEDDLY::policies::node_deletion::OPTIMISTIC |
MEDDLY::forest::policies::NEVER_DELETE | MEDDLY::policies::node_deletion::NEVER |
MEDDLY::forest::BOOLEAN | MEDDLY::range_type::BOOLEAN |
MEDDLY::forest::INTEGER | MEDDLY::range_type::INTEGER |
MEDDLY::forest::REAL | MEDDLY::range_type::REAL |
MEDDLY::forest::MULTI_TERMINAL | MEDDLY::edge_labeling::MULTI_TERMINAL |
MEDDLY::forest::EVPLUS | MEDDLY::edge_labeling::EVPLUS |
MEDDLY::forest::EVTIMES | MEDDLY::edge_labeling::EVTIMES |
MEDDLY::forest::INDEX_SET | MEDDLY::edge_labeling::INDEX_SET |
Method changes
Old call | New call |
---|---|
node_storage::moveNodeOffset(node, old, new) | node_storage::getParent()->moveNodeOffset(node, old, new) |
unpacked_node::useUnpackedNode() | unpacked_node::New() |
unpacked_node::newFromNode(f, nh, howstored) | expert_forest::newUnpacked(nh, howstored) |
unpacked->initFromNode(f, nh, howstored) | f->unpackNode(unpacked, nh, howstored) |
howstored should be: | FULL_ONLY (previously true) |
SPARSE_ONLY (previously false) | |
FULL_OR_SPARSE |
New in Version 0.16.0 (released 28 Mar 2023)
This release is primarily for bug fixes and to get a stable release out before a number of significant interface changes planned for this summer.
Simple Interface Changes
- Under forest policies, you can now decide (at runtime) to use
reference counts or mark and sweep for garbage collection.
The current default is to use reference counts.
Set
useReferenceCounts
to false to instead use mark and sweep.
Expert Interface Changes
- More compact (and dynamic) node header implementation.
Implementation
- Some bug fixes.
New in Version 0.15.1 (released 09 Jul 2019)
Simple Interface Changes
- For forests with range of
INTEGER
, function values are nowlong
instead ofint
. The interface has been updated appropriately (methodscreateEdge
,createEdgeForVar
, andevaluate
).
Expert Interface Changes
The compute table interface has changed significantly. This will affect anyone who implements their own operations. Essentially, the compute table is now much more aware of the contents of each compute table entry (in terms of the types of items in an entry). The long term goals of this change include simplification (and better flexibility flexibility) of operation code and eventually to allow for efficient compression of compute table entries.
-
Class
compute_table::search_key
has been renamedcompute_table::entry_key
, and is now concrete. -
Class
compute_table::search_result
has been renamedcompute_table::entry_result
, and is now concrete. -
Class
compute_table::entry_builder
has been removed. A compute table entry is now added by giving the key portion and the result portion. -
New class,
compute_table::entry_type
with type information for compute table entries. - The list of recycled
entry_keys
is now maintained in classcompute_table
. When implementing an operation, old code:compute_table::entry_key* CTsrch = useCTkey(); CTsrch->reset(); // ... doneCTkey(CTsrch);
should be replaced with:
compute_table::entry_key* CTsrch = CT->useEntryKey(this); // ... CT->recycle(CTsrch);
-
Instead of returning the result, the
compute_table::find
method now expects the result to be passed as an argument and will be filled in. Operations now pre-allocate results for this purpose (only one result is needed per entry type). - Removed
OperationMap
as a compute table option.
Implementation
- Streamlined compute table implemenation using templates.
New in Version 0.15.0 (released 22 May 2018)
We have changed the release numbering system, because the repository has moved to git and the old version numbering system was based on the Subversion revision number.
Simple Interface Changes
- New (experimental) method,
dd_edge::writePicture
, generates a visualization of the decision diagram. You must have Graphviz installed for this to work.
Expert Interface Changes
- Various improvements and extensions to Saturation implementation.
Implementation Changes
- Moved
node_headers
out ofexpert_forest
. - Node header now includes incoming count.
- Separated memory management out of node storage, into its own style that can be set at runtime.
- Error class now tracks filename and line number of source code that threw the error.
- Updated garbage collection of compute table entries. Compute table entry status is now one of: dead, recoverable, active.
- Support for extensible variables:
- To enable, give the variable a negative bound
- Can mix extensible and non-extensible variables in the same domain
- Supported in multi-terminal forests for sets and relations
- Compatible with Apply operations and saturation
New in Version 0.14.818 (released 05 Jul 2017)
Simple Interface Changes
- Class
node_storage
factory portion split into new class,node_storage_style
. Interface updated. - Forest policies must be constructed after library initialization,
because node storage styles will not be known before this.
A new empty constructor, and method
useDefaults
, have been added to classforest::policies
to allow this. - Changed error code
OVERFLOW
toVALUE_OVERFLOW
to avoid name issues with math macro.
Expert Interface Changes
- Default policies for MDD and MXD forests moved from
class
settings
to classforest
as static members. This allows the defaults to be changed after library initialization. - Initialization sequence has been removed from class
settings
, and is instead passed to the MEDDLY initialization function explicitly. - Class
op_initializer
has been converted into a generic library initialization class,initializer_list
. - Class
cleanup_procedure
has been removed; useinitializer_list
instead. - Compute table initialization is now handled by an initializer,
class
ct_initializer
. The compute table settings have been moved from classsettings
, and into this new class. To change the default compute table settings, you should- Build and save the default initializer list,
using
defaultInitializerList()
. - Change the compute table settings, using static methods of class
ct_initializer
. - Initialize the library, using the initializer list that was saved in step 1.
- Build and save the default initializer list,
using
- The old class
settings
has been removed, since it has become empty.
Implementation Changes
- Node storage styles are now set up using an
initializer_list
.
New in Version 0.13.685 (released 15 Jun 2016)
Simple Interface Changes
- New abstract interfaces for I/O (classes
input
andoutput
) for all library I/O (except for internal debugging I/O). Use classesFILE_input
andFILE_output
for C-styleFILE*
I/O, and classesistream_input
andostream_output
for C++-styleiostream
I/O.meddly.h
now includes bothcstdio
andiostream
. These can be disabled if necessary by defining_MEDDLY_WITHOUT_CSTDIO_
or_MEDDLY_WITHOUT_IOSTREAM_
, respectively, before includingmeddly.h
.
Expert Interface Changes
- Class
node_reader
is now classunpacked_node
, and methods to initialize a node reader have been moved into theunpacked_node
class. - Class
node_builder
has been eliminated; all functionality has been moved to classunpacked_node
. - Class
node_header
is now a private inner class for classexpert_forest
; all access to node header information should be through getter and setter helper functions. - Prototype implementation of saturation on partitioned transition relations.
See operation
SATURATION_FORWARD
and classsatpregen_opname
. - Prototype implementation of on-the-fly saturation.
See operation
SATURATION_OTF_FORWARD
and classsatotf_opname
.
Implementation Changes
- Fixed several bugs with node reference counts.
New in Version 0.12.625 (released 25 Apr 2015)
Simple Interface Changes
- More careful and more strict use of
set
methods in classdd_edge
: for multi-terminal forests, useset
with a single argument; for edge-valued forsts, use the appropriate two-argument version ofset
. - Added new edge labeling possiblity,
INDEX_SET
. From now on, this should be used instead ofEVPLUS
whenever an indexed set is constructed with operationCONVERT_TO_INDEX_SET
, otherwise the library will throw an exception. - Added operations
VM_MULTIPLY
,MV_MULTIPLY
andMM_MULTIPLY
for MTMxDs. - Changed design of the
enumerator
class. Regular enumerators can be initialized as usual (constructor with add_edge
). Otherwise, use a constructor (or initialize later) by passing the enumeration type and forest. Note that now, the forest for an enumerator is fixed for its life. - Added support for EV*MxDs.
- Added mechanism to log forest changes to a file,
to be utilized by other utilities (see class
logger
within classforest
). - Cleaned up the header file.
Expert Interface Changes
- Added classes
int_EVencoder
andfloat_EVencoder
for a centralized mechanism for storing edge values within nodes. - Classes
bool_encoder
,int_encoder
, andfloat_encoder
have been renamedbool_Tencoder
,int_Tencoder
, andfloat_Tencoder
for consistency. - Vector-matrix and matrix-vector multiply can now use
INDEX_SET
orEVPLUS
forests. Currently, it is better to useINDEX_SET
forests if possible. - Changed names
VECT_MATR_MULT
andMATR_VECT_MULT
, toEXPLVECT_MATR_MULT
andMATR_EXPLVECT_MULT
, to emphasize that vectors are stored explicitly. - Completely re-designed the compute table interface. Large impact on implementation of operations; little to no impact on everything else. The new interface completely hides the compute table storage mechanism, so we will be able to plug in different storage schemes without changing any operation code (at least, in theory). Part of the gradual shift toward 64-bit node handles.
- Class
numerical_operation
is removed and should be replaced byspecialized_operation
. - Added a
specialized_operation
for saturation, which allows the use of partitioned transition relations with options for organizing and combining them. See classsatpregen_opname
, andSATURATION_FORWARD
. - Cleaned up the header file.
Implementation Changes
- New implementation of
COPY
. It should now be possible to copy between almost any two forests over the same domain (assuming they are either both for sets, or both for relations). - Added test applications for
COPY
, and EV*MxDs.
New in Version 0.11.486 (released 04 Feb 2014)
Simple Interface Changes
- Added
const
to array of terminal values, in parameter tocreateEdgeForVar
methods. This should have minimal, if any, impact on applications. - Added constants
DONT_CARE
andDONT_CHANGE
, which should be used instead of raw values, for calls tocreateEdge()
methods. In particular,DONT_CHANGE
should NOT be used for unprimed levels.
Expert Interface Changes
The mechanism for encoding and decoding terminal nodes
(for multi-terminal forests) has been changed.
The following methods of expert_forest
were removed:
getBoolean()
getInteger()
getReal()
getTerminalNode()
isValidTerminalValue()
Terminal encoding is now handled by classes bool_encoder
,
int_encoder
, and float_encoder
inside expert_forest
, allowing the use of templates if desired.
The following methods have been added for convenience:
handleForValue()
getValueFromHandle()
getBooleanFromHandle()
getIntegerFromHandle()
getRealFromHandle()
Implementation Changes
- Reorganized (and reimplemented) mutli-terminal hierarchy
- A few bug fixes
New in Version 0.10.456 (released 30 Jul 2013)
- Added
typedefs
for node handles and addresses, updated the interface and code to use these. - Switched to one pool of nodes per forest, instead of one pool per level.
- Changed free list representation for node handles.
- The node storage mechanism is now loosely coupled, and may be selected at runtime.
- The node memory recycling mechanism is now loosely coupled. There are a few mechanisms to choose from.
- Added a new node storage mechanism that uses compression.
- Added ability to read and write DDs to a file.
Simple Interface Changes
- The forest policy for specifying full vs sparse node storage has changed.
Now, this is specified via
storage_flags
by combining flagsALLOW_FULL_STORAGE
andALLOW_SPARSE_STORAGE
as appropriate. - The node storage scheme may be changed on a per forest basis,
at runtime, by setting the forest
policy
as appropriate (membernodestor
). - Removed forest policy
recycleNodeStorageHoles
, since the new policynodestor
allows to specify how nodes are stored and how holes are tracked (if at all). - In the
forest
class, added methodswriteEdges
, to write one or more edges (and all nodes below) to a file in a machine readable formatreadEdges
, to read one or more edges (and all nodes below) from a file
Expert Interface Changes
- The node storage interface has changed. This is likely to affect forest implementations, and not much else.
- Different node storage schemes are implemented in the
storage
subdirectory. Motivated users may invent and use their own schemes. - In the
expert_forest
class, methodreportMemoryUsage
has been replaced by methodreportStats
. expert_forest::markNodesInSubgraph
andexpert_forest::showNodeGraph
now take an array of root nodes, instead of a single one.
New in Version 0.9.397 (released 26 Jul 2012)
- New unique table.
- New iterator implementation for
dd_edge
class. - Using fine-grained identity reduction rules.
- Lots of code reorganization and cleanup.
Simple Interface Changes
- Iterators have been replaced with enumerators.
The old code segment
for (dd_edge::const_iterator i = e.begin(); i; ++i)
should be replaced by
for (enumerator i(e); i; ++i)
and most other
iterator
functionality has been included in theenumerator
class. -
Removed
findFirstElement
methods, the same behavior can be obtained with enumerators. - Removed
createSubmatrix
methods, the same behavior can be obtained with the cross product and intersection operators.
Expert Interface Changes
-
Added
node_builder
subclass, updated operations to use it. This is the mechanism to use for building new nodes. -
Added
node_reader
subclass, updated operations to use it. This is the mechanism to use for reading nodes in a forest. -
Removed most of the old interface for accessing nodes.
-
Removed temporary edges.
New in Version 0.8.311 (released 18 Jun 2012)
- Improved documentation generation (automatically updates library version number).
- Added complete technical documentation under a new
docs-devel
directory. - Reorganized forest class hierarchy, in directory
src/forests
. - More thorough library cleanup in
MEDDLY::cleanup()
. - New version of
MULTIPLY
identifies more terminal cases.
Interface Changes
- Policy settings for a forest are now specified when the forest
is constructed.
The old code segment
forest *f = d->createForest(false, forest::BOOLEAN, forest::MULTI_TERMINAL); f->setReductionRule(forest::FULLY_REDUCED); f->setNodeStorage(forest::FULL_OR_SPARSE_STORAGE); f->setNodeDeletion(forest::PESSIMISTIC_DELETION);
can be replaced by
forest::policies fp(false); // false: not a relation fp.setFullyReduced(); fp.setCompactStorage(); fp.setPessimistic(); forest *f = d->createForest(false, forest::BOOLEAN, forest::MULTI_TERMINAL, fp);
The default settings for the
forest::policies
struct may be found by examining the header filemeddly.h
, and of course it is only necessary to specify a desired policy that differs from its default. Alternatively, a forest may be created usingforest *f = d->createForest(false, forest::BOOLEAN, forest::MULTI_TERMINAL);
which will use the library-wide default policies, based on whether the new forest is a relation or not. The library-wide defaults, if not specified, will be equal to the default
forest::policies
initialization; otherwise, they may be changed by adjustingmddDefaults
andmxdDefaults
inMEDDLY::settings
(in the expert interface) before the library is initialized. -
In class
domain
, old methodsgetVar
andreadVar
are changed touseVar
andgetVar
, for consistency. - Added a better statistics mechanism for forests.
The old interface is stil present, for compatability.
More information may be obtained using
forest::getStats()
.
New in Version 0.7.254 (released 15 Jul 2011)
- No changes to the simple interface.
- The compute table class is now visible in the expert interface. This should allow operations to be defined outside the library and still use the built-in compute tables.
- The compute table mechanism has been redesigned and reimplemented. The compute table interface has changed significantly; this will affect anyone who implements their own operations.
- Different compute tables may be selected at library initialization time.
- Some of the globally visible functions and macros have been renamed or moved into the MEDDLY namespace to avoid conflicts.
- Several example applications run faster now. This resolves the known issue under version 0.6.233.
New in Version 0.6.233 (released 05 Jul 2011)
Changes to the simple interface
- The compute manager class has been removed;
all its functionality has been moved to
the
MEDDLY
namespace. For example, the old code segmentcompute_manager* CM = getComputeManager(); CM->apply(compute_manager::UNION, x, y, z);
can be replaced by
apply(UNION, x, y, z);
- The types of the operation codes (e.g.,
UNION
) have changed. Most applications should not be affected by this; however, the change is visible to the simple interface. - A call to
MEDDLY::cleanup()
will automatically destroy any remaining domains, forests, or other objects created by MEDDLY. (This known issue listed under version 0.5 seems to be resolved.) - A few operation names have changed:
old
MIN
is nowMINIMUM
and oldMAX
is nowMAXIMUM
.
Changes to the expert interface
- Operation codes are now classes instead of an enumerated type. Each operation knows its own name and how to build an operation for specified forests (more on that, below).
- The old operation and op_info classes have been merged together into a new operation class. Each instance of operation is tied to specific forests.
- There are operation subclasses for unary, binary, and numerical operations. A numerical operation is tied to specific forest edges.
- Numerical operations have moved to the expert interface,
and are accessed as follows.
Old code:
// preprocessing compute_manager* CM = getComputeManager(); // ... // critical CM->vectorMatrixMultiply(y, y_ind, x, x_ind, A);
New code:
// preprocessing numerical_operation* VM = VECT_MATR_MULT->buildOperation(y_ind, A, x_ind); // ... // critical VM->compute(y, x);
- Users may define their own operations in user space,
and initialize them with the same mechanism as the
built-in operations.
To do this:
- Derive a class from
op_initializer
and implement the required virtual functions. - Insert your initializer into the instance of
settings
used to initialize the library. If you want to initialize the builtin operations, you should use something likeMEDDLY::settings s; s.operationBuilder = new my_initializer(s.operationBuilder); MEDDLY::initialize(s);
- Your initializer’s
initChain
method will be called during the call toMEDDLY::initialize(s);
- Your initializer’s
cleanupChain
method will be called during the call toMEDDLY::cleanup();
- Derive a class from
Known Issues
- The current compute table is not as fast as the old one for some operations.
New in Version 0.5.186 (released 16 Jun 2011)
New Features
-
Variables in domains are represented by instances of class
variable
, instead of integers. The same variable may appear in more than one domain. -
Domain levels are always in the order: topmost, …, 2, 1, 0 where level 0 is for terminal nodes. As such, level mapping is no longer necessary.
- For convenience, there is a new function
MEDDLY::createDomainBottomUp(...)
which combines domain creation and variable initialization.
- There are new functions to destroy objects,
MEDDLY::destroyDomain(...) MEDDLY::destroyForest(...)
and these must be used instead of
delete
.
Deprecated Functions
Now deprecated | Equivalent replacement |
---|---|
domain::getTopVariable() |
domain::getNumVariables() |
domain::getVariableAbove(v) |
v+1 |
domain::getVariableBelow(v) |
v-1 |
expert_domain::getVariableHeight(v) |
v |
expert_domain::getVariableWithHeight(h) |
h |
Known Issues
- Calling
MEDDLY::cleanup()
can sometimes cause a segmentation fault. Destroying all domains before callingcleanup()
seems to fix this.
New in Version 0.4.174 (released 13 Jun 2011)
-
Functions and classes are now contained in a
MEDDLY
namespace. -
Top-level functions named
MEDDLY_function
have been renamed asfunction
.
For example,MEDDLY_createDomain()
can now be called asMEDDLY::createDomain()
, or ascreateDomain()
inside ausing namespace MEDDLY
block. - There is a single, centralized
error
class. All methods that previously returnederror
now returnvoid
, and any errors are passed back to the user usingthrow
. For example, the old code fragmentdomain::error e = dom->createVariablesBottomUp(vars, N); if (e != domain::SUCCESS) { fprintf(stderr, "Error: %s\n", domain::getErrorCodeName(e)); exit(1); }
now becomes
try { dom->createVariablesBottomUp(vars, N); } catch (MEDDLY::error e) { fprintf(stderr, "Error: %s\n", e.getName()); exit(1); }
- The library must be initialized before use.
(Most operations will fail and throw an appropriate error, otherwise.)
This can be done via
MEDDLY::initialize();
which uses default settings. To use different settings:
MEDDLY::settings s; // change members of s here; // the constructor will fill everything with default values so // it is only necessary to specify the non-default values. MEDDLY::initialize(s);
-
compute_manager::setHashTablePolicy()
has been removed, as this functionality is now provided using the appropriate settings during library initialization. - Library memory may be released using
MEDDLY::cleanup();
Most operations will fail and throw an appropriate error after
cleanup()
is called. If desired, the library may be initialized again.
New in Version 0.3.165 (released 08 Jun 2011)
- Added row-wise and column-wise iterators for Matrix Diagrams.
-
Iterators can now return the terminal value of the corresponding minterm.
-
Added (basic) vector matrix multiplication operations.
- Improved batch addition of minterms based on Radix Sort (speed).
- Added mechanism for building temporary nodes.
-
Added another option for batch addition of minterms based on temporary nodes.
- Added reverse reachability (all states that can reach a given set of states using a given next-state function).
-
Added the traditional reachability algorithm and a saturation-based algorithm for reverse reachability.
- Added test directory and files for
make check
. - Reorganization of source files.
Version 0.2.101 (released 11 Jun 2010)
- First tarball release
- CTL model checking functionality is complete (some advanced features are still in development)