samples/apifest1/day2/pinbasedsolution/src/org/netbeans/apifest/boolcircuit/Circuit.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:52:45 +0200
changeset 52 4257f4cf226b
permissions -rw-r--r--
Adding samples from API fest to the repository, including pieces of their code in the document, not just links
     1 /*
     2  * The contents of this file are subject to the terms of the Common Development
     3  * and Distribution License (the License). You may not use this file except in
     4  * compliance with the License.
     5  *
     6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
     7  * or http://www.netbeans.org/cddl.txt.
     8  *
     9  * When distributing Covered Code, include this CDDL Header Notice in each file
    10  * and include the License file at http://www.netbeans.org/cddl.txt.
    11  * If applicable, add the following below the CDDL Header, with the fields
    12  * enclosed by brackets [] replaced by your own identifying information:
    13  * "Portions Copyrighted [year] [name of copyright owner]"
    14  *
    15  * The Original Software is NetBeans. The Initial Developer of the Original
    16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
    17  * Microsystems, Inc. All Rights Reserved.
    18  */
    19 
    20 package org.netbeans.apifest.boolcircuit;
    21 
    22 /**
    23  * A representation of a logic circuit.
    24  * It can only be constructed from an element net.
    25  * Usage:
    26  * <pre>
    27  *  Circuit c = Circuit.construct(
    28  *      Element.createOr(
    29  *          Element.createAnd(
    30  *              Element.createInput(0),
    31  *              Element.createInput(1)
    32  *          ),
    33  *          Element.createInput(2)
    34  *      )
    35  *  );
    36  *            
    37  *  boolean val = c.evaluate(false, true, false));
    38  * </pre>
    39  */
    40 public class Circuit {
    41     Element root;
    42     int pins;
    43     
    44     private Circuit(Element elem) {
    45         root = elem;
    46         pins = 1 + root.maxInput();
    47     }
    48     
    49     /**
    50      * Evaluate output of the circuit for given inputs.
    51      * For general 
    52      */
    53     public boolean evaluate(Boolean ... inputs) throws UnstableException {
    54         if (inputs.length != pins) throw new IllegalArgumentException("Wrong number of inputs, " + pins + " expected.");
    55         double[] inp = new double[pins];
    56         for (int i=0; i<pins; i++) inp[i] = inputs[i] ? 1 : 0;
    57         double res = root.evaluate(inp);
    58         return res > 0.5;
    59     }
    60 
    61     public double evaluate(double ... inputs) throws UnstableException {
    62         if (inputs.length != pins) throw new IllegalArgumentException("Wrong number of inputs, " + pins + " expected.");
    63         
    64         double[] inp = new double[pins]; // defensive copy with a check
    65         for (int i=0; i<inputs.length; i++) {
    66             if (inputs[i] < 0.0 || inputs[i] > 1.0) {
    67                 throw new IllegalArgumentException("Out of range, pin " + i + ", value=" + inputs[i]);
    68             }
    69             inp[i] = inputs[i];
    70         }
    71         
    72         return root.evaluate(inp);
    73     }
    74     
    75     /**
    76      * Creates a circuit from a preconstructed element net.
    77      *
    78      * @param a top-level element representing the logic net.
    79      * @return a circuit prepared for evaluating result for given inputs.
    80      * 
    81      */
    82     public static Circuit construct(Element elem) {
    83         return new Circuit(elem);
    84     }
    85     
    86 }