soco 1.0.0

Algorithms for Smoothed Online Convex Optimization
Documentation
use crate::{init, utils::hash_map};
use soco::{
    algorithms::online::uni_dimensional::memoryless::memoryless,
    model::data_center::{
        loads::{LoadProfile, PredictedLoadProfile},
        model::{
            DataCenterModel, DataCenterOfflineInput, DataCenterOnlineInput,
            JobType, Location, ServerType, Source, DEFAULT_KEY,
        },
        models::{
            energy_consumption::{
                EnergyConsumptionModel, SimplifiedLinearEnergyConsumptionModel,
            },
            energy_cost::{EnergyCostModel, LinearEnergyCostModel},
            revenue_loss::{
                MinimalDetectableDelayRevenueLossModel, RevenueLossModel,
            },
            switching_cost::{SwitchingCost, SwitchingCostModel},
        },
        DataCenterModelOutputFailure, DataCenterModelOutputSuccess,
    },
    problem::FractionalSmoothedConvexOptimization,
    streaming::online::{self, OfflineResponse},
};
use std::{
    sync::{mpsc::channel, Arc},
    thread,
};

#[test]
fn integration() {
    init();

    let addr = "127.0.0.1:5000";

    let t_end = 2;
    let m = 10;

    let (sender, receiver) = channel();
    let server = thread::spawn(move || {
        let delta = 1.;
        let model = DataCenterModel::new(
            delta,
            vec![Location {
                key: DEFAULT_KEY.to_string(),
                m: hash_map(&[(DEFAULT_KEY.to_string(), m)]),
            }],
            vec![ServerType::default()],
            vec![Source::default()],
            vec![JobType::default()],
            EnergyConsumptionModel::SimplifiedLinear(hash_map(&[(
                DEFAULT_KEY.to_string(),
                SimplifiedLinearEnergyConsumptionModel { phi_max: 1. },
            )])),
            EnergyCostModel::Linear(hash_map(&[(
                DEFAULT_KEY.to_string(),
                LinearEnergyCostModel {
                    cost: Arc::new(|_| 1.),
                },
            )])),
            RevenueLossModel::MinimalDetectableDelay(hash_map(&[(
                DEFAULT_KEY.to_string(),
                MinimalDetectableDelayRevenueLossModel::default(),
            )])),
            SwitchingCostModel::new(hash_map(&[(
                DEFAULT_KEY.to_string(),
                SwitchingCost {
                    energy_cost: 1.,
                    phi_min: 0.5,
                    phi_max: 1.,
                    epsilon: 1.,
                    delta: 1.,
                    tau: 5.,
                    rho: 5.,
                },
            )])),
        );
        let input = DataCenterOfflineInput {
            loads: vec![LoadProfile::raw(vec![10.]); t_end as usize],
        };

        let OfflineResponse {
            xs: (xs, _),
            int_xs: (int_xs, _),
            ..
        } = online::start(
            addr.parse().unwrap(),
            model,
            &memoryless,
            (),
            0,
            input,
            Some(sender),
        )
        .unwrap();
        xs.verify(t_end, &vec![m as f64]).unwrap();
        int_xs.verify(t_end, &vec![m]).unwrap();
    });

    receiver.recv().unwrap();
    for t in 0..1 {
        let input = DataCenterOnlineInput {
            loads: vec![PredictedLoadProfile::raw(vec![vec![10.]])],
        };
        let ((x, _), (int_x, _), _, _) = online::next::<
            f64,
            FractionalSmoothedConvexOptimization<
                DataCenterModelOutputSuccess,
                DataCenterModelOutputFailure,
            >,
            (),
            DataCenterOnlineInput,
            DataCenterModelOutputSuccess,
            DataCenterModelOutputFailure,
        >(addr.parse().unwrap(), input)
        .unwrap();
        x.verify(t_end + t, &vec![m as f64]).unwrap();
        int_x.verify(t_end + t, &vec![m]).unwrap();
    }
    online::stop(addr.parse().unwrap());

    server.join().unwrap();
}