FuzzyKit/docsets/.docset/Contents/Resources/Documents/index.html

328 lines
24 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<title> Reference</title>
<link rel="stylesheet" type="text/css" href="css/jazzy.css" />
<link rel="stylesheet" type="text/css" href="css/highlight.css" />
<meta charset='utf-8'>
<script src="js/jquery.min.js" defer></script>
<script src="js/jazzy.js" defer></script>
<script src="js/lunr.min.js" defer></script>
<script src="js/typeahead.jquery.js" defer></script>
<script src="js/jazzy.search.js" defer></script>
</head>
<body>
<a title=" Reference"></a>
<header>
<div class="content-wrapper">
<p><a href="index.html"> Docs</a> (7% documented)</p>
<div class="header-right">
<form role="search" action="search.json">
<input type="text" placeholder="Search documentation" data-typeahead>
</form>
</div>
</div>
</header>
<div class="content-wrapper">
<p id="breadcrumbs">
<a href="index.html"> Reference</a>
<img id="carat" src="img/carat.png" alt=""/>
Reference
</p>
</div>
<div class="content-wrapper">
<nav class="sidebar">
<ul class="nav-groups">
<li class="nav-group-name">
<a href="Classes.html">Classes</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Classes/FuzzyLogicController.html">FuzzyLogicController</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Enums.html">Enumerations</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Enums/ComplementFunction.html">ComplementFunction</a>
</li>
<li class="nav-group-task">
<a href="Enums/CompositionMethod.html">CompositionMethod</a>
</li>
<li class="nav-group-task">
<a href="Enums/DifferenceFunction.html">DifferenceFunction</a>
</li>
<li class="nav-group-task">
<a href="Enums/ImplicationMethod.html">ImplicationMethod</a>
</li>
<li class="nav-group-task">
<a href="Enums/SNormFunction.html">SNormFunction</a>
</li>
<li class="nav-group-task">
<a href="Enums/SymmetricDifferenceFunction.html">SymmetricDifferenceFunction</a>
</li>
<li class="nav-group-task">
<a href="Enums/TNormFunction.html">TNormFunction</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Functions.html">Functions</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Functions.html#/s:10FuzzyLogic1nopyAA0A8NegationVy5InputQzGxAA0A11PropositionRzlF">!(_:)</a>
</li>
<li class="nav-group-task">
<a href="Functions.html#/s:10FuzzyLogic2aaoiyAA0A11ConjunctionVy5InputQz_AEQy_tGx_q_tAA0A11PropositionRzAaIR_r0_lF">&amp;&amp;(_:_:)</a>
</li>
<li class="nav-group-task">
<a href="Functions.html#/s:10FuzzyLogic3ssgoiyAA0A4RuleVy5InputQz_AEQy_tGx_q_tAA0A11PropositionRzAaIR_r0_lF">--&gt;(_:_:)</a>
</li>
<li class="nav-group-task">
<a href="Functions.html#/s:10FuzzyLogic2xxoiyAA0A3XORVy5InputQz_AEQy_tGx_q_tAA0A11PropositionRzAaIR_r0_lF">^^(_:_:)</a>
</li>
<li class="nav-group-task">
<a href="Functions.html#/s:10FuzzyLogic2oooiyAA0A11DisjunctionVy5InputQz_AEQy_tGx_q_tAA0A11PropositionRzAaIR_r0_lF">||(_:_:)</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Protocols.html">Protocols</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Protocols/AnyFuzzySetRepresentable.html">AnyFuzzySetRepresentable</a>
</li>
<li class="nav-group-task">
<a href="Protocols/FuzzyImplicationCapable.html">FuzzyImplicationCapable</a>
</li>
<li class="nav-group-task">
<a href="Protocols/FuzzyProposition.html">FuzzyProposition</a>
</li>
<li class="nav-group-task">
<a href="Protocols/FuzzySet.html">FuzzySet</a>
</li>
<li class="nav-group-task">
<a href="Protocols/FuzzySetOperations.html">FuzzySetOperations</a>
</li>
<li class="nav-group-task">
<a href="Protocols/LinguisticVariable.html">LinguisticVariable</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Structs.html">Structures</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Structs/AnyFuzzySet.html">AnyFuzzySet</a>
</li>
<li class="nav-group-task">
<a href="Structs/BinaryCartesianProduct.html">BinaryCartesianProduct</a>
</li>
<li class="nav-group-task">
<a href="Structs/BinaryFuzzyRelation.html">BinaryFuzzyRelation</a>
</li>
<li class="nav-group-task">
<a href="Structs/DiscreteMutableFuzzySet.html">DiscreteMutableFuzzySet</a>
</li>
<li class="nav-group-task">
<a href="Structs/DynamicLinguisticVariable.html">DynamicLinguisticVariable</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzyConjunction.html">FuzzyConjunction</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzyDisjunction.html">FuzzyDisjunction</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzyNegation.html">FuzzyNegation</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzyRelationsComposition.html">FuzzyRelationsComposition</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzyRule.html">FuzzyRule</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzyRuleBase.html">FuzzyRuleBase</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzyRuleBase/FuzzyRuleBaseBuilder.html"> FuzzyRuleBaseBuilder</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzySetComposition.html">FuzzySetComposition</a>
</li>
<li class="nav-group-task">
<a href="Structs/FuzzyXOR.html">FuzzyXOR</a>
</li>
<li class="nav-group-task">
<a href="Structs/HomogenousFuzzyRelation.html">HomogenousFuzzyRelation</a>
</li>
<li class="nav-group-task">
<a href="Structs/IterableFuzzySet.html">IterableFuzzySet</a>
</li>
<li class="nav-group-task">
<a href="Structs/IterableFuzzySet/Element.html"> Element</a>
</li>
<li class="nav-group-task">
<a href="Structs/MembershipFunction.html">MembershipFunction</a>
</li>
<li class="nav-group-task">
<a href="Structs/ModifiableLinguisticVariable.html">ModifiableLinguisticVariable</a>
</li>
<li class="nav-group-task">
<a href="Structs/OperationSettings.html">OperationSettings</a>
</li>
<li class="nav-group-task">
<a href="Structs/SimpleLinguisticVariable.html">SimpleLinguisticVariable</a>
</li>
<li class="nav-group-task">
<a href="Structs/TernaryFuzzyRelation.html">TernaryFuzzyRelation</a>
</li>
<li class="nav-group-task">
<a href="Structs/TriangularFuzzyNumber.html">TriangularFuzzyNumber</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Typealiases.html">Type Aliases</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Typealiases.html#/s:9FuzzySets5Gradea">Grade</a>
</li>
</ul>
</li>
</ul>
</nav>
<article class="main-content">
<section>
<section class="section">
<p><img src="Resources/cover.png" alt="Cover photo"></p>
<h1 id='fuzzykit' class='heading'>FuzzyKit</h1>
<p>Fuzzy sets and fuzzy logic theory implementations.</p>
<p><img src="https://img.shields.io/badge/MADE%20FOR-SWIFT-orange?style=for-the-badge&logo=swift" alt="Made for Swift">
<img src="https://img.shields.io/badge/SWIFT%20PACKAGE%20MANAGER-SUPPORTED-green?style=for-the-badge&logo=SWIFT" alt="Swift Package Manager supported"></p>
<p><a href="https://github.com/allexks/FuzzyKit/actions/workflows/build-and-test.yml"><img src="https://github.com/allexks/FuzzyKit/actions/workflows/build-and-test.yml/badge.svg" alt="Build &amp; Test"></a>
<img src="https://img.shields.io/github/license/allexks/FuzzyKit" alt="License"></p>
<h2 id='example-usage' class='heading'>Example Usage</h2>
<pre class="highlight swift"><code><span class="kd">import</span> <span class="kt">FuzzyKit</span>
<span class="kd">enum</span> <span class="kt">Funding</span> <span class="p">{</span> <span class="k">case</span> <span class="n">adequate</span><span class="p">,</span> <span class="n">marginal</span><span class="p">,</span> <span class="n">inadequate</span> <span class="p">}</span>
<span class="kd">enum</span> <span class="kt">Staffing</span> <span class="p">{</span> <span class="k">case</span> <span class="n">small</span><span class="p">,</span> <span class="n">large</span> <span class="p">}</span>
<span class="kd">enum</span> <span class="kt">Risk</span> <span class="p">{</span> <span class="k">case</span> <span class="n">low</span><span class="p">,</span> <span class="n">normal</span><span class="p">,</span> <span class="n">high</span> <span class="p">}</span>
<span class="k">let</span> <span class="nv">funding</span><span class="p">:</span> <span class="kt">SimpleLinguisticVariable</span><span class="o">&lt;</span><span class="kt">Funding</span><span class="p">,</span> <span class="kt">AnyFuzzySet</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span>
<span class="o">.</span><span class="nv">inadequate</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">membershipFunction</span><span class="p">:</span> <span class="o">.</span><span class="nf">leftOpen</span><span class="p">(</span><span class="nv">slopeStart</span><span class="p">:</span> <span class="mi">15</span><span class="p">,</span> <span class="nv">slopeEnd</span><span class="p">:</span> <span class="mi">35</span><span class="p">)),</span>
<span class="o">.</span><span class="nv">marginal</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">membershipFunction</span><span class="p">:</span> <span class="o">.</span><span class="nf">triangular</span><span class="p">(</span><span class="nv">minimum</span><span class="p">:</span> <span class="mi">21</span><span class="p">,</span> <span class="nv">peak</span><span class="p">:</span> <span class="mi">41</span><span class="p">,</span> <span class="nv">maximum</span><span class="p">:</span> <span class="mi">61</span><span class="p">)),</span>
<span class="o">.</span><span class="nv">adequate</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">membershipFunction</span><span class="p">:</span> <span class="o">.</span><span class="nf">rightOpen</span><span class="p">(</span><span class="nv">slopeStart</span><span class="p">:</span> <span class="mi">55</span><span class="p">,</span> <span class="nv">slopeEnd</span><span class="p">:</span> <span class="mi">75</span><span class="p">)),</span>
<span class="p">]</span>
<span class="k">let</span> <span class="nv">staffing</span><span class="p">:</span> <span class="kt">SimpleLinguisticVariable</span><span class="o">&lt;</span><span class="kt">Staffing</span><span class="p">,</span> <span class="kt">AnyFuzzySet</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span>
<span class="o">.</span><span class="nv">small</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">membershipFunction</span><span class="p">:</span> <span class="o">.</span><span class="nf">leftOpen</span><span class="p">(</span><span class="nv">slopeStart</span><span class="p">:</span> <span class="mi">29</span><span class="p">,</span> <span class="nv">slopeEnd</span><span class="p">:</span> <span class="mi">69</span><span class="p">)),</span>
<span class="o">.</span><span class="nv">large</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">membershipFunction</span><span class="p">:</span> <span class="o">.</span><span class="nf">rightOpen</span><span class="p">(</span><span class="nv">slopeStart</span><span class="p">:</span> <span class="mi">37</span><span class="p">,</span> <span class="nv">slopeEnd</span><span class="p">:</span> <span class="mi">77</span><span class="p">)),</span>
<span class="p">]</span>
<span class="k">let</span> <span class="nv">risk</span><span class="p">:</span> <span class="kt">SimpleLinguisticVariable</span><span class="o">&lt;</span><span class="kt">Risk</span><span class="p">,</span> <span class="kt">AnyFuzzySet</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span>
<span class="o">.</span><span class="nv">low</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">membershipFunction</span><span class="p">:</span> <span class="o">.</span><span class="nf">leftOpen</span><span class="p">(</span><span class="nv">slopeStart</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> <span class="nv">slopeEnd</span><span class="p">:</span> <span class="mi">40</span><span class="p">)),</span>
<span class="o">.</span><span class="nv">normal</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">membershipFunction</span><span class="p">:</span> <span class="o">.</span><span class="nf">triangular</span><span class="p">(</span><span class="nv">minimum</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> <span class="nv">peak</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span> <span class="nv">maximum</span><span class="p">:</span> <span class="mi">80</span><span class="p">)),</span>
<span class="o">.</span><span class="nv">high</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">membershipFunction</span><span class="p">:</span> <span class="o">.</span><span class="nf">rightOpen</span><span class="p">(</span><span class="nv">slopeStart</span><span class="p">:</span> <span class="mi">60</span><span class="p">,</span> <span class="nv">slopeEnd</span><span class="p">:</span> <span class="mi">80</span><span class="p">)),</span>
<span class="p">]</span>
<span class="k">let</span> <span class="nv">Ø</span> <span class="o">=</span> <span class="kt">AnyFuzzySet</span><span class="o">&lt;</span><span class="kt">Double</span><span class="o">&gt;.</span><span class="n">empty</span>
<span class="k">let</span> <span class="nv">ruleBase</span> <span class="o">=</span> <span class="kt">FuzzyRuleBase</span> <span class="p">{</span>
<span class="n">funding</span><span class="o">.</span><span class="nf">is</span><span class="p">(</span><span class="o">.</span><span class="n">adequate</span><span class="p">)</span> <span class="o">||</span> <span class="n">staffing</span><span class="o">.</span><span class="nf">is</span><span class="p">(</span><span class="o">.</span><span class="n">small</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">risk</span><span class="o">.</span><span class="nf">is</span><span class="p">(</span><span class="o">.</span><span class="n">low</span><span class="p">)</span>
<span class="n">funding</span><span class="o">.</span><span class="nf">is</span><span class="p">(</span><span class="o">.</span><span class="n">marginal</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">staffing</span><span class="o">.</span><span class="nf">is</span><span class="p">(</span><span class="o">.</span><span class="n">large</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">risk</span><span class="o">.</span><span class="nf">is</span><span class="p">(</span><span class="o">.</span><span class="n">normal</span><span class="p">)</span>
<span class="n">funding</span><span class="o">.</span><span class="nf">is</span><span class="p">(</span><span class="o">.</span><span class="n">inadequate</span><span class="p">)</span> <span class="o">||</span> <span class="kt">Ø</span> <span class="o">--&gt;</span> <span class="n">risk</span><span class="o">.</span><span class="nf">is</span><span class="p">(</span><span class="o">.</span><span class="n">high</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">let</span> <span class="nv">flc</span> <span class="o">=</span> <span class="kt">FuzzyLogicController</span><span class="p">(</span><span class="nv">rules</span><span class="p">:</span> <span class="n">ruleBase</span><span class="p">,</span> <span class="nv">settings</span><span class="p">:</span> <span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">implication</span><span class="p">:</span> <span class="o">.</span><span class="n">mamdani</span><span class="p">))</span>
<span class="n">flc</span><span class="o">.</span><span class="nf">consequenceGrade</span><span class="p">(</span><span class="nv">for</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span> <span class="nv">usingSingletonFact</span><span class="p">:</span> <span class="p">(</span><span class="mf">8.8</span><span class="p">,</span> <span class="mi">42</span><span class="p">))</span> <span class="c1">// result is 0.675</span>
</code></pre>
<h2 id='modules' class='heading'>Modules</h2>
<p>Using the Swift Package Manager, don&rsquo;t forget to add the package as a dependency to your <code>Package.swift</code> file:</p>
<pre class="highlight diff"><code>dependencies: [
<span class="gi">+ .package(url: "https://github.com/allexks/FuzzyKit", .upToNextMajor(from: "0.1.0")),
</span>],
</code></pre>
<p>To be able to use everything from this package, you can import everything at once using this helper module:</p>
<pre class="highlight diff"><code>.target(
name: "...",
dependencies: [
<span class="gi">+ .product(name: "FuzzyKit", package: "FuzzyKit"),
</span> ]
),
</code></pre>
<pre class="highlight swift"><code><span class="kd">import</span> <span class="kt">FuzzyKit</span>
</code></pre>
<p>Or alternatively, import only the specific modules needed:</p>
<pre class="highlight diff"><code>.target(
name: "...",
dependencies: [
<span class="gi">+ .product(name: "FuzzySets", package: "FuzzyKit"),
+ .product(name: "FuzzyNumbers", package: "FuzzyKit"),
+ .product(name: "FuzzyRelations", package: "FuzzyKit"),
+ .product(name: "FuzzyLogic", package: "FuzzyKit"),
</span> ]
),
</code></pre>
<pre class="highlight swift"><code><span class="kd">import</span> <span class="kt">FuzzySets</span>
<span class="kd">import</span> <span class="kt">FuzzyNumbers</span>
<span class="kd">import</span> <span class="kt">FuzzyRelations</span>
<span class="kd">import</span> <span class="kt">FuzzyLogic</span>
</code></pre>
<h2 id='api-reference' class='heading'>API Reference</h2>
<p>API Reference automatically collected with <code>jazzy</code> is published <a href="https://allexks.github.io/FuzzyKit">here</a> with each new release.</p>
<h2 id='code-fuzzysets-code-module' class='heading'><code>FuzzySets</code> Module</h2>
<h3 id='code-protocol-fuzzyset-code' class='heading'><code>protocol FuzzySet</code></h3>
<p>This abstraction requires a fuzzy set to provide a <code>grade(forElement:)</code> method which accepts a parameter of an <code>associatedtype Universe</code> and returns its membership <code><a href="Typealiases.html#/s:9FuzzySets5Gradea">Grade</a></code> in the set. There are 3 provided concrete implementations in this module:</p>
<ol>
<li><p><code>struct AnyFuzzySet</code> - allows type erasure. It only stores a <code><a href="Structs/MembershipFunction.html">MembershipFunction</a></code> and has non-mutable methods.</p></li>
<li><p><code>struct IterableFuzzySet</code> - stores a <code><a href="Structs/MembershipFunction.html">MembershipFunction</a></code> as well as a <code>Sequence</code> of elements of the associated type <code>Universe</code>. Implements <code>Sequence</code> so that it can easily be iterated over them. The elements of the iteration over an <code><a href="Structs/IterableFuzzySet.html">IterableFuzzySet</a></code> are <code>struct</code>s containing <code>grade</code> and <code>element</code> properties. It has non-mutable methods only. Includes <code>support</code>, <code>core</code> and <code>height</code> computed properties.</p></li>
<li><p><code>struct DiscreteMutableFuzzySet</code> - it is &ldquo;discrete&rdquo; because it doesn&rsquo;t stores a <code><a href="Structs/MembershipFunction.html">MembershipFunction</a></code> but instead keeps its elements and their grade in a <code>Dictionary</code>, and it is &ldquo;mutable&rdquo; because it contains mutable equivalents of all other methods that operate over the set (including <code>subscript</code>). A default value of <code>0</code> is returned for the grade of an element that is not in the dictionary (a different default value can be provided as well). Includes <code>support</code>, <code>core</code> and <code>height</code> computed properties. A bonus feature is its debug print using Zadeh&rsquo;s notation.</p></li>
</ol>
<p>Convertions between the 3 types are easy and possible using the <code>eraseToAnyFuzzySet</code>, <code>makeIterable</code> and <code>makeDiscreteMutable</code> methods defined on them.</p>
<h3 id='code-protocol-fuzzysetoperations-code' class='heading'><code>protocol FuzzySetOperations</code></h3>
<p>All 3 concrete types implement it. It requires the following methods that operate on fuzzy sets:</p>
<ul>
<li><p><code>alphaCut(_:alpha:)</code></p></li>
<li><p><code>complement(method:)</code></p></li>
<li><p><code>intersection(_:method:)</code></p></li>
<li><p><code>union(_:method:)</code></p></li>
<li><p><code>difference(_:method:)</code></p></li>
<li><p><code>symmetricDifference(_:method:)</code></p></li>
<li><p><code>power(_:n:)</code></p></li>
<li><p><code>appliedCustomFunction(_:function:)</code></p></li>
</ul>
<h2 id='license' class='heading'>License</h2>
<p><a href="LICENSE">MIT</a></p>
<p><a href="https://app.fossa.com/projects/git%2Bgithub.com%2Fallexks%2FFuzzyKit?ref=badge_large"><img src="https://app.fossa.com/api/projects/git%2Bgithub.com%2Fallexks%2FFuzzyKit.svg?type=large" alt="FOSSA Status"></a></p>
</section>
</section>
<section id="footer">
<p>&copy; 2022 <a class="link" href="" target="_blank" rel="external noopener">Alexander Ignatov</a>. All rights reserved. (Last updated: 2022-02-08)</p>
<p>Generated by <a class="link" href="https://github.com/realm/jazzy" target="_blank" rel="external noopener">jazzy ♪♫ v0.14.1</a>, a <a class="link" href="https://realm.io" target="_blank" rel="external noopener">Realm</a> project.</p>
</section>
</article>
</div>
</body>
</html>