Giter VIP home page Giter VIP logo

opbe's Introduction

OPBE

Ogame Probabilistic Battle Engine

Require PHP >= 5.3

http://www.phpclasses.org/package/8318-PHP-Ogame-probabilistic-battle-engine.html

  1. Introduction
  2. Quick start
  3. Accuracy
  4. Performance
  5. TestCases
  6. Developers guide
  7. License
  8. Questions
  9. Who is using OPBE

Introduction

OPBE is the first (and only) battle engine in the world that uses Probability theory:
battles are processed very very fast and required little memory resources.
Also, memory and CPU usage are O(1), this means they are CONSTANT and independent of the ships amount.

Features:

  • Multiple players and fleets (ACS)
  • Fake targets (Fodder)
  • Rapid fire
  • Randomic rapid fire with normal distribution
  • Ordered fires
  • Bounce rule
  • Waste of damage
  • Moon attempt
  • Plunder algorithm (resources partition)
  • Defenses rebuilt
  • Report generated by templates
  • Report can be stored as object in database
  • Cross-platform (XgProyect,2moons,Xnova,Wootook etc)

Future features

  • automatic Bcmath detect and usage if needed

Quick start (installation)

This seems so cool! How can I use it?
You can check in implementations directory for your game version, read the installation.txt file.
Be sure you have read the license with respect for the author.


Accuracy

One of main concepts used in this battle engine is the expected value: instead calculate each ship case, OPBE creates an estimation of their behavior.
This estimation is improved by analyzing behavior for infinite simulations, so, to test OPBE's accuracy you have to set speedsim (or dragosim)'s battles amount to a big number, such as 3k.
Recently was added a feature to simulate a randomic rapid fire, making the combat more realistic. Anyway you can enable or disable it inside the constants/battle_constants file.
Note: randomic rapid fire will only change the amount of shots,but the way it do is particularly...Infact the deviaton from the mean is made by a special random number generator implementing Gauss algorithm.
This ensure a bell curve of shots close to the ideality.
Also,the system can be bounded by values that can be setted in the constants/battle_constants* file.


Performance

It seems that noone knows the O() notation, so this is the definition from the Wiki:
big O notation is used to classify algorithms by how they respond (e.g., in their processing time or working space requirements) to changes in input size.
There are different possibilities, such as O(n) (linear), O(n^2) (quadratic) etc.
OPBE is O(1) in both CPU and MEMORY usage:
In practice, that means that the computional requirements to solve an algoritm don't increase with the input size.
It's awesome! You can simulate 20 ships or 20 Tera ships and nothing should change.
In reality, there is a small difference because the arithmetic operations aren't O(1) for CPU, and also a double requires more space than an integer.

Let's do some test:

Double's limit test

Write a lot of nines in both defender's BC and attacker's BC.
Because of the double limit, your number will be trunked to 9223372036854775807.
Anyway the battle starts and are calculated as well (some overflow errors maybe).

Battle calculated in 2.54 ms.
Memory used: 335 KB
Worst case, OPBE max requirements!

The only thing that requires a lot of memory in OPBE is the Report, because it stores all ships in every round... this means that more
rounds = more memory.
Also, the worst case for CPU and memory is to have all types of ships(iteration of them).
So we set 1'000'000 of ships in each type(defenses only for defender),not a big number just to avoid overflow in calculations.
And we got:

Battle calculated in 144.88 ms.
Memory used: 6249 KB
  • These values really depend on your hardware and PHP configuration: expecially, caching the bytecode will decrease a lot the CPU usage but increase RAM usage.

Seems a lot? Try a O(n^2) algorithm and you will crash with insane small amount of ships :)
Anyway you can decrease a lot the memory usage setting, in constants/battle_constants.php,

    define('ONLY_FIRST_AND_LAST_ROUND',true);

Making new test cases to share

