001package org.cpsolver.ifs.util; 002 003import org.cpsolver.ifs.assignment.Assignment; 004import org.cpsolver.ifs.model.Model; 005import org.cpsolver.ifs.model.Value; 006import org.cpsolver.ifs.model.Variable; 007import org.cpsolver.ifs.solution.Solution; 008import org.cpsolver.ifs.solver.Solver; 009import org.cpsolver.ifs.termination.TerminationCondition; 010 011/** 012 * Abstract problem saver class. 013 * 014 * @author Tomáš Müller 015 * @version IFS 1.3 (Iterative Forward Search)<br> 016 * Copyright (C) 2006 - 2016 Tomáš Müller<br> 017 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 018 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br> 019 * <br> 020 * This library is free software; you can redistribute it and/or modify 021 * it under the terms of the GNU Lesser General Public License as 022 * published by the Free Software Foundation; either version 3 of the 023 * License, or (at your option) any later version. <br> 024 * <br> 025 * This library is distributed in the hope that it will be useful, but 026 * WITHOUT ANY WARRANTY; without even the implied warranty of 027 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 028 * Lesser General Public License for more details. <br> 029 * <br> 030 * You should have received a copy of the GNU Lesser General Public 031 * License along with this library; if not see 032 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>. 033 */ 034public abstract class ProblemSaver<V extends Variable<V, T>, T extends Value<V, T>, M extends Model<V,T>> implements Runnable { 035 private Solver<V, T> iSolver = null; 036 private Callback iCallback = null; 037 private TerminationCondition<V, T> iTermination = null; 038 039 /** 040 * Constructor 041 * @param solver current solver 042 */ 043 public ProblemSaver(Solver<V, T> solver) { 044 iSolver = solver; 045 } 046 047 /** Solver 048 * @return current solver 049 **/ 050 public Solver<V, T> getSolver() { 051 return iSolver; 052 } 053 054 /** Solution to be saved 055 * @return current solution 056 **/ 057 protected Solution<V, T> getSolution() { 058 return iSolver.currentSolution(); 059 } 060 061 /** Model of the solution 062 * @return problem model 063 **/ 064 @SuppressWarnings("unchecked") 065 public M getModel() { 066 return (M)iSolver.currentSolution().getModel(); 067 } 068 069 /** Current assignment 070 * @return current assignment 071 **/ 072 public Assignment<V, T> getAssignment() { 073 return getSolution().getAssignment(); 074 } 075 076 /** Save the solution 077 * @throws Exception thrown when save fails 078 **/ 079 public abstract void save() throws Exception; 080 081 /** 082 * Sets callback class 083 * 084 * @param callback 085 * method {@link Callback#execute()} is executed when save is 086 * done 087 */ 088 public void setCallback(Callback callback) { 089 iCallback = callback; 090 } 091 092 /** 093 * Provide termination condition so that the save process can be stopped if needed (optional). 094 */ 095 public void setTerminationCondition(TerminationCondition<V, T> termination) { 096 iTermination = termination; 097 } 098 099 /** 100 * Return termination condition so that the save process can be stopped if needed. 101 */ 102 public TerminationCondition<V, T> getTerminationCondition() { 103 return iTermination; 104 } 105 106 @Override 107 public void run() { 108 try { 109 save(); 110 } catch (Exception e) { 111 org.apache.logging.log4j.LogManager.getLogger(this.getClass()).error(e.getMessage(), e); 112 } finally { 113 if (iCallback != null) 114 iCallback.execute(); 115 } 116 } 117}