diff options
Diffstat (limited to 'examples/hybrid')
-rw-r--r-- | examples/hybrid/ObstacleAvoidance.R | 86 | ||||
-rw-r--r-- | examples/hybrid/ObstacleAvoidance.cpp | 75 | ||||
-rw-r--r-- | examples/hybrid/ObstacleAvoidance.fcl | 49 | ||||
-rw-r--r-- | examples/hybrid/ObstacleAvoidance.fis | 43 | ||||
-rw-r--r-- | examples/hybrid/ObstacleAvoidance.fld | 1025 | ||||
-rw-r--r-- | examples/hybrid/ObstacleAvoidance.fll | 43 | ||||
-rw-r--r-- | examples/hybrid/ObstacleAvoidance.java | 86 | ||||
-rw-r--r-- | examples/hybrid/ObstacleAvoidance.pdf | bin | 0 -> 45584 bytes | |||
-rw-r--r-- | examples/hybrid/tipper.R | 109 | ||||
-rw-r--r-- | examples/hybrid/tipper.cpp | 92 | ||||
-rw-r--r-- | examples/hybrid/tipper.fcl | 66 | ||||
-rw-r--r-- | examples/hybrid/tipper.fis | 57 | ||||
-rw-r--r-- | examples/hybrid/tipper.fld | 1025 | ||||
-rw-r--r-- | examples/hybrid/tipper.fll | 63 | ||||
-rw-r--r-- | examples/hybrid/tipper.java | 103 | ||||
-rw-r--r-- | examples/hybrid/tipper.pdf | bin | 0 -> 32309 bytes |
16 files changed, 2922 insertions, 0 deletions
diff --git a/examples/hybrid/ObstacleAvoidance.R b/examples/hybrid/ObstacleAvoidance.R new file mode 100644 index 0000000..5a94543 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.R @@ -0,0 +1,86 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "ObstacleAvoidance" +engine.fll = "Engine: ObstacleAvoidance +InputVariable: obstacle + enabled: true + range: 0.000 1.000 + lock-range: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: mSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: tsSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: left Constant 0.333 + term: right Constant 0.666 +RuleBlock: mamdani + enabled: true + conjunction: none + disjunction: none + implication: AlgebraicProduct + activation: General + rule: if obstacle is left then mSteer is right + rule: if obstacle is right then mSteer is left +RuleBlock: takagiSugeno + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if obstacle is left then tsSteer is right + rule: if obstacle is right then tsSteer is left" + +engine.fldFile = "ObstacleAvoidance.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(obstacle, mSteer)) + + geom_line(aes(color=mSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("obstacle vs mSteer") + +engine.plot.o1_i1 = ggplot(engine.df, aes(obstacle, mSteer)) + + geom_line(aes(color=mSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("mSteer vs obstacle") + +engine.plot.i1_o2 = ggplot(engine.df, aes(obstacle, tsSteer)) + + geom_line(aes(color=tsSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("obstacle vs tsSteer") + +engine.plot.o2_i1 = ggplot(engine.df, aes(obstacle, tsSteer)) + + geom_line(aes(color=tsSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("tsSteer vs obstacle") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, engine.plot.i1_o2, engine.plot.o2_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/hybrid/ObstacleAvoidance.cpp b/examples/hybrid/ObstacleAvoidance.cpp new file mode 100644 index 0000000..a5e42e1 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.cpp @@ -0,0 +1,75 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("ObstacleAvoidance"); +engine->setDescription(""); + +InputVariable* obstacle = new InputVariable; +obstacle->setName("obstacle"); +obstacle->setDescription(""); +obstacle->setEnabled(true); +obstacle->setRange(0.000, 1.000); +obstacle->setLockValueInRange(false); +obstacle->addTerm(new Ramp("left", 1.000, 0.000)); +obstacle->addTerm(new Ramp("right", 0.000, 1.000)); +engine->addInputVariable(obstacle); + +OutputVariable* mSteer = new OutputVariable; +mSteer->setName("mSteer"); +mSteer->setDescription(""); +mSteer->setEnabled(true); +mSteer->setRange(0.000, 1.000); +mSteer->setLockValueInRange(false); +mSteer->setAggregation(new Maximum); +mSteer->setDefuzzifier(new Centroid(100)); +mSteer->setDefaultValue(fl::nan); +mSteer->setLockPreviousValue(false); +mSteer->addTerm(new Ramp("left", 1.000, 0.000)); +mSteer->addTerm(new Ramp("right", 0.000, 1.000)); +engine->addOutputVariable(mSteer); + +OutputVariable* tsSteer = new OutputVariable; +tsSteer->setName("tsSteer"); +tsSteer->setDescription(""); +tsSteer->setEnabled(true); +tsSteer->setRange(0.000, 1.000); +tsSteer->setLockValueInRange(false); +tsSteer->setAggregation(new Maximum); +tsSteer->setDefuzzifier(new WeightedAverage("Automatic")); +tsSteer->setDefaultValue(fl::nan); +tsSteer->setLockPreviousValue(false); +tsSteer->addTerm(new Constant("left", 0.333)); +tsSteer->addTerm(new Constant("right", 0.666)); +engine->addOutputVariable(tsSteer); + +RuleBlock* mamdani = new RuleBlock; +mamdani->setName("mamdani"); +mamdani->setDescription(""); +mamdani->setEnabled(true); +mamdani->setConjunction(fl::null); +mamdani->setDisjunction(fl::null); +mamdani->setImplication(new AlgebraicProduct); +mamdani->setActivation(new General); +mamdani->addRule(Rule::parse("if obstacle is left then mSteer is right", engine)); +mamdani->addRule(Rule::parse("if obstacle is right then mSteer is left", engine)); +engine->addRuleBlock(mamdani); + +RuleBlock* takagiSugeno = new RuleBlock; +takagiSugeno->setName("takagiSugeno"); +takagiSugeno->setDescription(""); +takagiSugeno->setEnabled(true); +takagiSugeno->setConjunction(fl::null); +takagiSugeno->setDisjunction(fl::null); +takagiSugeno->setImplication(fl::null); +takagiSugeno->setActivation(new General); +takagiSugeno->addRule(Rule::parse("if obstacle is left then tsSteer is right", engine)); +takagiSugeno->addRule(Rule::parse("if obstacle is right then tsSteer is left", engine)); +engine->addRuleBlock(takagiSugeno); + + +} diff --git a/examples/hybrid/ObstacleAvoidance.fcl b/examples/hybrid/ObstacleAvoidance.fcl new file mode 100644 index 0000000..81a30a7 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.fcl @@ -0,0 +1,49 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK ObstacleAvoidance + +VAR_INPUT + obstacle: REAL; +END_VAR + +VAR_OUTPUT + mSteer: REAL; + tsSteer: REAL; +END_VAR + +FUZZIFY obstacle + RANGE := (0.000 .. 1.000); + TERM left := Ramp 1.000 0.000; + TERM right := Ramp 0.000 1.000; +END_FUZZIFY + +DEFUZZIFY mSteer + RANGE := (0.000 .. 1.000); + TERM left := Ramp 1.000 0.000; + TERM right := Ramp 0.000 1.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY tsSteer + RANGE := (0.000 .. 1.000); + TERM left := 0.333; + TERM right := 0.666; + METHOD : COGS; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK mamdani + ACT : PROD; + RULE 1 : if obstacle is left then mSteer is right + RULE 2 : if obstacle is right then mSteer is left +END_RULEBLOCK + +RULEBLOCK takagiSugeno + RULE 1 : if obstacle is left then tsSteer is right + RULE 2 : if obstacle is right then tsSteer is left +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/hybrid/ObstacleAvoidance.fis b/examples/hybrid/ObstacleAvoidance.fis new file mode 100644 index 0000000..1bf0476 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.fis @@ -0,0 +1,43 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='ObstacleAvoidance' +Type='hybrid' +Version=6.0 +NumInputs=1 +NumOutputs=2 +NumRules=4 +AndMethod='min' +OrMethod='max' +ImpMethod='prod' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='obstacle' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'rampmf',[1.000 0.000] +MF2='right':'rampmf',[0.000 1.000] + +[Output1] +Name='mSteer' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'rampmf',[1.000 0.000] +MF2='right':'rampmf',[0.000 1.000] + +[Output2] +Name='tsSteer' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'constant',[0.333] +MF2='right':'constant',[0.666] + +[Rules] +# RuleBlock mamdani +1.000 , 2.000 0.000 (1.000) : 1 +2.000 , 1.000 0.000 (1.000) : 1 +# RuleBlock takagiSugeno +1.000 , 0.000 2.000 (1.000) : 1 +2.000 , 0.000 1.000 (1.000) : 1 diff --git a/examples/hybrid/ObstacleAvoidance.fld b/examples/hybrid/ObstacleAvoidance.fld new file mode 100644 index 0000000..bd96696 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.fld @@ -0,0 +1,1025 @@ +obstacle mSteer tsSteer +0.000000000 0.666650000 0.666000000 +0.000977517 0.666650000 0.665674487 +0.001955034 0.666650000 0.665348974 +0.002932551 0.666650000 0.665023460 +0.003910068 0.666650000 0.664697947 +0.004887586 0.666650000 0.664372434 +0.005865103 0.666638485 0.664046921 +0.006842620 0.666625450 0.663721408 +0.007820137 0.666612389 0.663395894 +0.008797654 0.666599303 0.663070381 +0.009775171 0.666586193 0.662744868 +0.010752688 0.666573056 0.662419355 +0.011730205 0.666559894 0.662093842 +0.012707722 0.666546707 0.661768328 +0.013685239 0.666533494 0.661442815 +0.014662757 0.666520255 0.661117302 +0.015640274 0.666498518 0.660791789 +0.016617791 0.666472271 0.660466276 +0.017595308 0.666445974 0.660140762 +0.018572825 0.666419626 0.659815249 +0.019550342 0.666393229 0.659489736 +0.020527859 0.666366781 0.659164223 +0.021505376 0.666340282 0.658838710 +0.022482893 0.666313732 0.658513196 +0.023460411 0.666287131 0.658187683 +0.024437928 0.666260479 0.657862170 +0.025415445 0.666228313 0.657536657 +0.026392962 0.666188686 0.657211144 +0.027370479 0.666148986 0.656885630 +0.028347996 0.666109209 0.656560117 +0.029325513 0.666069358 0.656234604 +0.030303030 0.666029432 0.655909091 +0.031280547 0.665989429 0.655583578 +0.032258065 0.665949351 0.655258065 +0.033235582 0.665909196 0.654932551 +0.034213099 0.665868966 0.654607038 +0.035190616 0.665826169 0.654281525 +0.036168133 0.665773005 0.653956012 +0.037145650 0.665719742 0.653630499 +0.038123167 0.665666380 0.653304985 +0.039100684 0.665612917 0.652979472 +0.040078201 0.665559355 0.652653959 +0.041055718 0.665505693 0.652328446 +0.042033236 0.665451930 0.652002933 +0.043010753 0.665398066 0.651677419 +0.043988270 0.665344101 0.651351906 +0.044965787 0.665290034 0.651026393 +0.045943304 0.665223628 0.650700880 +0.046920821 0.665156655 0.650375367 +0.047898338 0.665089559 0.650049853 +0.048875855 0.665022339 0.649724340 +0.049853372 0.664954994 0.649398827 +0.050830890 0.664887525 0.649073314 +0.051808407 0.664819932 0.648747801 +0.052785924 0.664752213 0.648422287 +0.053763441 0.664684369 0.648096774 +0.054740958 0.664616398 0.647771261 +0.055718475 0.664539056 0.647445748 +0.056695992 0.664458237 0.647120235 +0.057673509 0.664377270 0.646794721 +0.058651026 0.664296156 0.646469208 +0.059628543 0.664214895 0.646143695 +0.060606061 0.664133485 0.645818182 +0.061583578 0.664051926 0.645492669 +0.062561095 0.663970218 0.645167155 +0.063538612 0.663888361 0.644841642 +0.064516129 0.663806354 0.644516129 +0.065493646 0.663717900 0.644190616 +0.066471163 0.663623109 0.643865103 +0.067448680 0.663528148 0.643539589 +0.068426197 0.663433016 0.643214076 +0.069403715 0.663337714 0.642888563 +0.070381232 0.663242240 0.642563050 +0.071358749 0.663146594 0.642237537 +0.072336266 0.663050776 0.641912023 +0.073313783 0.662954785 0.641586510 +0.074291300 0.662858620 0.641260997 +0.075268817 0.662758885 0.640935484 +0.076246334 0.662650011 0.640609971 +0.077223851 0.662540943 0.640284457 +0.078201369 0.662431683 0.639958944 +0.079178886 0.662322229 0.639633431 +0.080156403 0.662212581 0.639307918 +0.081133920 0.662102739 0.638982405 +0.082111437 0.661992701 0.638656891 +0.083088954 0.661882468 0.638331378 +0.084066471 0.661772039 0.638005865 +0.085043988 0.661660863 0.637680352 +0.086021505 0.661537806 0.637354839 +0.086999022 0.661414534 0.637029326 +0.087976540 0.661291048 0.636703812 +0.088954057 0.661167346 0.636378299 +0.089931574 0.661043428 0.636052786 +0.090909091 0.660919294 0.635727273 +0.091886608 0.660794942 0.635401760 +0.092864125 0.660670373 0.635076246 +0.093841642 0.660545585 0.634750733 +0.094819159 0.660420579 0.634425220 +0.095796676 0.660285492 0.634099707 +0.096774194 0.660147932 0.633774194 +0.097751711 0.660010136 0.633448680 +0.098729228 0.659872104 0.633123167 +0.099706745 0.659733835 0.632797654 +0.100684262 0.659595328 0.632472141 +0.101661779 0.659456582 0.632146628 +0.102639296 0.659317597 0.631821114 +0.103616813 0.659178373 0.631495601 +0.104594330 0.659038909 0.631170088 +0.105571848 0.658892208 0.630844575 +0.106549365 0.658740291 0.630519062 +0.107526882 0.658588119 0.630193548 +0.108504399 0.658435689 0.629868035 +0.109481916 0.658283002 0.629542522 +0.110459433 0.658130057 0.629217009 +0.111436950 0.657976852 0.628891496 +0.112414467 0.657823389 0.628565982 +0.113391984 0.657669665 0.628240469 +0.114369501 0.657515680 0.627914956 +0.115347019 0.657357242 0.627589443 +0.116324536 0.657190916 0.627263930 +0.117302053 0.657024315 0.626938416 +0.118279570 0.656857437 0.626612903 +0.119257087 0.656690282 0.626287390 +0.120234604 0.656522850 0.625961877 +0.121212121 0.656355139 0.625636364 +0.122189638 0.656187149 0.625310850 +0.123167155 0.656018879 0.624985337 +0.124144673 0.655850329 0.624659824 +0.125122190 0.655680041 0.624334311 +0.126099707 0.655499270 0.624008798 +0.127077224 0.655318205 0.623683284 +0.128054741 0.655136845 0.623357771 +0.129032258 0.654955190 0.623032258 +0.130009775 0.654773238 0.622706745 +0.130987292 0.654590990 0.622381232 +0.131964809 0.654408443 0.622055718 +0.132942326 0.654225598 0.621730205 +0.133919844 0.654042454 0.621404692 +0.134897361 0.653859010 0.621079179 +0.135874878 0.653664982 0.620753666 +0.136852395 0.653469436 0.620428152 +0.137829912 0.653273578 0.620102639 +0.138807429 0.653077407 0.619777126 +0.139784946 0.652880922 0.619451613 +0.140762463 0.652684123 0.619126100 +0.141739980 0.652487008 0.618800587 +0.142717498 0.652289577 0.618475073 +0.143695015 0.652091829 0.618149560 +0.144672532 0.651893763 0.617824047 +0.145650049 0.651687855 0.617498534 +0.146627566 0.651477831 0.617173021 +0.147605083 0.651267477 0.616847507 +0.148582600 0.651056794 0.616521994 +0.149560117 0.650845780 0.616196481 +0.150537634 0.650634436 0.615870968 +0.151515152 0.650422759 0.615545455 +0.152492669 0.650210750 0.615219941 +0.153470186 0.649998407 0.614894428 +0.154447703 0.649785731 0.614568915 +0.155425220 0.649567877 0.614243402 +0.156402737 0.649343393 0.613917889 +0.157380254 0.649118566 0.613592375 +0.158357771 0.648893393 0.613266862 +0.159335288 0.648667875 0.612941349 +0.160312805 0.648442011 0.612615836 +0.161290323 0.648215799 0.612290323 +0.162267840 0.647989239 0.611964809 +0.163245357 0.647762331 0.611639296 +0.164222874 0.647535073 0.611313783 +0.165200391 0.647305221 0.610988270 +0.166177908 0.647066320 0.610662757 +0.167155425 0.646827060 0.610337243 +0.168132942 0.646587441 0.610011730 +0.169110459 0.646347463 0.609686217 +0.170087977 0.646107124 0.609360704 +0.171065494 0.645866424 0.609035191 +0.172043011 0.645625361 0.608709677 +0.173020528 0.645383936 0.608384164 +0.173998045 0.645142147 0.608058651 +0.174975562 0.644899993 0.607733138 +0.175953079 0.644647002 0.607407625 +0.176930596 0.644393373 0.607082111 +0.177908113 0.644139372 0.606756598 +0.178885630 0.643884998 0.606431085 +0.179863148 0.643630251 0.606105572 +0.180840665 0.643375130 0.605780059 +0.181818182 0.643119633 0.605454545 +0.182795699 0.642863761 0.605129032 +0.183773216 0.642607513 0.604803519 +0.184750733 0.642350886 0.604478006 +0.185728250 0.642086038 0.604152493 +0.186705767 0.641818123 0.603826979 +0.187683284 0.641549824 0.603501466 +0.188660802 0.641281142 0.603175953 +0.189638319 0.641012074 0.602850440 +0.190615836 0.640742621 0.602524927 +0.191593353 0.640472782 0.602199413 +0.192570870 0.640202555 0.601873900 +0.193548387 0.639931940 0.601548387 +0.194525904 0.639660937 0.601222874 +0.195503421 0.639384233 0.600897361 +0.196480938 0.639102138 0.600571848 +0.197458456 0.638819650 0.600246334 +0.198435973 0.638536767 0.599920821 +0.199413490 0.638253490 0.599595308 +0.200391007 0.637969817 0.599269795 +0.201368524 0.637685747 0.598944282 +0.202346041 0.637401280 0.598618768 +0.203323558 0.637116415 0.598293255 +0.204301075 0.636831150 0.597967742 +0.205278592 0.636542613 0.597642229 +0.206256109 0.636246466 0.597316716 +0.207233627 0.635949918 0.596991202 +0.208211144 0.635652966 0.596665689 +0.209188661 0.635355612 0.596340176 +0.210166178 0.635057853 0.596014663 +0.211143695 0.634759688 0.595689150 +0.212121212 0.634461118 0.595363636 +0.213098729 0.634162142 0.595038123 +0.214076246 0.633862757 0.594712610 +0.215053763 0.633562423 0.594387097 +0.216031281 0.633252376 0.594061584 +0.217008798 0.632941920 0.593736070 +0.217986315 0.632631055 0.593410557 +0.218963832 0.632319779 0.593085044 +0.219941349 0.632008091 0.592759531 +0.220918866 0.631695992 0.592434018 +0.221896383 0.631383479 0.592108504 +0.222873900 0.631070553 0.591782991 +0.223851417 0.630757212 0.591457478 +0.224828935 0.630443455 0.591131965 +0.225806452 0.630121364 0.590806452 +0.226783969 0.629797178 0.590480938 +0.227761486 0.629472576 0.590155425 +0.228739003 0.629147559 0.589829912 +0.229716520 0.628822125 0.589504399 +0.230694037 0.628496272 0.589178886 +0.231671554 0.628170002 0.588853372 +0.232649071 0.627843312 0.588527859 +0.233626588 0.627516202 0.588202346 +0.234604106 0.627188671 0.587876833 +0.235581623 0.626855159 0.587551320 +0.236559140 0.626517443 0.587225806 +0.237536657 0.626179308 0.586900293 +0.238514174 0.625840753 0.586574780 +0.239491691 0.625501777 0.586249267 +0.240469208 0.625162379 0.585923754 +0.241446725 0.624822559 0.585598240 +0.242424242 0.624482316 0.585272727 +0.243401760 0.624141649 0.584947214 +0.244379277 0.623800557 0.584621701 +0.245356794 0.623455725 0.584296188 +0.246334311 0.623104704 0.583970674 +0.247311828 0.622753262 0.583645161 +0.248289345 0.622401397 0.583319648 +0.249266862 0.622049109 0.582994135 +0.250244379 0.621696398 0.582668622 +0.251221896 0.621343261 0.582343109 +0.252199413 0.620989700 0.582017595 +0.253176931 0.620635712 0.581692082 +0.254154448 0.620281297 0.581366569 +0.255131965 0.619925265 0.581041056 +0.256109482 0.619561189 0.580715543 +0.257086999 0.619196691 0.580390029 +0.258064516 0.618831769 0.580064516 +0.259042033 0.618466424 0.579739003 +0.260019550 0.618100655 0.579413490 +0.260997067 0.617734460 0.579087977 +0.261974585 0.617367839 0.578762463 +0.262952102 0.617000791 0.578436950 +0.263929619 0.616633316 0.578111437 +0.264907136 0.616265413 0.577785924 +0.265884653 0.615889366 0.577460411 +0.266862170 0.615512088 0.577134897 +0.267839687 0.615134387 0.576809384 +0.268817204 0.614756264 0.576483871 +0.269794721 0.614377718 0.576158358 +0.270772239 0.613998747 0.575832845 +0.271749756 0.613619351 0.575507331 +0.272727273 0.613239530 0.575181818 +0.273704790 0.612859282 0.574856305 +0.274682307 0.612478608 0.574530792 +0.275659824 0.612091947 0.574205279 +0.276637341 0.611702189 0.573879765 +0.277614858 0.611312012 0.573554252 +0.278592375 0.610921415 0.573228739 +0.279569892 0.610530398 0.572903226 +0.280547410 0.610138959 0.572577713 +0.281524927 0.609747097 0.572252199 +0.282502444 0.609354813 0.571926686 +0.283479961 0.608962106 0.571601173 +0.284457478 0.608568974 0.571275660 +0.285434995 0.608171886 0.570950147 +0.286412512 0.607769974 0.570624633 +0.287390029 0.607367648 0.570299120 +0.288367546 0.606964906 0.569973607 +0.289345064 0.606561748 0.569648094 +0.290322581 0.606158173 0.569322581 +0.291300098 0.605754180 0.568997067 +0.292277615 0.605349770 0.568671554 +0.293255132 0.604944940 0.568346041 +0.294232649 0.604539690 0.568020528 +0.295210166 0.604132380 0.567695015 +0.296187683 0.603718665 0.567369501 +0.297165200 0.603304542 0.567043988 +0.298142717 0.602890009 0.566718475 +0.299120235 0.602475066 0.566392962 +0.300097752 0.602059712 0.566067449 +0.301075269 0.601643947 0.565741935 +0.302052786 0.601227769 0.565416422 +0.303030303 0.600811179 0.565090909 +0.304007820 0.600394176 0.564765396 +0.304985337 0.599976759 0.564439883 +0.305962854 0.599551726 0.564114370 +0.306940371 0.599126182 0.563788856 +0.307917889 0.598700236 0.563463343 +0.308895406 0.598273888 0.563137830 +0.309872923 0.597847137 0.562812317 +0.310850440 0.597419982 0.562486804 +0.311827957 0.596992424 0.562161290 +0.312805474 0.596564460 0.561835777 +0.313782991 0.596136092 0.561510264 +0.314760508 0.595707318 0.561184751 +0.315738025 0.595272860 0.560859238 +0.316715543 0.594836296 0.560533724 +0.317693060 0.594399340 0.560208211 +0.318670577 0.593961991 0.559882698 +0.319648094 0.593524248 0.559557185 +0.320625611 0.593086112 0.559231672 +0.321603128 0.592647581 0.558906158 +0.322580645 0.592208655 0.558580645 +0.323558162 0.591769334 0.558255132 +0.324535679 0.591329617 0.557929619 +0.325513196 0.590886006 0.557604106 +0.326490714 0.590438847 0.557278592 +0.327468231 0.589991307 0.556953079 +0.328445748 0.589543385 0.556627566 +0.329423265 0.589095081 0.556302053 +0.330400782 0.588646394 0.555976540 +0.331378299 0.588197324 0.555651026 +0.332355816 0.587747870 0.555325513 +0.333333333 0.587298033 0.555000000 +0.334310850 0.586847811 0.554674487 +0.335288368 0.586395337 0.554348974 +0.336265885 0.585938031 0.554023460 +0.337243402 0.585480357 0.553697947 +0.338220919 0.585022313 0.553372434 +0.339198436 0.584563900 0.553046921 +0.340175953 0.584105117 0.552721408 +0.341153470 0.583645965 0.552395894 +0.342130987 0.583186441 0.552070381 +0.343108504 0.582726546 0.551744868 +0.344086022 0.582266280 0.551419355 +0.345063539 0.581805253 0.551093842 +0.346041056 0.581338270 0.550768328 +0.347018573 0.580870934 0.550442815 +0.347996090 0.580403243 0.550117302 +0.348973607 0.579935197 0.549791789 +0.349951124 0.579466795 0.549466276 +0.350928641 0.578998038 0.549140762 +0.351906158 0.578528925 0.548815249 +0.352883675 0.578059455 0.548489736 +0.353861193 0.577589628 0.548164223 +0.354838710 0.577119444 0.547838710 +0.355816227 0.576644207 0.547513196 +0.356793744 0.576167703 0.547187683 +0.357771261 0.575690860 0.546862170 +0.358748778 0.575213679 0.546536657 +0.359726295 0.574736158 0.546211144 +0.360703812 0.574258297 0.545885630 +0.361681329 0.573780096 0.545560117 +0.362658847 0.573301554 0.545234604 +0.363636364 0.572822672 0.544909091 +0.364613881 0.572343449 0.544583578 +0.365591398 0.571860698 0.544258065 +0.366568915 0.571375542 0.543932551 +0.367546432 0.570890065 0.543607038 +0.368523949 0.570404267 0.543281525 +0.369501466 0.569918146 0.542956012 +0.370478983 0.569431703 0.542630499 +0.371456500 0.568944938 0.542304985 +0.372434018 0.568457849 0.541979472 +0.373411535 0.567970438 0.541653959 +0.374389052 0.567482703 0.541328446 +0.375366569 0.566992805 0.541002933 +0.376344086 0.566499534 0.540677419 +0.377321603 0.566005960 0.540351906 +0.378299120 0.565512083 0.540026393 +0.379276637 0.565017903 0.539700880 +0.380254154 0.564523420 0.539375367 +0.381231672 0.564028633 0.539049853 +0.382209189 0.563533542 0.538724340 +0.383186706 0.563038147 0.538398827 +0.384164223 0.562542448 0.538073314 +0.385141740 0.562045786 0.537747801 +0.386119257 0.561544954 0.537422287 +0.387096774 0.561043840 0.537096774 +0.388074291 0.560542444 0.536771261 +0.389051808 0.560040764 0.536445748 +0.390029326 0.559538801 0.536120235 +0.391006843 0.559036555 0.535794721 +0.391984360 0.558534026 0.535469208 +0.392961877 0.558031212 0.535143695 +0.393939394 0.557528114 0.534818182 +0.394916911 0.557024732 0.534492669 +0.395894428 0.556517268 0.534167155 +0.396871945 0.556009189 0.533841642 +0.397849462 0.555500848 0.533516129 +0.398826979 0.554992247 0.533190616 +0.399804497 0.554483383 0.532865103 +0.400782014 0.553974258 0.532539589 +0.401759531 0.553464870 0.532214076 +0.402737048 0.552955221 0.531888563 +0.403714565 0.552445308 0.531563050 +0.404692082 0.551935134 0.531237537 +0.405669599 0.551422112 0.530912023 +0.406647116 0.550907660 0.530586510 +0.407624633 0.550392969 0.530260997 +0.408602151 0.549878039 0.529935484 +0.409579668 0.549362870 0.529609971 +0.410557185 0.548847462 0.529284457 +0.411534702 0.548331815 0.528958944 +0.412512219 0.547815928 0.528633431 +0.413489736 0.547299802 0.528307918 +0.414467253 0.546783436 0.527982405 +0.415444770 0.546265287 0.527656891 +0.416422287 0.545745069 0.527331378 +0.417399804 0.545224637 0.527005865 +0.418377322 0.544703989 0.526680352 +0.419354839 0.544183126 0.526354839 +0.420332356 0.543662048 0.526029326 +0.421309873 0.543140754 0.525703812 +0.422287390 0.542619244 0.525378299 +0.423264907 0.542097518 0.525052786 +0.424242424 0.541575577 0.524727273 +0.425219941 0.541052744 0.524401760 +0.426197458 0.540527383 0.524076246 +0.427174976 0.540001832 0.523750733 +0.428152493 0.539476090 0.523425220 +0.429130010 0.538950158 0.523099707 +0.430107527 0.538424035 0.522774194 +0.431085044 0.537897722 0.522448680 +0.432062561 0.537371217 0.522123167 +0.433040078 0.536844521 0.521797654 +0.434017595 0.536317635 0.521472141 +0.434995112 0.535790557 0.521146628 +0.435972630 0.535260701 0.520821114 +0.436950147 0.534730668 0.520495601 +0.437927664 0.534200469 0.520170088 +0.438905181 0.533670106 0.519844575 +0.439882698 0.533139577 0.519519062 +0.440860215 0.532608883 0.519193548 +0.441837732 0.532078024 0.518868035 +0.442815249 0.531546999 0.518542522 +0.443792766 0.531015810 0.518217009 +0.444770283 0.530484454 0.517891496 +0.445747801 0.529951246 0.517565982 +0.446725318 0.529417377 0.517240469 +0.447702835 0.528883370 0.516914956 +0.448680352 0.528349224 0.516589443 +0.449657869 0.527814939 0.516263930 +0.450635386 0.527280516 0.515938416 +0.451612903 0.526745953 0.515612903 +0.452590420 0.526211252 0.515287390 +0.453567937 0.525676412 0.514961877 +0.454545455 0.525141432 0.514636364 +0.455522972 0.524605346 0.514310850 +0.456500489 0.524068300 0.513985337 +0.457478006 0.523531142 0.513659824 +0.458455523 0.522993872 0.513334311 +0.459433040 0.522456490 0.513008798 +0.460410557 0.521918997 0.512683284 +0.461388074 0.521381392 0.512357771 +0.462365591 0.520843675 0.512032258 +0.463343109 0.520305846 0.511706745 +0.464320626 0.519767905 0.511381232 +0.465298143 0.519229421 0.511055718 +0.466275660 0.518689863 0.510730205 +0.467253177 0.518150220 0.510404692 +0.468230694 0.517610493 0.510079179 +0.469208211 0.517070682 0.509753666 +0.470185728 0.516530787 0.509428152 +0.471163245 0.515990807 0.509102639 +0.472140762 0.515450743 0.508777126 +0.473118280 0.514910594 0.508451613 +0.474095797 0.514370361 0.508126100 +0.475073314 0.513829968 0.507800587 +0.476050831 0.513288569 0.507475073 +0.477028348 0.512747115 0.507149560 +0.478005865 0.512205604 0.506824047 +0.478983382 0.511664036 0.506498534 +0.479960899 0.511122412 0.506173021 +0.480938416 0.510580732 0.505847507 +0.481915934 0.510038995 0.505521994 +0.482893451 0.509497202 0.505196481 +0.483870968 0.508955352 0.504870968 +0.484848485 0.508413446 0.504545455 +0.485826002 0.507870980 0.504219941 +0.486803519 0.507328390 0.503894428 +0.487781036 0.506785773 0.503568915 +0.488758553 0.506243127 0.503243402 +0.489736070 0.505700453 0.502917889 +0.490713587 0.505157751 0.502592375 +0.491691105 0.504615020 0.502266862 +0.492668622 0.504072261 0.501941349 +0.493646139 0.503529474 0.501615836 +0.494623656 0.502986658 0.501290323 +0.495601173 0.502443695 0.500964809 +0.496578690 0.501900652 0.500639296 +0.497556207 0.501357608 0.500313783 +0.498533724 0.500814565 0.499988270 +0.499511241 0.500271522 0.499662757 +0.500488759 0.499728478 0.499337243 +0.501466276 0.499185435 0.499011730 +0.502443793 0.498642392 0.498686217 +0.503421310 0.498099348 0.498360704 +0.504398827 0.497556305 0.498035191 +0.505376344 0.497013342 0.497709677 +0.506353861 0.496470526 0.497384164 +0.507331378 0.495927739 0.497058651 +0.508308895 0.495384980 0.496733138 +0.509286413 0.494842249 0.496407625 +0.510263930 0.494299547 0.496082111 +0.511241447 0.493756873 0.495756598 +0.512218964 0.493214227 0.495431085 +0.513196481 0.492671610 0.495105572 +0.514173998 0.492129020 0.494780059 +0.515151515 0.491586554 0.494454545 +0.516129032 0.491044648 0.494129032 +0.517106549 0.490502798 0.493803519 +0.518084066 0.489961005 0.493478006 +0.519061584 0.489419268 0.493152493 +0.520039101 0.488877588 0.492826979 +0.521016618 0.488335964 0.492501466 +0.521994135 0.487794396 0.492175953 +0.522971652 0.487252885 0.491850440 +0.523949169 0.486711431 0.491524927 +0.524926686 0.486170032 0.491199413 +0.525904203 0.485629639 0.490873900 +0.526881720 0.485089406 0.490548387 +0.527859238 0.484549257 0.490222874 +0.528836755 0.484009193 0.489897361 +0.529814272 0.483469213 0.489571848 +0.530791789 0.482929318 0.489246334 +0.531769306 0.482389507 0.488920821 +0.532746823 0.481849780 0.488595308 +0.533724340 0.481310137 0.488269795 +0.534701857 0.480770579 0.487944282 +0.535679374 0.480232095 0.487618768 +0.536656891 0.479694154 0.487293255 +0.537634409 0.479156325 0.486967742 +0.538611926 0.478618608 0.486642229 +0.539589443 0.478081003 0.486316716 +0.540566960 0.477543510 0.485991202 +0.541544477 0.477006128 0.485665689 +0.542521994 0.476468858 0.485340176 +0.543499511 0.475931700 0.485014663 +0.544477028 0.475394654 0.484689150 +0.545454545 0.474858568 0.484363636 +0.546432063 0.474323588 0.484038123 +0.547409580 0.473788748 0.483712610 +0.548387097 0.473254047 0.483387097 +0.549364614 0.472719484 0.483061584 +0.550342131 0.472185061 0.482736070 +0.551319648 0.471650776 0.482410557 +0.552297165 0.471116630 0.482085044 +0.553274682 0.470582623 0.481759531 +0.554252199 0.470048754 0.481434018 +0.555229717 0.469515546 0.481108504 +0.556207234 0.468984190 0.480782991 +0.557184751 0.468453001 0.480457478 +0.558162268 0.467921976 0.480131965 +0.559139785 0.467391117 0.479806452 +0.560117302 0.466860423 0.479480938 +0.561094819 0.466329894 0.479155425 +0.562072336 0.465799531 0.478829912 +0.563049853 0.465269332 0.478504399 +0.564027370 0.464739299 0.478178886 +0.565004888 0.464209443 0.477853372 +0.565982405 0.463682365 0.477527859 +0.566959922 0.463155479 0.477202346 +0.567937439 0.462628783 0.476876833 +0.568914956 0.462102278 0.476551320 +0.569892473 0.461575965 0.476225806 +0.570869990 0.461049842 0.475900293 +0.571847507 0.460523910 0.475574780 +0.572825024 0.459998168 0.475249267 +0.573802542 0.459472617 0.474923754 +0.574780059 0.458947256 0.474598240 +0.575757576 0.458424423 0.474272727 +0.576735093 0.457902482 0.473947214 +0.577712610 0.457380756 0.473621701 +0.578690127 0.456859246 0.473296188 +0.579667644 0.456337952 0.472970674 +0.580645161 0.455816874 0.472645161 +0.581622678 0.455296011 0.472319648 +0.582600196 0.454775363 0.471994135 +0.583577713 0.454254931 0.471668622 +0.584555230 0.453734713 0.471343109 +0.585532747 0.453216564 0.471017595 +0.586510264 0.452700198 0.470692082 +0.587487781 0.452184072 0.470366569 +0.588465298 0.451668185 0.470041056 +0.589442815 0.451152538 0.469715543 +0.590420332 0.450637130 0.469390029 +0.591397849 0.450121961 0.469064516 +0.592375367 0.449607031 0.468739003 +0.593352884 0.449092340 0.468413490 +0.594330401 0.448577888 0.468087977 +0.595307918 0.448064866 0.467762463 +0.596285435 0.447554692 0.467436950 +0.597262952 0.447044779 0.467111437 +0.598240469 0.446535130 0.466785924 +0.599217986 0.446025742 0.466460411 +0.600195503 0.445516617 0.466134897 +0.601173021 0.445007753 0.465809384 +0.602150538 0.444499152 0.465483871 +0.603128055 0.443990811 0.465158358 +0.604105572 0.443482732 0.464832845 +0.605083089 0.442975268 0.464507331 +0.606060606 0.442471886 0.464181818 +0.607038123 0.441968788 0.463856305 +0.608015640 0.441465974 0.463530792 +0.608993157 0.440963445 0.463205279 +0.609970674 0.440461199 0.462879765 +0.610948192 0.439959236 0.462554252 +0.611925709 0.439457556 0.462228739 +0.612903226 0.438956160 0.461903226 +0.613880743 0.438455046 0.461577713 +0.614858260 0.437954214 0.461252199 +0.615835777 0.437457552 0.460926686 +0.616813294 0.436961853 0.460601173 +0.617790811 0.436466458 0.460275660 +0.618768328 0.435971367 0.459950147 +0.619745846 0.435476580 0.459624633 +0.620723363 0.434982097 0.459299120 +0.621700880 0.434487917 0.458973607 +0.622678397 0.433994040 0.458648094 +0.623655914 0.433500466 0.458322581 +0.624633431 0.433007195 0.457997067 +0.625610948 0.432517297 0.457671554 +0.626588465 0.432029562 0.457346041 +0.627565982 0.431542151 0.457020528 +0.628543500 0.431055062 0.456695015 +0.629521017 0.430568297 0.456369501 +0.630498534 0.430081854 0.456043988 +0.631476051 0.429595733 0.455718475 +0.632453568 0.429109935 0.455392962 +0.633431085 0.428624458 0.455067449 +0.634408602 0.428139302 0.454741935 +0.635386119 0.427656551 0.454416422 +0.636363636 0.427177328 0.454090909 +0.637341153 0.426698446 0.453765396 +0.638318671 0.426219904 0.453439883 +0.639296188 0.425741703 0.453114370 +0.640273705 0.425263842 0.452788856 +0.641251222 0.424786321 0.452463343 +0.642228739 0.424309140 0.452137830 +0.643206256 0.423832297 0.451812317 +0.644183773 0.423355793 0.451486804 +0.645161290 0.422880556 0.451161290 +0.646138807 0.422410372 0.450835777 +0.647116325 0.421940545 0.450510264 +0.648093842 0.421471075 0.450184751 +0.649071359 0.421001962 0.449859238 +0.650048876 0.420533205 0.449533724 +0.651026393 0.420064803 0.449208211 +0.652003910 0.419596757 0.448882698 +0.652981427 0.419129066 0.448557185 +0.653958944 0.418661730 0.448231672 +0.654936461 0.418194747 0.447906158 +0.655913978 0.417733720 0.447580645 +0.656891496 0.417273454 0.447255132 +0.657869013 0.416813559 0.446929619 +0.658846530 0.416354035 0.446604106 +0.659824047 0.415894883 0.446278592 +0.660801564 0.415436100 0.445953079 +0.661779081 0.414977687 0.445627566 +0.662756598 0.414519643 0.445302053 +0.663734115 0.414061969 0.444976540 +0.664711632 0.413604663 0.444651026 +0.665689150 0.413152189 0.444325513 +0.666666667 0.412701967 0.444000000 +0.667644184 0.412252130 0.443674487 +0.668621701 0.411802676 0.443348974 +0.669599218 0.411353606 0.443023460 +0.670576735 0.410904919 0.442697947 +0.671554252 0.410456615 0.442372434 +0.672531769 0.410008693 0.442046921 +0.673509286 0.409561153 0.441721408 +0.674486804 0.409113994 0.441395894 +0.675464321 0.408670383 0.441070381 +0.676441838 0.408230666 0.440744868 +0.677419355 0.407791345 0.440419355 +0.678396872 0.407352419 0.440093842 +0.679374389 0.406913888 0.439768328 +0.680351906 0.406475752 0.439442815 +0.681329423 0.406038009 0.439117302 +0.682306940 0.405600660 0.438791789 +0.683284457 0.405163704 0.438466276 +0.684261975 0.404727140 0.438140762 +0.685239492 0.404292682 0.437815249 +0.686217009 0.403863908 0.437489736 +0.687194526 0.403435540 0.437164223 +0.688172043 0.403007576 0.436838710 +0.689149560 0.402580018 0.436513196 +0.690127077 0.402152863 0.436187683 +0.691104594 0.401726112 0.435862170 +0.692082111 0.401299764 0.435536657 +0.693059629 0.400873818 0.435211144 +0.694037146 0.400448274 0.434885630 +0.695014663 0.400023241 0.434560117 +0.695992180 0.399605824 0.434234604 +0.696969697 0.399188821 0.433909091 +0.697947214 0.398772231 0.433583578 +0.698924731 0.398356053 0.433258065 +0.699902248 0.397940288 0.432932551 +0.700879765 0.397524934 0.432607038 +0.701857283 0.397109991 0.432281525 +0.702834800 0.396695458 0.431956012 +0.703812317 0.396281335 0.431630499 +0.704789834 0.395867620 0.431304985 +0.705767351 0.395460310 0.430979472 +0.706744868 0.395055060 0.430653959 +0.707722385 0.394650230 0.430328446 +0.708699902 0.394245820 0.430002933 +0.709677419 0.393841827 0.429677419 +0.710654936 0.393438252 0.429351906 +0.711632454 0.393035094 0.429026393 +0.712609971 0.392632352 0.428700880 +0.713587488 0.392230026 0.428375367 +0.714565005 0.391828114 0.428049853 +0.715542522 0.391431026 0.427724340 +0.716520039 0.391037894 0.427398827 +0.717497556 0.390645187 0.427073314 +0.718475073 0.390252903 0.426747801 +0.719452590 0.389861041 0.426422287 +0.720430108 0.389469602 0.426096774 +0.721407625 0.389078585 0.425771261 +0.722385142 0.388687988 0.425445748 +0.723362659 0.388297811 0.425120235 +0.724340176 0.387908053 0.424794721 +0.725317693 0.387521392 0.424469208 +0.726295210 0.387140718 0.424143695 +0.727272727 0.386760470 0.423818182 +0.728250244 0.386380649 0.423492669 +0.729227761 0.386001253 0.423167155 +0.730205279 0.385622282 0.422841642 +0.731182796 0.385243736 0.422516129 +0.732160313 0.384865613 0.422190616 +0.733137830 0.384487912 0.421865103 +0.734115347 0.384110634 0.421539589 +0.735092864 0.383734587 0.421214076 +0.736070381 0.383366684 0.420888563 +0.737047898 0.382999209 0.420563050 +0.738025415 0.382632161 0.420237537 +0.739002933 0.382265540 0.419912023 +0.739980450 0.381899345 0.419586510 +0.740957967 0.381533576 0.419260997 +0.741935484 0.381168231 0.418935484 +0.742913001 0.380803309 0.418609971 +0.743890518 0.380438811 0.418284457 +0.744868035 0.380074735 0.417958944 +0.745845552 0.379718703 0.417633431 +0.746823069 0.379364288 0.417307918 +0.747800587 0.379010300 0.416982405 +0.748778104 0.378656739 0.416656891 +0.749755621 0.378303602 0.416331378 +0.750733138 0.377950891 0.416005865 +0.751710655 0.377598603 0.415680352 +0.752688172 0.377246738 0.415354839 +0.753665689 0.376895296 0.415029326 +0.754643206 0.376544275 0.414703812 +0.755620723 0.376199443 0.414378299 +0.756598240 0.375858351 0.414052786 +0.757575758 0.375517684 0.413727273 +0.758553275 0.375177441 0.413401760 +0.759530792 0.374837621 0.413076246 +0.760508309 0.374498223 0.412750733 +0.761485826 0.374159247 0.412425220 +0.762463343 0.373820692 0.412099707 +0.763440860 0.373482557 0.411774194 +0.764418377 0.373144841 0.411448680 +0.765395894 0.372811329 0.411123167 +0.766373412 0.372483798 0.410797654 +0.767350929 0.372156688 0.410472141 +0.768328446 0.371829998 0.410146628 +0.769305963 0.371503728 0.409821114 +0.770283480 0.371177875 0.409495601 +0.771260997 0.370852441 0.409170088 +0.772238514 0.370527424 0.408844575 +0.773216031 0.370202822 0.408519062 +0.774193548 0.369878636 0.408193548 +0.775171065 0.369556545 0.407868035 +0.776148583 0.369242788 0.407542522 +0.777126100 0.368929447 0.407217009 +0.778103617 0.368616521 0.406891496 +0.779081134 0.368304008 0.406565982 +0.780058651 0.367991909 0.406240469 +0.781036168 0.367680221 0.405914956 +0.782013685 0.367368945 0.405589443 +0.782991202 0.367058080 0.405263930 +0.783968719 0.366747624 0.404938416 +0.784946237 0.366437577 0.404612903 +0.785923754 0.366137243 0.404287390 +0.786901271 0.365837858 0.403961877 +0.787878788 0.365538882 0.403636364 +0.788856305 0.365240312 0.403310850 +0.789833822 0.364942147 0.402985337 +0.790811339 0.364644388 0.402659824 +0.791788856 0.364347034 0.402334311 +0.792766373 0.364050082 0.402008798 +0.793743891 0.363753534 0.401683284 +0.794721408 0.363457387 0.401357771 +0.795698925 0.363168850 0.401032258 +0.796676442 0.362883585 0.400706745 +0.797653959 0.362598720 0.400381232 +0.798631476 0.362314253 0.400055718 +0.799608993 0.362030183 0.399730205 +0.800586510 0.361746510 0.399404692 +0.801564027 0.361463233 0.399079179 +0.802541544 0.361180350 0.398753666 +0.803519062 0.360897862 0.398428152 +0.804496579 0.360615767 0.398102639 +0.805474096 0.360339063 0.397777126 +0.806451613 0.360068060 0.397451613 +0.807429130 0.359797445 0.397126100 +0.808406647 0.359527218 0.396800587 +0.809384164 0.359257379 0.396475073 +0.810361681 0.358987926 0.396149560 +0.811339198 0.358718858 0.395824047 +0.812316716 0.358450176 0.395498534 +0.813294233 0.358181877 0.395173021 +0.814271750 0.357913962 0.394847507 +0.815249267 0.357649114 0.394521994 +0.816226784 0.357392487 0.394196481 +0.817204301 0.357136239 0.393870968 +0.818181818 0.356880367 0.393545455 +0.819159335 0.356624870 0.393219941 +0.820136852 0.356369749 0.392894428 +0.821114370 0.356115002 0.392568915 +0.822091887 0.355860628 0.392243402 +0.823069404 0.355606627 0.391917889 +0.824046921 0.355352998 0.391592375 +0.825024438 0.355100007 0.391266862 +0.826001955 0.354857853 0.390941349 +0.826979472 0.354616064 0.390615836 +0.827956989 0.354374639 0.390290323 +0.828934506 0.354133576 0.389964809 +0.829912023 0.353892876 0.389639296 +0.830889541 0.353652537 0.389313783 +0.831867058 0.353412559 0.388988270 +0.832844575 0.353172940 0.388662757 +0.833822092 0.352933680 0.388337243 +0.834799609 0.352694779 0.388011730 +0.835777126 0.352464927 0.387686217 +0.836754643 0.352237669 0.387360704 +0.837732160 0.352010761 0.387035191 +0.838709677 0.351784201 0.386709677 +0.839687195 0.351557989 0.386384164 +0.840664712 0.351332125 0.386058651 +0.841642229 0.351106607 0.385733138 +0.842619746 0.350881434 0.385407625 +0.843597263 0.350656607 0.385082111 +0.844574780 0.350432123 0.384756598 +0.845552297 0.350214269 0.384431085 +0.846529814 0.350001593 0.384105572 +0.847507331 0.349789250 0.383780059 +0.848484848 0.349577241 0.383454545 +0.849462366 0.349365564 0.383129032 +0.850439883 0.349154220 0.382803519 +0.851417400 0.348943206 0.382478006 +0.852394917 0.348732523 0.382152493 +0.853372434 0.348522169 0.381826979 +0.854349951 0.348312145 0.381501466 +0.855327468 0.348106237 0.381175953 +0.856304985 0.347908171 0.380850440 +0.857282502 0.347710423 0.380524927 +0.858260020 0.347512992 0.380199413 +0.859237537 0.347315877 0.379873900 +0.860215054 0.347119078 0.379548387 +0.861192571 0.346922593 0.379222874 +0.862170088 0.346726422 0.378897361 +0.863147605 0.346530564 0.378571848 +0.864125122 0.346335018 0.378246334 +0.865102639 0.346140990 0.377920821 +0.866080156 0.345957546 0.377595308 +0.867057674 0.345774402 0.377269795 +0.868035191 0.345591557 0.376944282 +0.869012708 0.345409010 0.376618768 +0.869990225 0.345226762 0.376293255 +0.870967742 0.345044810 0.375967742 +0.871945259 0.344863155 0.375642229 +0.872922776 0.344681795 0.375316716 +0.873900293 0.344500730 0.374991202 +0.874877810 0.344319959 0.374665689 +0.875855327 0.344149671 0.374340176 +0.876832845 0.343981121 0.374014663 +0.877810362 0.343812851 0.373689150 +0.878787879 0.343644861 0.373363636 +0.879765396 0.343477150 0.373038123 +0.880742913 0.343309718 0.372712610 +0.881720430 0.343142563 0.372387097 +0.882697947 0.342975685 0.372061584 +0.883675464 0.342809084 0.371736070 +0.884652981 0.342642758 0.371410557 +0.885630499 0.342484320 0.371085044 +0.886608016 0.342330335 0.370759531 +0.887585533 0.342176611 0.370434018 +0.888563050 0.342023148 0.370108504 +0.889540567 0.341869943 0.369782991 +0.890518084 0.341716998 0.369457478 +0.891495601 0.341564311 0.369131965 +0.892473118 0.341411881 0.368806452 +0.893450635 0.341259709 0.368480938 +0.894428152 0.341107792 0.368155425 +0.895405670 0.340961091 0.367829912 +0.896383187 0.340821627 0.367504399 +0.897360704 0.340682403 0.367178886 +0.898338221 0.340543418 0.366853372 +0.899315738 0.340404672 0.366527859 +0.900293255 0.340266165 0.366202346 +0.901270772 0.340127896 0.365876833 +0.902248289 0.339989864 0.365551320 +0.903225806 0.339852068 0.365225806 +0.904203324 0.339714508 0.364900293 +0.905180841 0.339579421 0.364574780 +0.906158358 0.339454415 0.364249267 +0.907135875 0.339329627 0.363923754 +0.908113392 0.339205058 0.363598240 +0.909090909 0.339080706 0.363272727 +0.910068426 0.338956572 0.362947214 +0.911045943 0.338832654 0.362621701 +0.912023460 0.338708952 0.362296188 +0.913000978 0.338585466 0.361970674 +0.913978495 0.338462194 0.361645161 +0.914956012 0.338339137 0.361319648 +0.915933529 0.338227961 0.360994135 +0.916911046 0.338117532 0.360668622 +0.917888563 0.338007299 0.360343109 +0.918866080 0.337897261 0.360017595 +0.919843597 0.337787419 0.359692082 +0.920821114 0.337677771 0.359366569 +0.921798631 0.337568317 0.359041056 +0.922776149 0.337459057 0.358715543 +0.923753666 0.337349989 0.358390029 +0.924731183 0.337241115 0.358064516 +0.925708700 0.337141380 0.357739003 +0.926686217 0.337045215 0.357413490 +0.927663734 0.336949224 0.357087977 +0.928641251 0.336853406 0.356762463 +0.929618768 0.336757760 0.356436950 +0.930596285 0.336662286 0.356111437 +0.931573803 0.336566984 0.355785924 +0.932551320 0.336471852 0.355460411 +0.933528837 0.336376891 0.355134897 +0.934506354 0.336282100 0.354809384 +0.935483871 0.336193646 0.354483871 +0.936461388 0.336111639 0.354158358 +0.937438905 0.336029782 0.353832845 +0.938416422 0.335948074 0.353507331 +0.939393939 0.335866515 0.353181818 +0.940371457 0.335785105 0.352856305 +0.941348974 0.335703844 0.352530792 +0.942326491 0.335622730 0.352205279 +0.943304008 0.335541763 0.351879765 +0.944281525 0.335460944 0.351554252 +0.945259042 0.335383602 0.351228739 +0.946236559 0.335315631 0.350903226 +0.947214076 0.335247787 0.350577713 +0.948191593 0.335180068 0.350252199 +0.949169110 0.335112475 0.349926686 +0.950146628 0.335045006 0.349601173 +0.951124145 0.334977661 0.349275660 +0.952101662 0.334910441 0.348950147 +0.953079179 0.334843345 0.348624633 +0.954056696 0.334776372 0.348299120 +0.955034213 0.334709966 0.347973607 +0.956011730 0.334655899 0.347648094 +0.956989247 0.334601934 0.347322581 +0.957966764 0.334548070 0.346997067 +0.958944282 0.334494307 0.346671554 +0.959921799 0.334440645 0.346346041 +0.960899316 0.334387083 0.346020528 +0.961876833 0.334333620 0.345695015 +0.962854350 0.334280258 0.345369501 +0.963831867 0.334226995 0.345043988 +0.964809384 0.334173831 0.344718475 +0.965786901 0.334131034 0.344392962 +0.966764418 0.334090804 0.344067449 +0.967741935 0.334050649 0.343741935 +0.968719453 0.334010571 0.343416422 +0.969696970 0.333970568 0.343090909 +0.970674487 0.333930642 0.342765396 +0.971652004 0.333890791 0.342439883 +0.972629521 0.333851014 0.342114370 +0.973607038 0.333811314 0.341788856 +0.974584555 0.333771687 0.341463343 +0.975562072 0.333739521 0.341137830 +0.976539589 0.333712869 0.340812317 +0.977517107 0.333686268 0.340486804 +0.978494624 0.333659718 0.340161290 +0.979472141 0.333633219 0.339835777 +0.980449658 0.333606771 0.339510264 +0.981427175 0.333580374 0.339184751 +0.982404692 0.333554026 0.338859238 +0.983382209 0.333527729 0.338533724 +0.984359726 0.333501482 0.338208211 +0.985337243 0.333479745 0.337882698 +0.986314761 0.333466506 0.337557185 +0.987292278 0.333453293 0.337231672 +0.988269795 0.333440106 0.336906158 +0.989247312 0.333426944 0.336580645 +0.990224829 0.333413807 0.336255132 +0.991202346 0.333400697 0.335929619 +0.992179863 0.333387611 0.335604106 +0.993157380 0.333374550 0.335278592 +0.994134897 0.333361515 0.334953079 +0.995112414 0.333350000 0.334627566 +0.996089932 0.333350000 0.334302053 +0.997067449 0.333350000 0.333976540 +0.998044966 0.333350000 0.333651026 +0.999022483 0.333350000 0.333325513 +1.000000000 0.333350000 0.333000000 diff --git a/examples/hybrid/ObstacleAvoidance.fll b/examples/hybrid/ObstacleAvoidance.fll new file mode 100644 index 0000000..970221b --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.fll @@ -0,0 +1,43 @@ +Engine: ObstacleAvoidance +InputVariable: obstacle + enabled: true + range: 0.000 1.000 + lock-range: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: mSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: tsSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: left Constant 0.333 + term: right Constant 0.666 +RuleBlock: mamdani + enabled: true + conjunction: none + disjunction: none + implication: AlgebraicProduct + activation: General + rule: if obstacle is left then mSteer is right + rule: if obstacle is right then mSteer is left +RuleBlock: takagiSugeno + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if obstacle is left then tsSteer is right + rule: if obstacle is right then tsSteer is left
\ No newline at end of file diff --git a/examples/hybrid/ObstacleAvoidance.java b/examples/hybrid/ObstacleAvoidance.java new file mode 100644 index 0000000..8196670 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.java @@ -0,0 +1,86 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class ObstacleAvoidance{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("ObstacleAvoidance"); +engine.setDescription(""); + +InputVariable obstacle = new InputVariable(); +obstacle.setName("obstacle"); +obstacle.setDescription(""); +obstacle.setEnabled(true); +obstacle.setRange(0.000, 1.000); +obstacle.setLockValueInRange(false); +obstacle.addTerm(new Ramp("left", 1.000, 0.000)); +obstacle.addTerm(new Ramp("right", 0.000, 1.000)); +engine.addInputVariable(obstacle); + +OutputVariable mSteer = new OutputVariable(); +mSteer.setName("mSteer"); +mSteer.setDescription(""); +mSteer.setEnabled(true); +mSteer.setRange(0.000, 1.000); +mSteer.setLockValueInRange(false); +mSteer.setAggregation(new Maximum()); +mSteer.setDefuzzifier(new Centroid(100)); +mSteer.setDefaultValue(Double.NaN); +mSteer.setLockPreviousValue(false); +mSteer.addTerm(new Ramp("left", 1.000, 0.000)); +mSteer.addTerm(new Ramp("right", 0.000, 1.000)); +engine.addOutputVariable(mSteer); + +OutputVariable tsSteer = new OutputVariable(); +tsSteer.setName("tsSteer"); +tsSteer.setDescription(""); +tsSteer.setEnabled(true); +tsSteer.setRange(0.000, 1.000); +tsSteer.setLockValueInRange(false); +tsSteer.setAggregation(new Maximum()); +tsSteer.setDefuzzifier(new WeightedAverage("Automatic")); +tsSteer.setDefaultValue(Double.NaN); +tsSteer.setLockPreviousValue(false); +tsSteer.addTerm(new Constant("left", 0.333)); +tsSteer.addTerm(new Constant("right", 0.666)); +engine.addOutputVariable(tsSteer); + +RuleBlock mamdani = new RuleBlock(); +mamdani.setName("mamdani"); +mamdani.setDescription(""); +mamdani.setEnabled(true); +mamdani.setConjunction(null); +mamdani.setDisjunction(null); +mamdani.setImplication(new AlgebraicProduct()); +mamdani.setActivation(new General()); +mamdani.addRule(Rule.parse("if obstacle is left then mSteer is right", engine)); +mamdani.addRule(Rule.parse("if obstacle is right then mSteer is left", engine)); +engine.addRuleBlock(mamdani); + +RuleBlock takagiSugeno = new RuleBlock(); +takagiSugeno.setName("takagiSugeno"); +takagiSugeno.setDescription(""); +takagiSugeno.setEnabled(true); +takagiSugeno.setConjunction(null); +takagiSugeno.setDisjunction(null); +takagiSugeno.setImplication(null); +takagiSugeno.setActivation(new General()); +takagiSugeno.addRule(Rule.parse("if obstacle is left then tsSteer is right", engine)); +takagiSugeno.addRule(Rule.parse("if obstacle is right then tsSteer is left", engine)); +engine.addRuleBlock(takagiSugeno); + + +} +} diff --git a/examples/hybrid/ObstacleAvoidance.pdf b/examples/hybrid/ObstacleAvoidance.pdf Binary files differnew file mode 100644 index 0000000..ad74e68 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.pdf diff --git a/examples/hybrid/tipper.R b/examples/hybrid/tipper.R new file mode 100644 index 0000000..ba11351 --- /dev/null +++ b/examples/hybrid/tipper.R @@ -0,0 +1,109 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "tipper" +engine.description = "(service and food) -> (tip)" +engine.fll = "Engine: tipper +description: (service and food) -> (tip) +InputVariable: service + description: quality of service + enabled: true + range: 0.000 10.000 + lock-range: true + term: poor Trapezoid 0.000 0.000 2.500 5.000 + term: good Triangle 2.500 5.000 7.500 + term: excellent Trapezoid 5.000 7.500 10.000 10.000 +InputVariable: food + description: quality of food + enabled: true + range: 0.000 10.000 + lock-range: true + term: rancid Trapezoid 0.000 0.000 2.500 7.500 + term: delicious Trapezoid 2.500 7.500 10.000 10.000 +OutputVariable: mTip + description: tip based on Mamdani inference + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: cheap Triangle 0.000 5.000 10.000 + term: average Triangle 10.000 15.000 20.000 + term: generous Triangle 20.000 25.000 30.000 +OutputVariable: tsTip + description: tip based on Takagi-Sugeno inference + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: cheap Constant 5.000 + term: average Constant 15.000 + term: generous Constant 25.000 +RuleBlock: mamdani + description: Mamdani inference + enabled: true + conjunction: AlgebraicProduct + disjunction: AlgebraicSum + implication: Minimum + activation: General + rule: if service is poor or food is rancid then mTip is cheap + rule: if service is good then mTip is average + rule: if service is excellent or food is delicious then mTip is generous with 0.5 + rule: if service is excellent and food is delicious then mTip is generous with 1.0 +RuleBlock: takagiSugeno + description: Takagi-Sugeno inference + enabled: true + conjunction: AlgebraicProduct + disjunction: AlgebraicSum + implication: none + activation: General + rule: if service is poor or food is rancid then tsTip is cheap + rule: if service is good then tsTip is average + rule: if service is excellent or food is delicious then tsTip is generous with 0.5 + rule: if service is excellent and food is delicious then tsTip is generous with 1.0" + +engine.fldFile = "tipper.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1i2_o1 = ggplot(engine.df, aes(service, food)) + + geom_tile(aes(fill=mTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=service, y=food, z=mTip), color="black") + + ggtitle("(service, food) = mTip") + +engine.plot.i2i1_o1 = ggplot(engine.df, aes(food, service)) + + geom_tile(aes(fill=mTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=food, y=service, z=mTip), color="black") + + ggtitle("(food, service) = mTip") + +engine.plot.i1i2_o2 = ggplot(engine.df, aes(service, food)) + + geom_tile(aes(fill=tsTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=service, y=food, z=tsTip), color="black") + + ggtitle("(service, food) = tsTip") + +engine.plot.i2i1_o2 = ggplot(engine.df, aes(food, service)) + + geom_tile(aes(fill=tsTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=food, y=service, z=tsTip), color="black") + + ggtitle("(food, service) = tsTip") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1i2_o1, engine.plot.i2i1_o1, engine.plot.i1i2_o2, engine.plot.i2i1_o2, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/hybrid/tipper.cpp b/examples/hybrid/tipper.cpp new file mode 100644 index 0000000..57bcc78 --- /dev/null +++ b/examples/hybrid/tipper.cpp @@ -0,0 +1,92 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("tipper"); +engine->setDescription("(service and food) -> (tip)"); + +InputVariable* service = new InputVariable; +service->setName("service"); +service->setDescription("quality of service"); +service->setEnabled(true); +service->setRange(0.000, 10.000); +service->setLockValueInRange(true); +service->addTerm(new Trapezoid("poor", 0.000, 0.000, 2.500, 5.000)); +service->addTerm(new Triangle("good", 2.500, 5.000, 7.500)); +service->addTerm(new Trapezoid("excellent", 5.000, 7.500, 10.000, 10.000)); +engine->addInputVariable(service); + +InputVariable* food = new InputVariable; +food->setName("food"); +food->setDescription("quality of food"); +food->setEnabled(true); +food->setRange(0.000, 10.000); +food->setLockValueInRange(true); +food->addTerm(new Trapezoid("rancid", 0.000, 0.000, 2.500, 7.500)); +food->addTerm(new Trapezoid("delicious", 2.500, 7.500, 10.000, 10.000)); +engine->addInputVariable(food); + +OutputVariable* mTip = new OutputVariable; +mTip->setName("mTip"); +mTip->setDescription("tip based on Mamdani inference"); +mTip->setEnabled(true); +mTip->setRange(0.000, 30.000); +mTip->setLockValueInRange(false); +mTip->setAggregation(new Maximum); +mTip->setDefuzzifier(new Centroid(100)); +mTip->setDefaultValue(fl::nan); +mTip->setLockPreviousValue(false); +mTip->addTerm(new Triangle("cheap", 0.000, 5.000, 10.000)); +mTip->addTerm(new Triangle("average", 10.000, 15.000, 20.000)); +mTip->addTerm(new Triangle("generous", 20.000, 25.000, 30.000)); +engine->addOutputVariable(mTip); + +OutputVariable* tsTip = new OutputVariable; +tsTip->setName("tsTip"); +tsTip->setDescription("tip based on Takagi-Sugeno inference"); +tsTip->setEnabled(true); +tsTip->setRange(0.000, 30.000); +tsTip->setLockValueInRange(false); +tsTip->setAggregation(fl::null); +tsTip->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +tsTip->setDefaultValue(fl::nan); +tsTip->setLockPreviousValue(false); +tsTip->addTerm(new Constant("cheap", 5.000)); +tsTip->addTerm(new Constant("average", 15.000)); +tsTip->addTerm(new Constant("generous", 25.000)); +engine->addOutputVariable(tsTip); + +RuleBlock* mamdani = new RuleBlock; +mamdani->setName("mamdani"); +mamdani->setDescription("Mamdani inference"); +mamdani->setEnabled(true); +mamdani->setConjunction(new AlgebraicProduct); +mamdani->setDisjunction(new AlgebraicSum); +mamdani->setImplication(new Minimum); +mamdani->setActivation(new General); +mamdani->addRule(Rule::parse("if service is poor or food is rancid then mTip is cheap", engine)); +mamdani->addRule(Rule::parse("if service is good then mTip is average", engine)); +mamdani->addRule(Rule::parse("if service is excellent or food is delicious then mTip is generous with 0.5", engine)); +mamdani->addRule(Rule::parse("if service is excellent and food is delicious then mTip is generous with 1.0", engine)); +engine->addRuleBlock(mamdani); + +RuleBlock* takagiSugeno = new RuleBlock; +takagiSugeno->setName("takagiSugeno"); +takagiSugeno->setDescription("Takagi-Sugeno inference"); +takagiSugeno->setEnabled(true); +takagiSugeno->setConjunction(new AlgebraicProduct); +takagiSugeno->setDisjunction(new AlgebraicSum); +takagiSugeno->setImplication(fl::null); +takagiSugeno->setActivation(new General); +takagiSugeno->addRule(Rule::parse("if service is poor or food is rancid then tsTip is cheap", engine)); +takagiSugeno->addRule(Rule::parse("if service is good then tsTip is average", engine)); +takagiSugeno->addRule(Rule::parse("if service is excellent or food is delicious then tsTip is generous with 0.5", engine)); +takagiSugeno->addRule(Rule::parse("if service is excellent and food is delicious then tsTip is generous with 1.0", engine)); +engine->addRuleBlock(takagiSugeno); + + +} diff --git a/examples/hybrid/tipper.fcl b/examples/hybrid/tipper.fcl new file mode 100644 index 0000000..299dbb8 --- /dev/null +++ b/examples/hybrid/tipper.fcl @@ -0,0 +1,66 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK tipper + +VAR_INPUT + service: REAL; + food: REAL; +END_VAR + +VAR_OUTPUT + mTip: REAL; + tsTip: REAL; +END_VAR + +FUZZIFY service + RANGE := (0.000 .. 10.000); + TERM poor := Trapezoid 0.000 0.000 2.500 5.000; + TERM good := Triangle 2.500 5.000 7.500; + TERM excellent := Trapezoid 5.000 7.500 10.000 10.000; +END_FUZZIFY + +FUZZIFY food + RANGE := (0.000 .. 10.000); + TERM rancid := Trapezoid 0.000 0.000 2.500 7.500; + TERM delicious := Trapezoid 2.500 7.500 10.000 10.000; +END_FUZZIFY + +DEFUZZIFY mTip + RANGE := (0.000 .. 30.000); + TERM cheap := Triangle 0.000 5.000 10.000; + TERM average := Triangle 10.000 15.000 20.000; + TERM generous := Triangle 20.000 25.000 30.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY tsTip + RANGE := (0.000 .. 30.000); + TERM cheap := 5.000; + TERM average := 15.000; + TERM generous := 25.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK mamdani + AND : PROD; + OR : ASUM; + ACT : MIN; + RULE 1 : if service is poor or food is rancid then mTip is cheap + RULE 2 : if service is good then mTip is average + RULE 3 : if service is excellent or food is delicious then mTip is generous with 0.5 + RULE 4 : if service is excellent and food is delicious then mTip is generous with 1.0 +END_RULEBLOCK + +RULEBLOCK takagiSugeno + AND : PROD; + OR : ASUM; + RULE 1 : if service is poor or food is rancid then tsTip is cheap + RULE 2 : if service is good then tsTip is average + RULE 3 : if service is excellent or food is delicious then tsTip is generous with 0.5 + RULE 4 : if service is excellent and food is delicious then tsTip is generous with 1.0 +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/hybrid/tipper.fis b/examples/hybrid/tipper.fis new file mode 100644 index 0000000..abd850a --- /dev/null +++ b/examples/hybrid/tipper.fis @@ -0,0 +1,57 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='tipper' +Type='hybrid' +Version=6.0 +NumInputs=2 +NumOutputs=2 +NumRules=8 +AndMethod='prod' +OrMethod='probor' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='service' +Range=[0.000 10.000] +NumMFs=3 +MF1='poor':'trapmf',[0.000 0.000 2.500 5.000] +MF2='good':'trimf',[2.500 5.000 7.500] +MF3='excellent':'trapmf',[5.000 7.500 10.000 10.000] + +[Input2] +Name='food' +Range=[0.000 10.000] +NumMFs=2 +MF1='rancid':'trapmf',[0.000 0.000 2.500 7.500] +MF2='delicious':'trapmf',[2.500 7.500 10.000 10.000] + +[Output1] +Name='mTip' +Range=[0.000 30.000] +NumMFs=3 +MF1='cheap':'trimf',[0.000 5.000 10.000] +MF2='average':'trimf',[10.000 15.000 20.000] +MF3='generous':'trimf',[20.000 25.000 30.000] + +[Output2] +Name='tsTip' +Range=[0.000 30.000] +NumMFs=3 +MF1='cheap':'constant',[5.000] +MF2='average':'constant',[15.000] +MF3='generous':'constant',[25.000] + +[Rules] +# RuleBlock mamdani +1.000 1.000 , 1.000 0.000 (1.000) : 2 +2.000 0.000 , 2.000 0.000 (1.000) : 1 +3.000 2.000 , 3.000 0.000 (0.500) : 2 +3.000 2.000 , 3.000 0.000 (1.000) : 1 +# RuleBlock takagiSugeno +1.000 1.000 , 0.000 1.000 (1.000) : 2 +2.000 0.000 , 0.000 2.000 (1.000) : 1 +3.000 2.000 , 0.000 3.000 (0.500) : 2 +3.000 2.000 , 0.000 3.000 (1.000) : 1 diff --git a/examples/hybrid/tipper.fld b/examples/hybrid/tipper.fld new file mode 100644 index 0000000..7a8e29d --- /dev/null +++ b/examples/hybrid/tipper.fld @@ -0,0 +1,1025 @@ +service food mTip tsTip +0.000000000 0.000000000 4.998950210 5.000000000 +0.000000000 0.322580645 4.998950210 5.000000000 +0.000000000 0.645161290 4.998950210 5.000000000 +0.000000000 0.967741935 4.998950210 5.000000000 +0.000000000 1.290322581 4.998950210 5.000000000 +0.000000000 1.612903226 4.998950210 5.000000000 +0.000000000 1.935483871 4.998950210 5.000000000 +0.000000000 2.258064516 4.998950210 5.000000000 +0.000000000 2.580645161 5.314026132 5.160000000 +0.000000000 2.903225806 6.467756859 5.775193798 +0.000000000 3.225806452 7.452789474 6.353383459 +0.000000000 3.548387097 8.316896407 6.897810219 +0.000000000 3.870967742 9.067963620 7.411347518 +0.000000000 4.193548387 9.734585733 7.896551724 +0.000000000 4.516129032 10.322182298 8.355704698 +0.000000000 4.838709677 10.846060307 8.790849673 +0.000000000 5.161290323 11.316227524 9.203821656 +0.000000000 5.483870968 11.733949841 9.596273292 +0.000000000 5.806451613 12.115369655 9.969696970 +0.000000000 6.129032258 12.452152483 10.325443787 +0.000000000 6.451612903 12.762450565 10.664739884 +0.000000000 6.774193548 13.037607639 10.988700565 +0.000000000 7.096774194 13.291172539 11.298342541 +0.000000000 7.419354839 13.516499633 11.594594595 +0.000000000 7.741935484 13.570706205 11.666666667 +0.000000000 8.064516129 13.570706205 11.666666667 +0.000000000 8.387096774 13.570706205 11.666666667 +0.000000000 8.709677419 13.570706205 11.666666667 +0.000000000 9.032258065 13.570706205 11.666666667 +0.000000000 9.354838710 13.570706205 11.666666667 +0.000000000 9.677419355 13.570706205 11.666666667 +0.000000000 10.000000000 13.570706205 11.666666667 +0.322580645 0.000000000 4.998950210 5.000000000 +0.322580645 0.322580645 4.998950210 5.000000000 +0.322580645 0.645161290 4.998950210 5.000000000 +0.322580645 0.967741935 4.998950210 5.000000000 +0.322580645 1.290322581 4.998950210 5.000000000 +0.322580645 1.612903226 4.998950210 5.000000000 +0.322580645 1.935483871 4.998950210 5.000000000 +0.322580645 2.258064516 4.998950210 5.000000000 +0.322580645 2.580645161 5.314026132 5.160000000 +0.322580645 2.903225806 6.467756859 5.775193798 +0.322580645 3.225806452 7.452789474 6.353383459 +0.322580645 3.548387097 8.316896407 6.897810219 +0.322580645 3.870967742 9.067963620 7.411347518 +0.322580645 4.193548387 9.734585733 7.896551724 +0.322580645 4.516129032 10.322182298 8.355704698 +0.322580645 4.838709677 10.846060307 8.790849673 +0.322580645 5.161290323 11.316227524 9.203821656 +0.322580645 5.483870968 11.733949841 9.596273292 +0.322580645 5.806451613 12.115369655 9.969696970 +0.322580645 6.129032258 12.452152483 10.325443787 +0.322580645 6.451612903 12.762450565 10.664739884 +0.322580645 6.774193548 13.037607639 10.988700565 +0.322580645 7.096774194 13.291172539 11.298342541 +0.322580645 7.419354839 13.516499633 11.594594595 +0.322580645 7.741935484 13.570706205 11.666666667 +0.322580645 8.064516129 13.570706205 11.666666667 +0.322580645 8.387096774 13.570706205 11.666666667 +0.322580645 8.709677419 13.570706205 11.666666667 +0.322580645 9.032258065 13.570706205 11.666666667 +0.322580645 9.354838710 13.570706205 11.666666667 +0.322580645 9.677419355 13.570706205 11.666666667 +0.322580645 10.000000000 13.570706205 11.666666667 +0.645161290 0.000000000 4.998950210 5.000000000 +0.645161290 0.322580645 4.998950210 5.000000000 +0.645161290 0.645161290 4.998950210 5.000000000 +0.645161290 0.967741935 4.998950210 5.000000000 +0.645161290 1.290322581 4.998950210 5.000000000 +0.645161290 1.612903226 4.998950210 5.000000000 +0.645161290 1.935483871 4.998950210 5.000000000 +0.645161290 2.258064516 4.998950210 5.000000000 +0.645161290 2.580645161 5.314026132 5.160000000 +0.645161290 2.903225806 6.467756859 5.775193798 +0.645161290 3.225806452 7.452789474 6.353383459 +0.645161290 3.548387097 8.316896407 6.897810219 +0.645161290 3.870967742 9.067963620 7.411347518 +0.645161290 4.193548387 9.734585733 7.896551724 +0.645161290 4.516129032 10.322182298 8.355704698 +0.645161290 4.838709677 10.846060307 8.790849673 +0.645161290 5.161290323 11.316227524 9.203821656 +0.645161290 5.483870968 11.733949841 9.596273292 +0.645161290 5.806451613 12.115369655 9.969696970 +0.645161290 6.129032258 12.452152483 10.325443787 +0.645161290 6.451612903 12.762450565 10.664739884 +0.645161290 6.774193548 13.037607639 10.988700565 +0.645161290 7.096774194 13.291172539 11.298342541 +0.645161290 7.419354839 13.516499633 11.594594595 +0.645161290 7.741935484 13.570706205 11.666666667 +0.645161290 8.064516129 13.570706205 11.666666667 +0.645161290 8.387096774 13.570706205 11.666666667 +0.645161290 8.709677419 13.570706205 11.666666667 +0.645161290 9.032258065 13.570706205 11.666666667 +0.645161290 9.354838710 13.570706205 11.666666667 +0.645161290 9.677419355 13.570706205 11.666666667 +0.645161290 10.000000000 13.570706205 11.666666667 +0.967741935 0.000000000 4.998950210 5.000000000 +0.967741935 0.322580645 4.998950210 5.000000000 +0.967741935 0.645161290 4.998950210 5.000000000 +0.967741935 0.967741935 4.998950210 5.000000000 +0.967741935 1.290322581 4.998950210 5.000000000 +0.967741935 1.612903226 4.998950210 5.000000000 +0.967741935 1.935483871 4.998950210 5.000000000 +0.967741935 2.258064516 4.998950210 5.000000000 +0.967741935 2.580645161 5.314026132 5.160000000 +0.967741935 2.903225806 6.467756859 5.775193798 +0.967741935 3.225806452 7.452789474 6.353383459 +0.967741935 3.548387097 8.316896407 6.897810219 +0.967741935 3.870967742 9.067963620 7.411347518 +0.967741935 4.193548387 9.734585733 7.896551724 +0.967741935 4.516129032 10.322182298 8.355704698 +0.967741935 4.838709677 10.846060307 8.790849673 +0.967741935 5.161290323 11.316227524 9.203821656 +0.967741935 5.483870968 11.733949841 9.596273292 +0.967741935 5.806451613 12.115369655 9.969696970 +0.967741935 6.129032258 12.452152483 10.325443787 +0.967741935 6.451612903 12.762450565 10.664739884 +0.967741935 6.774193548 13.037607639 10.988700565 +0.967741935 7.096774194 13.291172539 11.298342541 +0.967741935 7.419354839 13.516499633 11.594594595 +0.967741935 7.741935484 13.570706205 11.666666667 +0.967741935 8.064516129 13.570706205 11.666666667 +0.967741935 8.387096774 13.570706205 11.666666667 +0.967741935 8.709677419 13.570706205 11.666666667 +0.967741935 9.032258065 13.570706205 11.666666667 +0.967741935 9.354838710 13.570706205 11.666666667 +0.967741935 9.677419355 13.570706205 11.666666667 +0.967741935 10.000000000 13.570706205 11.666666667 +1.290322581 0.000000000 4.998950210 5.000000000 +1.290322581 0.322580645 4.998950210 5.000000000 +1.290322581 0.645161290 4.998950210 5.000000000 +1.290322581 0.967741935 4.998950210 5.000000000 +1.290322581 1.290322581 4.998950210 5.000000000 +1.290322581 1.612903226 4.998950210 5.000000000 +1.290322581 1.935483871 4.998950210 5.000000000 +1.290322581 2.258064516 4.998950210 5.000000000 +1.290322581 2.580645161 5.314026132 5.160000000 +1.290322581 2.903225806 6.467756859 5.775193798 +1.290322581 3.225806452 7.452789474 6.353383459 +1.290322581 3.548387097 8.316896407 6.897810219 +1.290322581 3.870967742 9.067963620 7.411347518 +1.290322581 4.193548387 9.734585733 7.896551724 +1.290322581 4.516129032 10.322182298 8.355704698 +1.290322581 4.838709677 10.846060307 8.790849673 +1.290322581 5.161290323 11.316227524 9.203821656 +1.290322581 5.483870968 11.733949841 9.596273292 +1.290322581 5.806451613 12.115369655 9.969696970 +1.290322581 6.129032258 12.452152483 10.325443787 +1.290322581 6.451612903 12.762450565 10.664739884 +1.290322581 6.774193548 13.037607639 10.988700565 +1.290322581 7.096774194 13.291172539 11.298342541 +1.290322581 7.419354839 13.516499633 11.594594595 +1.290322581 7.741935484 13.570706205 11.666666667 +1.290322581 8.064516129 13.570706205 11.666666667 +1.290322581 8.387096774 13.570706205 11.666666667 +1.290322581 8.709677419 13.570706205 11.666666667 +1.290322581 9.032258065 13.570706205 11.666666667 +1.290322581 9.354838710 13.570706205 11.666666667 +1.290322581 9.677419355 13.570706205 11.666666667 +1.290322581 10.000000000 13.570706205 11.666666667 +1.612903226 0.000000000 4.998950210 5.000000000 +1.612903226 0.322580645 4.998950210 5.000000000 +1.612903226 0.645161290 4.998950210 5.000000000 +1.612903226 0.967741935 4.998950210 5.000000000 +1.612903226 1.290322581 4.998950210 5.000000000 +1.612903226 1.612903226 4.998950210 5.000000000 +1.612903226 1.935483871 4.998950210 5.000000000 +1.612903226 2.258064516 4.998950210 5.000000000 +1.612903226 2.580645161 5.314026132 5.160000000 +1.612903226 2.903225806 6.467756859 5.775193798 +1.612903226 3.225806452 7.452789474 6.353383459 +1.612903226 3.548387097 8.316896407 6.897810219 +1.612903226 3.870967742 9.067963620 7.411347518 +1.612903226 4.193548387 9.734585733 7.896551724 +1.612903226 4.516129032 10.322182298 8.355704698 +1.612903226 4.838709677 10.846060307 8.790849673 +1.612903226 5.161290323 11.316227524 9.203821656 +1.612903226 5.483870968 11.733949841 9.596273292 +1.612903226 5.806451613 12.115369655 9.969696970 +1.612903226 6.129032258 12.452152483 10.325443787 +1.612903226 6.451612903 12.762450565 10.664739884 +1.612903226 6.774193548 13.037607639 10.988700565 +1.612903226 7.096774194 13.291172539 11.298342541 +1.612903226 7.419354839 13.516499633 11.594594595 +1.612903226 7.741935484 13.570706205 11.666666667 +1.612903226 8.064516129 13.570706205 11.666666667 +1.612903226 8.387096774 13.570706205 11.666666667 +1.612903226 8.709677419 13.570706205 11.666666667 +1.612903226 9.032258065 13.570706205 11.666666667 +1.612903226 9.354838710 13.570706205 11.666666667 +1.612903226 9.677419355 13.570706205 11.666666667 +1.612903226 10.000000000 13.570706205 11.666666667 +1.935483871 0.000000000 4.998950210 5.000000000 +1.935483871 0.322580645 4.998950210 5.000000000 +1.935483871 0.645161290 4.998950210 5.000000000 +1.935483871 0.967741935 4.998950210 5.000000000 +1.935483871 1.290322581 4.998950210 5.000000000 +1.935483871 1.612903226 4.998950210 5.000000000 +1.935483871 1.935483871 4.998950210 5.000000000 +1.935483871 2.258064516 4.998950210 5.000000000 +1.935483871 2.580645161 5.314026132 5.160000000 +1.935483871 2.903225806 6.467756859 5.775193798 +1.935483871 3.225806452 7.452789474 6.353383459 +1.935483871 3.548387097 8.316896407 6.897810219 +1.935483871 3.870967742 9.067963620 7.411347518 +1.935483871 4.193548387 9.734585733 7.896551724 +1.935483871 4.516129032 10.322182298 8.355704698 +1.935483871 4.838709677 10.846060307 8.790849673 +1.935483871 5.161290323 11.316227524 9.203821656 +1.935483871 5.483870968 11.733949841 9.596273292 +1.935483871 5.806451613 12.115369655 9.969696970 +1.935483871 6.129032258 12.452152483 10.325443787 +1.935483871 6.451612903 12.762450565 10.664739884 +1.935483871 6.774193548 13.037607639 10.988700565 +1.935483871 7.096774194 13.291172539 11.298342541 +1.935483871 7.419354839 13.516499633 11.594594595 +1.935483871 7.741935484 13.570706205 11.666666667 +1.935483871 8.064516129 13.570706205 11.666666667 +1.935483871 8.387096774 13.570706205 11.666666667 +1.935483871 8.709677419 13.570706205 11.666666667 +1.935483871 9.032258065 13.570706205 11.666666667 +1.935483871 9.354838710 13.570706205 11.666666667 +1.935483871 9.677419355 13.570706205 11.666666667 +1.935483871 10.000000000 13.570706205 11.666666667 +2.258064516 0.000000000 4.998950210 5.000000000 +2.258064516 0.322580645 4.998950210 5.000000000 +2.258064516 0.645161290 4.998950210 5.000000000 +2.258064516 0.967741935 4.998950210 5.000000000 +2.258064516 1.290322581 4.998950210 5.000000000 +2.258064516 1.612903226 4.998950210 5.000000000 +2.258064516 1.935483871 4.998950210 5.000000000 +2.258064516 2.258064516 4.998950210 5.000000000 +2.258064516 2.580645161 5.314026132 5.160000000 +2.258064516 2.903225806 6.467756859 5.775193798 +2.258064516 3.225806452 7.452789474 6.353383459 +2.258064516 3.548387097 8.316896407 6.897810219 +2.258064516 3.870967742 9.067963620 7.411347518 +2.258064516 4.193548387 9.734585733 7.896551724 +2.258064516 4.516129032 10.322182298 8.355704698 +2.258064516 4.838709677 10.846060307 8.790849673 +2.258064516 5.161290323 11.316227524 9.203821656 +2.258064516 5.483870968 11.733949841 9.596273292 +2.258064516 5.806451613 12.115369655 9.969696970 +2.258064516 6.129032258 12.452152483 10.325443787 +2.258064516 6.451612903 12.762450565 10.664739884 +2.258064516 6.774193548 13.037607639 10.988700565 +2.258064516 7.096774194 13.291172539 11.298342541 +2.258064516 7.419354839 13.516499633 11.594594595 +2.258064516 7.741935484 13.570706205 11.666666667 +2.258064516 8.064516129 13.570706205 11.666666667 +2.258064516 8.387096774 13.570706205 11.666666667 +2.258064516 8.709677419 13.570706205 11.666666667 +2.258064516 9.032258065 13.570706205 11.666666667 +2.258064516 9.354838710 13.570706205 11.666666667 +2.258064516 9.677419355 13.570706205 11.666666667 +2.258064516 10.000000000 13.570706205 11.666666667 +2.580645161 0.000000000 5.592761972 5.312500000 +2.580645161 0.322580645 5.592761972 5.312500000 +2.580645161 0.645161290 5.592761972 5.312500000 +2.580645161 0.967741935 5.592761972 5.312500000 +2.580645161 1.290322581 5.592761972 5.312500000 +2.580645161 1.612903226 5.592761972 5.312500000 +2.580645161 1.935483871 5.592761972 5.312500000 +2.580645161 2.258064516 5.592761972 5.312500000 +2.580645161 2.580645161 5.880621907 5.465349012 +2.580645161 2.903225806 6.939232958 6.055190858 +2.580645161 3.225806452 7.848835301 6.612674391 +2.580645161 3.548387097 8.651174558 7.140391254 +2.580645161 3.870967742 9.351975577 7.640663528 +2.580645161 4.193548387 9.976796931 8.115577889 +2.580645161 4.516129032 10.530004073 8.567014703 +2.580645161 4.838709677 11.024934815 8.996672905 +2.580645161 5.161290323 11.470583404 9.406091371 +2.580645161 5.483870968 11.867640871 9.796667328 +2.580645161 5.806451613 12.231162308 10.169672290 +2.580645161 6.129032258 12.552900008 10.526265883 +2.580645161 6.451612903 12.849986938 10.867507886 +2.580645161 6.774193548 13.113962484 11.194368756 +2.580645161 7.096774194 13.357668633 11.507738837 +2.580645161 7.419354839 13.574618159 11.808436465 +2.580645161 7.741935484 13.626860714 11.881720430 +2.580645161 8.064516129 13.626860714 11.881720430 +2.580645161 8.387096774 13.626860714 11.881720430 +2.580645161 8.709677419 13.626860714 11.881720430 +2.580645161 9.032258065 13.626860714 11.881720430 +2.580645161 9.354838710 13.626860714 11.881720430 +2.580645161 9.677419355 13.626860714 11.881720430 +2.580645161 10.000000000 13.626860714 11.881720430 +2.903225806 0.000000000 7.283786709 6.388888889 +2.903225806 0.322580645 7.283786709 6.388888889 +2.903225806 0.645161290 7.283786709 6.388888889 +2.903225806 0.967741935 7.283786709 6.388888889 +2.903225806 1.290322581 7.283786709 6.388888889 +2.903225806 1.612903226 7.283786709 6.388888889 +2.903225806 1.935483871 7.283786709 6.388888889 +2.903225806 2.258064516 7.283786709 6.388888889 +2.903225806 2.580645161 7.499955755 6.520624303 +2.903225806 2.903225806 8.305212731 7.035456336 +2.903225806 3.225806452 9.011457616 7.531699979 +2.903225806 3.548387097 9.645097856 8.010344100 +2.903225806 3.870967742 10.207136722 8.472308650 +2.903225806 4.193548387 10.715739625 8.918450561 +2.903225806 4.516129032 11.172892280 9.349569052 +2.903225806 4.838709677 11.587921940 9.766410408 +2.903225806 5.161290323 11.967183067 10.169672290 +2.903225806 5.483870968 12.308758298 10.560007632 +2.903225806 5.806451613 12.624644763 10.938028169 +2.903225806 6.129032258 12.908650399 11.304307635 +2.903225806 6.451612903 13.174140812 11.659384671 +2.903225806 6.774193548 13.414725347 12.003765465 +2.903225806 7.096774194 13.639701953 12.337926161 +2.903225806 7.419354839 13.842390029 12.662315057 +2.903225806 7.741935484 13.891460681 12.741935484 +2.903225806 8.064516129 13.891460681 12.741935484 +2.903225806 8.387096774 13.891460681 12.741935484 +2.903225806 8.709677419 13.891460681 12.741935484 +2.903225806 9.032258065 13.891460681 12.741935484 +2.903225806 9.354838710 13.891460681 12.741935484 +2.903225806 9.677419355 13.891460681 12.741935484 +2.903225806 10.000000000 13.891460681 12.741935484 +3.225806452 0.000000000 8.314651325 7.250000000 +3.225806452 0.322580645 8.314651325 7.250000000 +3.225806452 0.645161290 8.314651325 7.250000000 +3.225806452 0.967741935 8.314651325 7.250000000 +3.225806452 1.290322581 8.314651325 7.250000000 +3.225806452 1.612903226 8.314651325 7.250000000 +3.225806452 1.935483871 8.314651325 7.250000000 +3.225806452 2.258064516 8.314651325 7.250000000 +3.225806452 2.580645161 8.491360774 7.368791474 +3.225806452 2.903225806 9.156409155 7.837810945 +3.225806452 3.225806452 9.746803244 8.297222769 +3.225806452 3.548387097 10.284138020 8.747319166 +3.225806452 3.870967742 10.769427894 9.188380622 +3.225806452 4.193548387 11.214534071 9.620676476 +3.225806452 4.516129032 11.619323393 10.044465468 +3.225806452 4.838709677 11.993033266 10.459996253 +3.225806452 5.161290323 12.340224927 10.867507886 +3.225806452 5.483870968 12.657043434 11.267230289 +3.225806452 5.806451613 12.956823683 11.659384671 +3.225806452 6.129032258 13.232890780 12.044183950 +3.225806452 6.451612903 13.493168128 12.421833125 +3.225806452 6.774193548 13.734211054 12.792529651 +3.225806452 7.096774194 13.966630648 13.156463778 +3.225806452 7.419354839 14.180445683 13.513818877 +3.225806452 7.741935484 14.232664470 13.602150538 +3.225806452 8.064516129 14.232664470 13.602150538 +3.225806452 8.387096774 14.232664470 13.602150538 +3.225806452 8.709677419 14.232664470 13.602150538 +3.225806452 9.032258065 14.232664470 13.602150538 +3.225806452 9.354838710 14.232664470 13.602150538 +3.225806452 9.677419355 14.232664470 13.602150538 +3.225806452 10.000000000 14.232664470 13.602150538 +3.548387097 0.000000000 8.985030201 7.954545455 +3.548387097 0.322580645 8.985030201 7.954545455 +3.548387097 0.645161290 8.985030201 7.954545455 +3.548387097 0.967741935 8.985030201 7.954545455 +3.548387097 1.290322581 8.985030201 7.954545455 +3.548387097 1.612903226 8.985030201 7.954545455 +3.548387097 1.935483871 8.985030201 7.954545455 +3.548387097 2.258064516 8.985030201 7.954545455 +3.548387097 2.580645161 9.137812976 8.065372642 +3.548387097 2.903225806 9.717703976 8.506659369 +3.548387097 3.225806452 10.238351404 8.944737320 +3.548387097 3.548387097 10.720683414 9.379641369 +3.548387097 3.870967742 11.160003933 9.811405883 +3.548387097 4.193548387 11.571126024 10.240064737 +3.548387097 4.516129032 11.950914620 10.665651317 +3.548387097 4.838709677 12.307875007 11.088198536 +3.548387097 5.161290323 12.645356184 11.507738837 +3.548387097 5.483870968 12.960313946 11.924304201 +3.548387097 5.806451613 13.266478726 12.337926161 +3.548387097 6.129032258 13.551156560 12.748635804 +3.548387097 6.451612903 13.831439195 13.156463778 +3.548387097 6.774193548 14.095225315 13.561440308 +3.548387097 7.096774194 14.356367336 13.963595192 +3.548387097 7.419354839 14.605377743 14.362957820 +3.548387097 7.741935484 14.667921566 14.462365591 +3.548387097 8.064516129 14.667921566 14.462365591 +3.548387097 8.387096774 14.667921566 14.462365591 +3.548387097 8.709677419 14.667921566 14.462365591 +3.548387097 9.032258065 14.667921566 14.462365591 +3.548387097 9.354838710 14.667921566 14.462365591 +3.548387097 9.677419355 14.667921566 14.462365591 +3.548387097 10.000000000 14.667921566 14.462365591 +3.870967742 0.000000000 9.432393054 8.541666667 +3.870967742 0.322580645 9.432393054 8.541666667 +3.870967742 0.645161290 9.432393054 8.541666667 +3.870967742 0.967741935 9.432393054 8.541666667 +3.870967742 1.290322581 9.432393054 8.541666667 +3.870967742 1.612903226 9.432393054 8.541666667 +3.870967742 1.935483871 9.432393054 8.541666667 +3.870967742 2.258064516 9.432393054 8.541666667 +3.870967742 2.580645161 9.569971811 8.647671878 +3.870967742 2.903225806 10.095984031 9.072764022 +3.870967742 3.225806452 10.575695895 9.499578059 +3.870967742 3.548387097 11.024096907 9.928124472 +3.870967742 3.870967742 11.442347059 10.358413828 +3.870967742 4.193548387 11.836700132 10.790456784 +3.870967742 4.516129032 12.211639878 11.224264080 +3.870967742 4.838709677 12.568786873 11.659846547 +3.870967742 5.161290323 12.913995839 12.097215103 +3.870967742 5.483870968 13.247084242 12.536380757 +3.870967742 5.806451613 13.573370226 12.977354606 +3.870967742 6.129032258 13.891165979 13.420147843 +3.870967742 6.451612903 14.206686830 13.864771748 +3.870967742 6.774193548 14.518152082 14.311237701 +3.870967742 7.096774194 14.833264590 14.759557170 +3.870967742 7.419354839 15.145455566 15.209741723 +3.870967742 7.741935484 15.224455159 15.322580645 +3.870967742 8.064516129 15.224455159 15.322580645 +3.870967742 8.387096774 15.224455159 15.322580645 +3.870967742 8.709677419 15.224455159 15.322580645 +3.870967742 9.032258065 15.224455159 15.322580645 +3.870967742 9.354838710 15.224455159 15.322580645 +3.870967742 9.677419355 15.224455159 15.322580645 +3.870967742 10.000000000 15.224455159 15.322580645 +4.193548387 0.000000000 9.724829800 9.038461538 +4.193548387 0.322580645 9.724829800 9.038461538 +4.193548387 0.645161290 9.724829800 9.038461538 +4.193548387 0.967741935 9.724829800 9.038461538 +4.193548387 1.290322581 9.724829800 9.038461538 +4.193548387 1.612903226 9.724829800 9.038461538 +4.193548387 1.935483871 9.724829800 9.038461538 +4.193548387 2.258064516 9.724829800 9.038461538 +4.193548387 2.580645161 9.852943138 9.141680907 +4.193548387 2.903225806 10.345918352 9.558110433 +4.193548387 3.225806452 10.802543542 9.980311860 +4.193548387 3.548387097 11.235827387 10.408406027 +4.193548387 3.870967742 11.644759742 10.842517170 +4.193548387 4.193548387 12.040733478 11.282773042 +4.193548387 4.516129032 12.424030547 11.729305038 +4.193548387 4.838709677 12.796980884 12.182248328 +4.193548387 5.161290323 13.166426475 12.641741988 +4.193548387 5.483870968 13.531922324 13.107929151 +4.193548387 5.806451613 13.901663971 13.580957145 +4.193548387 6.129032258 14.268117073 14.060977658 +4.193548387 6.451612903 14.647562125 14.548146895 +4.193548387 6.774193548 15.033372347 15.042625746 +4.193548387 7.096774194 15.433721197 15.544579969 +4.193548387 7.419354839 15.846288602 16.054180370 +4.193548387 7.741935484 15.954652850 16.182795699 +4.193548387 8.064516129 15.954652850 16.182795699 +4.193548387 8.387096774 15.954652850 16.182795699 +4.193548387 8.709677419 15.954652850 16.182795699 +4.193548387 9.032258065 15.954652850 16.182795699 +4.193548387 9.354838710 15.954652850 16.182795699 +4.193548387 9.677419355 15.954652850 16.182795699 +4.193548387 10.000000000 15.954652850 16.182795699 +4.516129032 0.000000000 9.902963105 9.464285714 +4.516129032 0.322580645 9.902963105 9.464285714 +4.516129032 0.645161290 9.902963105 9.464285714 +4.516129032 0.967741935 9.902963105 9.464285714 +4.516129032 1.290322581 9.902963105 9.464285714 +4.516129032 1.612903226 9.902963105 9.464285714 +4.516129032 1.935483871 9.902963105 9.464285714 +4.516129032 2.258064516 9.902963105 9.464285714 +4.516129032 2.580645161 10.025672736 9.566064982 +4.516129032 2.903225806 10.500507438 9.978829026 +4.516129032 3.225806452 10.946239871 10.400856341 +4.516129032 3.548387097 11.376703200 10.832462297 +4.516129032 3.870967742 11.792259146 11.273976741 +4.516129032 4.193548387 12.201356693 11.725744843 +4.516129032 4.516129032 12.604952096 12.188127995 +4.516129032 4.838709677 13.008602620 12.661504771 +4.516129032 5.161290323 13.417792712 13.146271965 +4.516129032 5.483870968 13.834555987 13.642845698 +4.516129032 5.806451613 14.267444692 14.151662612 +4.516129032 6.129032258 14.713512788 14.673181146 +4.516129032 6.451612903 15.186143246 15.207882920 +4.516129032 6.774193548 15.682677037 15.756274213 +4.516129032 7.096774194 16.216113014 16.318887562 +4.516129032 7.419354839 16.788339244 16.896283492 +4.516129032 7.741935484 16.942283864 17.043010753 +4.516129032 8.064516129 16.942283864 17.043010753 +4.516129032 8.387096774 16.942283864 17.043010753 +4.516129032 8.709677419 16.942283864 17.043010753 +4.516129032 9.032258065 16.942283864 17.043010753 +4.516129032 9.354838710 16.942283864 17.043010753 +4.516129032 9.677419355 16.942283864 17.043010753 +4.516129032 10.000000000 16.942283864 17.043010753 +4.838709677 0.000000000 9.987593227 9.833333333 +4.838709677 0.322580645 9.987593227 9.833333333 +4.838709677 0.645161290 9.987593227 9.833333333 +4.838709677 0.967741935 9.987593227 9.833333333 +4.838709677 1.290322581 9.987593227 9.833333333 +4.838709677 1.612903226 9.987593227 9.833333333 +4.838709677 1.935483871 9.987593227 9.833333333 +4.838709677 2.258064516 9.987593227 9.833333333 +4.838709677 2.580645161 10.107937367 9.934574396 +4.838709677 2.903225806 10.576746882 10.347022587 +4.838709677 3.225806452 11.023190342 10.771849382 +4.838709677 3.548387097 11.461860178 11.209620539 +4.838709677 3.870967742 11.892974885 11.660936829 +4.838709677 4.193548387 12.326836015 12.126436782 +4.838709677 4.516129032 12.765557275 12.606799704 +4.838709677 4.838709677 13.215984335 13.102748986 +4.838709677 5.161290323 13.685165434 13.615055734 +4.838709677 5.483870968 14.175297225 14.144542773 +4.838709677 5.806451613 14.699676483 14.692089057 +4.838709677 6.129032258 15.258066385 15.258634538 +4.838709677 6.451612903 15.868732072 15.845185548 +4.838709677 6.774193548 16.535753191 16.452820769 +4.838709677 7.096774194 17.280236196 17.082697848 +4.838709677 7.419354839 18.115344324 17.736060763 +4.838709677 7.741935484 18.343399565 17.903225806 +4.838709677 8.064516129 18.343399565 17.903225806 +4.838709677 8.387096774 18.343399565 17.903225806 +4.838709677 8.709677419 18.343399565 17.903225806 +4.838709677 9.032258065 18.343399565 17.903225806 +4.838709677 9.354838710 18.343399565 17.903225806 +4.838709677 9.677419355 18.343399565 17.903225806 +4.838709677 10.000000000 18.343399565 17.903225806 +5.161290323 0.000000000 10.453438845 10.081967213 +5.161290323 0.322580645 10.453438845 10.081967213 +5.161290323 0.645161290 10.453438845 10.081967213 +5.161290323 0.967741935 10.453438845 10.081967213 +5.161290323 1.290322581 10.453438845 10.081967213 +5.161290323 1.612903226 10.453438845 10.081967213 +5.161290323 1.935483871 10.453438845 10.081967213 +5.161290323 2.258064516 10.453438845 10.081967213 +5.161290323 2.580645161 10.555334150 10.189117452 +5.161290323 2.903225806 10.957766893 10.626095161 +5.161290323 3.225806452 11.358194134 11.076954676 +5.161290323 3.548387097 11.754612081 11.542368165 +5.161290323 3.870967742 12.159885021 12.023051902 +5.161290323 4.193548387 12.572343139 12.519769950 +5.161290323 4.516129032 13.004157242 13.033338207 +5.161290323 4.838709677 13.454843261 13.564628886 +5.161290323 5.161290323 13.937409133 14.114575450 +5.161290323 5.483870968 14.453623313 14.684178093 +5.161290323 5.806451613 15.017597606 15.274509804 +5.161290323 6.129032258 15.634903956 15.886723119 +5.161290323 6.451612903 16.324245881 16.522057627 +5.161290323 6.774193548 17.100135640 17.181848349 +5.161290323 7.096774194 17.987899976 17.867535104 +5.161290323 7.419354839 19.013798273 18.580672994 +5.161290323 7.741935484 19.297725710 18.763440860 +5.161290323 8.064516129 19.297725710 18.763440860 +5.161290323 8.387096774 19.297725710 18.763440860 +5.161290323 8.709677419 19.297725710 18.763440860 +5.161290323 9.032258065 19.297725710 18.763440860 +5.161290323 9.354838710 19.297725710 18.763440860 +5.161290323 9.677419355 19.297725710 18.763440860 +5.161290323 10.000000000 19.297725710 18.763440860 +5.483870968 0.000000000 11.200371425 10.254237288 +5.483870968 0.322580645 11.200371425 10.254237288 +5.483870968 0.645161290 11.200371425 10.254237288 +5.483870968 0.967741935 11.200371425 10.254237288 +5.483870968 1.290322581 11.200371425 10.254237288 +5.483870968 1.612903226 11.200371425 10.254237288 +5.483870968 1.935483871 11.200371425 10.254237288 +5.483870968 2.258064516 11.200371425 10.254237288 +5.483870968 2.580645161 11.275744351 10.373748457 +5.483870968 2.903225806 11.579276776 10.860102906 +5.483870968 3.225806452 11.893660170 11.360174870 +5.483870968 3.548387097 12.214119876 11.874552997 +5.483870968 3.870967742 12.553283322 12.403860107 +5.483870968 4.193548387 12.907426182 12.948755706 +5.483870968 4.516129032 13.285781482 13.509938724 +5.483870968 4.838709677 13.693069775 14.088150508 +5.483870968 5.161290323 14.133110626 14.684178093 +5.483870968 5.483870968 14.617921843 15.298857769 +5.483870968 5.806451613 15.149780175 15.933079002 +5.483870968 6.129032258 15.746811487 16.587788726 +5.483870968 6.451612903 16.415017186 17.263996060 +5.483870968 6.774193548 17.180595436 17.962777500 +5.483870968 7.096774194 18.063069240 18.685282635 +5.483870968 7.419354839 19.094026165 19.432740459 +5.483870968 7.741935484 19.380891828 19.623655914 +5.483870968 8.064516129 19.380891828 19.623655914 +5.483870968 8.387096774 19.380891828 19.623655914 +5.483870968 8.709677419 19.380891828 19.623655914 +5.483870968 9.032258065 19.380891828 19.623655914 +5.483870968 9.354838710 19.380891828 19.623655914 +5.483870968 9.677419355 19.380891828 19.623655914 +5.483870968 10.000000000 19.380891828 19.623655914 +5.806451613 0.000000000 11.792304026 10.438596491 +5.806451613 0.322580645 11.792304026 10.438596491 +5.806451613 0.645161290 11.792304026 10.438596491 +5.806451613 0.967741935 11.792304026 10.438596491 +5.806451613 1.290322581 11.792304026 10.438596491 +5.806451613 1.612903226 11.792304026 10.438596491 +5.806451613 1.935483871 11.792304026 10.438596491 +5.806451613 2.258064516 11.792304026 10.438596491 +5.806451613 2.580645161 11.848083932 10.571165035 +5.806451613 2.903225806 12.077812184 11.109435588 +5.806451613 3.225806452 12.327537589 11.660851868 +5.806451613 3.548387097 12.590635013 12.225901398 +5.806451613 3.870967742 12.875627326 12.805096111 +5.806451613 4.193548387 13.187716001 13.398973895 +5.806451613 4.516129032 13.525122531 14.008100260 +5.806451613 4.838709677 13.897938757 14.633070135 +5.806451613 5.161290323 14.310798618 15.274509804 +5.806451613 5.483870968 14.768759505 15.933079002 +5.806451613 5.806451613 15.285527581 16.609473175 +5.806451613 6.129032258 15.867812510 17.304425935 +5.806451613 6.451612903 16.531661050 18.018711707 +5.806451613 6.774193548 17.302903875 18.753148615 +5.806451613 7.096774194 18.198839735 19.508601601 +5.806451613 7.419354839 19.260035649 20.285985830 +5.806451613 7.741935484 19.557269007 20.483870968 +5.806451613 8.064516129 19.557269007 20.483870968 +5.806451613 8.387096774 19.557269007 20.483870968 +5.806451613 8.709677419 19.557269007 20.483870968 +5.806451613 9.032258065 19.557269007 20.483870968 +5.806451613 9.354838710 19.557269007 20.483870968 +5.806451613 9.677419355 19.557269007 20.483870968 +5.806451613 10.000000000 19.557269007 20.483870968 +6.129032258 0.000000000 12.272218993 10.636363636 +6.129032258 0.322580645 12.272218993 10.636363636 +6.129032258 0.645161290 12.272218993 10.636363636 +6.129032258 0.967741935 12.272218993 10.636363636 +6.129032258 1.290322581 12.272218993 10.636363636 +6.129032258 1.612903226 12.272218993 10.636363636 +6.129032258 1.935483871 12.272218993 10.636363636 +6.129032258 2.258064516 12.272218993 10.636363636 +6.129032258 2.580645161 12.312912957 10.782742908 +6.129032258 2.903225806 12.485719838 11.375649592 +6.129032258 3.225806452 12.683802558 11.980650967 +6.129032258 3.548387097 12.903346192 12.598120927 +6.129032258 3.870967742 13.148207675 13.228448936 +6.129032258 4.193548387 13.424397092 13.872040848 +6.129032258 4.516129032 13.734709260 14.529319781 +6.129032258 4.838709677 14.081175133 15.200727043 +6.129032258 5.161290323 14.472910716 15.886723119 +6.129032258 5.483870968 14.920581746 16.587788726 +6.129032258 5.806451613 15.427041299 17.304425935 +6.129032258 6.129032258 16.008438809 18.037159372 +6.129032258 6.451612903 16.684191565 18.786537498 +6.129032258 6.774193548 17.475450862 19.553133975 +6.129032258 7.096774194 18.410291448 20.337549137 +6.129032258 7.419354839 19.533529202 21.140411551 +6.129032258 7.741935484 19.850782228 21.344086022 +6.129032258 8.064516129 19.850782228 21.344086022 +6.129032258 8.387096774 19.850782228 21.344086022 +6.129032258 8.709677419 19.850782228 21.344086022 +6.129032258 9.032258065 19.850782228 21.344086022 +6.129032258 9.354838710 19.850782228 21.344086022 +6.129032258 9.677419355 19.850782228 21.344086022 +6.129032258 10.000000000 19.850782228 21.344086022 +6.451612903 0.000000000 12.667715960 10.849056604 +6.451612903 0.322580645 12.667715960 10.849056604 +6.451612903 0.645161290 12.667715960 10.849056604 +6.451612903 0.967741935 12.667715960 10.849056604 +6.451612903 1.290322581 12.667715960 10.849056604 +6.451612903 1.612903226 12.667715960 10.849056604 +6.451612903 1.935483871 12.667715960 10.849056604 +6.451612903 2.258064516 12.667715960 10.849056604 +6.451612903 2.580645161 12.695732249 11.010062510 +6.451612903 2.903225806 12.824135659 11.660519441 +6.451612903 3.225806452 12.981327533 12.321456235 +6.451612903 3.548387097 13.167148134 12.993128221 +6.451612903 3.870967742 13.381921080 13.675799087 +6.451612903 4.193548387 13.630079770 14.369741229 +6.451612903 4.516129032 13.917888750 15.075236113 +6.451612903 4.838709677 14.251097627 15.792574657 +6.451612903 5.161290323 14.632147614 16.522057627 +6.451612903 5.483870968 15.072735735 17.263996060 +6.451612903 5.806451613 15.583881738 18.018711707 +6.451612903 6.129032258 16.182136955 18.786537498 +6.451612903 6.451612903 16.899235777 19.567818029 +6.451612903 6.774193548 17.840675551 20.362910080 +6.451612903 7.096774194 18.923022827 21.172183159 +6.451612903 7.419354839 20.191498874 21.996020073 +6.451612903 7.741935484 20.543702253 22.204301075 +6.451612903 8.064516129 20.543702253 22.204301075 +6.451612903 8.387096774 20.543702253 22.204301075 +6.451612903 8.709677419 20.543702253 22.204301075 +6.451612903 9.032258065 20.543702253 22.204301075 +6.451612903 9.354838710 20.543702253 22.204301075 +6.451612903 9.677419355 20.543702253 22.204301075 +6.451612903 10.000000000 20.543702253 22.204301075 +6.774193548 0.000000000 12.998209351 11.078431373 +6.774193548 0.322580645 12.998209351 11.078431373 +6.774193548 0.645161290 12.998209351 11.078431373 +6.774193548 0.967741935 12.998209351 11.078431373 +6.774193548 1.290322581 12.998209351 11.078431373 +6.774193548 1.612903226 12.998209351 11.078431373 +6.774193548 1.935483871 12.998209351 11.078431373 +6.774193548 2.258064516 12.998209351 11.078431373 +6.774193548 2.580645161 13.016700861 11.254948535 +6.774193548 2.903225806 13.109051400 11.966077401 +6.774193548 3.225806452 13.233524203 12.685407657 +6.774193548 3.548387097 13.391742155 13.413082004 +6.774193548 3.870967742 13.584206097 14.149246475 +6.774193548 4.193548387 13.814318448 14.894050530 +6.774193548 4.516129032 14.087835159 15.647647155 +6.774193548 4.838709677 14.410179185 16.410192974 +6.774193548 5.161290323 14.791181858 17.181848349 +6.774193548 5.483870968 15.241218368 17.962777500 +6.774193548 5.806451613 15.875517713 18.753148615 +6.774193548 6.129032258 16.681146859 19.553133975 +6.774193548 6.451612903 17.569488681 20.362910080 +6.774193548 6.774193548 18.574163704 21.182657773 +6.774193548 7.096774194 19.734151545 22.012562382 +6.774193548 7.419354839 21.103510509 22.852813853 +6.774193548 7.741935484 21.487304165 23.064516129 +6.774193548 8.064516129 21.487304165 23.064516129 +6.774193548 8.387096774 21.487304165 23.064516129 +6.774193548 8.709677419 21.487304165 23.064516129 +6.774193548 9.032258065 21.487304165 23.064516129 +6.774193548 9.354838710 21.487304165 23.064516129 +6.774193548 9.677419355 21.487304165 23.064516129 +6.774193548 10.000000000 21.487304165 23.064516129 +7.096774194 0.000000000 13.277885841 11.326530612 +7.096774194 0.322580645 13.277885841 11.326530612 +7.096774194 0.645161290 13.277885841 11.326530612 +7.096774194 0.967741935 13.277885841 11.326530612 +7.096774194 1.290322581 13.277885841 11.326530612 +7.096774194 1.612903226 13.277885841 11.326530612 +7.096774194 1.935483871 13.277885841 11.326530612 +7.096774194 2.258064516 13.277885841 11.326530612 +7.096774194 2.580645161 13.288352640 11.519519025 +7.096774194 2.903225806 13.350771800 12.294662039 +7.096774194 3.225806452 13.448963305 13.074946112 +7.096774194 3.548387097 13.584671491 13.860422559 +7.096774194 3.870967742 13.760664445 14.651143382 +7.096774194 4.193548387 13.980902626 15.447161280 +7.096774194 4.516129032 14.249972519 16.248529659 +7.096774194 4.838709677 14.574475539 17.055302647 +7.096774194 5.161290323 14.966122630 17.867535104 +7.096774194 5.483870968 15.630163357 18.685282635 +7.096774194 5.806451613 16.437215216 19.508601601 +7.096774194 6.129032258 17.309323446 20.337549137 +7.096774194 6.451612903 18.275865243 21.172183159 +7.096774194 6.774193548 19.378378532 22.012562382 +7.096774194 7.096774194 20.668439101 22.858746331 +7.096774194 7.419354839 22.225144822 23.710795356 +7.096774194 7.741935484 22.668948283 23.924731183 +7.096774194 8.064516129 22.668948283 23.924731183 +7.096774194 8.387096774 22.668948283 23.924731183 +7.096774194 8.709677419 22.668948283 23.924731183 +7.096774194 9.032258065 22.668948283 23.924731183 +7.096774194 9.354838710 22.668948283 23.924731183 +7.096774194 9.677419355 22.668948283 23.924731183 +7.096774194 10.000000000 22.668948283 23.924731183 +7.419354839 0.000000000 13.515825784 11.595744681 +7.419354839 0.322580645 13.515825784 11.595744681 +7.419354839 0.645161290 13.515825784 11.595744681 +7.419354839 0.967741935 13.515825784 11.595744681 +7.419354839 1.290322581 13.515825784 11.595744681 +7.419354839 1.612903226 13.515825784 11.595744681 +7.419354839 1.935483871 13.515825784 11.595744681 +7.419354839 2.258064516 13.515825784 11.595744681 +7.419354839 2.580645161 13.519282293 11.806246782 +7.419354839 2.903225806 13.556279203 12.648978190 +7.419354839 3.225806452 13.633565239 13.492868190 +7.419354839 3.548387097 13.753168201 14.337919175 +7.419354839 3.870967742 13.918417774 15.184133540 +7.419354839 4.193548387 14.134193279 16.031513690 +7.419354839 4.516129032 14.407312339 16.880062037 +7.419354839 4.838709677 14.747121823 17.729780997 +7.419354839 5.161290323 15.312289393 18.580672994 +7.419354839 5.483870968 16.162307388 19.432740459 +7.419354839 5.806451613 17.055699946 20.285985830 +7.419354839 6.129032258 18.025108663 21.140411551 +7.419354839 6.451612903 19.112532086 21.996020073 +7.419354839 6.774193548 20.379272817 22.852813853 +7.419354839 7.096774194 21.908521849 23.710795356 +7.419354839 7.419354839 23.837396065 24.569967054 +7.419354839 7.741935484 24.406429743 24.784946237 +7.419354839 8.064516129 24.406429743 24.784946237 +7.419354839 8.387096774 24.406429743 24.784946237 +7.419354839 8.709677419 24.406429743 24.784946237 +7.419354839 9.032258065 24.406429743 24.784946237 +7.419354839 9.354838710 24.406429743 24.784946237 +7.419354839 9.677419355 24.406429743 24.784946237 +7.419354839 10.000000000 24.406429743 24.784946237 +7.741935484 0.000000000 13.570706205 11.666666667 +7.741935484 0.322580645 13.570706205 11.666666667 +7.741935484 0.645161290 13.570706205 11.666666667 +7.741935484 0.967741935 13.570706205 11.666666667 +7.741935484 1.290322581 13.570706205 11.666666667 +7.741935484 1.612903226 13.570706205 11.666666667 +7.741935484 1.935483871 13.570706205 11.666666667 +7.741935484 2.258064516 13.570706205 11.666666667 +7.741935484 2.580645161 13.572517919 11.881720430 +7.741935484 2.903225806 13.603707815 12.741935484 +7.741935484 3.225806452 13.676532623 13.602150538 +7.741935484 3.548387097 13.793124575 14.462365591 +7.741935484 3.870967742 13.957010447 15.322580645 +7.741935484 4.193548387 14.173387937 16.182795699 +7.741935484 4.516129032 14.449561083 17.043010753 +7.741935484 4.838709677 14.795606896 17.903225806 +7.741935484 5.161290323 15.430252399 18.763440860 +7.741935484 5.483870968 16.305345082 19.623655914 +7.741935484 5.806451613 17.225621817 20.483870968 +7.741935484 6.129032258 18.227035950 21.344086022 +7.741935484 6.451612903 19.356366279 22.204301075 +7.741935484 6.774193548 20.682807170 23.064516129 +7.741935484 7.096774194 22.303013754 23.924731183 +7.741935484 7.419354839 24.380408194 24.784946237 +7.741935484 7.741935484 25.001049790 25.000000000 +7.741935484 8.064516129 25.001049790 25.000000000 +7.741935484 8.387096774 25.001049790 25.000000000 +7.741935484 8.709677419 25.001049790 25.000000000 +7.741935484 9.032258065 25.001049790 25.000000000 +7.741935484 9.354838710 25.001049790 25.000000000 +7.741935484 9.677419355 25.001049790 25.000000000 +7.741935484 10.000000000 25.001049790 25.000000000 +8.064516129 0.000000000 13.570706205 11.666666667 +8.064516129 0.322580645 13.570706205 11.666666667 +8.064516129 0.645161290 13.570706205 11.666666667 +8.064516129 0.967741935 13.570706205 11.666666667 +8.064516129 1.290322581 13.570706205 11.666666667 +8.064516129 1.612903226 13.570706205 11.666666667 +8.064516129 1.935483871 13.570706205 11.666666667 +8.064516129 2.258064516 13.570706205 11.666666667 +8.064516129 2.580645161 13.572517919 11.881720430 +8.064516129 2.903225806 13.603707815 12.741935484 +8.064516129 3.225806452 13.676532623 13.602150538 +8.064516129 3.548387097 13.793124575 14.462365591 +8.064516129 3.870967742 13.957010447 15.322580645 +8.064516129 4.193548387 14.173387937 16.182795699 +8.064516129 4.516129032 14.449561083 17.043010753 +8.064516129 4.838709677 14.795606896 17.903225806 +8.064516129 5.161290323 15.430252399 18.763440860 +8.064516129 5.483870968 16.305345082 19.623655914 +8.064516129 5.806451613 17.225621817 20.483870968 +8.064516129 6.129032258 18.227035950 21.344086022 +8.064516129 6.451612903 19.356366279 22.204301075 +8.064516129 6.774193548 20.682807170 23.064516129 +8.064516129 7.096774194 22.303013754 23.924731183 +8.064516129 7.419354839 24.380408194 24.784946237 +8.064516129 7.741935484 25.001049790 25.000000000 +8.064516129 8.064516129 25.001049790 25.000000000 +8.064516129 8.387096774 25.001049790 25.000000000 +8.064516129 8.709677419 25.001049790 25.000000000 +8.064516129 9.032258065 25.001049790 25.000000000 +8.064516129 9.354838710 25.001049790 25.000000000 +8.064516129 9.677419355 25.001049790 25.000000000 +8.064516129 10.000000000 25.001049790 25.000000000 +8.387096774 0.000000000 13.570706205 11.666666667 +8.387096774 0.322580645 13.570706205 11.666666667 +8.387096774 0.645161290 13.570706205 11.666666667 +8.387096774 0.967741935 13.570706205 11.666666667 +8.387096774 1.290322581 13.570706205 11.666666667 +8.387096774 1.612903226 13.570706205 11.666666667 +8.387096774 1.935483871 13.570706205 11.666666667 +8.387096774 2.258064516 13.570706205 11.666666667 +8.387096774 2.580645161 13.572517919 11.881720430 +8.387096774 2.903225806 13.603707815 12.741935484 +8.387096774 3.225806452 13.676532623 13.602150538 +8.387096774 3.548387097 13.793124575 14.462365591 +8.387096774 3.870967742 13.957010447 15.322580645 +8.387096774 4.193548387 14.173387937 16.182795699 +8.387096774 4.516129032 14.449561083 17.043010753 +8.387096774 4.838709677 14.795606896 17.903225806 +8.387096774 5.161290323 15.430252399 18.763440860 +8.387096774 5.483870968 16.305345082 19.623655914 +8.387096774 5.806451613 17.225621817 20.483870968 +8.387096774 6.129032258 18.227035950 21.344086022 +8.387096774 6.451612903 19.356366279 22.204301075 +8.387096774 6.774193548 20.682807170 23.064516129 +8.387096774 7.096774194 22.303013754 23.924731183 +8.387096774 7.419354839 24.380408194 24.784946237 +8.387096774 7.741935484 25.001049790 25.000000000 +8.387096774 8.064516129 25.001049790 25.000000000 +8.387096774 8.387096774 25.001049790 25.000000000 +8.387096774 8.709677419 25.001049790 25.000000000 +8.387096774 9.032258065 25.001049790 25.000000000 +8.387096774 9.354838710 25.001049790 25.000000000 +8.387096774 9.677419355 25.001049790 25.000000000 +8.387096774 10.000000000 25.001049790 25.000000000 +8.709677419 0.000000000 13.570706205 11.666666667 +8.709677419 0.322580645 13.570706205 11.666666667 +8.709677419 0.645161290 13.570706205 11.666666667 +8.709677419 0.967741935 13.570706205 11.666666667 +8.709677419 1.290322581 13.570706205 11.666666667 +8.709677419 1.612903226 13.570706205 11.666666667 +8.709677419 1.935483871 13.570706205 11.666666667 +8.709677419 2.258064516 13.570706205 11.666666667 +8.709677419 2.580645161 13.572517919 11.881720430 +8.709677419 2.903225806 13.603707815 12.741935484 +8.709677419 3.225806452 13.676532623 13.602150538 +8.709677419 3.548387097 13.793124575 14.462365591 +8.709677419 3.870967742 13.957010447 15.322580645 +8.709677419 4.193548387 14.173387937 16.182795699 +8.709677419 4.516129032 14.449561083 17.043010753 +8.709677419 4.838709677 14.795606896 17.903225806 +8.709677419 5.161290323 15.430252399 18.763440860 +8.709677419 5.483870968 16.305345082 19.623655914 +8.709677419 5.806451613 17.225621817 20.483870968 +8.709677419 6.129032258 18.227035950 21.344086022 +8.709677419 6.451612903 19.356366279 22.204301075 +8.709677419 6.774193548 20.682807170 23.064516129 +8.709677419 7.096774194 22.303013754 23.924731183 +8.709677419 7.419354839 24.380408194 24.784946237 +8.709677419 7.741935484 25.001049790 25.000000000 +8.709677419 8.064516129 25.001049790 25.000000000 +8.709677419 8.387096774 25.001049790 25.000000000 +8.709677419 8.709677419 25.001049790 25.000000000 +8.709677419 9.032258065 25.001049790 25.000000000 +8.709677419 9.354838710 25.001049790 25.000000000 +8.709677419 9.677419355 25.001049790 25.000000000 +8.709677419 10.000000000 25.001049790 25.000000000 +9.032258065 0.000000000 13.570706205 11.666666667 +9.032258065 0.322580645 13.570706205 11.666666667 +9.032258065 0.645161290 13.570706205 11.666666667 +9.032258065 0.967741935 13.570706205 11.666666667 +9.032258065 1.290322581 13.570706205 11.666666667 +9.032258065 1.612903226 13.570706205 11.666666667 +9.032258065 1.935483871 13.570706205 11.666666667 +9.032258065 2.258064516 13.570706205 11.666666667 +9.032258065 2.580645161 13.572517919 11.881720430 +9.032258065 2.903225806 13.603707815 12.741935484 +9.032258065 3.225806452 13.676532623 13.602150538 +9.032258065 3.548387097 13.793124575 14.462365591 +9.032258065 3.870967742 13.957010447 15.322580645 +9.032258065 4.193548387 14.173387937 16.182795699 +9.032258065 4.516129032 14.449561083 17.043010753 +9.032258065 4.838709677 14.795606896 17.903225806 +9.032258065 5.161290323 15.430252399 18.763440860 +9.032258065 5.483870968 16.305345082 19.623655914 +9.032258065 5.806451613 17.225621817 20.483870968 +9.032258065 6.129032258 18.227035950 21.344086022 +9.032258065 6.451612903 19.356366279 22.204301075 +9.032258065 6.774193548 20.682807170 23.064516129 +9.032258065 7.096774194 22.303013754 23.924731183 +9.032258065 7.419354839 24.380408194 24.784946237 +9.032258065 7.741935484 25.001049790 25.000000000 +9.032258065 8.064516129 25.001049790 25.000000000 +9.032258065 8.387096774 25.001049790 25.000000000 +9.032258065 8.709677419 25.001049790 25.000000000 +9.032258065 9.032258065 25.001049790 25.000000000 +9.032258065 9.354838710 25.001049790 25.000000000 +9.032258065 9.677419355 25.001049790 25.000000000 +9.032258065 10.000000000 25.001049790 25.000000000 +9.354838710 0.000000000 13.570706205 11.666666667 +9.354838710 0.322580645 13.570706205 11.666666667 +9.354838710 0.645161290 13.570706205 11.666666667 +9.354838710 0.967741935 13.570706205 11.666666667 +9.354838710 1.290322581 13.570706205 11.666666667 +9.354838710 1.612903226 13.570706205 11.666666667 +9.354838710 1.935483871 13.570706205 11.666666667 +9.354838710 2.258064516 13.570706205 11.666666667 +9.354838710 2.580645161 13.572517919 11.881720430 +9.354838710 2.903225806 13.603707815 12.741935484 +9.354838710 3.225806452 13.676532623 13.602150538 +9.354838710 3.548387097 13.793124575 14.462365591 +9.354838710 3.870967742 13.957010447 15.322580645 +9.354838710 4.193548387 14.173387937 16.182795699 +9.354838710 4.516129032 14.449561083 17.043010753 +9.354838710 4.838709677 14.795606896 17.903225806 +9.354838710 5.161290323 15.430252399 18.763440860 +9.354838710 5.483870968 16.305345082 19.623655914 +9.354838710 5.806451613 17.225621817 20.483870968 +9.354838710 6.129032258 18.227035950 21.344086022 +9.354838710 6.451612903 19.356366279 22.204301075 +9.354838710 6.774193548 20.682807170 23.064516129 +9.354838710 7.096774194 22.303013754 23.924731183 +9.354838710 7.419354839 24.380408194 24.784946237 +9.354838710 7.741935484 25.001049790 25.000000000 +9.354838710 8.064516129 25.001049790 25.000000000 +9.354838710 8.387096774 25.001049790 25.000000000 +9.354838710 8.709677419 25.001049790 25.000000000 +9.354838710 9.032258065 25.001049790 25.000000000 +9.354838710 9.354838710 25.001049790 25.000000000 +9.354838710 9.677419355 25.001049790 25.000000000 +9.354838710 10.000000000 25.001049790 25.000000000 +9.677419355 0.000000000 13.570706205 11.666666667 +9.677419355 0.322580645 13.570706205 11.666666667 +9.677419355 0.645161290 13.570706205 11.666666667 +9.677419355 0.967741935 13.570706205 11.666666667 +9.677419355 1.290322581 13.570706205 11.666666667 +9.677419355 1.612903226 13.570706205 11.666666667 +9.677419355 1.935483871 13.570706205 11.666666667 +9.677419355 2.258064516 13.570706205 11.666666667 +9.677419355 2.580645161 13.572517919 11.881720430 +9.677419355 2.903225806 13.603707815 12.741935484 +9.677419355 3.225806452 13.676532623 13.602150538 +9.677419355 3.548387097 13.793124575 14.462365591 +9.677419355 3.870967742 13.957010447 15.322580645 +9.677419355 4.193548387 14.173387937 16.182795699 +9.677419355 4.516129032 14.449561083 17.043010753 +9.677419355 4.838709677 14.795606896 17.903225806 +9.677419355 5.161290323 15.430252399 18.763440860 +9.677419355 5.483870968 16.305345082 19.623655914 +9.677419355 5.806451613 17.225621817 20.483870968 +9.677419355 6.129032258 18.227035950 21.344086022 +9.677419355 6.451612903 19.356366279 22.204301075 +9.677419355 6.774193548 20.682807170 23.064516129 +9.677419355 7.096774194 22.303013754 23.924731183 +9.677419355 7.419354839 24.380408194 24.784946237 +9.677419355 7.741935484 25.001049790 25.000000000 +9.677419355 8.064516129 25.001049790 25.000000000 +9.677419355 8.387096774 25.001049790 25.000000000 +9.677419355 8.709677419 25.001049790 25.000000000 +9.677419355 9.032258065 25.001049790 25.000000000 +9.677419355 9.354838710 25.001049790 25.000000000 +9.677419355 9.677419355 25.001049790 25.000000000 +9.677419355 10.000000000 25.001049790 25.000000000 +10.000000000 0.000000000 13.570706205 11.666666667 +10.000000000 0.322580645 13.570706205 11.666666667 +10.000000000 0.645161290 13.570706205 11.666666667 +10.000000000 0.967741935 13.570706205 11.666666667 +10.000000000 1.290322581 13.570706205 11.666666667 +10.000000000 1.612903226 13.570706205 11.666666667 +10.000000000 1.935483871 13.570706205 11.666666667 +10.000000000 2.258064516 13.570706205 11.666666667 +10.000000000 2.580645161 13.572517919 11.881720430 +10.000000000 2.903225806 13.603707815 12.741935484 +10.000000000 3.225806452 13.676532623 13.602150538 +10.000000000 3.548387097 13.793124575 14.462365591 +10.000000000 3.870967742 13.957010447 15.322580645 +10.000000000 4.193548387 14.173387937 16.182795699 +10.000000000 4.516129032 14.449561083 17.043010753 +10.000000000 4.838709677 14.795606896 17.903225806 +10.000000000 5.161290323 15.430252399 18.763440860 +10.000000000 5.483870968 16.305345082 19.623655914 +10.000000000 5.806451613 17.225621817 20.483870968 +10.000000000 6.129032258 18.227035950 21.344086022 +10.000000000 6.451612903 19.356366279 22.204301075 +10.000000000 6.774193548 20.682807170 23.064516129 +10.000000000 7.096774194 22.303013754 23.924731183 +10.000000000 7.419354839 24.380408194 24.784946237 +10.000000000 7.741935484 25.001049790 25.000000000 +10.000000000 8.064516129 25.001049790 25.000000000 +10.000000000 8.387096774 25.001049790 25.000000000 +10.000000000 8.709677419 25.001049790 25.000000000 +10.000000000 9.032258065 25.001049790 25.000000000 +10.000000000 9.354838710 25.001049790 25.000000000 +10.000000000 9.677419355 25.001049790 25.000000000 +10.000000000 10.000000000 25.001049790 25.000000000 diff --git a/examples/hybrid/tipper.fll b/examples/hybrid/tipper.fll new file mode 100644 index 0000000..cb8803f --- /dev/null +++ b/examples/hybrid/tipper.fll @@ -0,0 +1,63 @@ +Engine: tipper +description: (service and food) -> (tip) +InputVariable: service + description: quality of service + enabled: true + range: 0.000 10.000 + lock-range: true + term: poor Trapezoid 0.000 0.000 2.500 5.000 + term: good Triangle 2.500 5.000 7.500 + term: excellent Trapezoid 5.000 7.500 10.000 10.000 +InputVariable: food + description: quality of food + enabled: true + range: 0.000 10.000 + lock-range: true + term: rancid Trapezoid 0.000 0.000 2.500 7.500 + term: delicious Trapezoid 2.500 7.500 10.000 10.000 +OutputVariable: mTip + description: tip based on Mamdani inference + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: cheap Triangle 0.000 5.000 10.000 + term: average Triangle 10.000 15.000 20.000 + term: generous Triangle 20.000 25.000 30.000 +OutputVariable: tsTip + description: tip based on Takagi-Sugeno inference + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: cheap Constant 5.000 + term: average Constant 15.000 + term: generous Constant 25.000 +RuleBlock: mamdani + description: Mamdani inference + enabled: true + conjunction: AlgebraicProduct + disjunction: AlgebraicSum + implication: Minimum + activation: General + rule: if service is poor or food is rancid then mTip is cheap + rule: if service is good then mTip is average + rule: if service is excellent or food is delicious then mTip is generous with 0.5 + rule: if service is excellent and food is delicious then mTip is generous with 1.0 +RuleBlock: takagiSugeno + description: Takagi-Sugeno inference + enabled: true + conjunction: AlgebraicProduct + disjunction: AlgebraicSum + implication: none + activation: General + rule: if service is poor or food is rancid then tsTip is cheap + rule: if service is good then tsTip is average + rule: if service is excellent or food is delicious then tsTip is generous with 0.5 + rule: if service is excellent and food is delicious then tsTip is generous with 1.0
\ No newline at end of file diff --git a/examples/hybrid/tipper.java b/examples/hybrid/tipper.java new file mode 100644 index 0000000..e0578ca --- /dev/null +++ b/examples/hybrid/tipper.java @@ -0,0 +1,103 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class tipper{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("tipper"); +engine.setDescription("(service and food) -> (tip)"); + +InputVariable service = new InputVariable(); +service.setName("service"); +service.setDescription("quality of service"); +service.setEnabled(true); +service.setRange(0.000, 10.000); +service.setLockValueInRange(true); +service.addTerm(new Trapezoid("poor", 0.000, 0.000, 2.500, 5.000)); +service.addTerm(new Triangle("good", 2.500, 5.000, 7.500)); +service.addTerm(new Trapezoid("excellent", 5.000, 7.500, 10.000, 10.000)); +engine.addInputVariable(service); + +InputVariable food = new InputVariable(); +food.setName("food"); +food.setDescription("quality of food"); +food.setEnabled(true); +food.setRange(0.000, 10.000); +food.setLockValueInRange(true); +food.addTerm(new Trapezoid("rancid", 0.000, 0.000, 2.500, 7.500)); +food.addTerm(new Trapezoid("delicious", 2.500, 7.500, 10.000, 10.000)); +engine.addInputVariable(food); + +OutputVariable mTip = new OutputVariable(); +mTip.setName("mTip"); +mTip.setDescription("tip based on Mamdani inference"); +mTip.setEnabled(true); +mTip.setRange(0.000, 30.000); +mTip.setLockValueInRange(false); +mTip.setAggregation(new Maximum()); +mTip.setDefuzzifier(new Centroid(100)); +mTip.setDefaultValue(Double.NaN); +mTip.setLockPreviousValue(false); +mTip.addTerm(new Triangle("cheap", 0.000, 5.000, 10.000)); +mTip.addTerm(new Triangle("average", 10.000, 15.000, 20.000)); +mTip.addTerm(new Triangle("generous", 20.000, 25.000, 30.000)); +engine.addOutputVariable(mTip); + +OutputVariable tsTip = new OutputVariable(); +tsTip.setName("tsTip"); +tsTip.setDescription("tip based on Takagi-Sugeno inference"); +tsTip.setEnabled(true); +tsTip.setRange(0.000, 30.000); +tsTip.setLockValueInRange(false); +tsTip.setAggregation(null); +tsTip.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +tsTip.setDefaultValue(Double.NaN); +tsTip.setLockPreviousValue(false); +tsTip.addTerm(new Constant("cheap", 5.000)); +tsTip.addTerm(new Constant("average", 15.000)); +tsTip.addTerm(new Constant("generous", 25.000)); +engine.addOutputVariable(tsTip); + +RuleBlock mamdani = new RuleBlock(); +mamdani.setName("mamdani"); +mamdani.setDescription("Mamdani inference"); +mamdani.setEnabled(true); +mamdani.setConjunction(new AlgebraicProduct()); +mamdani.setDisjunction(new AlgebraicSum()); +mamdani.setImplication(new Minimum()); +mamdani.setActivation(new General()); +mamdani.addRule(Rule.parse("if service is poor or food is rancid then mTip is cheap", engine)); +mamdani.addRule(Rule.parse("if service is good then mTip is average", engine)); +mamdani.addRule(Rule.parse("if service is excellent or food is delicious then mTip is generous with 0.5", engine)); +mamdani.addRule(Rule.parse("if service is excellent and food is delicious then mTip is generous with 1.0", engine)); +engine.addRuleBlock(mamdani); + +RuleBlock takagiSugeno = new RuleBlock(); +takagiSugeno.setName("takagiSugeno"); +takagiSugeno.setDescription("Takagi-Sugeno inference"); +takagiSugeno.setEnabled(true); +takagiSugeno.setConjunction(new AlgebraicProduct()); +takagiSugeno.setDisjunction(new AlgebraicSum()); +takagiSugeno.setImplication(null); +takagiSugeno.setActivation(new General()); +takagiSugeno.addRule(Rule.parse("if service is poor or food is rancid then tsTip is cheap", engine)); +takagiSugeno.addRule(Rule.parse("if service is good then tsTip is average", engine)); +takagiSugeno.addRule(Rule.parse("if service is excellent or food is delicious then tsTip is generous with 0.5", engine)); +takagiSugeno.addRule(Rule.parse("if service is excellent and food is delicious then tsTip is generous with 1.0", engine)); +engine.addRuleBlock(takagiSugeno); + + +} +} diff --git a/examples/hybrid/tipper.pdf b/examples/hybrid/tipper.pdf Binary files differnew file mode 100644 index 0000000..482e9cc --- /dev/null +++ b/examples/hybrid/tipper.pdf |