Something wrong with OPBE? The fastest way to share the simulation is to make a test case.

  1. Set your prefered class name,but it must extends RunnableTest.
  2. Override two functions:
  • getAttachers() : return a PlayerGroup that rappresent the attackers
  • getDefenders() : return a PlayerGroup that rappresent the defenders
  1. Instantiate your class inside the file.
  2. Put the file in opbe/test/runnable/

An example:

<?php
require ("../RunnableTest.php");
class MyTest extends RunnableTest
{
    public function getAttachers()
    {
        $fleet = new Fleet(1,array(
            $this->getShipType(206, 50),
            $this->getShipType(207, 50),
            $this->getShipType(204, 150)));
        $player = new Player(1, array($fleet));
        return new PlayerGroup(array($player));
    }
    public function getDefenders()
    {
        $fleet = new Fleet(2,array(
            $this->getShipType(210, 150),
            $this->getShipType(215, 50),
            $this->getShipType(207, 20)));
        $player = new Player(2, array($fleet));
        return new PlayerGroup(array($player));
    }
}
new MyTest();
?>
  • You can check the combat result entering with a browser in opbe/test/runnable/MyTest.php
  • Please use Github issue system

Implementation developing guide

The system organization is like :

  • PlayerGroup
    • Player1
    • Player2
      • Fleet1
      • Fleet2
        • ShipType1
        • ShipType2

So in a PlayerGroup there are different Players,
each Player have different Fleets,
each Fleet have different ShipTypes.

  • All these classes implements Iterator interface, so you can iterate them as arrays.

     foreach($playerGroup as $idPlayer => $player)
      {
          foreach($player as $idFleet => $fleet)
          {
              foreach($fleet as $idShipType => $shipType)
              {
                  // do something
              }
          }
      }

    But to increase performace it's better to call getIterator() function.

  • Another good point is that there aren't side effects in all OPBE classes. This means something like this:

class A
    private $store=array();
    function put($id,$object)
    {
       $this->store[$id] = $object->clone();
    }
    function get($id) 
    {
        return $this->store[$id];    
    }
} 

$a= new A();
$obj = new Object();
$obj->x= "hello";
$a->store(1,$obj);

$obj->x .=" word"; // $object is edited only outside A, no side effects!

echo $a->get(1); // print "hello" instead "hello world"  

Sometimes it's not really required to clone, but this good practice ensure less bugs.

ShipType

ShipType is the smallest unit in the system: it reppresents a group of specific object type able to fight.
For some reasons, OPBE needs to categorize it in either one of these two types extending ShipType:

  • Defense
  • Ship

You shouldn't ened to care about this fact because this automatic code will do it for you:

    $shipType =  $this->getShipType($idShipType, $count);
   
function getShipType($id, $count)
{
    global $CombatCaps, $pricelist;
    $rf = $CombatCaps[$id]['sd'];
    $shield = $CombatCaps[$id]['shield'];
    $cost = array($pricelist[$id]['metal'], $pricelist[$id]['crystal']);
    $power = $CombatCaps[$id]['attack'];
    if ($id >= SHIP_MIN_ID && $id <= SHIP_MAX_ID)
    {
        return new Ship($id, $count, $rf, $shield, $cost, $power);
    }
    return new Defense($id, $count, $rf, $shield, $cost, $power);
}
   
  • Note that you can assign different technology levels to each ShipType, see functions inside this class.
  • By default, ShipType will give tech levels by its Fleet container .

Fleet

Fleet is a group of ShipType and it is extended by a single object

  • HomeFleet : represent the ships and defense in the target's planet

This time you have to manually choose the right class and HomeFleet should have $id = 0;

    $fleet = new Fleet($idFleet); // $idFleet is a must
    $fleet = new HomeFleet(0); // 0 is a must
    $fleet->addShipType($shipType);
  • Note that you can assign differents techs to each Fleet, see functions inside this class.
  • By default, Fleet will give tech levels by its Player container .
  • HomeFleet work as Fleet, but with the difference that is unique: adding more HomeFleet will result on merging them. Feature implemented just for a better report.
  • Fleet has a __toString method that automatically fill-up the corrispective views/fleet.html and return the result html.
    So you can echo it.
  echo $fleet; 

