⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generator.cpp

📁 一个类似STL的自动机的源代码库
💻 CPP
字号:
#include <astl.h>
#include <random.h>
#include <functional>
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <unistd.h>
#include <stream.h>
#include <ccopy.h>

using namespace std;

void usage(const string& exe)
{
  cerr << "Usage: " << exe 
       << " [-vm] [-t x] [-f x] [-d depth] [-s seed] {tree|dag|cyclic}" << endl;
  cerr << "       -v\tsend comments to standard error output" << endl;
  cerr << "       -m\tdo not mark states during traversal (dag)" << endl;
  cerr << "       -t\tprobability for a transition to be defined (default 0.5)" << endl;
  cerr << "       -f\tprobability for a state to be final (default 0.1)" << endl;
  cerr << "       -d\tmax depth (default 3)" << endl;
  cerr << "       -s\trandom number generator seed (default time)" << endl;
  exit(1);
}

int main(int argc, char** argv)
{
  bool verbose = false;
  int depth = 3;
  int seed = time(0);
  double t_prob = .5;
  double f_prob = .1;
  const char* exe = argv[0];
  bool mark = true;
  for(int c; (c = getopt(argc, argv, "vmf:t:d:s:")) != EOF;)
    switch(c) {
    case 't' : 
      if (optarg) t_prob = atof(optarg); else usage(exe);
      break;
    case 'f' :
      if (optarg) f_prob = atof(optarg); else usage(exe);
      break;
    case 'd' :
      if (optarg) depth = atoi(optarg); else usage(exe);
      break;
    case 's' :
      if (optarg) seed = atoi(optarg); else usage(exe);
      break;
    case 'v' :
      verbose = true;
      break;
    case 'm' :
      mark = false;
      break;
    default :
      usage(exe);
    }

  string structure;
  if (optind < argc) structure = argv[optind];
  else usage(exe);
  DFA_stream out(cout);
  if (structure == "tree") {
    if (verbose) cerr << "random tree automaton [depth " << depth << ", tprob " << t_prob
		      << ", fprob " << f_prob << ", seed " << seed << "]" << endl;
    clone(out, dfirstc(tree_generator<range<char, 'a', 'z'> >(depth, t_prob, f_prob, seed)));
  }
  else
    if (structure == "dag") {
      if (verbose) cerr << "random DAG automaton [depth " << depth << ", tprob " << t_prob
			<< ", fprob " << f_prob << ", seed " << seed << "]" << endl;
      if (mark) 
	clone(out, dfirst_markc(dag_generator<range<char, 'a', 'z'> >(depth, t_prob, f_prob, seed)));
      else
	clone(out, dfirstc(dag_generator<range<char, 'a', 'z'> >(depth, t_prob, f_prob, seed)));
    }
    else
      if (structure == "cyclic") {
	if (verbose) cerr << "random cyclic automaton [depth " << depth << ", tprob " << t_prob
			  << ", fprob " << f_prob << ", seed " << seed << "]" << endl;
	clone(out, dfirst_markc(cyclic_generator<range<char, 'a', 'z'> >(depth, t_prob, f_prob, seed)));
      }
      else usage(exe);

  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -