/** * 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); }
/** * 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; }