Player

Player is a group of Fleets, don't care about the question attacker or defender.

    $player = new Player($idPlayer); // $idPlayer is a must
    $player->addFleet($fleet);
  • Player has a __toString method that automatically fill-up the corrispective views/player2.html and return the result html.
    So you can echo it.
  echo $player; 

PlayerGroup

PlayerGroup is a group of Player, don't care about the question attacker or defender.

    $playerGroup = new PlayerGroup();
    $playerGroup->addPlayer($player);
  • PlayerGroup has a __toString method that automatically fill-up the corrispective views/PlayerGroup.html and return the result html.
    So you can echo it.
  echo $playerGroup; 

Bring them together

An easy way to display them:

    $fleet = new Fleet($idFleet);
    $fleet->addShipType($this->getShipType($id, $count));
    
    $player = new Player($idPlayer);
    $player->addFleet($fleet);
    
    $playerGroup = new PlayerGroup();
    $playerGroup->addPlayer($player);
    

Battle

Battle is the main class of OPBE.
The first argument of constructor is the attacking PlayerGroup, the second one is the defending PlayerGroup.

There are two methods you need to know about:

  • startBattle(boolean $debug) : start the battle, if $debug == true, informations will be written in output.
  • getReport() : return an object useful to retrieve all kinds of battle information.
    $engine = new Battle($attackingPlayerGroup, $defendingPlayerGroup);
    $engine->startBattle(false);
    $info = $engine->getReport();

BattleReport

BattleReport is a big container of data about the simulated battle.
In the web interface of OPBE, the instance of BattleReport is injected in templates.

    $info = $engine->getReport();
  • BattleReport contains all the ships status in every round, and also has useful functions to fill templates or update
    the database after the battle.
  • BattleReport has a __toString method that automatically fill-up the corrispective views/report.html and return the result html.
    So you can echo it.
   echo $info; 

This is very usefull to store only the object in database and generate the html when needed. For example:

    $obj = serialize($info);
    mysql_query("INSERT INTO Reports (id , obj) VALUES ($id, $obj)");
    
    $result = mysql_fetch_array(mysql_query("SELECT obj FROM Reports WHERE id = $id"));    
    $info = unserialize($result['obj']);
    echo $info;

License

license

Copyright (C) 2013  Jstar

OPBE is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

OPBE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

why affero GPL


Questions

I would like to include your battle engine but the code of my game won't be published

You can keep secret your code because OPBE can be seen as a external module with own license, it's only required to share changes on OPBE.

I would like to have some profits with my game

GNU affero v3 accepts profits as well

I would like use OPBE with numbers greater than double

You should replace any PHP native mathematical with BC math functions

I would like change ships/defense repair probability

    You have to change only constats/battle_constants.php  
    define('DEFENSE_REPAIR_PROB', 0.7); // 0.7 = 70%
    define('SHIP_REPAIR_PROB', 0);

Who is using OPBE?

I'm happy to deliver this software giving others the possibility to have a good battle engine.
On the other hand, it's a pleasure to see people using my OPBE.
[update] Please do not send email, instead use github's private messages

xgproyect

opbe's People

Contributors

athk avatar byazrail avatar jgalat avatar jstar88 avatar kaizoku04 avatar lucaskovacs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

opbe's Issues

Just curious, O(1)?

Unless you have discovered something new, you have to iterate all ships at least once. Something in my guts tells me once is a bit low no matter how probabilistic this is.

So what is actually O(1) compared to all other battle sims?

battle engine problem

Hello I have a question about the mechanism of how the battle engine works on high tier fleet against low tier.
When I stimulated massive basic defence units against the top tier units, I found that no damage can be done on the top tier units and I am very curious about the result.

Example:

Attacker: 100 black moons
Defender: 100 billion light laser turret

Result:
The battle ended in a draw.
The attacker lost a total of 0 units.
The defender lost a total of 67 214 000 units.

