Пример #1
0
/*********************************************************************
Makes a "beginner" level gameboard which is 10 x 10 and has 10 mines. 
It starts out with all tiles marked as "covered"
************************************************************************/
void Minesweeper::Beginner()
{
	setBoardSize(10, 10);
	int mines = 0;
	while (mines < 10)
	{
		/*******************************************************************
		Loops through the array and places either a mine or an empty cell
		based on output from RNG
		********************************************************************/

		for (int r = 0; r < 10; ++r)
		{
			for (int c = 0; c < 10; ++c)
			{
				for (int idx = 0; idx < r*c; ++idx)
				{
					
					if ((1 + (rand() % 10)) == 1)
					{
						
						setBoard(getMine());
					}

					else
					{
						setBoard(getBlank());
					}
				}
			}
		}
	}

}
bool SynapseSimulatorUpdater<MType>::
start(std::function<bool()> thread_init,
      std::function<bool()> thread_destroy) {
  struct Synchronizer : public DataBuffer {
    DeviceNeuronStateBuffer<MType>* neuron_state;
    SynapticFireVectorBuffer<MType>* synaptic_fire;
    SynapticCurrentBuffer<MType>* synaptic_current;
    float simulation_time;
    float time_step;
  };
  auto synchronizer_publisher = new SpecificPublisher<Synchronizer>();
  for (size_t i = 0; i < num_buffers_; ++i) {
    synchronizer_publisher->addBlank(new Synchronizer());
  }
  auto master_function = [this,
                          synchronizer_publisher,
                          thread_init,
                          thread_destroy]() {
    thread_init();
    float simulation_time = 0.0f;
    float time_step = simulation_parameters_->getTimeStep();
    unsigned int simulation_step = 0;
    Mailbox mailbox;
    while(true) {
      DeviceNeuronStateBuffer<MType>* neuron_state = nullptr;
      neuron_state_subscription_->pull(&neuron_state, &mailbox);
      SynapticFireVectorBuffer<MType>* synaptic_fire = nullptr;
      fire_subscription_->pull(&synaptic_fire, &mailbox);
      if (!mailbox.wait(&neuron_state, &synaptic_fire)) {
        neuron_state_subscription_->cancel();
        fire_subscription_->cancel();
        if (neuron_state) {
          neuron_state->release();
        }
        if (synaptic_fire) {
          synaptic_fire->release();
        }
        delete synchronizer_publisher;
        break;
      }
      auto synchronizer = synchronizer_publisher->getBlank();
      auto synaptic_current = this->getBlank();
      synaptic_current->simulation_step = simulation_step;
      if (!synaptic_current->clear()) {
        std::cerr << "Failed to clear SynapticCurrentBuffer." <<
          std::endl;
      }
      synchronizer->neuron_state = neuron_state;
      synchronizer->synaptic_fire = synaptic_fire;
      synchronizer->synaptic_current = synaptic_current;
      synchronizer->time_step = time_step;
      synchronizer->simulation_time = simulation_time;
      auto prerelease_function = [this, synchronizer]() {
        this->publish(synchronizer->synaptic_current);
        synchronizer->neuron_state->release();
        synchronizer->synaptic_fire->release();
      };
      synchronizer->setPrereleaseFunction(prerelease_function);
      synchronizer_publisher->publish(synchronizer);
      simulation_time += time_step;
      ++simulation_step;
    }
    thread_destroy();
  };
  master_thread_ = std::thread(master_function);

  for (size_t i = 0; i < simulators_.size(); ++i) {
    auto simulator = simulators_[i];
    auto unit_offset = device_synaptic_vector_offsets_[i];
    auto subscription = synchronizer_publisher->subscribe();
    auto worker_function = [subscription, 
                            simulator, 
                            unit_offset,
                            thread_init,
                            thread_destroy]() {
      thread_init();
      auto word_offset = Bit::num_words(unit_offset);
      while (true) {
        auto synchronizer = subscription->pull();
        if (nullptr == synchronizer) {
          delete subscription;
          break;
        }
        SynapseUpdateParameters parameters;
        parameters.synaptic_fire =
          synchronizer->synaptic_fire->getFireBits() + word_offset;
        parameters.neuron_voltage =
          synchronizer->neuron_state->getVoltages();
        parameters.device_neuron_fire =
          synchronizer->neuron_state->getFireBits();
        parameters.synaptic_current =
          synchronizer->synaptic_current->getCurrents();
        parameters.write_lock =
          synchronizer->synaptic_current->getWriteLock();
        parameters.simulation_time = synchronizer->simulation_time;
        parameters.time_step = synchronizer->time_step;
        if (!simulator->update(&parameters)) {
          std::cerr << "An error occurred updating a SynapseSimulator." <<
            std::endl;
        }
        synchronizer->release();
      }
      thread_destroy();
    };
    worker_threads_.push_back(std::thread(worker_function));
  }
  return true;
}