001: package org.zilonis.network.alpha;
002:
003: /**
004: * Copyright (c) 2005 Elie Levy <elie.levy@zilonis.org>
005: * All rights reserved
006: *
007: * This License governs use of the accompanying Software, and your use of the
008: * Software constitutes acceptance of this license.
009: *
010: * You may use this Software for any non-commercial purpose, subject to the
011: * restrictions in this license. Some purposes which can be non-commercial are
012: * teaching, academic research, and personal experimentation. You may also
013: * distribute this Software with books or other teaching materials, or publish
014: * the Software on websites, that are intended to teach the use of the
015: * Software.
016: *
017: *
018: * You may not use or distribute this Software or any derivative works in any
019: * form for commercial purposes. Examples of commercial purposes would be
020: * running business operations, licensing, leasing, or selling the Software, or
021: * distributing the Software for use with commercial products.
022: *
023: * You may modify this Software and distribute the modified Software for
024: * non-commercial purposes, however, you may not grant rights to the Software
025: * or derivative works that are broader than those provided by this License.
026: * For example, you may not distribute modifications of the Software under
027: * terms that would permit commercial use, or under terms that purport to
028: * require the Software or derivative works to be sublicensed to others.
029: *
030: * You may use any information in intangible form that you remember after
031: * accessing the Software. However, this right does not grant you a license to
032: * any of the copyrights or patents for anything you might create using such
033: * information.
034: *
035: * In return, we simply require that you agree:
036: *
037: * Not to remove any copyright or other notices from the Software.
038: *
039: *
040: * That if you distribute the Software in source or object form, you will
041: * include a verbatim copy of this license.
042: *
043: *
044: * That if you distribute derivative works of the Software in source code form
045: * you do so only under a license that includes all of the provisions of this
046: * License, and if you distribute derivative works of the Software solely in
047: * object form you do so only under a license that complies with this License.
048: *
049: *
050: * That if you have modified the Software or created derivative works, and
051: * distribute such modifications or derivative works, you will cause the
052: * modified files to carry prominent notices so that recipients know that they
053: * are not receiving the original Software. Such notices must state: (i) that
054: * you have changed the Software; and (ii) the date of any changes.
055: *
056: *
057: * THAT THE SOFTWARE COMES "AS IS", WITH NO WARRANTIES. THIS MEANS NO EXPRESS,
058: * IMPLIED OR STATUTORY WARRANTY, INCLUDING WITHOUT LIMITATION, WARRANTIES OF
059: * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR ANY WARRANTY OF TITLE
060: * OR NON-INFRINGEMENT. ALSO, YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU
061: * DISTRIBUTE THE SOFTWARE OR DERIVATIVE WORKS.
062: *
063: *
064: * THAT NEITHER ZILONIS NOR THE AUTHOR WILL BE LIABLE FOR ANY DAMAGES RELATED
065: * TO THE SOFTWARE OR THIS LICENSE, INCLUDING DIRECT, INDIRECT, SPECIAL,
066: * CONSEQUENTIAL OR INCIDENTAL DAMAGES, TO THE MAXIMUM EXTENT THE LAW PERMITS,
067: * NO MATTER WHAT LEGAL THEORY IT IS BASED ON. ALSO, YOU MUST PASS THIS
068: * LIMITATION OF LIABILITY ON WHENEVER YOU DISTRIBUTE THE SOFTWARE OR
069: * DERIVATIVE WORKS.
070: *
071: *
072: * That if you sue anyone over patents that you think may apply to the Software
073: * or anyone's use of the Software, your license to the Software ends
074: * automatically.
075: *
076: *
077: * That your rights under the License end automatically if you breach it in any
078: * way.
079: *
080: *
081: * Elie Levy reserves all rights not expressly granted to you in this
082: * license.
083: *
084: */
085:
086: import static org.zilonis.symbol.Triplet.ATTRIBUTE;
087: import static org.zilonis.symbol.Triplet.IDENTIFIER;
088: import static org.zilonis.symbol.Triplet.VALUE;
089:
090: import java.util.HashMap;
091: import java.util.Iterator;
092: import java.util.concurrent.ConcurrentHashMap;
093:
094: import org.zilonis.network.WME;
095: import org.zilonis.scope.Scope;
096: import org.zilonis.symbol.Triplet;
097:
098: public class AlphaNetwork {
099:
100: private ConcurrentHashMap<String, AlphaMemory> alphaNetwork;
101:
102: public AlphaNetwork() {
103: alphaNetwork = new ConcurrentHashMap<String, AlphaMemory>();
104: }
105:
106: public void addWME(Scope scope, WME wme) {
107: for (int i = 0; i < 8; ++i) {
108: AlphaMemory alphaMemory = alphaNetwork.get(getKey(i, wme
109: .getTriplet()));
110: if (alphaMemory != null)
111: alphaMemory.rightActivate(scope, wme);
112: }
113: }
114:
115: public AlphaMemory getAlphaMemory(Scope scope, Triplet condition) {
116: String alphaKey = getKey(condition);
117: AlphaMemory alphaMemory = alphaNetwork.get(alphaKey);
118: if (alphaMemory == null) {
119: alphaMemory = new AlphaMemory(condition);
120: alphaNetwork.put(alphaKey, alphaMemory);
121: initializeAlphaMemory(scope, alphaMemory, condition);
122: }
123: return alphaMemory;
124: }
125:
126: public void initializeAlphaMemory(Scope scope,
127: AlphaMemory alphaMemory, Triplet condition) {
128: AlphaMemory moreGeneralAlphaMemory = null;
129: if (!condition.isVariable(Triplet.IDENTIFIER)) {
130: Triplet moreGeneralCondition = new Triplet("?c", condition
131: .get(Triplet.ATTRIBUTE), condition
132: .get(Triplet.VALUE));
133: moreGeneralAlphaMemory = getAlphaMemory(scope,
134: moreGeneralCondition);
135: }
136: if ((moreGeneralAlphaMemory == null)
137: && (!condition.isVariable(Triplet.VALUE))) {
138: Triplet moreGeneralCondition = new Triplet("?c", condition
139: .get(Triplet.ATTRIBUTE), "?v");
140: moreGeneralAlphaMemory = getAlphaMemory(scope,
141: moreGeneralCondition);
142: }
143: Iterator<WME> iterator = (moreGeneralAlphaMemory != null) ? moreGeneralAlphaMemory
144: .getWMEIterable(scope).iterator()
145: : scope.getWMEIterator();
146: while (iterator.hasNext()) {
147: WME wme = iterator.next();
148: if (wme.getTriplet().match(condition))
149: alphaMemory.rightActivate(scope, wme);
150: }
151: }
152:
153: public String getKey(Triplet condition) {
154: return (condition.isVariable(IDENTIFIER) ? "*" : condition
155: .get(IDENTIFIER))
156: + "_"
157: + (condition.isVariable(ATTRIBUTE) ? "*" : condition
158: .get(ATTRIBUTE))
159: + "_"
160: + (condition.isVariable(VALUE) ? "*" : condition
161: .get(VALUE));
162: }
163:
164: public String getKey(int i, Triplet wme) {
165: switch (i) {
166: case 0:
167: return wme.get(IDENTIFIER) + "_" + wme.get(ATTRIBUTE) + "_"
168: + wme.get(VALUE);
169: case 1:
170: return wme.get(IDENTIFIER) + "_" + wme.get(ATTRIBUTE)
171: + "_*";
172: case 2:
173: return wme.get(IDENTIFIER) + "_*_" + wme.get(VALUE);
174: case 3:
175: return wme.get(IDENTIFIER) + "_*_*";
176: case 4:
177: return "*_" + wme.get(ATTRIBUTE) + "_" + wme.get(VALUE);
178: case 5:
179: return "*_" + wme.get(ATTRIBUTE) + "_*";
180: case 6:
181: return "*_*_" + wme.get(VALUE);
182: case 7:
183: return "*_*_*";
184: }
185: return "";
186: }
187:
188: }
|