and a message showed up while the battle:
The defending fleet fires a total of 100'000'000'000 times with the power of 10'000'000'000'000 upon the attacker.
The attacker's shields absorb 0 damage points.

Is that a bug or some special setting for high tier units protection? Many thanks!

Something battle fault.

This is 2moons.
I thanks. this battle is attacker win.
But, Something wrong like this ( draw )


Attacker
250% - 250% - 250%
Avatar 3

Defender
80% - 120% - 100%
Missile Launcher 196
Light Laser Turret 14
Heavy Laser Turret 31
Gauss Cannon 1
Ion Cannon 1
Plasma Cannon 7
Small Shield Dome 1
Large Shield Dome 1

---- result of battle ----
The battle ended in a draw.

Battle Engine Error - Undefined index: techs

Hi,
I implemented Your Battle Engine on 2Moons v1.7 script. Your battle module is very good, but has one bug.
The players can't attack colony planets of other players, and players can't attack inactive user planets. This error shows up:
here is screenshoot: http://pokit.org/get/img/fae68c241700a8fd9d85105bd1b699f2.jpg

NOTICE
Message: Undefined index: techs
File: /includes/classes/missions/GenerateReport.php
Line: 72
URL: http://bihline.com/game.php?page=overview
PHP-Version: 5.3.28
PHP-API: cgi-fcgi
MySQL-Cleint-Version: 5.1.67
2Moons Version: 1.7.2676
Debug Backtrace:
#0 /includes/classes/missions/GenerateReport.php(72): errorHandler(8, 'Undefined index...', 'FILEPATH ...', 72, Array)
#1 /includes/classes/missions/MissionCaseAttack.php(322): GenerateReport(Array, Array)
#2 /includes/classes/class.FlyingFleetHandler.php(80): MissionCaseAttack->TargetEvent()
#3 /includes/FleetHandler.php(40): FlyingFleetHandler->run()
#4 /includes/common.php(126): require('FILEPATH ...')
#5 /game.php(35): require('FILEPATH ...')
#6 {main}

How can I fix this. Please help.
Thanks

Question

Hello can you give me the files names i have to edit if i would like example to offer the player the opportunity to have a double attack ? didn't find out exactly,

Regards

tryMoon

looks like tryMoon event doesn't count resources that already floating around the planet and trying to use resources that was left only from current battle

Missing name

Sorry can't create pull request but there is missing name when adding player to PlayerGroup
Please replase inside Player.php model:

public function cloneMe()
    {
        $fleets = array_values($this->array);
        return new Player($this->id, $fleets ,$this->weapons_tech, $this->shields_tech, $this->armour_tech);
    }

With:

public function cloneMe()
    {
        $fleets = array_values($this->array);
        return new Player($this->id, $fleets ,$this->weapons_tech, $this->shields_tech, $this->armour_tech, $this->name);
    }

Bug with big number of civil ships

There is problem with big number of small cargo, heavy cargo, and recycler,
attacker :
small cargo : 7,000,000
battlecruiser : 40,000

defender:
small cargo : 2,700,000
battlecruiser : 15,000

after battle

attacker :
small cargo : 6440792
battlecruiser : 39857

defender:
small cargo : 2,700,000
battlecruiser : 15,000

result :
The battle ended in a draw
The attacker has lost a total of 2 246 842 000 units.
The defender has lost a total of 0 units.

problem : attacker has bigger number of ships, more battlecruisers but he cannot drop even 1 ship of defender.

test code used :
<?php require ("../../RunnableTest.php"); class MyTest extends RunnableTest { public function getAttachers() { $fleet = new Fleet(1,array( $this->getShipType(202, 7000000), $this->getShipType(215, 40000))); $player = new Player(1, array($fleet)); return new PlayerGroup(array($player)); } public function getDefenders() { $fleet = new Fleet(2,array( $this->getShipType(202, 2700000), $this->getShipType(215, 15000))); $player = new Player(2, array($fleet)); return new PlayerGroup(array($player)); } } new MyTest(); ?>

