Skip to content
/ cnetwork Public

A constraint network for encoding and analysing variable relations

License

Notifications You must be signed in to change notification settings

hycos/cnetwork

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cnetwork

cnetwork enables you to manage constraints by providing a simple Java API for constraint network construction and constraint network manipulation.

Status

License: EUPL Language Linux Build Status Test Coverage

Integration

For the time being, because there are no stable releases yet, there are only Maven snapshots available that can be easily integrated into your application.

<dependency>
    <groupId>com.github.hycos</groupId>
    <artifactId>cnetwork</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

Usage

Constraint Network Construction

The example below illustrates how to use the cnetwork API. The ConstraintNetworkBuilder manages the constraint network construction. The addOperand(), addOperation() and addConstraint() methods add variables/operands, operations (i.e., a function with a non-boolean return value) and constraints to the network, respectively. All of these methods create Node instances in the constraint network. The addOperand() method takes as argument the type and the identifier as input, whereas the addOperation() and addConstraint() methods takes as input the kind of operation/constraint and the involved parameter nodes.

ConstraintNetworkBuilder cn = new ConstraintNetworkBuilder();
Node zero = cn.addOperand(NodeKind.NUMLIT, "0");
Node one = cn.addOperand(NodeKind.NUMLIT, "1");
Node three = cn.addOperand(NodeKind.NUMLIT, "3");
Node dot = cn.addOperand(NodeKind.STRLIT, ".");
Node add = cn.addOperation(NodeKind.ADD, one, zero);
cn.addConstraint(NodeKind.EQUALS, add, zero);

Slicing

In case you would like to do an impact analysis in a constraint network, you can use the CnetworkSlicerForward object or CnetworkSlicerBackward classes. The slicer takes as input a constraint network instance. After invoking the slice() method with the slicing criterion as input, the method returns a set of the nodes which appear in the slice. The following code snippet illustrates a backward slicing example where the set nodes contains the two constraint network nodes tostr and var.

Node five = cn.addOperand(NodeKind.NUMLIT, "5");
Node s = cn.addOperand(NodeKind.STRLIT, "s");
Node var = cn.addOperand(NodeKind.NUMVAR, "v");
Node tostr = cn.addOperation(NodeKind.TOSTR, var);

Node concat = cn.addOperation(NodeKind.CONCAT, tostr, s);

CnetworkSlicerBackward b = new CnetworkSlicerBackward(cn
        .getConstraintNetwork());

Visualization

You can visualize a constraint network by invoking the .toDot() method which serializes the constraint network in the .dot output format. From this input format, you print a graph by means of graphviz (for example by invoking dot -T pdf <infile> -o <ofile>). In case you would like to automate this task, this script might be useful.

ConstraintNetworkBuilder cb = new ConstraintNetworkBuilder();
// ...
System.out.println(cb.getConstraintNetwork().toDot());

The constraint network for the first example would look as follows.

Screenshot

License

Copyright (C) 2017 Julian Thome julian.thome.de@gmail.com

cnetwork is licensed under the EUPL, Version 1.1 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); You may not use this work except in compliance with the Licence. You may obtain a copy of the Licence at:

https://joinup.ec.europa.eu/sites/default/files/eupl1.1.-licence-en_0.pdf

Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licence for the specific language governing permissions and limitations under the Licence.

Releases

No releases published

Packages

No packages published

Languages