Example #1
0
 /**
  * Sample a new value.
  *
  * @param   \Hoa\Math\Sampler  $sampler    Sampler.
  * @return  mixed
  * @throws  \Hoa\Realdom\Exception
  */
 public function sample(Math\Sampler $sampler = null)
 {
     if (empty($this->_realdoms)) {
         throw new Exception('Cannot sample because the disjunction is empty.', 3);
     }
     if (null === $sampler && null === ($sampler = Realdom::getDefaultSampler())) {
         throw new Exception('No sampler set. Please, use the %s::setDefaultSampler() ' . 'method.', 4, __NAMESPACE__);
     }
     $m = count($this->_realdoms) - 1;
     $i = $sampler->getInteger(0, $m);
     $this->_chosenRealdom = $this->_realdoms[$i];
     return $this->_chosenRealdom->sample($sampler);
 }
Example #2
0
 /**
  * The entry method.
  *
  * @return  int
  */
 public function main()
 {
     while (false !== ($c = $this->getOption($v))) {
         switch ($c) {
             case 'h':
             case '?':
                 return $this->usage();
             case '__ambiguous':
                 $this->resolveOptionAmbiguity($v);
                 break;
         }
     }
     Realdom::setDefaultSampler(new Math\Sampler\Random());
     $compiler = Compiler\Llk::load(new File\Read('hoa://Library/Praspel/Grammar.pp'));
     $interpreter = new Praspel\Visitor\Interpreter();
     $dump = new Praspel\Visitor\Compiler();
     $interpreter->visit($compiler->parse('@requires;'));
     $words = [];
     from('Hoathis or Hoa')->foreachImport('Realdom.*', function ($classname) use(&$words) {
         $class = new \ReflectionClass($classname);
         if ($class->isSubclassOf('\\Hoa\\Realdom')) {
             $words[] = $classname::NAME;
         }
         return;
     });
     $readline = new Console\Readline();
     $readline->setAutocompleter(new Console\Readline\Autocompleter\Word($words));
     $expression = '.h';
     do {
         try {
             if ('.' === $expression[0]) {
                 @(list($expression, $tail) = explode(' ', $expression));
             }
             switch ($expression) {
                 case '.h':
                 case '.help':
                     echo 'Usage:', "\n", '    .h[elp]      to print this help;', "\n", '    .c[lear]     to clear the screen;', "\n", '    .v[ariables] to print all variables;', "\n", '    .s[ample]    to sample a value of a variable;', "\n", '    .u[nset]     to unset a variable;', "\n", '    .d[ump]      to dump the tree of the expression;', "\n", '    .q[uit]      to quit.', "\n";
                     break;
                 case '.c':
                 case '.clear':
                     Console\Cursor::clear('↕');
                     break;
                 case '.v':
                 case '.variables':
                     foreach ($interpreter->getClause() as $variable) {
                         echo $variable->getName(), ': ', $variable->getHeld()->toPraspel(), "\n";
                     }
                     break;
                 case '.s':
                 case '.sample':
                     if (null === $tail) {
                         echo 'You must precise a variable name.', "\n";
                         break;
                     }
                     $_clause = $interpreter->getClause();
                     if (!isset($_clause[$tail])) {
                         echo 'Variable ', $tail, ' does not exist.', "\n";
                         break;
                     }
                     $_variable = $_clause[$tail];
                     var_export($_variable->sample());
                     echo "\n";
                     $_variable->reset();
                     break;
                 case '.u':
                 case '.unset':
                     if (null === $tail) {
                         echo 'You must precise a variable name.', "\n";
                         break;
                     }
                     $_clause = $interpreter->getClause();
                     unset($_clause[$tail]);
                     break;
                 case '.d':
                 case '.dump':
                     echo $dump->visit($interpreter->getRoot());
                     break;
                 case '.q':
                 case '.quit':
                     break 2;
                 default:
                     if (null === $expression) {
                         break;
                     }
                     $interpreter->visit($compiler->parse($expression, 'expression'));
                     break;
             }
         } catch (\Exception $e) {
             echo $e->getMessage(), "\n";
         }
         echo "\n";
     } while (false !== ($expression = $readline->readLine('> ')));
     return;
 }