Increase the attack power

Hello. jstar88
How are you?
I have a question.
My 2moons version is 1.3
My english is no good. sorry...^^

From basic attack power... (var.php)

Can I increase the attack power of the Attacker battle_ship + 10% and the Defender's light_hunter attack power + 20% in battle?

The bottom line is that in battle I want to add an increase in attack power to each attacker & defender's fleet or defense facility.

Is it possible?

Error Battle engine

Check "opbe/errors/" folder for more informations. 01-04-14__18-46-27
not exist

The folder its not create.. So I can not know that throws the error

Debris

Hello i really dont understand
function calculateAttack(&$attackers, &$defenders, $FleetTF, $DefTF)

Why do you use it when its not used in your code i mean the fleetTF and DefTF var you use constant,

???

plz help

In the current '2Moons 1.7.2' it is marked

'shield_tech' and 'defence_tech' is the opposite.

'Shield_tech' => 'defence_tech'
'defence_tech' => 'Shield_tech'

And

111 => armour
110 => shield

What if I modify any part?

Some battle shield -

Hi~
I found something.
How about this?

More shields absorb 1'265 damage.

The defending fleet fires a total of 5 times with the power of 1'080 upon the attacker.
The attacker's shields absorb 1'265 damage points.

Fight like this

PRESENTATION

Attacker bot
170% - 160% - 160%
Heavy Cargo 20
Planet Bomber 30

Defender bot
150% - 150% - 150%
Missile Launcher 1
Light LaserTurret 2
Heavy Laser Turret 1
Small Shield Dome 1
Large Shield Dome 1


BATTLE

Round 1

Attacker bot
170% - 160% - 160%
Heavy Cargo 20
Planet Bomber 30

Defender bot
150% - 150% - 150%
Missile Launcher 1
Light LaserTurret 2
Heavy Laser Turret 1
Small Shield Dome 1
Large Shield Dome 1

The attacking fleet fires a total of 93 times with the power of 197'370 upon the defender.
The defender's shields absorb 30'363 damage points.

The defending fleet fires a total of 5 times with the power of 1'080 upon the attacker.
The attacker's shields absorb 1'265 damage points.

How to apply engine?

Hi~
The battle enging is very good.
And, How to apply this code in 2moons sources?
My 2moons version is 1.3.5...
Please Some teach to me for apply source?

Report customization

@jstar88 This ticket is more a feature request than an issue, but, It will be great to be able to edit the presentation of the combat reports without the need to modify the OPBE library.

Other thing that I notice is that the destroy mission is pretty similar to the attack mission, main differences are that there is no moon creation, no debris, and the script needs to calculate the the chance of moon destruction, death start destruction or the tie.

Any thought about this?

Regards,
lucky

Error with the battle

Hi,

I'm an administrator of a custom 2Moons server.

I installed OPBE not long ago, and we fonud a problem.

I have a custom defense, called the Ionic Cannon, which is a single defense (same as shields), and which is created solely to destroy bigger ships in one hit (with even a rapidfire against them)

However, it seems that this defense doesn't act at all in some cases.
The damage output is clearly displayed in the round results, but no damage is applied.

I first thought it was my specific modified defense that made it. However, after a little check, the problem also applies with preexisting defenses of 2Moons, such as the Orbital Platform.

To reproduce this bug in the battle simulator:

Put 100 heavy attacking ships such as the Death Star or the Dark Moon, or even Avatar, with no fodder.

Put 100 000 Missile launchers and 1 Orbital Platform (which has enough firepower to get rid of nearly everything)

Launch the simulation.

You will see that the damage outcome is indeed like what it's supposed to be, however, despite having enough power to get rid of any of them, the attackers doesn't lose a single unit.

The problem is a big one, as it makes more powerful defenses useless.

Do you have any idea about how to fix that?

Thanks,

Para

Battle report error?

// in BattleReport.php
// function getAfterBattlePlayerGroup

