1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#[macro_use]

extern crate lazy_static;
extern crate rand;

pub mod glowworm;
pub mod swarm;
pub mod qt;
pub mod constants;
pub mod scoring;
pub mod dfire;
pub mod dna;
pub mod pydock;

use swarm::Swarm;
use rand::SeedableRng;
use rand::rngs::StdRng;
use scoring::Score;
use log::info;


pub struct GSO<'a> {
    pub swarm: Swarm<'a>,
    pub rng: StdRng,
    pub output_directory: String
}


impl<'a> GSO<'a> {
    pub fn new(positions: &[Vec<f64>], seed: u64, scoring: &'a Box<dyn Score>, use_anm: bool,
        rec_num_anm: usize, lig_num_anm: usize, output_directory: String) -> Self {
        let mut gso = GSO {
            swarm: Swarm::new(),
            rng: SeedableRng::seed_from_u64(seed),
            output_directory
        };
        gso.swarm.add_glowworms(positions, scoring, use_anm, rec_num_anm, lig_num_anm);
        gso
    }

    pub fn run(&mut self, steps: u32) {
        for step in 1..steps+1 {
            info!("Step {}", step);
            self.swarm.update_luciferin();
            self.swarm.movement_phase(&mut self.rng);
            if step % 10 == 0 || step == 1 {
                match self.swarm.save(step, &self.output_directory) {
                    Ok(ok) => ok,
                    Err(why) => panic!("Error saving GSO output: {:?}", why),
                }
            }
        }
    }
}