| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | /******************************************************************************\
 | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | *    SimpleCUDD library (www.cs.kuleuven.be/~theo/tools/simplecudd.html)       * | 
					
						
							|  |  |  | *  SimpleCUDD was developed at Katholieke Universiteit Leuven(www.kuleuven.be) * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							| 
									
										
										
										
											2010-05-06 18:02:07 +02:00
										 |  |  | *  Copyright Katholieke Universiteit Leuven 2008                               * | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | *                                                                              * | 
					
						
							|  |  |  | *  Author: Theofrastos Mantadelis, Angelika Kimmig, Bernd Gutmann              * | 
					
						
							|  |  |  | *  File: ProblogBDD.c                                                          * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | ******************************************************************************** | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							| 
									
										
										
										
											2010-05-06 18:02:07 +02:00
										 |  |  | * Artistic License 2.0                                                         * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * Copyright (c) 2000-2006, The Perl Foundation.                                * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * Everyone is permitted to copy and distribute verbatim copies of this license * | 
					
						
							|  |  |  | * document, but changing it is not allowed.                                    * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * Preamble                                                                     * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * This license establishes the terms under which a given free software Package * | 
					
						
							|  |  |  | * may be copied, modified, distributed, and/or redistributed. The intent is    * | 
					
						
							|  |  |  | * that the Copyright Holder maintains some artistic control over the           * | 
					
						
							|  |  |  | * development of that Package while still keeping the Package available as     * | 
					
						
							|  |  |  | * open source and free software.                                               * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * You are always permitted to make arrangements wholly outside of this license * | 
					
						
							|  |  |  | * directly with the Copyright Holder of a given Package. If the terms of this  * | 
					
						
							|  |  |  | * license do not permit the full use that you propose to make of the Package,  * | 
					
						
							|  |  |  | * you should contact the Copyright Holder and seek a different licensing       * | 
					
						
							|  |  |  | * arrangement.                                                                 * | 
					
						
							|  |  |  | * Definitions                                                                  * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Copyright Holder" means the individual(s) or organization(s) named in the   * | 
					
						
							|  |  |  | * copyright notice for the entire Package.                                     * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Contributor" means any party that has contributed code or other material to * | 
					
						
							|  |  |  | * the Package, in accordance with the Copyright Holder's procedures.           * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "You" and "your" means any person who would like to copy, distribute, or     * | 
					
						
							|  |  |  | * modify the Package.                                                          * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Package" means the collection of files distributed by the Copyright Holder, * | 
					
						
							|  |  |  | * and derivatives of that collection and/or of those files. A given Package    * | 
					
						
							|  |  |  | * may consist of either the Standard Version, or a Modified Version.           * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Distribute" means providing a copy of the Package or making it accessible   * | 
					
						
							|  |  |  | * to anyone else, or in the case of a company or organization, to others       * | 
					
						
							|  |  |  | * outside of your company or organization.                                     * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Distributor Fee" means any fee that you charge for Distributing this        * | 
					
						
							|  |  |  | * Package or providing support for this Package to another party. It does not  * | 
					
						
							|  |  |  | * mean licensing fees.                                                         * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Standard Version" refers to the Package if it has not been modified, or has * | 
					
						
							|  |  |  | * been modified only in ways explicitly requested by the Copyright Holder.     * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Modified Version" means the Package, if it has been changed, and such       * | 
					
						
							|  |  |  | * changes were not explicitly requested by the Copyright Holder.               * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Original License" means this Artistic License as Distributed with the       * | 
					
						
							|  |  |  | * Standard Version of the Package, in its current version or as it may be      * | 
					
						
							|  |  |  | * modified by The Perl Foundation in the future.                               * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Source" form means the source code, documentation source, and configuration * | 
					
						
							|  |  |  | * files for the Package.                                                       * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * "Compiled" form means the compiled bytecode, object code, binary, or any     * | 
					
						
							|  |  |  | * other form resulting from mechanical transformation or translation of the    * | 
					
						
							|  |  |  | * Source form.                                                                 * | 
					
						
							|  |  |  | * Permission for Use and Modification Without Distribution                     * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (1) You are permitted to use the Standard Version and create and use         * | 
					
						
							|  |  |  | * Modified Versions for any purpose without restriction, provided that you do  * | 
					
						
							|  |  |  | * not Distribute the Modified Version.                                         * | 
					
						
							|  |  |  | * Permissions for Redistribution of the Standard Version                       * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (2) You may Distribute verbatim copies of the Source form of the Standard    * | 
					
						
							|  |  |  | * Version of this Package in any medium without restriction, either gratis or  * | 
					
						
							|  |  |  | * for a Distributor Fee, provided that you duplicate all of the original       * | 
					
						
							|  |  |  | * copyright notices and associated disclaimers. At your discretion, such       * | 
					
						
							|  |  |  | * verbatim copies may or may not include a Compiled form of the Package.       * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (3) You may apply any bug fixes, portability changes, and other              * | 
					
						
							|  |  |  | * modifications made available from the Copyright Holder. The resulting        * | 
					
						
							|  |  |  | * Package will still be considered the Standard Version, and as such will be   * | 
					
						
							|  |  |  | * subject to the Original License.                                             * | 
					
						
							|  |  |  | * Distribution of Modified Versions of the Package as Source                   * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (4) You may Distribute your Modified Version as Source (either gratis or for * | 
					
						
							|  |  |  | * a Distributor Fee, and with or without a Compiled form of the Modified       * | 
					
						
							|  |  |  | * Version) provided that you clearly document how it differs from the Standard * | 
					
						
							|  |  |  | * Version, including, but not limited to, documenting any non-standard         * | 
					
						
							|  |  |  | * features, executables, or modules, and provided that you do at least ONE of  * | 
					
						
							|  |  |  | * the following:                                                               * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (a) make the Modified Version available to the Copyright Holder of the       * | 
					
						
							|  |  |  | * Standard Version, under the Original License, so that the Copyright Holder   * | 
					
						
							|  |  |  | * may include your modifications in the Standard Version.                      * | 
					
						
							|  |  |  | * (b) ensure that installation of your Modified Version does not prevent the   * | 
					
						
							|  |  |  | * user installing or running the Standard Version. In addition, the Modified   * | 
					
						
							|  |  |  | * Version must bear a name that is different from the name of the Standard     * | 
					
						
							|  |  |  | * Version.                                                                     * | 
					
						
							|  |  |  | * (c) allow anyone who receives a copy of the Modified Version to make the     * | 
					
						
							|  |  |  | * Source form of the Modified Version available to others under                * | 
					
						
							|  |  |  | * (i) the Original License or                                                  * | 
					
						
							|  |  |  | * (ii) a license that permits the licensee to freely copy, modify and          * | 
					
						
							|  |  |  | * redistribute the Modified Version using the same licensing terms that apply  * | 
					
						
							|  |  |  | * to the copy that the licensee received, and requires that the Source form of * | 
					
						
							|  |  |  | * the Modified Version, and of any works derived from it, be made freely       * | 
					
						
							|  |  |  | * available in that license fees are prohibited but Distributor Fees are       * | 
					
						
							|  |  |  | * allowed.                                                                     * | 
					
						
							|  |  |  | * Distribution of Compiled Forms of the Standard Version or Modified Versions  * | 
					
						
							|  |  |  | * without the Source                                                           * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (5) You may Distribute Compiled forms of the Standard Version without the    * | 
					
						
							|  |  |  | * Source, provided that you include complete instructions on how to get the    * | 
					
						
							|  |  |  | * Source of the Standard Version. Such instructions must be valid at the time  * | 
					
						
							|  |  |  | * of your distribution. If these instructions, at any time while you are       * | 
					
						
							|  |  |  | * carrying out such distribution, become invalid, you must provide new         * | 
					
						
							|  |  |  | * instructions on demand or cease further distribution. If you provide valid   * | 
					
						
							|  |  |  | * instructions or cease distribution within thirty days after you become aware * | 
					
						
							|  |  |  | * that the instructions are invalid, then you do not forfeit any of your       * | 
					
						
							|  |  |  | * rights under this license.                                                   * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (6) You may Distribute a Modified Version in Compiled form without the       * | 
					
						
							|  |  |  | * Source, provided that you comply with Section 4 with respect to the Source   * | 
					
						
							|  |  |  | * of the Modified Version.                                                     * | 
					
						
							|  |  |  | * Aggregating or Linking the Package                                           * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (7) You may aggregate the Package (either the Standard Version or Modified   * | 
					
						
							|  |  |  | * Version) with other packages and Distribute the resulting aggregation        * | 
					
						
							|  |  |  | * provided that you do not charge a licensing fee for the Package. Distributor * | 
					
						
							|  |  |  | * Fees are permitted, and licensing fees for other components in the           * | 
					
						
							|  |  |  | * aggregation are permitted. The terms of this license apply to the use and    * | 
					
						
							|  |  |  | * Distribution of the Standard or Modified Versions as included in the         * | 
					
						
							|  |  |  | * aggregation.                                                                 * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (8) You are permitted to link Modified and Standard Versions with other      * | 
					
						
							|  |  |  | * works, to embed the Package in a larger work of your own, or to build        * | 
					
						
							|  |  |  | * stand-alone binary or bytecode versions of applications that include the     * | 
					
						
							|  |  |  | * Package, and Distribute the result without restriction, provided the result  * | 
					
						
							|  |  |  | * does not expose a direct interface to the Package.                           * | 
					
						
							|  |  |  | * Items That are Not Considered Part of a Modified Version                     * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (9) Works (including, but not limited to, modules and scripts) that merely   * | 
					
						
							|  |  |  | * extend or make use of the Package, do not, by themselves, cause the Package  * | 
					
						
							|  |  |  | * to be a Modified Version. In addition, such works are not considered parts   * | 
					
						
							|  |  |  | * of the Package itself, and are not subject to the terms of this license.     * | 
					
						
							|  |  |  | * General Provisions                                                           * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (10) Any use, modification, and distribution of the Standard or Modified     * | 
					
						
							|  |  |  | * Versions is governed by this Artistic License. By using, modifying or        * | 
					
						
							|  |  |  | * distributing the Package, you accept this license. Do not use, modify, or    * | 
					
						
							|  |  |  | * distribute the Package, if you do not accept this license.                   * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (11) If your Modified Version has been derived from a Modified Version made  * | 
					
						
							|  |  |  | * by someone other than you, you are nevertheless required to ensure that your * | 
					
						
							|  |  |  | * Modified Version complies with the requirements of this license.             * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (12) This license does not grant you the right to use any trademark, service * | 
					
						
							|  |  |  | * mark, tradename, or logo of the Copyright Holder.                            * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (13) This license includes the non-exclusive, worldwide, free-of-charge      * | 
					
						
							|  |  |  | * patent license to make, have made, use, offer to sell, sell, import and      * | 
					
						
							|  |  |  | * otherwise transfer the Package with respect to any patent claims licensable  * | 
					
						
							|  |  |  | * by the Copyright Holder that are necessarily infringed by the Package. If    * | 
					
						
							|  |  |  | * you institute patent litigation (including a cross-claim or counterclaim)    * | 
					
						
							|  |  |  | * against any party alleging that the Package constitutes direct or            * | 
					
						
							|  |  |  | * contributory patent infringement, then this Artistic License to you shall    * | 
					
						
							|  |  |  | * terminate on the date that such litigation is filed.                         * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | * (14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER * | 
					
						
							|  |  |  | * AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE  * | 
					
						
							|  |  |  | * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR  * | 
					
						
							|  |  |  | * NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW.   * | 
					
						
							|  |  |  | * UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE    * | 
					
						
							|  |  |  | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN    * | 
					
						
							|  |  |  | * ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF * | 
					
						
							|  |  |  | * SUCH DAMAGE.                                                                 * | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | *                                                                              * | 
					
						
							|  |  |  | *         The End                                                              * | 
					
						
							|  |  |  | *                                                                              * | 
					
						
							|  |  |  | \******************************************************************************/ | 
					
						
							| 
									
										
										
										
											2010-05-06 18:02:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-21 11:49:19 +01:00
										 |  |  | /* modified by Fabrizio Riguzzi in 2009 for dealing with multivalued variables:
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | instead of variables or their negation, the script can contain equations of the | 
					
						
							| 
									
										
										
										
											2010-03-21 11:49:19 +01:00
										 |  |  | form | 
					
						
							|  |  |  | variable=value | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | Multivalued variables are translated to binary variables by means of a log | 
					
						
							| 
									
										
										
										
											2010-03-21 11:49:19 +01:00
										 |  |  | encodimg | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "simplecudd.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | #if HAVE_UNISTD_H
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | #include <signal.h>
 | 
					
						
							|  |  |  | #include <time.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _parameters { | 
					
						
							|  |  |  |   int loadfile; | 
					
						
							|  |  |  |   int savedfile; | 
					
						
							|  |  |  |   int exportfile; | 
					
						
							|  |  |  |   int inputfile; | 
					
						
							|  |  |  |   int debug; | 
					
						
							|  |  |  |   int errorcnt; | 
					
						
							|  |  |  |   int *error; | 
					
						
							|  |  |  |   int method; | 
					
						
							|  |  |  |   int queryid; | 
					
						
							|  |  |  |   int timeout; | 
					
						
							|  |  |  |   double sigmoid_slope; | 
					
						
							|  |  |  |   int online; | 
					
						
							|  |  |  |   int maxbufsize; | 
					
						
							|  |  |  |   char *ppid; | 
					
						
							|  |  |  | } parameters; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _gradientpair { | 
					
						
							|  |  |  |   double probability; | 
					
						
							|  |  |  |   double gradient; | 
					
						
							|  |  |  | } gradientpair; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _extmanager { | 
					
						
							|  |  |  |   DdManager *manager; | 
					
						
							|  |  |  |   DdNode *t, *f; | 
					
						
							|  |  |  |   hisqueue *his; | 
					
						
							|  |  |  |   namedvars varmap; | 
					
						
							|  |  |  | } extmanager; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | double ProbBool(extmanager MyManager, DdNode *node, int bits, int nBit, | 
					
						
							|  |  |  |                 int posBVar, variable v, int comp); | 
					
						
							|  |  |  | double Prob(extmanager MyManager, DdNode *node, int comp); | 
					
						
							|  |  |  | int correctPosition(int index, variable v, int posBVar); | 
					
						
							|  |  |  | double ret_prob(extmanager MyManager, DdNode *bdd); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | int argtype(const char *arg); | 
					
						
							|  |  |  | void printhelp(int argc, char **arg); | 
					
						
							|  |  |  | parameters loadparam(int argc, char **arg); | 
					
						
							|  |  |  | parameters params; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void handler(int num); | 
					
						
							|  |  |  | void pidhandler(int num); | 
					
						
							|  |  |  | void termhandler(int num); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double sigmoid(double x, double slope); | 
					
						
							|  |  |  | void myexpand(extmanager MyManager, DdNode *Current); | 
					
						
							|  |  |  | double CalcProbability(extmanager MyManager, DdNode *Current); | 
					
						
							|  |  |  | double CalcProbabilitySigmoid(extmanager MyManager, DdNode *Current); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | gradientpair CalcGradient(extmanager MyManager, DdNode *Current, int TargetVar, | 
					
						
							|  |  |  |                           char *TargetPattern); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | int patterncalculated(char *pattern, extmanager MyManager, int loc); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | char *extractpattern(char *thestr); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | int main(int argc, char **arg) { | 
					
						
							|  |  |  |   clock_t start, endc, endt; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   double elapsedc, elapsedt; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   extmanager MyManager; | 
					
						
							|  |  |  |   DdNode *bdd; | 
					
						
							|  |  |  |   bddfileheader fileheader; | 
					
						
							|  |  |  |   int i, ivarcnt, code; | 
					
						
							|  |  |  |   gradientpair tvalue; | 
					
						
							|  |  |  |   double probability = -1.0; | 
					
						
							|  |  |  |   char *varpattern; | 
					
						
							|  |  |  |   varpattern = NULL; | 
					
						
							|  |  |  |   code = -1; | 
					
						
							|  |  |  |   params = loadparam(argc, arg); | 
					
						
							|  |  |  |   if (params.errorcnt > 0) { | 
					
						
							|  |  |  |     printhelp(argc, arg); | 
					
						
							|  |  |  |     for (i = 0; i < params.errorcnt; i++) { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       fprintf(stderr, "Error: not known or error at parameter %s.\n", | 
					
						
							|  |  |  |               arg[params.error[i]]); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (params.online == 0 && params.loadfile == -1) { | 
					
						
							|  |  |  |     printhelp(argc, arg); | 
					
						
							|  |  |  |     fprintf(stderr, "Error: you must specify a loading file.\n"); | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (params.method != 0 && arg[params.method][0] != 'g' && | 
					
						
							|  |  |  |       arg[params.method][0] != 'p' && arg[params.method][0] != 'o' && | 
					
						
							|  |  |  |       arg[params.method][0] != 'l') { | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     printhelp(argc, arg); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     fprintf(stderr, "Error: you must choose a calculation method beetween " | 
					
						
							|  |  |  |                     "[p]robability, [g]radient, [l]ine search, [o]nline.\n"); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     return -1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (params.debug) | 
					
						
							|  |  |  |     DEBUGON; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   RAPIDLOADON; | 
					
						
							|  |  |  |   SETMAXBUFSIZE(params.maxbufsize); | 
					
						
							| 
									
										
										
										
											2010-07-30 12:36:13 +02:00
										 |  |  | #ifndef _WIN32
 | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   signal(SIGINT, termhandler); | 
					
						
							|  |  |  |   if (params.ppid != NULL) { | 
					
						
							|  |  |  |     signal(SIGALRM, pidhandler); | 
					
						
							|  |  |  |     alarm(5); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     signal(SIGALRM, handler); | 
					
						
							|  |  |  |     alarm(params.timeout); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-07-30 12:36:13 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   if (params.online) { | 
					
						
							|  |  |  |     MyManager.manager = simpleBDDinit(0); | 
					
						
							|  |  |  |     MyManager.t = HIGH(MyManager.manager); | 
					
						
							|  |  |  |     MyManager.f = LOW(MyManager.manager); | 
					
						
							|  |  |  |     MyManager.varmap = InitNamedVars(1, 0); | 
					
						
							|  |  |  |     bdd = OnlineGenerateBDD(MyManager.manager, &MyManager.varmap); | 
					
						
							|  |  |  |     ivarcnt = GetVarCount(MyManager.manager); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     fileheader = ReadFileHeader(arg[params.loadfile]); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     switch (fileheader.filetype) { | 
					
						
							|  |  |  |     case BDDFILE_SCRIPT: | 
					
						
							|  |  |  |       if (params.inputfile == -1) { | 
					
						
							|  |  |  |         printhelp(argc, arg); | 
					
						
							|  |  |  |         fprintf(stderr, "Error: an input file is necessary for this type of " | 
					
						
							|  |  |  |                         "loading file.\n"); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       } | 
					
						
							|  |  |  |       MyManager.manager = simpleBDDinit(fileheader.varcnt); | 
					
						
							|  |  |  |       MyManager.t = HIGH(MyManager.manager); | 
					
						
							|  |  |  |       MyManager.f = LOW(MyManager.manager); | 
					
						
							|  |  |  |       MyManager.varmap = InitNamedMultiVars( | 
					
						
							|  |  |  |           fileheader.varcnt, fileheader.varstart, fileheader.bvarcnt); | 
					
						
							|  |  |  |       if (LoadMultiVariableData(MyManager.manager, MyManager.varmap, | 
					
						
							|  |  |  |                                 arg[params.inputfile]) == -1) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |       start = clock(); | 
					
						
							|  |  |  |       bdd = FileGenerateBDD(MyManager.manager, MyManager.varmap, fileheader); | 
					
						
							|  |  |  |       endc = clock(); | 
					
						
							|  |  |  |       elapsedc = ((double)(endc - start)) / CLOCKS_PER_SEC; | 
					
						
							|  |  |  |       printf("elapsed_construction(%lf).\n", elapsedc); | 
					
						
							|  |  |  |       ivarcnt = fileheader.varcnt; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case BDDFILE_NODEDUMP: | 
					
						
							|  |  |  |       if (params.inputfile == -1) { | 
					
						
							|  |  |  |         printhelp(argc, arg); | 
					
						
							|  |  |  |         fprintf(stderr, "Error: an input file is necessary for this type of " | 
					
						
							|  |  |  |                         "loading file.\n"); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       MyManager.manager = simpleBDDinit(fileheader.varcnt); | 
					
						
							|  |  |  |       MyManager.t = HIGH(MyManager.manager); | 
					
						
							|  |  |  |       MyManager.f = LOW(MyManager.manager); | 
					
						
							|  |  |  |       MyManager.varmap = InitNamedVars(fileheader.varcnt, fileheader.varstart); | 
					
						
							|  |  |  |       bdd = LoadNodeDump(MyManager.manager, MyManager.varmap, | 
					
						
							|  |  |  |                          fileheader.inputfile); | 
					
						
							|  |  |  |       ivarcnt = fileheader.varcnt; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       fprintf(stderr, "Error: not a valid file format to load.\n"); | 
					
						
							|  |  |  |       return -1; | 
					
						
							|  |  |  |       break; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-07-30 12:36:13 +02:00
										 |  |  | #ifndef _WIN32
 | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   alarm(0); | 
					
						
							| 
									
										
										
										
											2010-07-30 12:36:13 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   // problem specifics
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (bdd != NULL) { | 
					
						
							|  |  |  |     ivarcnt = RepairVarcnt(&MyManager.varmap); | 
					
						
							|  |  |  |     code = 0; | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |     if (params.inputfile != -1) { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       if (LoadVariableData(MyManager.varmap, arg[params.inputfile]) == -1) | 
					
						
							|  |  |  |     return -1; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |       if (!all_loaded(MyManager.varmap, 1)) return -1; | 
					
						
							|  |  |  |     }*/ | 
					
						
							|  |  |  |     MyManager.his = InitHistory(ivarcnt); | 
					
						
							|  |  |  |     if (params.method != 0) { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       switch (arg[params.method][0]) { | 
					
						
							|  |  |  |       case 'g': | 
					
						
							|  |  |  |         for (i = 0; i < MyManager.varmap.varcnt; i++) { | 
					
						
							|  |  |  |           if (MyManager.varmap.vars[i] != NULL) { | 
					
						
							|  |  |  |             varpattern = extractpattern(MyManager.varmap.vars[i]); | 
					
						
							|  |  |  |             if ((varpattern == NULL) || | 
					
						
							|  |  |  |                 (!patterncalculated(varpattern, MyManager, i))) { | 
					
						
							|  |  |  |               tvalue = CalcGradient(MyManager, bdd, | 
					
						
							|  |  |  |                                     i + MyManager.varmap.varstart, varpattern); | 
					
						
							|  |  |  |               probability = tvalue.probability; | 
					
						
							|  |  |  |               double factor = | 
					
						
							|  |  |  |                   sigmoid(MyManager.varmap.dvalue[i], params.sigmoid_slope) * | 
					
						
							|  |  |  |                   (1 - | 
					
						
							|  |  |  |                    sigmoid(MyManager.varmap.dvalue[i], params.sigmoid_slope)) * | 
					
						
							|  |  |  |                   params.sigmoid_slope; | 
					
						
							|  |  |  |               if (varpattern == NULL) { | 
					
						
							|  |  |  |                 printf("query_gradient(%s,%s,%1.12f).\n", arg[params.queryid], | 
					
						
							|  |  |  |                        MyManager.varmap.vars[i], tvalue.gradient * factor); | 
					
						
							|  |  |  |               } else { | 
					
						
							|  |  |  |                 varpattern[strlen(varpattern) - 2] = '\0'; | 
					
						
							|  |  |  |                 printf("query_gradient(%s,%s,%1.12f).\n", arg[params.queryid], | 
					
						
							|  |  |  |                        varpattern, tvalue.gradient * factor); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |               ReInitHistory(MyManager.his, MyManager.varmap.varcnt); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |             if (varpattern != NULL) | 
					
						
							|  |  |  |               free(varpattern); | 
					
						
							|  |  |  |           } else { | 
					
						
							|  |  |  |             fprintf(stderr, "Error: no variable name given for parameter.\n"); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (probability < 0.0) { | 
					
						
							|  |  |  |           // no nodes, so we have to calculate probability ourself
 | 
					
						
							|  |  |  |           tvalue = | 
					
						
							|  |  |  |               CalcGradient(MyManager, bdd, 0 + MyManager.varmap.varstart, NULL); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |           probability = tvalue.probability; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |         } | 
					
						
							|  |  |  |         printf("query_probability(%s,%1.12f).\n", arg[params.queryid], | 
					
						
							|  |  |  |                probability); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 'l': | 
					
						
							|  |  |  |         tvalue = | 
					
						
							|  |  |  |             CalcGradient(MyManager, bdd, 0 + MyManager.varmap.varstart, NULL); | 
					
						
							|  |  |  |         probability = tvalue.probability; | 
					
						
							|  |  |  |         printf("query_probability(%s,%1.12f).\n", arg[params.queryid], | 
					
						
							|  |  |  |                probability); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 'p': | 
					
						
							|  |  |  |         printf("probability(%1.12f).\n", CalcProbability(MyManager, bdd)); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 'o': | 
					
						
							|  |  |  |         onlinetraverse(MyManager.manager, MyManager.varmap, MyManager.his, bdd); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         myexpand(MyManager, bdd); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       start = clock(); | 
					
						
							|  |  |  |       //	simpleNamedBDDtoDot(MyManager.manager, MyManager.varmap, bdd,
 | 
					
						
							|  |  |  |       //"bdd.dot");
 | 
					
						
							|  |  |  |       printf("probability(%1.12f).\n", ret_prob(MyManager, bdd)); | 
					
						
							|  |  |  |       endt = clock(); | 
					
						
							|  |  |  |       elapsedt = ((double)(endt - start)) / CLOCKS_PER_SEC; | 
					
						
							|  |  |  |       printf("elapsed_traversing(%lf).\n", elapsedt); | 
					
						
							|  |  |  |       //      myexpand(MyManager, bdd);
 | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     if (params.savedfile > -1) | 
					
						
							|  |  |  |       SaveNodeDump(MyManager.manager, MyManager.varmap, bdd, | 
					
						
							|  |  |  |                    arg[params.savedfile]); | 
					
						
							|  |  |  |     if (params.exportfile > -1) | 
					
						
							|  |  |  |       simpleNamedBDDtoDot(MyManager.manager, MyManager.varmap, bdd, | 
					
						
							|  |  |  |                           arg[params.exportfile]); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     ReInitHistory(MyManager.his, MyManager.varmap.varcnt); | 
					
						
							|  |  |  |     free(MyManager.his); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (MyManager.manager != NULL) { | 
					
						
							|  |  |  |     KillBDD(MyManager.manager); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     exit(code); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     free(MyManager.varmap.dvalue); | 
					
						
							|  |  |  |     free(MyManager.varmap.ivalue); | 
					
						
							|  |  |  |     free(MyManager.varmap.dynvalue); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     for (i = 0; i < MyManager.varmap.varcnt; i++) { | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |       free(MyManager.varmap.vars[i]); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       free(MyManager.varmap.mvars[i].probabilities); | 
					
						
							|  |  |  |       free(MyManager.varmap.mvars[i].booleanVars); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     free(MyManager.varmap.vars); | 
					
						
							|  |  |  |     free(MyManager.varmap.mvars); | 
					
						
							|  |  |  |     free(MyManager.varmap.bVar2mVar); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (params.error != NULL) | 
					
						
							|  |  |  |     free(params.error); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return code; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Shell Parameters handling */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int argtype(const char *arg) { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (strcmp(arg, "-l") == 0 || strcmp(arg, "--load") == 0) | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   if (strcmp(arg, "-e") == 0 || strcmp(arg, "--export") == 0) | 
					
						
							|  |  |  |     return 2; | 
					
						
							|  |  |  |   if (strcmp(arg, "-m") == 0 || strcmp(arg, "--method") == 0) | 
					
						
							|  |  |  |     return 3; | 
					
						
							|  |  |  |   if (strcmp(arg, "-i") == 0 || strcmp(arg, "--input") == 0) | 
					
						
							|  |  |  |     return 4; | 
					
						
							|  |  |  |   if (strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) | 
					
						
							|  |  |  |     return 5; | 
					
						
							|  |  |  |   if (strcmp(arg, "-d") == 0 || strcmp(arg, "--debug") == 0) | 
					
						
							|  |  |  |     return 6; | 
					
						
							|  |  |  |   if (strcmp(arg, "-id") == 0 || strcmp(arg, "--queryid") == 0) | 
					
						
							|  |  |  |     return 7; | 
					
						
							|  |  |  |   if (strcmp(arg, "-t") == 0 || strcmp(arg, "--timeout") == 0) | 
					
						
							|  |  |  |     return 8; | 
					
						
							|  |  |  |   if (strcmp(arg, "-sd") == 0 || strcmp(arg, "--savedump") == 0) | 
					
						
							|  |  |  |     return 9; | 
					
						
							|  |  |  |   if (strcmp(arg, "-sl") == 0 || strcmp(arg, "--slope") == 0) | 
					
						
							|  |  |  |     return 10; | 
					
						
							|  |  |  |   if (strcmp(arg, "-o") == 0 || strcmp(arg, "--online") == 0) | 
					
						
							|  |  |  |     return 11; | 
					
						
							|  |  |  |   if (strcmp(arg, "-bs") == 0 || strcmp(arg, "--bufsize") == 0) | 
					
						
							|  |  |  |     return 12; | 
					
						
							|  |  |  |   if (strcmp(arg, "-pid") == 0 || strcmp(arg, "--pid") == 0) | 
					
						
							|  |  |  |     return 13; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void printhelp(int argc, char **arg) { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   fprintf(stderr, "\nUsage: %s -l [filename] -i [filename] -o (-s(d) " | 
					
						
							|  |  |  |                   "[filename] -e [filename] -m [method] -id [queryid] -sl " | 
					
						
							|  |  |  |                   "[double]) (-t [seconds] -d -h)\n", | 
					
						
							|  |  |  |           arg[0]); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   fprintf(stderr, "Generates and traverses a BDD\nMandatory parameters:\n"); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   fprintf(stderr, "\t-l [filename]\t->\tfilename to load supports two " | 
					
						
							|  |  |  |                   "formats:\n\t\t\t\t\t\t1. script with generation " | 
					
						
							|  |  |  |                   "instructions\n\t\t\t\t\t\t2. node dump saved file\n"); | 
					
						
							|  |  |  |   fprintf(stderr, "\t-i [filename]\t->\tfilename to input problem specifics " | 
					
						
							|  |  |  |                   "(mandatory with file formats 1, 2)\n"); | 
					
						
							|  |  |  |   fprintf(stderr, "\t-o\t\t->\tgenerates the BDD in online mode instead from a " | 
					
						
							|  |  |  |                   "file can be used instead of -l\n"); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   fprintf(stderr, "Optional parameters:\n"); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   fprintf(stderr, "\t-sd [filename]\t->\tfilename to save generated BDD in " | 
					
						
							|  |  |  |                   "node dump format (fast loading, traverse valid only)\n"); | 
					
						
							|  |  |  |   fprintf( | 
					
						
							|  |  |  |       stderr, | 
					
						
							|  |  |  |       "\t-e [filename]\t->\tfilename to export generated BDD in dot format\n"); | 
					
						
							|  |  |  |   fprintf(stderr, "\t-m [method]\t->\tthe calculation method to be used: " | 
					
						
							|  |  |  |                   "none(default), [p]robability, [g]radient, [o]nline\n"); | 
					
						
							|  |  |  |   fprintf(stderr, "\t-id [queryid]\t->\tthe queries identity name (used by " | 
					
						
							|  |  |  |                   "gradient) default: %s\n", | 
					
						
							|  |  |  |           arg[0]); | 
					
						
							|  |  |  |   fprintf(stderr, "\t-sl [double]\t->\tthe sigmoid slope (used by gradient) " | 
					
						
							|  |  |  |                   "default: 1.0\n"); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   fprintf(stderr, "Extra parameters:\n"); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   fprintf(stderr, "\t-t [seconds]\t->\tthe seconds (int) for BDD generation " | 
					
						
							|  |  |  |                   "timeout default 0 = no timeout\n"); | 
					
						
							|  |  |  |   fprintf(stderr, "\t-pid [pid]\t->\ta process id (int) to check for " | 
					
						
							|  |  |  |                   "termination default 0 = no process to check works only " | 
					
						
							|  |  |  |                   "under POSIX OS\n"); | 
					
						
							|  |  |  |   fprintf(stderr, "\t-bs [bytes]\t->\tthe bytes (int) to use as a maximum " | 
					
						
							|  |  |  |                   "buffer size to read files default 0 = no max\n"); | 
					
						
							|  |  |  |   fprintf(stderr, | 
					
						
							|  |  |  |           "\t-d\t\t->\tRun in debug mode (gives extra messages in stderr)\n"); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   fprintf(stderr, "\t-h\t\t->\tHelp (displays this message)\n\n"); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   fprintf(stderr, "Example: %s -l testbdd -i input.txt -m g -id testbdd\n", | 
					
						
							|  |  |  |           arg[0]); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | parameters loadparam(int argc, char **arg) { | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  |   parameters params; | 
					
						
							|  |  |  |   params.loadfile = -1; | 
					
						
							|  |  |  |   params.savedfile = -1; | 
					
						
							|  |  |  |   params.exportfile = -1; | 
					
						
							|  |  |  |   params.method = 0; | 
					
						
							|  |  |  |   params.inputfile = -1; | 
					
						
							|  |  |  |   params.debug = 0; | 
					
						
							|  |  |  |   params.errorcnt = 0; | 
					
						
							|  |  |  |   params.queryid = 0; | 
					
						
							|  |  |  |   params.timeout = 0; | 
					
						
							|  |  |  |   params.sigmoid_slope = 1.0; | 
					
						
							|  |  |  |   params.online = 0; | 
					
						
							|  |  |  |   params.maxbufsize = 0; | 
					
						
							|  |  |  |   params.ppid = NULL; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   params.error = (int *)malloc(argc * sizeof(int)); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   for (i = 1; i < argc; i++) { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     switch (argtype(arg[i])) { | 
					
						
							|  |  |  |     case 0: | 
					
						
							|  |  |  |       if (argc > i + 1) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.loadfile = i; | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 2: | 
					
						
							|  |  |  |       if (argc > i + 1) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.exportfile = i; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 3: | 
					
						
							|  |  |  |       if (argc > i + 1) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.method = i; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 4: | 
					
						
							|  |  |  |       if (argc > i + 1) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.inputfile = i; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 5: | 
					
						
							|  |  |  |       printhelp(argc, arg); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 6: | 
					
						
							|  |  |  |       params.debug = 1; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 7: | 
					
						
							|  |  |  |       if (argc > i + 1) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.queryid = i; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 8: | 
					
						
							|  |  |  |       if ((argc > i + 1) && (IsPosNumber(arg[i + 1]))) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.timeout = atoi(arg[i]); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 9: | 
					
						
							|  |  |  |       if (argc > i + 1) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.savedfile = i; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 10: | 
					
						
							|  |  |  |       if ((argc > i + 1) && (IsRealNumber(arg[i + 1]))) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.sigmoid_slope = atof(arg[i]); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 11: | 
					
						
							|  |  |  |       params.online = 1; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 12: | 
					
						
							|  |  |  |       if ((argc > i + 1) && (IsPosNumber(arg[i + 1]))) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.maxbufsize = atoi(arg[i]); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case 13: | 
					
						
							|  |  |  |       if ((argc > i + 1) && (IsPosNumber(arg[i + 1]))) { | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         params.ppid = (char *)malloc(sizeof(char) * (strlen(arg[i]) + 1)); | 
					
						
							|  |  |  |         strcpy(params.ppid, arg[i]); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |         params.errorcnt++; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       params.error[params.errorcnt] = i; | 
					
						
							|  |  |  |       params.errorcnt++; | 
					
						
							|  |  |  |       break; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return params; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Error Handlers */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void handler(int num) { | 
					
						
							|  |  |  |   fprintf(stderr, "Error: Timeout %i exceeded.\n", params.timeout); | 
					
						
							|  |  |  |   exit(-1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void pidhandler(int num) { | 
					
						
							|  |  |  |   char *s; | 
					
						
							|  |  |  |   if (params.timeout > 0) { | 
					
						
							|  |  |  |     params.timeout -= 5; | 
					
						
							|  |  |  |     if (params.timeout <= 0) { | 
					
						
							|  |  |  |       fprintf(stderr, "Error: Timeout exceeded.\n"); | 
					
						
							|  |  |  |       exit(-1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   s = (char *)malloc(sizeof(char) * (19 + strlen(params.ppid))); | 
					
						
							|  |  |  |   strcpy(s, "ps "); | 
					
						
							|  |  |  |   strcat(s, params.ppid); | 
					
						
							|  |  |  |   strcat(s, " >/dev/null"); | 
					
						
							|  |  |  |   if (system(s) != 0) | 
					
						
							|  |  |  |     exit(4); | 
					
						
							| 
									
										
										
										
											2010-07-30 12:36:13 +02:00
										 |  |  | #ifndef _WIN32
 | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   signal(SIGALRM, pidhandler); | 
					
						
							|  |  |  |   alarm(5); | 
					
						
							| 
									
										
										
										
											2010-07-30 12:36:13 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   free(s); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | void termhandler(int num) { exit(3); } | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* General Functions */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | double sigmoid(double x, double slope) { return 1 / (1 + exp(-x * slope)); } | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Debugging traverse function */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void myexpand(extmanager MyManager, DdNode *Current) { | 
					
						
							|  |  |  |   DdNode *h, *l; | 
					
						
							|  |  |  |   hisnode *Found; | 
					
						
							|  |  |  |   char *curnode; | 
					
						
							|  |  |  |   curnode = GetNodeVarNameDisp(MyManager.manager, MyManager.varmap, Current); | 
					
						
							|  |  |  |   printf("%s\n", curnode); | 
					
						
							|  |  |  |   if ((Current != MyManager.t) && (Current != MyManager.f) && | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       ((Found = GetNode(MyManager.his, MyManager.varmap.varstart, Current)) == | 
					
						
							|  |  |  |        NULL)) { | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     l = LowNodeOf(MyManager.manager, Current); | 
					
						
							|  |  |  |     h = HighNodeOf(MyManager.manager, Current); | 
					
						
							|  |  |  |     printf("l(%s)->", curnode); | 
					
						
							|  |  |  |     myexpand(MyManager, l); | 
					
						
							|  |  |  |     printf("h(%s)->", curnode); | 
					
						
							|  |  |  |     myexpand(MyManager, h); | 
					
						
							|  |  |  |     AddNode(MyManager.his, MyManager.varmap.varstart, Current, 0.0, 0, NULL); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Angelikas Algorithm */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double CalcProbability(extmanager MyManager, DdNode *Current) { | 
					
						
							|  |  |  |   DdNode *h, *l; | 
					
						
							|  |  |  |   hisnode *Found; | 
					
						
							|  |  |  |   char *curnode; | 
					
						
							|  |  |  |   double lvalue, hvalue, tvalue; | 
					
						
							|  |  |  |   if (params.debug) { | 
					
						
							|  |  |  |     curnode = GetNodeVarNameDisp(MyManager.manager, MyManager.varmap, Current); | 
					
						
							|  |  |  |     fprintf(stderr, "%s\n", curnode); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (Current == MyManager.t) | 
					
						
							|  |  |  |     return 1.0; | 
					
						
							|  |  |  |   if (Current == MyManager.f) | 
					
						
							|  |  |  |     return 0.0; | 
					
						
							|  |  |  |   if ((Found = GetNode(MyManager.his, MyManager.varmap.varstart, Current)) != | 
					
						
							|  |  |  |       NULL) | 
					
						
							|  |  |  |     return Found->dvalue; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   l = LowNodeOf(MyManager.manager, Current); | 
					
						
							|  |  |  |   h = HighNodeOf(MyManager.manager, Current); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (params.debug) | 
					
						
							|  |  |  |     fprintf(stderr, "l(%s)->", curnode); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   lvalue = CalcProbability(MyManager, l); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (params.debug) | 
					
						
							|  |  |  |     fprintf(stderr, "h(%s)->", curnode); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   hvalue = CalcProbability(MyManager, h); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   tvalue = | 
					
						
							|  |  |  |       MyManager.varmap.dvalue[GetIndex(Current) - MyManager.varmap.varstart]; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   tvalue = tvalue * hvalue + lvalue * (1.0 - tvalue); | 
					
						
							|  |  |  |   AddNode(MyManager.his, MyManager.varmap.varstart, Current, tvalue, 0, NULL); | 
					
						
							|  |  |  |   return tvalue; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Bernds Algorithm */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | gradientpair CalcGradient(extmanager MyManager, DdNode *Current, int TargetVar, | 
					
						
							|  |  |  |                           char *TargetPattern) { | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   DdNode *h, *l; | 
					
						
							|  |  |  |   hisnode *Found; | 
					
						
							|  |  |  |   char *curnode; | 
					
						
							|  |  |  |   gradientpair lvalue, hvalue, tvalue; | 
					
						
							|  |  |  |   double this_probability; | 
					
						
							|  |  |  |   double *gradient; | 
					
						
							|  |  |  |   if (params.debug) { | 
					
						
							|  |  |  |     curnode = GetNodeVarNameDisp(MyManager.manager, MyManager.varmap, Current); | 
					
						
							|  |  |  |     fprintf(stderr, "%s\n", curnode); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (Current == MyManager.t) { | 
					
						
							|  |  |  |     tvalue.probability = 1.0; | 
					
						
							|  |  |  |     tvalue.gradient = 0.0; | 
					
						
							|  |  |  |     return tvalue; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (Current == MyManager.f) { | 
					
						
							|  |  |  |     tvalue.probability = 0.0; | 
					
						
							|  |  |  |     tvalue.gradient = 0.0; | 
					
						
							|  |  |  |     return tvalue; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if ((Found = GetNode(MyManager.his, MyManager.varmap.varstart, Current)) != | 
					
						
							|  |  |  |       NULL) { | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     tvalue.probability = Found->dvalue; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     tvalue.gradient = *((double *)Found->dynvalue); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     return tvalue; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   l = LowNodeOf(MyManager.manager, Current); | 
					
						
							|  |  |  |   h = HighNodeOf(MyManager.manager, Current); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (params.debug) | 
					
						
							|  |  |  |     fprintf(stderr, "l(%s)->", curnode); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   lvalue = CalcGradient(MyManager, l, TargetVar, TargetPattern); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (params.debug) | 
					
						
							|  |  |  |     fprintf(stderr, "h(%s)->", curnode); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   hvalue = CalcGradient(MyManager, h, TargetVar, TargetPattern); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   this_probability = sigmoid( | 
					
						
							|  |  |  |       MyManager.varmap.dvalue[GetIndex(Current) - MyManager.varmap.varstart], | 
					
						
							|  |  |  |       params.sigmoid_slope); | 
					
						
							|  |  |  |   tvalue.probability = this_probability * hvalue.probability + | 
					
						
							|  |  |  |                        (1 - this_probability) * lvalue.probability; | 
					
						
							|  |  |  |   tvalue.gradient = this_probability * hvalue.gradient + | 
					
						
							|  |  |  |                     (1 - this_probability) * lvalue.gradient; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   if ((GetIndex(Current) == TargetVar) || | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       ((TargetPattern != NULL) && | 
					
						
							|  |  |  |        patternmatch(TargetPattern, MyManager.varmap.vars[GetIndex(Current)]))) { | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |     tvalue.gradient += hvalue.probability - lvalue.probability; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   gradient = (double *)malloc(sizeof(double)); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   *gradient = tvalue.gradient; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   AddNode(MyManager.his, MyManager.varmap.varstart, Current, tvalue.probability, | 
					
						
							|  |  |  |           0, gradient); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   return tvalue; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | char *extractpattern(char *thestr) { | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   char *p; | 
					
						
							|  |  |  |   int i = 0, sl = strlen(thestr); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   while ((thestr[i] != '_') && (i < sl)) | 
					
						
							|  |  |  |     i++; | 
					
						
							|  |  |  |   if (i == sl) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   i++; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   p = (char *)malloc(sizeof(char) * (i + 2)); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   strncpy(p, thestr, i); | 
					
						
							|  |  |  |   p[i] = '*'; | 
					
						
							|  |  |  |   p[i + 1] = '\0'; | 
					
						
							|  |  |  |   return p; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int patterncalculated(char *pattern, extmanager MyManager, int loc) { | 
					
						
							|  |  |  |   int i; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (pattern == NULL) | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   for (i = loc - 1; i > -1; i--) | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     if (patternmatch(pattern, MyManager.varmap.vars[i])) | 
					
						
							|  |  |  |       return 1; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | double Prob(extmanager MyManager, DdNode *node, int comp) | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | /* compute the probability of the expression rooted at node
 | 
					
						
							|  |  |  | nodes is used to store nodes for which the probability has alread been computed | 
					
						
							|  |  |  | so that it is not recomputed | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   int mVarIndex, nBit, index; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   variable v; | 
					
						
							|  |  |  |   hisnode *Found; | 
					
						
							|  |  |  |   double res; | 
					
						
							|  |  |  |   double value; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   if (Cudd_IsConstant(node)) { | 
					
						
							|  |  |  |     value = Cudd_V(node); | 
					
						
							|  |  |  |     if (comp) { | 
					
						
							|  |  |  |       return 0.0; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       return 1.0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     Found = GetNode1(MyManager.varmap.bVar2mVar, MyManager.his, | 
					
						
							|  |  |  |                      MyManager.varmap.varstart, node); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |     if (Found != NULL) { | 
					
						
							|  |  |  |       return Found->dvalue; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       index = Cudd_NodeReadIndex(node); | 
					
						
							|  |  |  |       mVarIndex = MyManager.varmap.bVar2mVar[index]; | 
					
						
							|  |  |  |       v = MyManager.varmap.mvars[mVarIndex]; | 
					
						
							|  |  |  |       nBit = v.nBit; | 
					
						
							|  |  |  |       res = ProbBool(MyManager, node, 0, nBit, 0, v, comp); | 
					
						
							|  |  |  |       AddNode1(MyManager.varmap.bVar2mVar, MyManager.his, | 
					
						
							|  |  |  |                MyManager.varmap.varstart, node, res, 0, NULL); | 
					
						
							|  |  |  |       return res; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | double ProbBool(extmanager MyManager, DdNode *node, int bits, int nBit, | 
					
						
							|  |  |  |                 int posBVar, variable v, int comp) | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | /* explores a group of binary variables making up the multivalued variable v */ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   DdNode *T, *F; | 
					
						
							|  |  |  |   double p, res; | 
					
						
							|  |  |  |   double *probs; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |   int index; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   probs = v.probabilities; | 
					
						
							|  |  |  |   if (nBit == 0) { | 
					
						
							|  |  |  |     if (bits >= v.nVal) { | 
					
						
							|  |  |  |       return 0.0; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       p = probs[bits]; | 
					
						
							|  |  |  |       res = p * Prob(MyManager, node, comp); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |       return res; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     index = Cudd_NodeReadIndex(node); | 
					
						
							|  |  |  |     if (correctPosition(index, v, posBVar)) { | 
					
						
							| 
									
										
										
										
											2010-03-21 11:49:19 +01:00
										 |  |  |       T = Cudd_T(node); | 
					
						
							|  |  |  |       F = Cudd_E(node); | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |       bits = bits << 1; | 
					
						
							|  |  |  |       res = ProbBool(MyManager, T, bits + 1, nBit - 1, posBVar + 1, v, comp); | 
					
						
							|  |  |  |       comp = (!comp && Cudd_IsComplement(F)) || (comp && !Cudd_IsComplement(F)); | 
					
						
							|  |  |  |       res = res + ProbBool(MyManager, F, bits, nBit - 1, posBVar + 1, v, comp); | 
					
						
							|  |  |  |       return res; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       bits = bits << 1; | 
					
						
							|  |  |  |       res = ProbBool(MyManager, node, bits + 1, nBit - 1, posBVar + 1, v, comp); | 
					
						
							|  |  |  |       res = | 
					
						
							|  |  |  |           res + ProbBool(MyManager, node, bits, nBit - 1, posBVar + 1, v, comp); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  |       return res; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | int correctPosition(int index, variable v, int posBVar) | 
					
						
							|  |  |  | /* returns 1 is the boolean variable with index posBVar is in the correct
 | 
					
						
							|  |  |  | position | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | currently explored by ProbBool */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   int bvar; | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   bvar = v.booleanVars[posBVar]; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   return (bvar == index); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  | double ret_prob(extmanager MyManager, DdNode *bdd) { | 
					
						
							|  |  |  |   double prob; | 
					
						
							|  |  |  |   /* dividend is a global variable used by my_hash
 | 
					
						
							|  |  |  |      it is equal to an unsigned int with binary representation 11..1 */ | 
					
						
							|  |  |  |   prob = Prob(MyManager, bdd, Cudd_IsComplement(bdd)); | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 14:50:47 -05:00
										 |  |  |   return prob; | 
					
						
							| 
									
										
										
										
											2010-03-18 16:11:21 +01:00
										 |  |  | } |