if (!$endFleet->existShipType($idShipType))
{
    $endShipType = $shipType;
}
else
{
    $endShipType = $endFleet->getShipType($idShipType);
    $endShipType->increment($shipType->getCount());
}

// should be 
$endFleet->add( $shipType);

Parse error: Syntax error

Parse error: syntax error, unexpected T_FUNCTION in /home/a5951346/public_html/includes/opbe-master/implementations/Xgp/missionCaseAttack.php on line 49

Such line is

//---------------------------- errors -----------------------------------
//default handlers
$errorHandler = array('DebugManager', 'myErrorHandler');
$exceptionHandler = array('DebugManager', 'save');
//then,hack them merging a new function to move back fleets.
------------> $myFunc = function ()
{
global $debug;
$debug->error('Check "opbe/errors/" folder for more informations. '.date('d-m-y__H-i-s'), 'Battle error');
}
;
$errorHandler = DebugManager::intercept($errorHandler, $myFunc);
$exceptionHandler = DebugManager::intercept($exceptionHandler, $myFunc);

Running XGP 2.10.8. Followed instructions on installation. Actually did find somebody with the same error, but on a french forum. (http://www.kommunauty.fr/forum/20848-parse-error-syntax-error-unexpected-t-function/)

It would be awesome of you if you told me how to fix this. Thanks in advance!

Minimal Bug

See image first:http://imgur.com/0HXkeia

Hi, sorry to bother you but I found a couple of bugs. will not if they are bug but as I have two versions Eng much as language and English language these are bug and error with commas and apostofres to look for. Mirar la imagen

Bug 1: Error in language always comes out in English.
Bug 2: Other parts are still in English.
Bug 3: The numbers are together to texts.
Bug 4: Apostrophes appear in place points.

Attacker and Defender Basic Fleet and Defense Facilities Performance

Hi..
My version is 1.3...
../includes/var.php
Can the attacker and defender fleet and Planetary Defense facilities default their performance?
Is it applicable to OPBE?

Ex)
attacker
$CombatCaps = array(
202 => array ( 'shield' => 10, 'attack' => 5, 'sd' => array (210 => 5, 212 => 5)),
203 => array ( 'shield' => 25, 'attack' => 5, 'sd' => array (210 => 5, 212 => 5)),
...
...

defender
$CombatCaps2 = array(
202 => array ( 'shield' => 8, 'attack' => 10, 'sd' => array (210 => 5, 212 => 5)),
203 => array ( 'shield' => 20, 'attack' => 10, 'sd' => array (210 => 5, 212 => 5)),
...
...

calculateAttack.php

Just install 2moons 1.7.3 version and install newest OPBE. But i only get errors all the time. First it was with rootpaths but i fix that. Now i get this.

Message: Undefined index: user
File: /includes/libs/opbe/implementations/2Moons/1_7_2_injectionmode/calculateAttack.php
Line: 229
URL: http://xxxx/Marcim/mooons/game.php
PHP-Version: 5.5.9-1ubuntu4.14
PHP-API: apache2handler
MySQL-Cleint-Version: mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
2Moons Version: 1.7.2633
Debug Backtrace:
#0 /includes/libs/opbe/implementations/2Moons/1_7_2_injectionmode/calculateAttack.php(229): errorHandler(8, 'Undefined index...', 'FILEPATH ...', 229, Array)
#1 /includes/libs/opbe/implementations/2Moons/1_7_2_injectionmode/calculateAttack.php(146): updatePlayers(Object(PlayerGroup), Array)
#2 /includes/classes/missions/MissionCaseAttack.php(155): calculateAttack(Array, Array, '30', '0')
#3 /includes/classes/class.FlyingFleetHandler.php(80): MissionCaseAttack->TargetEvent()
#4 /includes/FleetHandler.php(40): FlyingFleetHandler->run()
#5 /includes/common.php(126): require('FILEPATH ...')
#6 /game.php(34): require('FILEPATH ...')
#7 {main}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.